Files
concord/packages/database/prisma/schema.prisma

235 lines
7.0 KiB
Plaintext

datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client"
output = "../generated"
}
// Enums
enum UserStatus {
online
offline
invisible
dnd
idle
}
enum ChannelType {
voice
text
forum
}
// Core
model User {
id String @id @default(cuid())
username String @unique @db.VarChar(32)
nickname String? @db.VarChar(64)
bio String? @db.VarChar(1024)
picture String? @db.VarChar(2048)
banner String? @db.VarChar(2048)
status UserStatus @default(offline)
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @default(now()) @map("updated_at")
passwordHash String @db.VarChar(255)
isOwner Boolean @default(false)
isAdmin Boolean @default(false)
// Relations
RoleAssign RoleAssign[]
Message Message[]
Reaction Reaction[]
UserPing UserPing[]
Timeout Timeout[]
RefreshToken RefreshToken[]
}
model Server {
id String @id @default(cuid())
name String @unique @db.VarChar(32)
description String? @db.VarChar(1024)
icon String? @db.VarChar(2048)
// FKs
headCategoryId String? @unique @map("head_category_id")
headCategory Category? @relation("ServerHeadCategory", fields: [headCategoryId], references: [id], onUpdate: NoAction, onDelete: SetNull)
// Relations
Category Category[]
Channel Channel[]
Role Role[]
Timeout Timeout[]
}
model Category {
id String @id @default(cuid())
name String @unique @db.VarChar(64)
// FKs (Linked-List)
nextCategoryId String? @unique @map("next_category_id")
nextCategory Category? @relation("CategoryOrder", fields: [nextCategoryId], references: [id], onUpdate: NoAction, onDelete: SetNull)
prevCategory Category? @relation("CategoryOrder")
serverId String @map("server_id")
server Server @relation(fields: [serverId], references: [id], onDelete: Cascade)
headChannelId String? @unique @map("head_channel_id")
headChannel Channel? @relation("CategoryHeadChannel", fields: [headChannelId], references: [id], onUpdate: NoAction, onDelete: SetNull)
// Relations
serverLink Server? @relation("ServerHeadCategory")
}
model Channel {
id String @id @default(cuid())
name String @unique @db.VarChar(64)
description String? @db.VarChar(1024)
type ChannelType @default(text)
// FKs (Linked-List)
nextChannelId String? @unique @map("next_channel_id")
nextChannel Channel? @relation("ChannelOrder", fields: [nextChannelId], references: [id], onUpdate: NoAction, onDelete: SetNull)
prevChannel Channel? @relation("ChannelOrder")
serverId String @map("server_id")
server Server @relation(fields: [serverId], references: [id], onDelete: Cascade)
// Relations
categoryLink Category? @relation("CategoryHeadChannel")
Message Message[]
ChannelPermissions ChannelPermissions[]
}
model Message {
id String @id @default(cuid())
text String @db.VarChar(8096)
createdAt DateTime @default(now())
updatedAt DateTime @default(now())
deletedAt DateTime?
// FKs
channelId String @map("channel_id")
channel Channel @relation(fields: [channelId], references: [id], onDelete: Cascade)
userId String @map("user_id")
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
// Replies
repliesToId String? @map("replies_to_id")
repliesTo Message? @relation("Replies", fields: [repliesToId], references: [id], onUpdate: NoAction, onDelete: SetNull)
replies Message[] @relation("Replies")
// Relations
Reaction Reaction[]
UserPing UserPing[]
RolePing RolePing[]
Attachment Attachment[]
}
model Role {
id String @id @default(cuid())
name String @unique @db.VarChar(64)
canModifyRoles Boolean @default(false)
canCreateChannels Boolean @default(false)
canKickUsers Boolean @default(false)
canTimeout Boolean @default(false)
// FKs
serverId String @map("server_id")
server Server @relation(fields: [serverId], references: [id], onDelete: Cascade)
// Relations
RoleAssign RoleAssign[]
ChannelPermissions ChannelPermissions[]
RolePing RolePing[]
}
// Supporting
model RoleAssign {
// Foreign Keys as composite primary key
userId String @map("user_id")
roleId String @map("role_id")
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
role Role @relation(fields: [roleId], references: [id], onDelete: Cascade)
@@id([userId, roleId])
}
model ChannelPermissions {
id String @id @default(cuid())
channelId String @map("channel_id")
roleId String @map("role_id")
channel Channel @relation(fields: [channelId], references: [id], onDelete: Cascade)
role Role @relation(fields: [roleId], references: [id], onDelete: Cascade)
}
model Reaction {
id String @id @default(cuid())
emoji String
messageId String @map("message_id")
userId String @map("user_id")
message Message @relation(fields: [messageId], references: [id], onDelete: Cascade)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([messageId, userId, emoji])
}
model UserPing {
// Foreign Keys as composite primary key
userId String @map("user_id")
messageId String @map("message_id")
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
message Message @relation(fields: [messageId], references: [id], onDelete: Cascade)
@@id([userId, messageId])
}
model RolePing {
// FKs as composite primary key
roleId String @map("role_id")
messageId String @map("message_id")
role Role @relation(fields: [roleId], references: [id], onDelete: Cascade)
message Message @relation(fields: [messageId], references: [id], onDelete: Cascade)
@@id([roleId, messageId])
}
model Attachment {
id String @id @default(cuid())
url String @db.VarChar(2000)
fileName String @map("file_name") @db.VarChar(255)
mimeType String @map("mime_type") @db.VarChar(64)
size Int
// FKs
messageId String @map("message_id")
message Message @relation(fields: [messageId], references: [id], onDelete: Cascade)
}
model Timeout {
timeoutUntil DateTime @map("timeout_until")
description String? @db.VarChar(1000)
// FKs
userId String @map("user_id")
serverId String @map("server_id")
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
server Server @relation(fields: [serverId], references: [id], onDelete: Cascade)
@@id([userId, serverId])
}
model RefreshToken {
id String @id @default(cuid())
tokenHash String @unique @db.VarChar(255)
createdAt DateTime @default(now())
expiresAt DateTime
device String? @db.VarChar(255)
// FKs
userId String @map("user_id")
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
}