# 权限表 Schema

---
DDS-Section: 9. 数据模型 - 9.5-9.6 权限表
DDS-Lines: L768-L777
---

## jenkins_acls 表

| 字段 | 类型 | 约束 | 说明 |
|:---|:---|:---|:---|
| `id` | int64 | PK | 主键 |
| `user_id` | int64 | NOT NULL, FK | 用户 ID |
| `organization_folder` | varchar(100) | NOT NULL | 组织文件夹 |
| `repository_name` | varchar(100) | - | 仓库名称（可空 = Org 级） |
| `branch_name` | varchar(100) | - | 分支名称（可空 = Repo 级） |
| `permission_level` | varchar(10) | NOT NULL | org/repo/branch |
| `can_view` | bool | NOT NULL | 查看权限 |
| `can_build` | bool | NOT NULL | 构建权限 |
| `granted_by` | int64 | NOT NULL | 授权人 ID |
| `granted_at` | datetime | NOT NULL | 授权时间 |
| `created_at` | datetime | AUTO | 创建时间 |
| `updated_at` | datetime | AUTO | 更新时间 |

### 索引设计

| 索引 | 字段 | 说明 |
|:---|:---|:---|
| `idx_jenkins_acl_user` | user_id | 用户维度查询 |
| `idx_jenkins_acl_resource` | user_id, organization_folder, repository_name, branch_name | 资源维度查询（层级覆盖） |

---

## project_acls 表

| 字段 | 类型 | 约束 | 说明 |
|:---|:---|:---|:---|
| `id` | int64 | PK | 主键 |
| `user_id` | int64 | NOT NULL, FK | 用户 ID |
| `project_id` | varchar(50) | NOT NULL | 项目 ID |
| `module_code` | varchar(30) | NOT NULL | 模块代码 |
| `can_view` | bool | NOT NULL | 查看权限 |
| `can_export` | bool | NOT NULL | 导出权限 |
| `granted_by` | int64 | NOT NULL | 授权人 ID |
| `granted_at` | datetime | NOT NULL | 授权时间 |
| `created_at` | datetime | AUTO | 创建时间 |
| `updated_at` | datetime | AUTO | 更新时间 |

### 索引设计

| 索引 | 字段 | 说明 |
|:---|:---|:---|
| `idx_project_acl_user` | user_id | 用户维度查询 |
| `idx_project_acl_project` | project_id, module_code | 项目+模块维度查询 |
| `uk_project_acl` | user_id, project_id, module_code | 唯一约束 |

---

## user_permission_caches 表

| 字段 | 类型 | 约束 | 说明 |
|:---|:---|:---|:---|
| `id` | int64 | PK | 主键 |
| `user_id` | int64 | UNIQUE, NOT NULL | 用户 ID |
| `permission_tree` | jsonb | NOT NULL | 权限树 JSON |
| `updated_at` | datetime | AUTO | 更新时间 |

### 缓存结构示例

```json
{
  "jenkins": {
    "cmit-dev": {
      "can_view": true,
      "can_build": false,
      "repositories": {
        "rmdc-core": {
          "can_view": true,
          "can_build": true,
          "branches": {
            "main": {"can_view": true, "can_build": true},
            "dev": {"can_view": true, "can_build": false}
          }
        }
      }
    }
  },
  "projects": {
    "proj-001": {
      "basic_info": {"can_view": true, "can_export": false},
      "business_info": {"can_view": true, "can_export": true}
    }
  }
}
```

---

## rsa_keypairs 表

| 字段 | 类型 | 约束 | 说明 |
|:---|:---|:---|:---|
| `id` | int64 | PK | 主键 |
| `public_key` | text | NOT NULL | PEM 格式公钥 |
| `private_key` | text | NOT NULL | PEM 格式私钥 |
| `expires_at` | datetime | NOT NULL | 过期时间 |
| `created_at` | datetime | AUTO | 创建时间 |

---

## system_configs 表

| 字段 | 类型 | 约束 | 说明 |
|:---|:---|:---|:---|
| `id` | int64 | PK | 主键 |
| `key` | varchar(100) | UNIQUE, NOT NULL | 配置键 |
| `value` | text | - | 配置值 |
| `description` | varchar(255) | - | 描述 |
| `created_at` | datetime | AUTO | 创建时间 |
| `updated_at` | datetime | AUTO | 更新时间 |
