forked from EduCraft/curriculum-project-hub
feat: redesign Feishu project console
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
-- 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;
|
||||
Reference in New Issue
Block a user