Existing stages and activities move into a default board per environment; new activities pick a board in the form.
58 lines
2.4 KiB
SQL
58 lines
2.4 KiB
SQL
-- CreateTable
|
|
CREATE TABLE "ActivityBoard" (
|
|
"id" TEXT NOT NULL,
|
|
"organizationId" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"isDefault" BOOLEAN NOT NULL DEFAULT false,
|
|
"position" INTEGER NOT NULL DEFAULT 0,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "ActivityBoard_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "ActivityBoard_organizationId_name_key" ON "ActivityBoard"("organizationId", "name");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ActivityBoard_organizationId_position_idx" ON "ActivityBoard"("organizationId", "position");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ActivityBoard" ADD CONSTRAINT "ActivityBoard_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Organization"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- Backfill: one default board per organization that already has activity stages
|
|
INSERT INTO "ActivityBoard" ("id", "organizationId", "name", "isDefault", "position", "createdAt", "updatedAt")
|
|
SELECT 'actb_' || md5(s."organizationId" || clock_timestamp()::text), s."organizationId", 'کارهای اصلی', true, 0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP
|
|
FROM (SELECT DISTINCT "organizationId" FROM "ActivityStage") AS s;
|
|
|
|
-- AlterTable: stages belong to a board
|
|
ALTER TABLE "ActivityStage" ADD COLUMN "boardId" TEXT;
|
|
|
|
UPDATE "ActivityStage" AS st
|
|
SET "boardId" = b."id"
|
|
FROM "ActivityBoard" AS b
|
|
WHERE b."organizationId" = st."organizationId" AND b."isDefault" = true;
|
|
|
|
ALTER TABLE "ActivityStage" ALTER COLUMN "boardId" SET NOT NULL;
|
|
|
|
-- Stage names are unique per board (not per organization)
|
|
DROP INDEX "ActivityStage_organizationId_name_key";
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "ActivityStage_boardId_name_key" ON "ActivityStage"("boardId", "name");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ActivityStage_boardId_position_idx" ON "ActivityStage"("boardId", "position");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ActivityStage" ADD CONSTRAINT "ActivityStage_boardId_fkey" FOREIGN KEY ("boardId") REFERENCES "ActivityBoard"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AlterTable: activities optionally point at a board (null = default board)
|
|
ALTER TABLE "Activity" ADD COLUMN "boardId" TEXT;
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Activity_boardId_idx" ON "Activity"("boardId");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Activity" ADD CONSTRAINT "Activity_boardId_fkey" FOREIGN KEY ("boardId") REFERENCES "ActivityBoard"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|