|
|
|
|
|
|
|
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 |
|
|
|
|
|
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 |
|
|
|
|
|
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? |
|
|
|
|
|
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 |
|
|
|
|
|
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? |
|
|
|
|
|
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()) |
|
|
|
|
|
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 |
|
|
|
|
|
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()) |
|
|
|
|
|
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()) |
|
|
|
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade) |
|
|
|
@@map("user_sessions") |
|
} |
|
|
|
|
|
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 |
|
} |
|
|