// FieldOps — initial scaffold schema. // // All models except Tenant carry tenantId. Tenant scoping is enforced at runtime // by the Prisma extension in src/tenant-extension.ts — see that file's header for // the operations it covers and (more importantly) those it does NOT. generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } enum UserRole { ADMIN SUPERVISOR OPERATOR } model Tenant { id String @id @default(cuid()) name String createdAt DateTime @default(now()) users User[] workstations Workstation[] events DomainEvent[] } model User { id String @id @default(cuid()) tenantId String email String passwordHash String? role UserRole @default(OPERATOR) createdAt DateTime @default(now()) tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) @@unique([tenantId, email]) @@index([tenantId]) } model Workstation { id String @id @default(cuid()) tenantId String code String name String area String tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) @@unique([tenantId, code]) @@index([tenantId]) } model DomainEvent { id String @id @default(cuid()) tenantId String aggregateType String aggregateId String eventType String payload Json occurredAt DateTime @default(now()) processedAt DateTime? tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) @@index([tenantId]) @@index([tenantId, processedAt]) @@index([tenantId, aggregateType, aggregateId]) }