generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } enum UserRoleSource { AUTHENTIK SYSTEM } model User { id String @id @default(uuid()) authentikId String? @unique authentikUserId String? @unique authentikSubject String? @unique username String? @unique email String? @unique name String? picture String? isActive Boolean @default(true) deletedAt DateTime? lastSeenAt DateTime? lastSyncedAt DateTime? syncStatus String? storageQuota BigInt? @default(10737418240) storageUsed BigInt? @default(0) metadata Json? lastGroupHash String? createdAt DateTime @default(now()) updatedAt DateTime @default(now()) userRoles UserRole[] userPermissions UserPermission[] mediaObjects MediaObject[] auditLogs AuditLog[] @relation("AuditUser") debtTransactionsCreated DebtTransaction[] @relation("createdBy") debtGroupMemberships DebtGroupMember[] } model ServiceAccount { id String @id @default(uuid()) client_id String @unique client_secret_hash String name String role String permissions Json status String @default("ACTIVE") metadata Json? created_at DateTime @default(now()) updated_at DateTime @default(now()) deleted_at DateTime? } model Role { id String @id @default(uuid()) code String @unique name String displayName String? description String? isDefault Boolean @default(false) createdAt DateTime @default(now()) updatedAt DateTime @default(now()) permissions RolePermission[] users UserRole[] authGroupRoleMappings AuthGroupRoleMapping[] } model Permission { id String @id @default(uuid()) code String @unique name String displayName String? description String? createdAt DateTime @default(now()) updatedAt DateTime @default(now()) roles RolePermission[] users UserPermission[] } model RolePermission { id String @id @default(uuid()) roleId String permissionId String createdAt DateTime @default(now()) role Role @relation(fields: [roleId], references: [id]) permission Permission @relation(fields: [permissionId], references: [id]) @@unique([roleId, permissionId]) @@index([roleId]) @@index([permissionId]) } model UserPermission { id String @id @default(uuid()) userId String permissionId String assignedBy String? createdAt DateTime @default(now()) user User @relation(fields: [userId], references: [id]) permission Permission @relation(fields: [permissionId], references: [id]) @@unique([userId, permissionId]) @@index([userId]) @@index([permissionId]) } model UserRole { id String @id @default(uuid()) userId String roleId String source UserRoleSource @default(AUTHENTIK) syncedAt DateTime @default(now()) createdAt DateTime @default(now()) user User @relation(fields: [userId], references: [id]) role Role @relation(fields: [roleId], references: [id]) @@unique([userId, roleId]) @@index([userId]) @@index([roleId]) } model AuthGroupRoleMapping { id String @id @default(uuid()) authGroup String roleId String createdAt DateTime @default(now()) updatedAt DateTime @default(now()) role Role @relation(fields: [roleId], references: [id]) } model AuditLog { id String @id @default(uuid()) userId String? action String resource String? resourceId String? details Json? createdAt DateTime @default(now()) user User? @relation("AuditUser", fields: [userId], references: [id]) @@index([userId]) @@index([action]) } model ScheduledJob { id String @id @default(uuid()) name String payload Json? cron String? runAt DateTime? status String @default("pending") attempts Int @default(0) lastRunAt DateTime? createdAt DateTime @default(now()) updatedAt DateTime @default(now()) } model MediaObject { id String @id @default(uuid()) ownerUserId String? storageKey String filename String? mimeType String? size BigInt? isPublic Boolean @default(false) metadata Json? createdAt DateTime @default(now()) updatedAt DateTime @default(now()) owner User? @relation(fields: [ownerUserId], references: [id]) @@index([ownerUserId]) @@index([storageKey]) } model Application { id String @id @default(uuid()) code String @unique name String description String? icon String? url String? applicationsClaim String @unique isActive Boolean @default(true) displayOrder Int @default(0) createdAt DateTime @default(now()) updatedAt DateTime @default(now()) } // Debt models used by bot-debt module model DebtGroup { id String @id @default(uuid()) name String ownerId String publicId String @unique createdAt DateTime @default(now()) updatedAt DateTime @default(now()) members DebtGroupMember[] people DebtPerson[] transactions DebtTransaction[] } model DebtGroupMember { id String @id @default(uuid()) groupId String userId String createdAt DateTime @default(now()) group DebtGroup @relation(fields: [groupId], references: [id]) user User @relation(fields: [userId], references: [id]) @@unique([groupId, userId], name: "groupId_userId") } model DebtPerson { id String @id @default(uuid()) groupId String name String isDeleted Boolean @default(false) createdAt DateTime @default(now()) group DebtGroup @relation(fields: [groupId], references: [id]) fromTransactions DebtTransaction[] @relation("fromPerson") toTransactions DebtTransaction[] @relation("toPerson") } model DebtTransaction { id String @id @default(uuid()) groupId String fromPersonId String toPersonId String amount BigInt type String description String? transactionDate DateTime createdByUserId String requestId String? createdAt DateTime @default(now()) group DebtGroup @relation(fields: [groupId], references: [id]) fromPerson DebtPerson @relation("fromPerson", fields: [fromPersonId], references: [id]) toPerson DebtPerson @relation("toPerson", fields: [toPersonId], references: [id]) createdByUser User @relation("createdBy", fields: [createdByUserId], references: [id]) @@index([groupId]) @@index([requestId]) }