-- quick-261002-k67 — Modul Nextcloud-Status. -- -- Zweck: neue Tabelle "NextcloudInstance" fuer die vom Verwalter -- eingetragenen Nextcloud-Clouds der Kunden (Kundenname, Adresse, optionales -- Logo) samt zuletzt ermitteltem Zustand (Erreichbarkeit, Wartungsmodus, -- Versionstext, Fehlerart). Der Zustand liegt direkt auf der Zeile, es gibt -- kein Zwischenlager. Logo-Bytes liegen als BYTEA an der Zeile (hoechstens -- 1 MiB, Pruefung im Dienst); Abfragen ausser dem Logo-Abruf waehlen sie -- nie mit aus. -- -- 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())`) — die -- Clouds sind gemeinsame Daten der Organisation, nicht persoenliche Daten -- eines einzelnen Benutzers. -- -- Zusaetzlich eine `system_read_policy` (Form aus -- 20260914120000_rls_system_context_read): der stuendliche Hintergrunddienst -- liest ueber `forSystem()` genau einmal je Durchlauf Kennung und Mandant -- aller Clouds und prueft danach jede Cloud an ihren eigenen Mandanten -- gebunden. Geschrieben wird nie im Systemkontext. -- -- 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 "NextcloudInstance" ( "id" TEXT NOT NULL, "tenantId" TEXT NOT NULL, "customerName" TEXT NOT NULL, "baseUrl" TEXT NOT NULL, "logoUrl" TEXT, "logoData" BYTEA, "logoMime" TEXT, "logoVersion" INTEGER NOT NULL DEFAULT 0, "lastCheckedAt" TIMESTAMP(3), "reachable" BOOLEAN, "maintenance" BOOLEAN, "needsDbUpgrade" BOOLEAN, "versionString" TEXT, "edition" TEXT, "productName" TEXT, "errorKind" TEXT, "errorDetail" TEXT, "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updatedAt" TIMESTAMP(3) NOT NULL, CONSTRAINT "NextcloudInstance_pkey" PRIMARY KEY ("id") ); CREATE INDEX "NextcloudInstance_tenantId_idx" ON "NextcloudInstance"("tenantId"); ALTER TABLE "NextcloudInstance" ENABLE ROW LEVEL SECURITY; ALTER TABLE "NextcloudInstance" FORCE ROW LEVEL SECURITY; CREATE POLICY tenant_isolation_policy ON "NextcloudInstance" USING ("tenantId" = current_tenant_id()); CREATE POLICY system_read_policy ON "NextcloudInstance" FOR SELECT USING (is_system_context());