// This is your Prisma schema file, // learn more about it in the docs: https://pris.ly/d/prisma-schema datasource db { provider = "postgresql" url = env("DATABASE_URL") } generator client { provider = "prisma-client-js" } model User { id String @id @default(uuid()) name String username String @unique email String @unique emailVerified DateTime? avatar String? bio String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime? memberships Membership[] accessTokens AccessToken[] authoredPages Page[] @@map("users") } model LoginToken { id String @id @default(uuid()) email String expiresAt DateTime // When the login token is creating by submitting the `subscribe` form // We store extra info here, like `{email: true}` subscribeForm Json? @@map("login_tokens") } model AccessToken { id String @id @default(uuid()) createdAt DateTime @default(now()) name String token String @unique user User @relation(fields: [userId], references: [id], onDelete: Cascade) userId String // Allow to get the access token via publicId in /api/login-complete publicId String? @unique publicIdExpiresAt DateTime? @@map("access_tokens") } enum MembershipRole { // The creator OWNER // The admins ADMIN // The subscribers SUBSCRIBER } model Membership { id String @id @default(uuid()) createdAt DateTime @default(now()) user User @relation(fields: [userId], references: [id], onDelete: Cascade) site Site @relation(fields: [siteId], references: [id], onDelete: Cascade) userId String siteId String role MembershipRole acceptedAt DateTime? // Last time the user switched to this membership using the site switcher in the dashboard lastSwitchedTo DateTime @default(now()) config Json @default("{}") @@map("memberships") } model Site { id String @id @default(uuid()) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt name String icon String? subdomain String @unique pages Page[] @relation(name: "SitePages") description String? twitter String? navigation Json? deletedAt DateTime? memberships Membership[] analyticsId String? @unique @@map("sites") } enum PageType { POST PAGE } enum PageEmailStatus { PENDING RUNNING SUCCESS FAILED } model Page { id String @id @default(uuid()) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt contentUpdatedAt DateTime @default(now()) publishedAt DateTime @default(now()) published Boolean @default(false) type PageType @default(POST) title String content String excerpt String? format String @default("markdown") slug String site Site @relation(name: "SitePages", fields: [siteId], references: [id], onDelete: Cascade) siteId String deletedAt DateTime? authors User[] // prerendered markdown to html, including extra data like excerpt rendered Json? emailSubject String? emailStatus PageEmailStatus? @@unique([siteId, slug]) @@map("pages") }