Align document slots to project document_duty even when the wrong ID is an active member, and fail generate/list instead of returning stale placeholder duties. Owner author backfill now picks creator, else lowest ID. Co-authored-by: Cursor <cursoragent@cursor.com>
55 lines
2.0 KiB
SQL
55 lines
2.0 KiB
SQL
-- +goose Up
|
|
-- 项目成员访问角色(owner/member/viewer)与文档职责(author/reviewer/approver)分离。
|
|
-- 立项时指定的 reviewer 必须能回填到后续受控文档 reviewer_id。
|
|
|
|
ALTER TABLE project_members
|
|
ADD COLUMN IF NOT EXISTS document_duty TEXT NOT NULL DEFAULT '';
|
|
|
|
ALTER TABLE project_members
|
|
DROP CONSTRAINT IF EXISTS chk_pm_document_duty;
|
|
|
|
ALTER TABLE project_members
|
|
ADD CONSTRAINT chk_pm_document_duty
|
|
CHECK (document_duty IN ('', 'author', 'reviewer', 'approver'));
|
|
|
|
CREATE UNIQUE INDEX IF NOT EXISTS uq_project_members_active_document_duty
|
|
ON project_members (project_id, document_duty)
|
|
WHERE status = 'active' AND document_duty <> '';
|
|
|
|
-- 创建者默认编制职责;已有非空职责不覆盖。
|
|
-- 多 owner/异常历史只回填一行:创建者优先,否则最低 user_id。
|
|
-- 必须与 internal/docduty.OwnerAuthorBackfillSQL 保持同步。
|
|
WITH candidates AS (
|
|
SELECT pm.project_id, pm.user_id,
|
|
CASE WHEN p.creator_user_id = pm.user_id THEN 0 ELSE 1 END AS creator_rank,
|
|
pm.user_id AS id_rank
|
|
FROM project_members pm
|
|
JOIN projects p ON p.id = pm.project_id
|
|
WHERE pm.status = 'active'
|
|
AND pm.document_duty = ''
|
|
AND (
|
|
pm.project_role = 'owner'
|
|
OR p.creator_user_id = pm.user_id
|
|
)
|
|
AND NOT EXISTS (
|
|
SELECT 1 FROM project_members other
|
|
WHERE other.project_id = pm.project_id
|
|
AND other.status = 'active'
|
|
AND other.document_duty = 'author'
|
|
)
|
|
),
|
|
picked AS (
|
|
SELECT DISTINCT ON (project_id) project_id, user_id
|
|
FROM candidates
|
|
ORDER BY project_id, creator_rank ASC, id_rank ASC
|
|
)
|
|
UPDATE project_members pm
|
|
SET document_duty = 'author', updated_at = now()
|
|
FROM picked
|
|
WHERE pm.project_id = picked.project_id AND pm.user_id = picked.user_id;
|
|
|
|
-- +goose Down
|
|
DROP INDEX IF EXISTS uq_project_members_active_document_duty;
|
|
ALTER TABLE project_members DROP CONSTRAINT IF EXISTS chk_pm_document_duty;
|
|
ALTER TABLE project_members DROP COLUMN IF EXISTS document_duty;
|