feat(db): add deletedAt audit timestamp to soft-deletable models

Add deletedAt DateTime? to User, Client, Role, Resource, and Blueprint
models for GDPR-compliant deactivation audit trail. Soft-delete mutations
now stamp deletedAt: new Date() on deactivation and clear it on
reactivation. Migration and test assertions updated accordingly.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-09 20:03:38 +02:00
parent f7407bd882
commit 1a8ea11331
10 changed files with 43 additions and 25 deletions
@@ -0,0 +1,5 @@
ALTER TABLE "User" ADD COLUMN IF NOT EXISTS "deletedAt" TIMESTAMP(3);
ALTER TABLE "Client" ADD COLUMN IF NOT EXISTS "deletedAt" TIMESTAMP(3);
ALTER TABLE "Role" ADD COLUMN IF NOT EXISTS "deletedAt" TIMESTAMP(3);
ALTER TABLE "Resource" ADD COLUMN IF NOT EXISTS "deletedAt" TIMESTAMP(3);
ALTER TABLE "Blueprint" ADD COLUMN IF NOT EXISTS "deletedAt" TIMESTAMP(3);
+5
View File
@@ -188,6 +188,7 @@ model User {
totpSecret String? // Base32 TOTP secret
totpEnabled Boolean @default(false)
isActive Boolean @default(true)
deletedAt DateTime?
accounts Account[]
sessions Session[]
@@ -709,6 +710,7 @@ model Client {
parent Client? @relation("ClientTree", fields: [parentId], references: [id])
children Client[] @relation("ClientTree")
isActive Boolean @default(true)
deletedAt DateTime?
sortOrder Int @default(0)
tags String[] @default([])
@@ -771,6 +773,7 @@ model Blueprint {
// rolePresets: StaffingRequirement[] — default roles for project creation wizard
rolePresets Json @db.JsonB @default("[]")
isActive Boolean @default(true)
deletedAt DateTime?
isGlobal Boolean @default(false)
resources Resource[]
@@ -792,6 +795,7 @@ model Role {
description String?
color String? // hex color e.g. "#6366f1"
isActive Boolean @default(true)
deletedAt DateTime?
resourceRoles ResourceRole[]
demandRequirements DemandRequirement[]
@@ -847,6 +851,7 @@ model Resource {
blueprintId String?
blueprint Blueprint? @relation(fields: [blueprintId], references: [id])
isActive Boolean @default(true)
deletedAt DateTime?
userId String? @unique
user User? @relation(fields: [userId], references: [id])