Files
tessera-ctl/apps/api/prisma/migrations/20260930150000_welcome_mail_template/migration.sql
T
schalli e10da76259
Tessera CI/CD / Lint & Type Check (push) Successful in 50s
Tessera CI/CD / Tests (push) Successful in 1m22s
Tessera CI/CD / Desktop-Pakete bauen (push) Successful in 19s
Tessera CI/CD / Build & Publish Images (push) Successful in 3m10s
feat(admin): eigene Vorlage fuer die Willkommensmail mit Platzhaltern, Vorschau und Testmail
Administrator -> Willkommensmail: Betreff, Ueberschrift, Einleitung, Abschluss je
Mandant (Tabelle WelcomeMailTemplate, RLS je Mandant, Migration 20260930150000);
Platzhalter {{name}} {{vorname}} {{benutzername}} {{email}} {{adresse}} {{firma}},
unbekannte -> 400 bzw. Hinweis beim Tippen; Werte escaped, Vorlage reiner Text.
Live-Vorschau per API gerendert, Testmail an die eigene Adresse ohne Token,
Zuruecksetzen auf Standard. Feste Bausteine (Kopf, Zugangsdaten, Anmeldehinweis,
Knoepfe, Fusszeile) bleiben immer drin.
Kopf: Wellenzelle dunkel statt weiss, Streifen 600x40, Inhalt 24 px naeher –
keine weisse Luecke, wenn OWA das CID-Bild nicht zeigt.
Lokal nachgewiesen: Hinweis/Sperre bei {{xyz}}, Speichern, Testmail (Link nur
/login), echte Mail mit eigener Vorlage und 7-Tage-Link.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-30 16:49:17 +02:00

53 lines
2.4 KiB
SQL

-- Willkommensmail: eigene Vorlage je Mandant (Administrator → Willkommensmail).
--
-- Zweck: neue Tabelle "WelcomeMailTemplate". Ein Administrator kann Betreff,
-- Ueberschrift, Einleitung und Abschlusstext der Willkommensmail anpassen
-- (mit Platzhaltern wie {{name}}). Hoechstens EINE Zeile je Mandant
-- ("tenantId" eindeutig); "Auf Standard zuruecksetzen" loescht die Zeile, dann
-- gelten wieder die Standardtexte aus dem Code. Die festen Bausteine der Mail
-- (Kopf, Zugangsdaten, Anmeldehinweis, Knoepfe, Fusszeile) stehen NICHT in
-- der Tabelle. "updatedBy" haelt den Benutzernamen des letzten Bearbeiters
-- als reinen Anzeigetext (keine Relation).
--
-- Von Hand geschrieben (Vorbild 20260929120000_custom_module).
--
-- 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
-- Vorlage ist Verwaltungsdatum des Mandanten, nicht persoenliches Datum eines
-- einzelnen Benutzers.
--
-- BEWUSST KEINE `system_read_policy`: gelesen wird nur beim Versand einer
-- Willkommensmail, und zwar gebunden an den Mandanten des Zielbenutzers
-- (`forTenant(prisma, tenantId)`); es gibt keinen Hintergrunddienst, der die
-- Vorlagen ueber alle Mandanten liest.
--
-- 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 "WelcomeMailTemplate" (
"id" TEXT NOT NULL,
"tenantId" TEXT NOT NULL,
"subject" TEXT NOT NULL,
"heading" TEXT NOT NULL,
"intro" TEXT NOT NULL,
"closing" TEXT NOT NULL,
"updatedBy" TEXT,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "WelcomeMailTemplate_pkey" PRIMARY KEY ("id")
);
CREATE UNIQUE INDEX "WelcomeMailTemplate_tenantId_key" ON "WelcomeMailTemplate"("tenantId");
ALTER TABLE "WelcomeMailTemplate" ENABLE ROW LEVEL SECURITY;
ALTER TABLE "WelcomeMailTemplate" FORCE ROW LEVEL SECURITY;
CREATE POLICY tenant_isolation_policy ON "WelcomeMailTemplate"
USING ("tenantId" = current_tenant_id());