File size: 5,159 Bytes
2c6bb7b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
// 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
}