136 lines
3.8 KiB
Plaintext
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")
|
|
}
|