// Templates2 Base — core data model shared by every case. // SQLite in development (file:./dev.db); switch the datasource url to Postgres in production. generator client { provider = "prisma-client-js" } datasource db { provider = "sqlite" url = env("DATABASE_URL") } model User { id String @id @default(cuid()) email String @unique passwordHash String name String? role String @default("user") // user | admin createdAt DateTime @default(now()) sessions Session[] subscription Subscription? auditLogs AuditLog[] orders Order[] } model Session { id String @id @default(cuid()) token String @unique userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) expiresAt DateTime createdAt DateTime @default(now()) @@index([userId]) } model Subscription { id String @id @default(cuid()) userId String @unique user User @relation(fields: [userId], references: [id], onDelete: Cascade) plan String @default("free") // free | pro status String @default("active") // active | canceled | past_due provider String @default("mock") // mock | stripe currentPeriodEnd DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model AuditLog { id String @id @default(cuid()) actorId String? actor User? @relation(fields: [actorId], references: [id], onDelete: SetNull) action String target String? meta String? createdAt DateTime @default(now()) @@index([actorId]) } model Category { id String @id @default(cuid()) slug String @unique name String products Product[] } model Product { id String @id @default(cuid()) slug String @unique name String description String price Int // minor units (e.g. cents) currency String @default("USD") image String? stock Int @default(0) active Boolean @default(true) variants Json? categoryId String? category Category? @relation(fields: [categoryId], references: [id], onDelete: SetNull) createdAt DateTime @default(now()) items OrderItem[] @@index([categoryId]) } model Order { id String @id @default(cuid()) userId String? user User? @relation(fields: [userId], references: [id], onDelete: SetNull) email String status String @default("pending") // pending | paid | shipped | canceled total Int currency String @default("USD") address String provider String @default("mock") providerRef String? @unique items OrderItem[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([userId]) } model OrderItem { id String @id @default(cuid()) orderId String order Order @relation(fields: [orderId], references: [id], onDelete: Cascade) productId String? product Product? @relation(fields: [productId], references: [id], onDelete: SetNull) name String variant String? price Int quantity Int }