-- 260929-9wc — Eigene Module: externe Seiten als Seitenleisten-Eintraege. -- -- Zweck: neue Tabelle "CustomModule". Der Administrator legt Eintraege an -- (Name, https-Adresse, Kategorie), alle Benutzer des Mandanten sehen sie in -- der Seitenleiste und ein Klick zeigt die Seite im Rahmen. Mehrere Zeilen je -- Mandant, Vorbild "ProxmoxServer" (tenantId-Spalte, keine Relation zu -- Tenant). -- -- Von Hand geschrieben (Vorbild 20260923140000_proxmox_server), von Hand -- gepflegter Kopfkommentar Pflicht bei jeder RLS-Migration in diesem Projekt. -- -- Zeilenschutz (Pflicht — sonst schlaegt rls-coverage.spec.ts fehl): die -- Tabelle traegt `tenantId` und `tenant_isolation_policy` OHNE -- Benutzerdimension (`USING ("tenantId" = current_tenant_id())`) — eigene -- Module sind Verwaltungsdaten des Mandanten, nicht persoenliche Daten eines -- einzelnen Benutzers. -- -- BEWUSST KEINE `system_read_policy`: es gibt keinen Hintergrunddienst, der -- eigene Module ueber alle Mandanten lesen muesste; jeder Zugriff laeuft -- mandantengebunden ueber `forTenant(prisma, tenantId)`. -- -- Rechte fuer die Anwendungsrolle tessera_app kommen automatisch ueber -- ALTER DEFAULT PRIVILEGES aus 20260909130000_rls_app_role — hier nichts zu -- tun. -- -- WICHTIG: wie alle bisherigen RLS-Migrationen wirken diese Regeln erst, -- wenn die Anwendung als Rolle ohne Umgehungsrecht verbindet (Schalter -- heute AUS, siehe docs/mandantentrennung-datenbankrolle.md). CREATE TABLE "CustomModule" ( "id" TEXT NOT NULL, "tenantId" TEXT NOT NULL, "name" TEXT NOT NULL, "url" TEXT NOT NULL, "category" TEXT NOT NULL, "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updatedAt" TIMESTAMP(3) NOT NULL, CONSTRAINT "CustomModule_pkey" PRIMARY KEY ("id") ); CREATE INDEX "CustomModule_tenantId_idx" ON "CustomModule"("tenantId"); ALTER TABLE "CustomModule" ENABLE ROW LEVEL SECURITY; ALTER TABLE "CustomModule" FORCE ROW LEVEL SECURITY; CREATE POLICY tenant_isolation_policy ON "CustomModule" USING ("tenantId" = current_tenant_id());