-- 0006_model_sharing.up.sql -- -- 模型共享(Model Sharing)L 級新功能。在既有 owner-only 模型庫上,疊加兩個正交維度: -- (1) visibility 廣播欄(private / tenant / public)— models 表加 enum 欄。 -- (2) model_shares 點對點分享表(ADR-017 決策 3 B1)— 分享給特定 user。 -- -- 對齊:docs/autoflow/04-architecture/feature-model-sharing-tdd.md §3、 -- docs/autoflow/04-architecture/api/api-model-sharing.md、 -- docs/autoflow/04-architecture/adr/adr-017-model-library-access.md 決策 3。 -- -- 環境事實(與 0001–0005 相同,已驗證):PostgreSQL 14.23,gen_random_uuid() 內建可直接用。 -- -- ★關鍵相容性:models.visibility DEFAULT 'private' → 既有所有 model 遷移後維持 owner-only -- 語意,零行為改變。使用者要主動 PATCH visibility 才會公開。 -- ── (1) models 加 visibility 欄(廣播式公開對象)───────────────────────────── -- 'private'(僅擁有者,= 現況預設)| 'tenant'(同租戶可見)| 'public'(全平台可見) -- 全部既有 row 加欄後為 'private'(DEFAULT),語意完全等同遷移前的 owner-only。 ALTER TABLE models ADD COLUMN visibility TEXT NOT NULL DEFAULT 'private'; ALTER TABLE models ADD CONSTRAINT chk_models_visibility CHECK (visibility IN ('private', 'tenant', 'public')); -- ── (2) model_shares 表(點對點分享,ADR-017 決策 3 B1,本功能沿用不重造)────── -- role:'viewer'(可 list/get/download)| 'editor'(可改 metadata;本期讀取端用,寫入權後續)。 -- PK (model_id, grantee_user_id):同一 model 對同一 grantee 只有一筆分享(重複分享 = upsert)。 -- FK ON DELETE CASCADE:model 硬刪時連帶清 share(雖然本系統 model 為軟刪,CASCADE 為防禦性 -- 一致——若未來真硬刪不留孤兒列;軟刪時 share 保留,由查詢端 join models.deleted_at 過濾)。 CREATE TABLE model_shares ( model_id UUID NOT NULL REFERENCES models(id) ON DELETE CASCADE, grantee_user_id UUID NOT NULL REFERENCES users(id), role TEXT NOT NULL DEFAULT 'viewer', granted_by UUID NOT NULL REFERENCES users(id), created_at TIMESTAMPTZ NOT NULL DEFAULT now(), PRIMARY KEY (model_id, grantee_user_id), CONSTRAINT chk_model_shares_role CHECK (role IN ('viewer', 'editor')) ); -- grantee 反查(共享庫「分享給我」predicate 的 EXISTS 子查走此 index)。 CREATE INDEX idx_model_shares_grantee ON model_shares (grantee_user_id); -- ── (3) 共享庫查詢用 index ─────────────────────────────────────────────────── -- public 全平台可見列表:high-selectivity partial index(沿用既有 models index 的 -- `WHERE deleted_at IS NULL` 慣例)。只索引 public 且未刪除且已上傳(ready)的 model, -- 共享庫預設按 created_at DESC 排序、此 index 直接覆蓋該掃描。 CREATE INDEX idx_models_public_active ON models (created_at DESC) WHERE deleted_at IS NULL AND visibility = 'public' AND uploaded_at IS NOT NULL; -- tenant 可見需 join users 取 owner.org_id;users 主鍵 join 成本低, -- owner 維度沿用既有 idx_models_owner_active,不另建。