Basis: Certvia dev@a48c5fb als Fundament für Craftvia
CI / build-and-check (push) Canceled after 0s
CI / audit (push) Canceled after 0s
CI / sbom (push) Canceled after 0s

Unveränderter Stand von certvia/dev (a48c5fb) plus Craftvia-Spezifikation
und Brandbook unter docs/craftvia/. ISMS-Module werden im Folgecommit entfernt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-14 11:05:39 +02:00
co-authored by Claude Opus 5
commit c8e6f30a27
720 changed files with 140143 additions and 0 deletions
+70
View File
@@ -0,0 +1,70 @@
import type { DefaultSession } from "next-auth";
/**
* Schlanke Mitgliedschafts-Info für den Tenant-Switcher (Option C, WS1).
* Eine Person (Identity) kann mehrere Mitgliedschaften (per-Mandant-User) haben;
* die Session trägt die Liste + den AKTIVEN Mandanten.
*/
export interface SessionMembership {
membershipId: string; // = User.id der Mitgliedschaft
tenantId: string;
tenantSlug: string;
tenantName: string;
}
declare module "next-auth" {
interface Session {
user: {
// = aktive Mitgliedschaft (User.id) — STABIL, Basis für Ownership/RLS/Audit.
id: string;
// globale Anmelde-Identität (Option C). Optional, da die GETRENNTE Plattform-
// Auth-Instanz (platform-auth.ts) dieselben Typen nutzt, aber keine Identity hat.
identityId?: string;
// = activeTenantId; gespiegelt als tenantId, damit ~356 dbForTenant-Call-Sites
// unverändert bleiben.
tenantId: string;
tenantSlug: string;
activeMembershipId?: string;
// alle aktiven Mitgliedschaften der Identity (für /select-tenant, WS2).
memberships?: SessionMembership[];
roles: string[];
permissions: string[]; // des AKTIVEN Mandanten
isPlatformAdmin: boolean;
// MFA an der Identity eingerichtet?
mfaEnrolled?: boolean;
// SEC2: Ausstellungszeitpunkt des JWT (`iat`, Sekunden seit Epoche). Wird
// gegen `sessionsValidAfter` des Kontos geprüft, um Sessions serverseitig
// zu entwerten (src/server/sessions.ts).
tokenIssuedAt?: number;
} & DefaultSession["user"];
}
interface User {
id?: string;
identityId?: string;
tenantId: string;
tenantSlug: string;
activeMembershipId?: string;
memberships?: SessionMembership[];
roles: string[];
permissions: string[];
isPlatformAdmin: boolean;
mfaEnrolled?: boolean;
}
}
// next-auth/jwt re-exportiert nur aus @auth/core/jwt — Augmentation muss dorthin
declare module "@auth/core/jwt" {
interface JWT {
userId: string;
identityId?: string;
tenantId: string;
tenantSlug: string;
activeMembershipId?: string;
memberships?: SessionMembership[];
roles: string[];
permissions: string[];
isPlatformAdmin: boolean;
mfaEnrolled?: boolean;
}
}