Files
certvia/prisma/migrations/20260724095408_software_and_project_assets/migration.sql
T
msolarczekandClaude Opus 4.8 0806030bd9 Datenmodell: Asset-Typen SOFTWARE und PROJECT mit Fachprofilen
Neue AssetType-Werte SOFTWARE und PROJECT plus 1:1-Profile:
- SoftwareProfile (Anbieter-Verknüpfung, Version/Patch-Stand, Freigabestatus
  BEANTRAGT/FREIGEGEBEN/GESPERRT, Freigeber, Kritikalität, Review)
- ProjectProfile (IS-Klassifizierung, ISB-Einbindung, Projektstatus)
Migration inkl. RLS-Policies; TENANT_MODELS und Dependency-Graph (Node-Typ +
Icons Package/FolderKanban) um beide Typen erweitert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-24 10:12:56 +02:00

92 lines
3.2 KiB
SQL

-- CreateEnum
CREATE TYPE "SoftwareApprovalStatus" AS ENUM ('BEANTRAGT', 'FREIGEGEBEN', 'GESPERRT');
-- CreateEnum
CREATE TYPE "ProjectStatus" AS ENUM ('GEPLANT', 'LAUFEND', 'ABGESCHLOSSEN', 'ABGEBROCHEN');
-- AlterEnum
-- This migration adds more than one value to an enum.
-- With PostgreSQL versions 11 and earlier, this is not possible
-- in a single migration. This can be worked around by creating
-- multiple migrations, each migration adding only one value to
-- the enum.
ALTER TYPE "AssetType" ADD VALUE 'SOFTWARE';
ALTER TYPE "AssetType" ADD VALUE 'PROJECT';
-- CreateTable
CREATE TABLE "software_profiles" (
"id" TEXT NOT NULL,
"tenant_id" TEXT NOT NULL,
"asset_id" TEXT NOT NULL,
"ref_no" INTEGER NOT NULL,
"provider_asset_id" TEXT,
"version" TEXT,
"approval_status" "SoftwareApprovalStatus" NOT NULL DEFAULT 'BEANTRAGT',
"approved_by" TEXT,
"criticality" INTEGER NOT NULL DEFAULT 1,
"next_review" TIMESTAMP(3),
"notes" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
"created_by" TEXT,
CONSTRAINT "software_profiles_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "project_profiles" (
"id" TEXT NOT NULL,
"tenant_id" TEXT NOT NULL,
"asset_id" TEXT NOT NULL,
"ref_no" INTEGER NOT NULL,
"classification" TEXT,
"isb_involved" BOOLEAN NOT NULL DEFAULT false,
"status" "ProjectStatus" NOT NULL DEFAULT 'GEPLANT',
"notes" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
"created_by" TEXT,
CONSTRAINT "project_profiles_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "software_profiles_asset_id_key" ON "software_profiles"("asset_id");
-- CreateIndex
CREATE INDEX "software_profiles_tenant_id_idx" ON "software_profiles"("tenant_id");
-- CreateIndex
CREATE UNIQUE INDEX "software_profiles_tenant_id_ref_no_key" ON "software_profiles"("tenant_id", "ref_no");
-- CreateIndex
CREATE UNIQUE INDEX "project_profiles_asset_id_key" ON "project_profiles"("asset_id");
-- CreateIndex
CREATE INDEX "project_profiles_tenant_id_idx" ON "project_profiles"("tenant_id");
-- CreateIndex
CREATE UNIQUE INDEX "project_profiles_tenant_id_ref_no_key" ON "project_profiles"("tenant_id", "ref_no");
-- AddForeignKey
ALTER TABLE "software_profiles" ADD CONSTRAINT "software_profiles_asset_id_fkey" FOREIGN KEY ("asset_id") REFERENCES "assets"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "software_profiles" ADD CONSTRAINT "software_profiles_provider_asset_id_fkey" FOREIGN KEY ("provider_asset_id") REFERENCES "assets"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "project_profiles" ADD CONSTRAINT "project_profiles_asset_id_fkey" FOREIGN KEY ("asset_id") REFERENCES "assets"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- RLS für die neuen mandantenbezogenen Tabellen.
DO $$
DECLARE t text;
BEGIN
FOREACH t IN ARRAY ARRAY['software_profiles','project_profiles'] LOOP
EXECUTE format('ALTER TABLE %I ENABLE ROW LEVEL SECURITY', t);
EXECUTE format('CREATE POLICY tenant_isolation ON %I USING (tenant_id = current_setting(''app.tenant_id'', true))', t);
END LOOP;
END $$;