generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } model User { id String @id @default(uuid()) username String @unique displayName String @default("") email String? @unique phone String? password String avatar String? bio String? birthday String? createdAt DateTime @default(now()) lastSeen DateTime @default(now()) isOnline Boolean @default(false) hideStoryViews Boolean @default(false) registrationIp String? messages Message[] chatMembers ChatMember[] reactions Reaction[] readReceipts ReadReceipt[] forwardedMessages Message[] @relation("ForwardedFrom") stories Story[] storyViews StoryView[] friendshipsSent Friendship[] @relation("FriendshipsSent") friendshipsReceived Friendship[] @relation("FriendshipsReceived") } model Chat { id String @id @default(uuid()) type String @default("personal") name String? avatar String? createdAt DateTime @default(now()) members ChatMember[] messages Message[] pinnedMessages PinnedMessage[] } model ChatMember { id String @id @default(uuid()) chatId String userId String role String @default("member") joinedAt DateTime @default(now()) isMuted Boolean @default(false) isArchived Boolean @default(false) isPinned Boolean @default(false) clearedAt DateTime? chat Chat @relation(fields: [chatId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([chatId, userId]) } model Message { id String @id @default(uuid()) chatId String senderId String content String? type String @default("text") replyToId String? quote String? forwardedFromId String? isEdited Boolean @default(false) isDeleted Boolean @default(false) scheduledAt DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt chat Chat @relation(fields: [chatId], references: [id], onDelete: Cascade) sender User @relation(fields: [senderId], references: [id]) replyTo Message? @relation("Reply", fields: [replyToId], references: [id]) replies Message[] @relation("Reply") forwardedFrom User? @relation("ForwardedFrom", fields: [forwardedFromId], references: [id]) media Media[] reactions Reaction[] readBy ReadReceipt[] pinnedIn PinnedMessage[] hiddenBy HiddenMessage[] } model Media { id String @id @default(uuid()) messageId String type String url String filename String? thumbnail String? size Int? duration Float? width Int? height Int? message Message @relation(fields: [messageId], references: [id], onDelete: Cascade) } model Reaction { id String @id @default(uuid()) 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]) @@unique([messageId, userId, emoji]) } model ReadReceipt { id String @id @default(uuid()) messageId String userId String readAt DateTime @default(now()) message Message @relation(fields: [messageId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id]) @@unique([messageId, userId]) } model PinnedMessage { id String @id @default(uuid()) chatId String messageId String pinnedAt DateTime @default(now()) chat Chat @relation(fields: [chatId], references: [id], onDelete: Cascade) message Message @relation(fields: [messageId], references: [id], onDelete: Cascade) @@unique([chatId, messageId]) } model Story { id String @id @default(uuid()) userId String type String @default("text") mediaUrl String? content String? bgColor String? createdAt DateTime @default(now()) expiresAt DateTime user User @relation(fields: [userId], references: [id], onDelete: Cascade) views StoryView[] } model StoryView { id String @id @default(uuid()) storyId String userId String viewedAt DateTime @default(now()) story Story @relation(fields: [storyId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id]) @@unique([storyId, userId]) } model HiddenMessage { id String @id @default(uuid()) messageId String userId String hiddenAt DateTime @default(now()) message Message @relation(fields: [messageId], references: [id], onDelete: Cascade) @@unique([messageId, userId]) } model Friendship { id String @id @default(uuid()) userId String friendId String status String @default("pending") // pending | accepted | declined createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user User @relation("FriendshipsSent", fields: [userId], references: [id], onDelete: Cascade) friend User @relation("FriendshipsReceived", fields: [friendId], references: [id], onDelete: Cascade) @@unique([userId, friendId]) }