Files
concord/concord-server/schema.prisma
2025-09-28 00:41:42 -04:00

135 lines
3.7 KiB
Plaintext

generator client {
provider = "prisma-client-js"
}
generator zod {
provider = "prisma-zod-generator"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model Instance {
id String @id @default(uuid(7))
name String
icon String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
Role Role[]
Category Category[]
}
model User {
id String @id @default(uuid(7))
username String
nickname String?
bio String?
picture String?
banner String?
admin Boolean
status String // online/offline/dnd/idle/invis
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
Role Role[]
UserAuth UserAuth?
Message Message[]
MessagePing MessagePing[]
}
model Role {
User User @relation(fields: [userId], references: [id])
userId String
Instance Instance @relation(fields: [instanceId], references: [id])
instanceId String
type String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@unique([userId, instanceId])
}
model UserAuth {
User User @relation(fields: [userId], references: [id])
userId String
password String // HASHED PASSWORD AS STRING USING SHA-256
token String? // current user token
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@unique([userId])
}
model Category {
id String @id @default(uuid(7))
Instance Instance? @relation(fields: [instanceId], references: [id])
instanceId String?
name String
position Int
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
Channel Channel[]
}
model Channel {
id String @id @default(uuid(7))
type String
Category Category? @relation(fields: [categoryId], references: [id])
categoryId String?
name String
description String
pinnedId String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
Message Message[]
ChannelPin ChannelPin?
}
model ChannelPin {
messageId String @unique
channelId String @unique
Message Message @relation(fields: [messageId], references: [id])
Channel Channel @relation(fields: [channelId], references: [id])
createdAt DateTime @default(now())
@@unique([messageId, channelId])
}
model Message {
id String @id @default(uuid(7))
Channel Channel @relation(fields: [channelId], references: [id])
channelId String
User User @relation(fields: [userId], references: [id])
userId String
deleted Boolean
text String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
replies Reply? @relation("MessageToReply")
repliedTo Reply? @relation("ReplyToMessage")
MessagePing MessagePing[]
ChannelPin ChannelPin?
}
model Reply {
message Message @relation("MessageToReply", fields: [messageId], references: [id]) //message text
messageId String @unique //message id of the reply
repliesTo Message @relation("ReplyToMessage", fields: [repliesToId], references: [id]) //message id that this message replies to
repliesToId String @unique //replies to this message id
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@unique([messageId, repliesToId])
}
model MessagePing {
Message Message @relation(fields: [messageId], references: [id])
messageId String
PingsUser User @relation(fields: [pingsUserId], references: [id])
pingsUserId String
createdAt DateTime @default(now())
@@unique([messageId, pingsUserId])
}