diff --git a/backend/prisma/rechte-report.ts b/backend/prisma/rechte-report.ts index ec537de3..3ee2b07b 100644 --- a/backend/prisma/rechte-report.ts +++ b/backend/prisma/rechte-report.ts @@ -12,10 +12,15 @@ * etwas Lesbares ausgibt. */ -import { PrismaClient } from '@prisma/client'; +// Ueber src/lib/prisma.js, NICHT ueber einen eigenen PrismaClient: Dort wird +// DATABASE_URL aus den DB_*-Teilen zusammengesetzt, falls sie fehlt. Bei +// `docker compose exec npx tsx prisma/.ts` ist genau das der +// Fall - der Entrypoint exportiert sie nur in den Serverprozess, eine neue +// Shell erbt sie nicht. Ein eigener Client scheitert dort mit +// "Environment variable not found: DATABASE_URL". +import prisma from '../src/lib/prisma.js'; import { ALLE_RECHTE, SYSTEMROLLEN_NAMEN } from '../src/config/rechte-katalog.js'; -const prisma = new PrismaClient(); /** * Liest isSystem/isHidden, sofern die Spalten existieren. diff --git a/backend/prisma/rolle-zuweisen.ts b/backend/prisma/rolle-zuweisen.ts index 92f1c724..c570b5f9 100644 --- a/backend/prisma/rolle-zuweisen.ts +++ b/backend/prisma/rolle-zuweisen.ts @@ -25,10 +25,15 @@ * Aenderung sofort wirkt und nicht spurlos bleibt. */ -import { PrismaClient } from '@prisma/client'; +// Ueber src/lib/prisma.js, NICHT ueber einen eigenen PrismaClient: Dort wird +// DATABASE_URL aus den DB_*-Teilen zusammengesetzt, falls sie fehlt. Bei +// `docker compose exec npx tsx prisma/.ts` ist genau das der +// Fall - der Entrypoint exportiert sie nur in den Serverprozess, eine neue +// Shell erbt sie nicht. Ein eigener Client scheitert dort mit +// "Environment variable not found: DATABASE_URL". +import prisma from '../src/lib/prisma.js'; import { createAuditLog } from '../src/services/audit.service.js'; -const prisma = new PrismaClient(); async function main(): Promise { const args = process.argv.slice(2); diff --git a/backend/prisma/sync-roles.ts b/backend/prisma/sync-roles.ts index 77e12beb..50015f01 100644 --- a/backend/prisma/sync-roles.ts +++ b/backend/prisma/sync-roles.ts @@ -14,10 +14,15 @@ * Produktionsdatenbanken sicher. */ -import { PrismaClient } from '@prisma/client'; +// Ueber src/lib/prisma.js, NICHT ueber einen eigenen PrismaClient: Dort wird +// DATABASE_URL aus den DB_*-Teilen zusammengesetzt, falls sie fehlt. Bei +// `docker compose exec npx tsx prisma/.ts` ist genau das der +// Fall - der Entrypoint exportiert sie nur in den Serverprozess, eine neue +// Shell erbt sie nicht. Ein eigener Client scheitert dort mit +// "Environment variable not found: DATABASE_URL". +import prisma from '../src/lib/prisma.js'; import { synchronisiereRechteUndRollen } from '../src/services/rollen-sync.service.js'; -const prisma = new PrismaClient(); synchronisiereRechteUndRollen(prisma) .catch((e) => { diff --git a/docs/todo.md b/docs/todo.md index 53d7f2c2..5ce86074 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -165,6 +165,14 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung noch in der Datenbank und bewachen nichts. Nicht gelöscht, sondern am Lesezugriff gefiltert – ein Filter ist die kleinere Behauptung als ein DELETE. + - **Nachtrag (Staging-Deploy)**: Die drei CLI-Skripte bauten sich einen + eigenen `PrismaClient` und gingen damit an `src/lib/prisma.ts` vorbei – dort + wird `DATABASE_URL` aus den `DB_*`-Teilen zusammengesetzt, wenn sie fehlt. + Genau das ist bei `docker compose exec` der Fall: Der Entrypoint exportiert + sie nur in den Serverprozess. Folge: „Environment variable not found". + Betroffen war auch `rolle-zuweisen.ts` – der Aussperr-Ausweg hätte in dem + Moment versagt, für den er gebaut ist. Jetzt nutzen alle drei den + gemeinsamen Client. - **Beim Deploy**: Die Migration beendet alle Sitzungen einmalig (`tokenInvalidatedAt`). Nötig, weil die Rechte im Token stehen – sonst liefen bis zu 15 Minuten 403er. Alle müssen sich einmal neu anmelden.