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]) }