// This is your Prisma schema file, // learn more about it in the docs: https://pris.ly/d/prisma-schema generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } // ============================================ // Core Models // ============================================ model User { id String @id @default(uuid()) email String @unique password String firstName String? lastName String? isActive Boolean @default(true) // Relations roles UserRole[] refreshTokens RefreshToken[] // Multi-tenancy (optional) tenantId String? tenant Tenant? @relation(fields: [tenantId], references: [id]) // Timestamps & Soft Delete createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime? @@index([email]) @@index([tenantId]) } model Role { id String @id @default(uuid()) name String @unique description String? isSystem Boolean @default(false) // Relations users UserRole[] permissions RolePermission[] // Timestamps & Soft Delete createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime? @@index([name]) } model Permission { id String @id @default(uuid()) name String @unique description String? resource String // e.g., "users", "posts" action String // e.g., "create", "read", "update", "delete" // Relations roles RolePermission[] // Timestamps createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@unique([resource, action]) @@index([resource]) } // Many-to-many: User <-> Role model UserRole { id String @id @default(uuid()) userId String roleId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) role Role @relation(fields: [roleId], references: [id], onDelete: Cascade) createdAt DateTime @default(now()) @@unique([userId, roleId]) @@index([userId]) @@index([roleId]) } // Many-to-many: Role <-> Permission model RolePermission { id String @id @default(uuid()) roleId String permissionId String role Role @relation(fields: [roleId], references: [id], onDelete: Cascade) permission Permission @relation(fields: [permissionId], references: [id], onDelete: Cascade) createdAt DateTime @default(now()) @@unique([roleId, permissionId]) @@index([roleId]) @@index([permissionId]) } // ============================================ // Authentication // ============================================ model RefreshToken { id String @id @default(uuid()) token String @unique userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) expiresAt DateTime createdAt DateTime @default(now()) @@index([token]) @@index([userId]) } // ============================================ // Multi-tenancy (Optional) // ============================================ model Tenant { id String @id @default(uuid()) name String slug String @unique isActive Boolean @default(true) // Relations users User[] // Timestamps & Soft Delete createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime? @@index([slug]) } // ============================================ // i18n / Translations (Optional - DB driven) // ============================================ model Translation { id String @id @default(uuid()) key String locale String // e.g., "en", "tr", "de" value String namespace String @default("common") // e.g., "common", "errors", "validation" // Timestamps createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@unique([key, locale, namespace]) @@index([key]) @@index([locale]) @@index([namespace]) }