Skip to content

Commit 16fcf49

Browse files
authored
Merge pull request #385 from PromptPlace/feat/#383
[FEAT] 채팅 관련 스키마 생성
2 parents 959e47f + 00591c2 commit 16fcf49

File tree

2 files changed

+182
-0
lines changed

2 files changed

+182
-0
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
-- CreateTable
2+
CREATE TABLE `ChatRoom` (
3+
`room_id` INTEGER NOT NULL AUTO_INCREMENT,
4+
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
5+
`last_message_id` INTEGER NULL,
6+
`user_id1` INTEGER NOT NULL,
7+
`user_id2` INTEGER NOT NULL,
8+
9+
UNIQUE INDEX `ChatRoom_last_message_id_key`(`last_message_id`),
10+
UNIQUE INDEX `ChatRoom_user_id1_user_id2_key`(`user_id1`, `user_id2`),
11+
PRIMARY KEY (`room_id`)
12+
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
13+
14+
-- CreateTable
15+
CREATE TABLE `ChatMessage` (
16+
`message_id` INTEGER NOT NULL AUTO_INCREMENT,
17+
`content` TEXT NULL,
18+
`sent_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
19+
`sender_id` INTEGER NOT NULL,
20+
`room_id` INTEGER NOT NULL,
21+
22+
PRIMARY KEY (`message_id`)
23+
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
24+
25+
-- CreateTable
26+
CREATE TABLE `ChatParticipant` (
27+
`chat_participant_id` INTEGER NOT NULL AUTO_INCREMENT,
28+
`is_pinned` BOOLEAN NOT NULL DEFAULT false,
29+
`left_at` DATETIME(3) NULL,
30+
`room_id` INTEGER NOT NULL,
31+
`user_id` INTEGER NOT NULL,
32+
`last_read_message_id` INTEGER NULL,
33+
34+
UNIQUE INDEX `ChatParticipant_room_id_user_id_key`(`room_id`, `user_id`),
35+
PRIMARY KEY (`chat_participant_id`)
36+
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
37+
38+
-- CreateTable
39+
CREATE TABLE `UserBlock` (
40+
`block_id` INTEGER NOT NULL AUTO_INCREMENT,
41+
`blocked_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
42+
`blocker_id` INTEGER NOT NULL,
43+
`blocked_id` INTEGER NOT NULL,
44+
45+
UNIQUE INDEX `UserBlock_blocker_id_blocked_id_key`(`blocker_id`, `blocked_id`),
46+
PRIMARY KEY (`block_id`)
47+
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
48+
49+
-- CreateTable
50+
CREATE TABLE `Attachment` (
51+
`attachment_id` INTEGER NOT NULL AUTO_INCREMENT,
52+
`message_id` INTEGER NOT NULL,
53+
`url` TEXT NOT NULL,
54+
`type` ENUM('IMAGE', 'FILE') NOT NULL,
55+
`name` VARCHAR(191) NOT NULL,
56+
`size` INTEGER NOT NULL,
57+
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
58+
59+
INDEX `Attachment_message_id_idx`(`message_id`),
60+
PRIMARY KEY (`attachment_id`)
61+
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
62+
63+
-- AddForeignKey
64+
ALTER TABLE `ChatRoom` ADD CONSTRAINT `ChatRoom_last_message_id_fkey` FOREIGN KEY (`last_message_id`) REFERENCES `ChatMessage`(`message_id`) ON DELETE SET NULL ON UPDATE CASCADE;
65+
66+
-- AddForeignKey
67+
ALTER TABLE `ChatRoom` ADD CONSTRAINT `ChatRoom_user_id1_fkey` FOREIGN KEY (`user_id1`) REFERENCES `User`(`user_id`) ON DELETE RESTRICT ON UPDATE CASCADE;
68+
69+
-- AddForeignKey
70+
ALTER TABLE `ChatRoom` ADD CONSTRAINT `ChatRoom_user_id2_fkey` FOREIGN KEY (`user_id2`) REFERENCES `User`(`user_id`) ON DELETE RESTRICT ON UPDATE CASCADE;
71+
72+
-- AddForeignKey
73+
ALTER TABLE `ChatMessage` ADD CONSTRAINT `ChatMessage_sender_id_fkey` FOREIGN KEY (`sender_id`) REFERENCES `User`(`user_id`) ON DELETE RESTRICT ON UPDATE CASCADE;
74+
75+
-- AddForeignKey
76+
ALTER TABLE `ChatMessage` ADD CONSTRAINT `ChatMessage_room_id_fkey` FOREIGN KEY (`room_id`) REFERENCES `ChatRoom`(`room_id`) ON DELETE CASCADE ON UPDATE CASCADE;
77+
78+
-- AddForeignKey
79+
ALTER TABLE `ChatParticipant` ADD CONSTRAINT `ChatParticipant_room_id_fkey` FOREIGN KEY (`room_id`) REFERENCES `ChatRoom`(`room_id`) ON DELETE CASCADE ON UPDATE CASCADE;
80+
81+
-- AddForeignKey
82+
ALTER TABLE `ChatParticipant` ADD CONSTRAINT `ChatParticipant_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `User`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
83+
84+
-- AddForeignKey
85+
ALTER TABLE `ChatParticipant` ADD CONSTRAINT `ChatParticipant_last_read_message_id_fkey` FOREIGN KEY (`last_read_message_id`) REFERENCES `ChatMessage`(`message_id`) ON DELETE SET NULL ON UPDATE CASCADE;
86+
87+
-- AddForeignKey
88+
ALTER TABLE `UserBlock` ADD CONSTRAINT `UserBlock_blocker_id_fkey` FOREIGN KEY (`blocker_id`) REFERENCES `User`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
89+
90+
-- AddForeignKey
91+
ALTER TABLE `UserBlock` ADD CONSTRAINT `UserBlock_blocked_id_fkey` FOREIGN KEY (`blocked_id`) REFERENCES `User`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
92+
93+
-- AddForeignKey
94+
ALTER TABLE `Attachment` ADD CONSTRAINT `Attachment_message_id_fkey` FOREIGN KEY (`message_id`) REFERENCES `ChatMessage`(`message_id`) ON DELETE CASCADE ON UPDATE CASCADE;

prisma/schema.prisma

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,14 @@ model User {
4444
UserBankAccount UserBankAccount?
4545
notificationSetting UserNotificationSetting?
4646
consents UserConsent[]
47+
chatRoomAs1 ChatRoom[] @relation("ChatUser1")
48+
chatRoomAs2 ChatRoom[] @relation("ChatUser2")
49+
sentChatMessages ChatMessage[] @relation("UserSentMessages")
50+
chatParticipants ChatParticipant[]
51+
blocks UserBlock[] @relation("BlockerUser")
52+
blockedBy UserBlock[] @relation("BlockedUser")
53+
54+
4755
}
4856

4957
model UserConsent {
@@ -467,6 +475,81 @@ model UserBankAccount {
467475
@@unique([preregistered_id, user_id], map: "uniq_userbank_prereg_user")
468476
}
469477

478+
model ChatRoom {
479+
room_id Int @id @default(autoincrement())
480+
created_at DateTime @default(now())
481+
last_message_id Int? @unique
482+
user_id1 Int
483+
user_id2 Int
484+
485+
lastMessage ChatMessage? @relation("lastMessage", fields: [last_message_id], references: [message_id], onDelete: SetNull)
486+
user1 User @relation("ChatUser1", fields: [user_id1], references: [user_id])
487+
user2 User @relation("ChatUser2", fields: [user_id2], references: [user_id])
488+
489+
@@unique([user_id1, user_id2]) // 두 유저간 채팅방은 유일
490+
491+
messages ChatMessage[] @relation("RoomMessages")
492+
participants ChatParticipant[] @relation("RoomParticipants")
493+
}
494+
495+
model ChatMessage {
496+
message_id Int @id @default(autoincrement())
497+
content String? @db.Text
498+
sent_at DateTime @default(now())
499+
sender_id Int
500+
room_id Int
501+
502+
user User @relation("UserSentMessages", fields: [sender_id], references: [user_id])
503+
chatRoom ChatRoom @relation("RoomMessages", fields: [room_id], references: [room_id], onDelete: Cascade)
504+
505+
lastMessageOf ChatRoom? @relation("lastMessage")
506+
readByParticipants ChatParticipant[] @relation("LastReadMessage")
507+
508+
attachments Attachment[]
509+
}
510+
511+
model ChatParticipant {
512+
chat_participant_id Int @id @default(autoincrement())
513+
is_pinned Boolean @default(false)
514+
left_at DateTime?
515+
room_id Int
516+
user_id Int
517+
last_read_message_id Int?
518+
519+
chatRoom ChatRoom @relation("RoomParticipants", fields: [room_id], references: [room_id], onDelete: Cascade)
520+
user User @relation(fields: [user_id], references: [user_id], onDelete: Cascade)
521+
lastReadMessage ChatMessage? @relation("LastReadMessage", fields: [last_read_message_id], references: [message_id], onDelete: SetNull)
522+
523+
@@unique([room_id, user_id])
524+
}
525+
526+
model UserBlock {
527+
block_id Int @id @default(autoincrement())
528+
blocked_at DateTime @default(now())
529+
blocker_id Int
530+
blocked_id Int
531+
532+
@@unique([blocker_id, blocked_id])
533+
534+
blockerUser User @relation("BlockerUser", fields: [blocker_id], references: [user_id], onDelete: Cascade)
535+
blockedUser User @relation("BlockedUser", fields: [blocked_id], references: [user_id], onDelete: Cascade)
536+
537+
}
538+
539+
model Attachment {
540+
attachment_id Int @id @default(autoincrement())
541+
message_id Int
542+
url String @db.Text
543+
type AttachmentType
544+
name String
545+
size Int
546+
created_at DateTime @default(now())
547+
548+
attachmentMessage ChatMessage @relation(fields: [message_id], references: [message_id], onDelete: Cascade)
549+
550+
@@index([message_id])
551+
}
552+
470553
enum Status {
471554
Pending
472555
Succeed
@@ -513,4 +596,9 @@ enum userStatus {
513596
active
514597
banned
515598
deleted
599+
}
600+
601+
enum AttachmentType {
602+
IMAGE
603+
FILE
516604
}

0 commit comments

Comments
 (0)