manicanldes-backend/prisma/schema.prisma

114 lines
3.8 KiB
Plaintext

generator client {
provider = "prisma-client"
output = "../src/generated/prisma"
moduleFormat = "cjs"
}
datasource db {
provider = "postgresql"
}
enum UserStatus {
PENDING
ACTIVE
SUSPENDED
}
model Organization {
id String @id @default(uuid()) @db.Uuid
name String @db.VarChar(160)
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz(3)
users User[]
roles Role[]
auditEvents AuditEvent[]
products Product[]
catalogGroups CatalogGroup[]
warehouses Warehouse[]
coupons Coupon[]
pricingPolicies PricingPolicy[]
@@map("organizations")
}
model User {
id String @id @default(uuid()) @db.Uuid
organizationId String @map("organization_id") @db.Uuid
email String @db.VarChar(254)
name String @db.VarChar(160)
passwordHash String @map("password_hash") @db.VarChar(256)
status UserStatus @default(PENDING)
isOwner Boolean @default(false) @map("is_owner")
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz(3)
organization Organization @relation(fields: [organizationId], references: [id], onDelete: Restrict)
roles UserRole[]
sessions Session[]
recoveryTokens RecoveryToken[]
addresses Address[]
stockEntries StockLedger[]
stockReservations StockReservation[]
carts Cart[]
orders Order[]
@@unique([organizationId, email])
@@unique([id, organizationId])
@@index([organizationId, createdAt, id])
@@map("users")
}
model Role {
id String @id @default(uuid()) @db.Uuid
organizationId String @map("organization_id") @db.Uuid
name String @db.VarChar(80)
isSystem Boolean @default(false) @map("is_system")
permissions String[]
organization Organization @relation(fields: [organizationId], references: [id], onDelete: Restrict)
users UserRole[]
@@unique([organizationId, name])
@@unique([id, organizationId])
@@map("roles")
}
model UserRole {
userId String @map("user_id") @db.Uuid
roleId String @map("role_id") @db.Uuid
organizationId String @map("organization_id") @db.Uuid
user User @relation(fields: [userId, organizationId], references: [id, organizationId], onDelete: Cascade)
role Role @relation(fields: [roleId, organizationId], references: [id, organizationId], onDelete: Restrict)
@@id([userId, roleId])
@@index([roleId, organizationId])
@@map("user_roles")
}
model Session {
id String @id @default(uuid()) @db.Uuid
userId String @map("user_id") @db.Uuid
tokenHash String @unique @map("token_hash") @db.Char(64)
expiresAt DateTime @map("expires_at") @db.Timestamptz(3)
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@index([userId])
@@index([expiresAt])
@@map("sessions")
}
model RecoveryToken {
id String @id @default(uuid()) @db.Uuid
userId String @map("user_id") @db.Uuid
tokenHash String @unique @map("token_hash") @db.Char(64)
expiresAt DateTime @map("expires_at") @db.Timestamptz(3)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@index([userId])
@@index([expiresAt])
@@map("recovery_tokens")
}
model AuditEvent {
id String @id @default(uuid()) @db.Uuid
organizationId String @map("organization_id") @db.Uuid
actorId String? @map("actor_id") @db.Uuid
action String @db.VarChar(80)
targetId String? @map("target_id") @db.Uuid
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3)
organization Organization @relation(fields: [organizationId], references: [id], onDelete: Restrict)
@@index([organizationId, createdAt, id])
@@map("audit_events")
}
model RateLimit {
key String @id @db.Char(64)
hits Int
expiresAt DateTime @map("expires_at") @db.Timestamptz(3)
@@index([expiresAt])
@@map("rate_limits")
}