Improve family invitations and absence management flows

This commit is contained in:
t.indorf
2026-10-09 22:59:36 +02:00
parent 4702bf5abb
commit 8915fe7df6
29 changed files with 2803 additions and 617 deletions
+3
View File
@@ -72,9 +72,12 @@ Für Produktion gilt `NODE_ENV=production`. `TEST_MODE` und `ALLOW_DATABASE_SEED
Der Docker-Build installiert Abhängigkeiten, generiert den Prisma-Client und erstellt den Produktionsbuild. Beim Container-Start führt `scripts/start-production.sh` aus:
```sh
npx prisma db execute --file deploy/sql/familieneinladungen.sql --schema prisma/schema.prisma
npx prisma db push --skip-generate
```
Die erste Zeile ergänzt den gespeicherten Versandstatus für Familieneinladungen und den eindeutigen Bezug zum Elternkonto. Sie ist wiederholbar, lässt vorhandene Konten und Aktivierungslinks bestehen und überspringt eine noch leere Datenbank. Der folgende Schemaabgleich erstellt dort das vollständige Schema. Auf bestehenden Datenbanken verhindert dieses additive Upgrade, dass Prisma wegen des neuen eindeutigen Indexes den Start mit einer pauschalen Datenverlustwarnung stoppt. Für dieses Feature sind keine neuen Umgebungsvariablen nötig.
Danach startet es den Notdienst-Worker und die App. Das Projekt besitzt weiterhin keine vollständige versionierte Prisma-Migrationshistorie. Vor Updates Schemaänderungen und Startlogs prüfen; bei einem fehlgeschlagenen Schemaabgleich die Ursache klären, bevor das Deployment fortgesetzt wird.
Für kontrollierte, einmalige SQL-Upgrades gibt es diese Alternativen:
+1
View File
@@ -25,6 +25,7 @@ Die zentrale Schritt-für-Schritt-Anleitung steht in [DEPLOYMENT_UND_MAILVERSAND
Beim Container-Start fuehrt `scripts/start-production.sh` automatisch aus:
```bash
npx prisma db execute --file deploy/sql/familieneinladungen.sql --schema prisma/schema.prisma
npx prisma db push --skip-generate
```
+30
View File
@@ -0,0 +1,30 @@
-- Additive upgrade before Prisma db push; safe to run repeatedly.
-- On a fresh database Prisma creates the entire schema afterwards.
DO $upgrade$
BEGIN
IF to_regclass('invitations') IS NULL THEN
RETURN;
END IF;
ALTER TABLE "invitations"
ADD COLUMN IF NOT EXISTS "userId" TEXT,
ADD COLUMN IF NOT EXISTS "sentAt" TIMESTAMP(3),
ADD COLUMN IF NOT EXISTS "lastAttemptAt" TIMESTAMP(3),
ADD COLUMN IF NOT EXISTS "leaseUntil" TIMESTAMP(3),
ADD COLUMN IF NOT EXISTS "attempts" INTEGER NOT NULL DEFAULT 0,
ADD COLUMN IF NOT EXISTS "failed" BOOLEAN NOT NULL DEFAULT false;
CREATE UNIQUE INDEX IF NOT EXISTS "invitations_userId_key" ON "invitations"("userId");
IF NOT EXISTS (
SELECT 1 FROM pg_constraint
WHERE conname = 'invitations_userId_fkey'
AND conrelid = 'invitations'::regclass
) THEN
ALTER TABLE "invitations"
ADD CONSTRAINT "invitations_userId_fkey"
FOREIGN KEY ("userId") REFERENCES "users"("id")
ON DELETE CASCADE ON UPDATE CASCADE;
END IF;
END
$upgrade$;