Files
Agent-System/deploy/postgres/goose/00031_2026-09-13-project-member-document-duty.sql
T
weichenandCursor 2f0a1b337c fix(docduty): treat assigned duty as authoritative on heal
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>
2026-09-13 22:16:36 +00:00

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;