Files
msgr/messenger-server/prisma/schema.prisma
2026-06-23 12:04:01 +03:00

356 lines
8.7 KiB
Plaintext

generator client {
provider = "prisma-client"
output = "../generated/prisma"
}
datasource db {
provider = "sqlite"
}
enum SenderType {
USER
CHANNEL
BOT
}
enum ChannelType {
PUBLIC
PRIVATE
}
enum ConversationType {
DIRECT
GROUP
CHANNEL
}
enum ConversationRole {
OWNER
ADMIN
MEMBER
}
enum GroupType {
PUBLIC
PRIVATE
}
model Sender {
id BigInt @id
type SenderType
userId BigInt? @unique
channelId BigInt? @unique
botId BigInt? @unique
user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
channel Channel? @relation(fields: [channelId], references: [id], onDelete: Cascade)
messages Message[]
}
model User {
id BigInt @id
firstName String @default("")
lastName String?
bio String?
username String? @unique
login String @unique
password String
dateOfBirth BigInt?
sender Sender?
chats Chat[]
sessions Session[]
conversationMembers ConversationMember[]
messageReads MessageRead[]
ownedGroups Group[]
groupMemberships GroupMember[]
groupBlackLists GroupBlackList[]
ownedChannels Channel[]
channelSubscriptions ChannelSubscriber[]
privacySettings PrivacySettings?
channelBlackLists ChannelBlackList[]
kanbanBoards KanbanBoard[]
}
model Session {
id Int @id @default(autoincrement())
userId BigInt
token String @unique
fcmToken String?
deviceModel String
osVersion String
osName String
createdAt BigInt
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([userId, token])
@@index([userId])
}
model Message {
id Int @id @default(autoincrement())
sequenceId BigInt
conversationId Int
text String?
sendTime BigInt
editedAt BigInt?
isRead Boolean @default(false)
deletedBySender Boolean @default(false)
deletedByReceiver Boolean @default(false)
senderId BigInt
sender Sender @relation(fields: [senderId], references: [id], onDelete: Cascade)
conversation Conversation @relation(fields: [conversationId], references: [id], onDelete: Cascade)
readReceipts MessageRead[]
files File[]
kanbanBoardId Int?
kanbanBoard KanbanBoard? @relation(fields: [kanbanBoardId], references: [id], onDelete: SetNull)
kanbanTaskId Int?
kanbanTask KanbanTask? @relation(fields: [kanbanTaskId], references: [id], onDelete: SetNull)
@@unique([conversationId, sequenceId])
@@index([conversationId, sendTime])
@@index([senderId])
@@index([kanbanBoardId])
@@index([kanbanTaskId])
}
model KanbanBoard {
id Int @id @default(autoincrement())
ownerId BigInt
title String
createdAt BigInt
updatedAt BigInt
owner User @relation(fields: [ownerId], references: [id], onDelete: Cascade)
columns KanbanColumn[]
messages Message[]
@@index([ownerId])
}
model KanbanColumn {
id Int @id @default(autoincrement())
boardId Int
title String
position Int
board KanbanBoard @relation(fields: [boardId], references: [id], onDelete: Cascade)
tasks KanbanTask[]
@@index([boardId, position])
}
model KanbanTask {
id Int @id @default(autoincrement())
columnId Int
title String
description String?
position Int
createdAt BigInt
updatedAt BigInt
column KanbanColumn @relation(fields: [columnId], references: [id], onDelete: Cascade)
messages Message[]
@@index([columnId, position])
}
model File {
id String @id @default(uuid())
name String
size BigInt
mimeType String
path String
status FileStatus @default(PENDING)
createdAt BigInt
updatedAt BigInt
messageId Int?
message Message? @relation(fields: [messageId], references: [id], onDelete: Cascade)
@@index([messageId])
@@index([status])
}
enum FileStatus {
PENDING
COMPLETED
FAILED
}
model MessageRead {
id Int @id @default(autoincrement())
messageId Int
userId BigInt
readAt BigInt
message Message @relation(fields: [messageId], references: [id], onDelete: Cascade)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([messageId, userId])
@@index([userId, readAt])
}
model Conversation {
id Int @id @default(autoincrement())
type ConversationType
createdAt BigInt
groupId BigInt? @unique
channelId BigInt? @unique
group Group? @relation(fields: [groupId], references: [id], onDelete: Cascade)
channel Channel? @relation(fields: [channelId], references: [id], onDelete: Cascade)
members ConversationMember[]
messages Message[]
chats Chat[]
inviteLinks InviteLink[]
}
model ConversationMember {
id Int @id @default(autoincrement())
conversationId Int
userId BigInt
role ConversationRole @default(MEMBER)
joinedAt BigInt
conversation Conversation @relation(fields: [conversationId], references: [id], onDelete: Cascade)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([conversationId, userId])
@@index([userId])
@@index([conversationId])
}
model Chat {
id Int @id @default(autoincrement())
userId BigInt
conversationId Int
isPinned Boolean @default(false)
isArchived Boolean @default(false)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
conversation Conversation @relation(fields: [conversationId], references: [id], onDelete: Cascade)
@@unique([userId, conversationId])
@@index([userId])
@@index([conversationId])
}
model Channel {
id BigInt @id
name String
bio String?
ownerId BigInt
channelType ChannelType @default(PRIVATE)
username String? @unique
sender Sender?
owner User @relation(fields: [ownerId], references: [id], onDelete: Cascade)
subscribers ChannelSubscriber[]
blockedUsers ChannelBlackList[]
conversations Conversation[]
}
model ChannelSubscriber {
id Int @id @default(autoincrement())
userId BigInt
channelId BigInt
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
channel Channel @relation(fields: [channelId], references: [id], onDelete: Cascade)
@@unique([userId, channelId])
@@index([userId])
@@index([channelId])
}
model ChannelBlackList {
id Int @id @default(autoincrement())
userId BigInt
channelId BigInt
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
channel Channel @relation(fields: [channelId], references: [id], onDelete: Cascade)
@@unique([userId, channelId])
}
model Group {
id BigInt @id
ownerId BigInt
name String
username String? @unique
bio String?
groupType GroupType @default(PRIVATE)
owner User @relation(fields: [ownerId], references: [id], onDelete: Cascade)
members GroupMember[]
blocked GroupBlackList[]
conversations Conversation[]
}
model GroupMember {
id Int @id @default(autoincrement())
groupId BigInt
userId BigInt
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
group Group @relation(fields: [groupId], references: [id], onDelete: Cascade)
@@unique([groupId, userId])
@@index([userId])
@@index([groupId])
}
model GroupBlackList {
id Int @id @default(autoincrement())
userId BigInt
groupId BigInt
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
group Group @relation(fields: [groupId], references: [id], onDelete: Cascade)
@@unique([userId, groupId])
}
model InviteLink {
id BigInt @id
code String @unique
conversationId Int
creatorId BigInt
maxUses Int?
uses Int @default(0)
expiresAt BigInt?
conversation Conversation @relation(fields: [conversationId], references: [id], onDelete: Cascade)
}
model PrivacySettings {
id Int @id @default(autoincrement())
userId BigInt @unique
lastSeen Int
messages Int
bio Int
dateOfBirth Int
invites Int
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
}