forked from bai/curriculum-project-hub
66 lines
2.5 KiB
SQL
66 lines
2.5 KiB
SQL
-- ADR-0017: roles are selected through the project-group control plane, not
|
|
-- through slash-command names. Existing alpha Organizations keep draft as
|
|
-- their configured default during migration; runtime code no longer hard-codes it.
|
|
ALTER TABLE "OrganizationAgentRole"
|
|
ADD COLUMN "isDefault" BOOLEAN NOT NULL DEFAULT false;
|
|
|
|
-- An Organization without any role was valid in the previous schema (the
|
|
-- runtime failed closed later). Preserve the old alpha baseline so every
|
|
-- existing binding can acquire a selected role during this migration.
|
|
INSERT INTO "OrganizationAgentRole" (
|
|
"id", "organizationId", "roleId", "label", "sortOrder", "isDefault", "updatedAt"
|
|
)
|
|
SELECT organization."id" || ':agent-role:draft', organization."id", 'draft', '草稿', 10, true, CURRENT_TIMESTAMP
|
|
FROM "Organization" organization
|
|
WHERE NOT EXISTS (
|
|
SELECT 1 FROM "OrganizationAgentRole" role
|
|
WHERE role."organizationId" = organization."id" AND role."disabledAt" IS NULL
|
|
);
|
|
|
|
WITH ranked AS (
|
|
SELECT "id", row_number() OVER (
|
|
PARTITION BY "organizationId"
|
|
ORDER BY CASE WHEN "roleId" = 'draft' THEN 0 ELSE 1 END, "sortOrder", "roleId", "id"
|
|
) AS position
|
|
FROM "OrganizationAgentRole"
|
|
WHERE "disabledAt" IS NULL
|
|
)
|
|
UPDATE "OrganizationAgentRole" role
|
|
SET "isDefault" = (ranked.position = 1)
|
|
FROM ranked
|
|
WHERE role."id" = ranked."id";
|
|
|
|
CREATE UNIQUE INDEX "OrganizationAgentRole_one_active_default_per_org"
|
|
ON "OrganizationAgentRole"("organizationId")
|
|
WHERE "isDefault" = true AND "disabledAt" IS NULL;
|
|
|
|
ALTER TABLE "ProjectGroupBinding"
|
|
ADD COLUMN "selectedAgentRoleId" TEXT;
|
|
|
|
UPDATE "ProjectGroupBinding" binding
|
|
SET "selectedAgentRoleId" = role."id"
|
|
FROM "Project" project
|
|
JOIN "OrganizationAgentRole" role
|
|
ON role."organizationId" = project."organizationId"
|
|
AND role."isDefault" = true
|
|
AND role."disabledAt" IS NULL
|
|
WHERE binding."projectId" = project."id";
|
|
|
|
DO $$
|
|
BEGIN
|
|
IF EXISTS (SELECT 1 FROM "ProjectGroupBinding" WHERE "selectedAgentRoleId" IS NULL) THEN
|
|
RAISE EXCEPTION 'cannot migrate project-group bindings without an active default Agent role';
|
|
END IF;
|
|
END $$;
|
|
|
|
ALTER TABLE "ProjectGroupBinding"
|
|
ALTER COLUMN "selectedAgentRoleId" SET NOT NULL;
|
|
|
|
CREATE INDEX "ProjectGroupBinding_selectedAgentRoleId_idx"
|
|
ON "ProjectGroupBinding"("selectedAgentRoleId");
|
|
|
|
ALTER TABLE "ProjectGroupBinding"
|
|
ADD CONSTRAINT "ProjectGroupBinding_selectedAgentRoleId_fkey"
|
|
FOREIGN KEY ("selectedAgentRoleId") REFERENCES "OrganizationAgentRole"("id")
|
|
ON DELETE RESTRICT ON UPDATE CASCADE;
|