# pb_tbl_scheme_share

> 来源：用户提供的结构草图（2026-04-08）与本次 owner 行级权限要求
> 类型：`base`
> 状态：`draft`，仅文档设计，尚未执行建表
> 读写规则：任意已登录用户可新增，但仅可访问 `scheme_share_owner = 当前 token 对应 openid` 且 `is_delete = 0` 的记录

## 表用途

用于存储方案分享记录，描述某个方案被分享给谁、分享权限、有效期以及接收状态。

## 关键设计说明

原始草图里没有 owner 字段，但你要求这 3 张表统一采用 `xxx_owner = 当前 token 对应 openid` 的 PB 行级约束。

因此本表文档中补充新增：

- `scheme_share_owner`

该字段用于表示“谁发起了这条分享记录”，并作为 PocketBase 原生访问控制的 owner 锚点。

## 字段清单

| 字段名 | 类型 | 必填 | 说明 |
| :--- | :--- | :---: | :--- |
| `id` | `text` | 是 | PocketBase 记录主键 |
| `scheme_share_id` | `text` | 是 | 分享业务 ID，唯一标识 |
| `scheme_id` | `text` | 是 | 关联方案 ID，建议保存 `tbl_scheme.scheme_id` |
| `scheme_share_owner` | `text` | 是 | 分享发起人 openid，用于 owner 行级权限控制 |
| `scheme_share_to` | `text` | 是 | 被分享目标用户标识，建议保存目标用户 openid |
| `scheme_share_acceptance_status` | `text` | 否 | 分享接收状态，如待接收 / 已接收 / 已参与 / 已拒绝 |
| `scheme_share_expires_at` | `date` | 否 | 分享有效期 |
| `scheme_share_permission` | `text` | 否 | 分享权限，如只读 / 可复制 / 可编辑 |
| `scheme_share_remark` | `text` | 否 | 分享备注 |
| `is_delete` | `number` | 否 | 软删除标记，`0` 表示未删除，`1` 表示已删除，默认 `0` |

## 索引

| 索引名 | 类型 | 说明 |
| :--- | :--- | :--- |
| `idx_tbl_scheme_share_scheme_share_id` | `UNIQUE INDEX` | 保证 `scheme_share_id` 唯一 |
| `idx_tbl_scheme_share_scheme_id` | `INDEX` | 加速按方案查询分享记录 |
| `idx_tbl_scheme_share_scheme_share_owner` | `INDEX` | 加速按分享发起人查询 |
| `idx_tbl_scheme_share_scheme_share_to` | `INDEX` | 加速按被分享目标查询 |
| `idx_tbl_scheme_share_acceptance_status` | `INDEX` | 加速按接收状态过滤 |
| `idx_tbl_scheme_share_expires_at` | `INDEX` | 加速按有效期过滤 |
| `idx_tbl_scheme_share_owner_to` | `INDEX` | 加速同一发起人向某目标用户的查询 |
| `idx_tbl_scheme_share_unique_map` | `UNIQUE INDEX` | 保证同一发起人对同一方案给同一目标的分享记录唯一 |

## 建议 PocketBase 原生权限规则

说明：

- 严格按你的要求，所有删改查都只允许 owner 访问。
- 这意味着“被分享人”不能直接通过 PocketBase 原生 records API 读取这张表；如果后续要支持被分享方直连访问，需要另行放宽 `listRule` / `viewRule` 或改由 hooks 中转。

| Rule | 建议表达式 |
| :--- | :--- |
| `listRule` | `@request.auth.id != "" && scheme_share_owner = @request.auth.openid && is_delete = 0` |
| `viewRule` | `@request.auth.id != "" && scheme_share_owner = @request.auth.openid && is_delete = 0` |
| `createRule` | `@request.auth.id != "" && @request.body.scheme_share_owner = @request.auth.openid` |
| `updateRule` | `@request.auth.id != "" && scheme_share_owner = @request.auth.openid && is_delete = 0` |
| `deleteRule` | `@request.auth.id != "" && scheme_share_owner = @request.auth.openid && is_delete = 0` |

## 补充约定

- `scheme_share_to` 当前建议保存目标用户 `openid`，这样后续如果要做 hooks 查询或消息通知，字段可直接复用。
- 若后续要支持“接收方修改 `scheme_share_acceptance_status`”，则当前 owner-only 原生规则不够，需要追加 hooks 或重新设计 PB 规则。
- 推荐把 `scheme_share_permission` 控制在有限枚举内，例如：`readonly`、`copyable`、`editable`。
- `is_delete` 用于软删除控制，撤销分享时建议优先标记为 `1`。
- PocketBase 系统字段 `created`、`updated` 仍然存在，只是不在 collection 字段清单里单独声明。
