xLog/prisma/schema.prisma

136 lines
3.8 KiB
Plaintext

// 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")
}