eretrrefvdsfd / server /prisma /schema.prisma
cnmksjs's picture
Upload 59 files
2c6bb7b verified
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id String @id @default(cuid())
email String @unique
username String @unique
displayName String
password String
avatar String?
bio String?
isOnline Boolean @default(false)
lastSeen DateTime @default(now())
isAdmin Boolean @default(false)
isVerified Boolean @default(false)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
// Relations
sentMessages Message[] @relation("MessageSender")
chatParticipants ChatParticipant[]
messageReactions MessageReaction[]
ownedGroups Group[] @relation("GroupOwner")
notifications Notification[]
userSessions UserSession[]
@@map("users")
}
model Chat {
id String @id @default(cuid())
type ChatType @default(DIRECT)
name String?
description String?
avatar String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
// Relations
participants ChatParticipant[]
messages Message[]
group Group?
@@map("chats")
}
model ChatParticipant {
id String @id @default(cuid())
chatId String
userId String
role ParticipantRole @default(MEMBER)
permissions Json?
joinedAt DateTime @default(now())
leftAt DateTime?
// Relations
chat Chat @relation(fields: [chatId], references: [id], onDelete: Cascade)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([chatId, userId])
@@map("chat_participants")
}
model Message {
id String @id @default(cuid())
chatId String
senderId String
content String
type MessageType @default(TEXT)
replyToId String?
isEdited Boolean @default(false)
isDeleted Boolean @default(false)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
// Relations
chat Chat @relation(fields: [chatId], references: [id], onDelete: Cascade)
sender User @relation("MessageSender", fields: [senderId], references: [id], onDelete: Cascade)
replyTo Message? @relation("MessageReply", fields: [replyToId], references: [id])
replies Message[] @relation("MessageReply")
attachments MessageAttachment[]
reactions MessageReaction[]
@@map("messages")
}
model MessageAttachment {
id String @id @default(cuid())
messageId String
type String
name String
url String
size Int
mimeType String
thumbnail String?
// Relations
message Message @relation(fields: [messageId], references: [id], onDelete: Cascade)
@@map("message_attachments")
}
model MessageReaction {
id String @id @default(cuid())
messageId String
userId String
emoji String
createdAt DateTime @default(now())
// Relations
message Message @relation(fields: [messageId], references: [id], onDelete: Cascade)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([messageId, userId, emoji])
@@map("message_reactions")
}
model Group {
id String @id @default(cuid())
chatId String @unique
name String
description String?
avatar String?
type GroupType @default(PRIVATE)
maxMembers Int @default(100)
ownerId String
settings Json?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
// Relations
chat Chat @relation(fields: [chatId], references: [id], onDelete: Cascade)
owner User @relation("GroupOwner", fields: [ownerId], references: [id])
@@map("groups")
}
model Notification {
id String @id @default(cuid())
userId String
type NotificationType
title String
content String
data Json?
isRead Boolean @default(false)
createdAt DateTime @default(now())
// Relations
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@map("notifications")
}
model UserSession {
id String @id @default(cuid())
userId String
token String @unique
userAgent String?
ipAddress String?
expiresAt DateTime
createdAt DateTime @default(now())
// Relations
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@map("user_sessions")
}
// Enums
enum ChatType {
DIRECT
GROUP
}
enum ParticipantRole {
MEMBER
ADMIN
OWNER
}
enum MessageType {
TEXT
IMAGE
FILE
AUDIO
VIDEO
SYSTEM
}
enum GroupType {
PUBLIC
PRIVATE
}
enum NotificationType {
MESSAGE
MENTION
GROUP_INVITE
SYSTEM
}