good forst commit
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
-- CreateEnum
|
||||
CREATE TYPE "AdminRole" AS ENUM ('OWNER', 'ADMIN', 'VIEWER');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "ActorType" AS ENUM ('ADMIN', 'SYSTEM', 'ADAPTER');
|
||||
|
||||
-- CreateTable: Tenant (must come first — referenced by everything else)
|
||||
CREATE TABLE "Tenant" (
|
||||
"id" TEXT NOT NULL,
|
||||
"slug" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"settings" JSONB NOT NULL DEFAULT '{}',
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "Tenant_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Tenant_slug_key" ON "Tenant"("slug");
|
||||
|
||||
-- Insert default tenant so existing rows can be backfilled
|
||||
INSERT INTO "Tenant" ("id", "slug", "name", "settings", "updatedAt")
|
||||
VALUES ('default', 'default', 'Default Tenant', '{}', CURRENT_TIMESTAMP);
|
||||
|
||||
-- Add tenantId columns as nullable first
|
||||
ALTER TABLE "Account" ADD COLUMN "tenantId" TEXT;
|
||||
ALTER TABLE "Approval" ADD COLUMN "tenantId" TEXT;
|
||||
ALTER TABLE "ConsentRecord" ADD COLUMN "tenantId" TEXT;
|
||||
ALTER TABLE "Group" ADD COLUMN "tenantId" TEXT;
|
||||
ALTER TABLE "Message" ADD COLUMN "tenantId" TEXT;
|
||||
ALTER TABLE "SyncRoute" ADD COLUMN "tenantId" TEXT;
|
||||
|
||||
-- Backfill all existing rows to the default tenant
|
||||
UPDATE "Account" SET "tenantId" = 'default';
|
||||
UPDATE "Approval" SET "tenantId" = 'default';
|
||||
UPDATE "ConsentRecord" SET "tenantId" = 'default';
|
||||
UPDATE "Group" SET "tenantId" = 'default';
|
||||
UPDATE "Message" SET "tenantId" = 'default';
|
||||
UPDATE "SyncRoute" SET "tenantId" = 'default';
|
||||
|
||||
-- Now enforce NOT NULL
|
||||
ALTER TABLE "Account" ALTER COLUMN "tenantId" SET NOT NULL;
|
||||
ALTER TABLE "Approval" ALTER COLUMN "tenantId" SET NOT NULL;
|
||||
ALTER TABLE "ConsentRecord" ALTER COLUMN "tenantId" SET NOT NULL;
|
||||
ALTER TABLE "Group" ALTER COLUMN "tenantId" SET NOT NULL;
|
||||
ALTER TABLE "Message" ALTER COLUMN "tenantId" SET NOT NULL;
|
||||
ALTER TABLE "SyncRoute" ALTER COLUMN "tenantId" SET NOT NULL;
|
||||
|
||||
-- CreateTable: Admin (new — NOT NULL tenantId is fine, we'll seed default admin later)
|
||||
CREATE TABLE "Admin" (
|
||||
"id" TEXT NOT NULL,
|
||||
"tenantId" TEXT NOT NULL,
|
||||
"email" TEXT NOT NULL,
|
||||
"passwordHash" TEXT NOT NULL,
|
||||
"role" "AdminRole" NOT NULL DEFAULT 'ADMIN',
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "Admin_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable: AuditEvent (new — NOT NULL tenantId is fine)
|
||||
CREATE TABLE "AuditEvent" (
|
||||
"id" TEXT NOT NULL,
|
||||
"tenantId" TEXT NOT NULL,
|
||||
"actorType" "ActorType" NOT NULL,
|
||||
"actorId" TEXT,
|
||||
"action" TEXT NOT NULL,
|
||||
"resourceType" TEXT NOT NULL,
|
||||
"resourceId" TEXT NOT NULL,
|
||||
"payload" JSONB NOT NULL DEFAULT '{}',
|
||||
"traceId" TEXT,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "AuditEvent_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Admin_tenantId_idx" ON "Admin"("tenantId");
|
||||
CREATE UNIQUE INDEX "Admin_tenantId_email_key" ON "Admin"("tenantId", "email");
|
||||
|
||||
CREATE INDEX "AuditEvent_tenantId_createdAt_idx" ON "AuditEvent"("tenantId", "createdAt");
|
||||
CREATE INDEX "AuditEvent_resourceType_resourceId_idx" ON "AuditEvent"("resourceType", "resourceId");
|
||||
|
||||
CREATE INDEX "Account_tenantId_idx" ON "Account"("tenantId");
|
||||
CREATE INDEX "Approval_tenantId_idx" ON "Approval"("tenantId");
|
||||
CREATE INDEX "ConsentRecord_tenantId_idx" ON "ConsentRecord"("tenantId");
|
||||
CREATE INDEX "Group_tenantId_idx" ON "Group"("tenantId");
|
||||
CREATE INDEX "Message_tenantId_idx" ON "Message"("tenantId");
|
||||
CREATE INDEX "SyncRoute_tenantId_idx" ON "SyncRoute"("tenantId");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Admin" ADD CONSTRAINT "Admin_tenantId_fkey" FOREIGN KEY ("tenantId") REFERENCES "Tenant"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
ALTER TABLE "AuditEvent" ADD CONSTRAINT "AuditEvent_tenantId_fkey" FOREIGN KEY ("tenantId") REFERENCES "Tenant"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
ALTER TABLE "Group" ADD CONSTRAINT "Group_tenantId_fkey" FOREIGN KEY ("tenantId") REFERENCES "Tenant"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
ALTER TABLE "Message" ADD CONSTRAINT "Message_tenantId_fkey" FOREIGN KEY ("tenantId") REFERENCES "Tenant"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
ALTER TABLE "Approval" ADD CONSTRAINT "Approval_tenantId_fkey" FOREIGN KEY ("tenantId") REFERENCES "Tenant"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
ALTER TABLE "SyncRoute" ADD CONSTRAINT "SyncRoute_tenantId_fkey" FOREIGN KEY ("tenantId") REFERENCES "Tenant"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
ALTER TABLE "ConsentRecord" ADD CONSTRAINT "ConsentRecord_tenantId_fkey" FOREIGN KEY ("tenantId") REFERENCES "Tenant"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
ALTER TABLE "Account" ADD CONSTRAINT "Account_tenantId_fkey" FOREIGN KEY ("tenantId") REFERENCES "Tenant"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
Reference in New Issue
Block a user