From 8a5cb53e797bb652eb3a8470ecc8f00d9442c264 Mon Sep 17 00:00:00 2001 From: Arin0303 Date: Mon, 19 Jan 2026 01:25:47 +0900 Subject: [PATCH 1/7] =?UTF-8?q?feat:=20ChatRoom=20=EB=AA=A8=EB=8D=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- prisma/schema.prisma | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 8c6fd8c..69e1954 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -44,6 +44,9 @@ model User { UserBankAccount UserBankAccount? notificationSetting UserNotificationSetting? consents UserConsent[] + chatRoomAs1 ChatRoom[] @relation("ChatUser1") + chatRoomAs2 ChatRoom[] @relation("ChatUser2") + } model UserConsent { @@ -467,6 +470,20 @@ model UserBankAccount { @@unique([preregistered_id, user_id], map: "uniq_userbank_prereg_user") } +model ChatRoom { + room_id Int @id @default(autoincrement()) + created_at DateTime @default(now()) + last_message_id Int? @unique + user_id1 Int + user_id2 Int + + chatMessage ChatMessage @relation(fields: [last_message_id], references: [message_id]) + user1 User @relation("ChatUser1", fields: [user_id1], references: [user_id]) + user2 User @relation("ChatUser2", fields: [user_id2], references: [user_id]) + + @@unique([user_id1, user_id2]) // 두 유저간 채팅방은 유일 +} + enum Status { Pending Succeed From 646481214776a1dfdf1e15a06cc16a222dcb5a1e Mon Sep 17 00:00:00 2001 From: Arin0303 Date: Mon, 19 Jan 2026 02:01:09 +0900 Subject: [PATCH 2/7] =?UTF-8?q?feat:=20ChatRoom=20=EB=AA=A8=EB=8D=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95,=20ChatMessage=20=EB=AA=A8=EB=8D=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- prisma/schema.prisma | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 69e1954..913c737 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -46,7 +46,7 @@ model User { consents UserConsent[] chatRoomAs1 ChatRoom[] @relation("ChatUser1") chatRoomAs2 ChatRoom[] @relation("ChatUser2") - + sentChatMessages ChatMessage[] @relation("UserSentMessages") } model UserConsent { @@ -477,13 +477,29 @@ model ChatRoom { user_id1 Int user_id2 Int - chatMessage ChatMessage @relation(fields: [last_message_id], references: [message_id]) + lastMessage ChatMessage? @relation("lastMessage", fields: [last_message_id], references: [message_id]) user1 User @relation("ChatUser1", fields: [user_id1], references: [user_id]) user2 User @relation("ChatUser2", fields: [user_id2], references: [user_id]) @@unique([user_id1, user_id2]) // 두 유저간 채팅방은 유일 + + messages ChatMessage[] @relation("RoomMessages") } +model ChatMessage { + message_id Int @id @default(autoincrement()) + content String? + sent_at DateTime @default(now()) + sender_id Int + room_id Int + + user User @relation("UserSentMessages", fields: [sender_id], references: [user_id]) + chatRoom ChatRoom @relation("RoomMessages", fields: [room_id], references: [room_id]) + + lastMessageOf ChatRoom? @relation("lastMessage") +} + + enum Status { Pending Succeed From 6b305f8da6fe66330cf63597bdef174200f01c14 Mon Sep 17 00:00:00 2001 From: Arin0303 Date: Mon, 19 Jan 2026 02:33:02 +0900 Subject: [PATCH 3/7] =?UTF-8?q?feat:=20ChatParticipant=20=EB=AA=A8?= =?UTF-8?q?=EB=8D=B8=20=EC=9E=91=EC=84=B1,=20=EA=B0=81=20=EB=AA=A8?= =?UTF-8?q?=EB=8D=B8=EB=B3=84=20Cascade=20=EC=84=A4=EC=A0=95=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- prisma/schema.prisma | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 913c737..2318657 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -47,6 +47,7 @@ model User { chatRoomAs1 ChatRoom[] @relation("ChatUser1") chatRoomAs2 ChatRoom[] @relation("ChatUser2") sentChatMessages ChatMessage[] @relation("UserSentMessages") + chatParticipants ChatParticipant[] } model UserConsent { @@ -477,26 +478,43 @@ model ChatRoom { user_id1 Int user_id2 Int - lastMessage ChatMessage? @relation("lastMessage", fields: [last_message_id], references: [message_id]) + lastMessage ChatMessage? @relation("lastMessage", fields: [last_message_id], references: [message_id], onDelete: SetNull) user1 User @relation("ChatUser1", fields: [user_id1], references: [user_id]) user2 User @relation("ChatUser2", fields: [user_id2], references: [user_id]) @@unique([user_id1, user_id2]) // 두 유저간 채팅방은 유일 messages ChatMessage[] @relation("RoomMessages") + participants ChatParticipant[] @relation("RoomParticipants") } model ChatMessage { message_id Int @id @default(autoincrement()) - content String? + content String? @db.Text sent_at DateTime @default(now()) sender_id Int room_id Int user User @relation("UserSentMessages", fields: [sender_id], references: [user_id]) - chatRoom ChatRoom @relation("RoomMessages", fields: [room_id], references: [room_id]) + chatRoom ChatRoom @relation("RoomMessages", fields: [room_id], references: [room_id], onDelete: Cascade) lastMessageOf ChatRoom? @relation("lastMessage") + readByParticipants ChatParticipant[] @relation("LastReadMessage") +} + +model ChatParticipant { + chat_participant_id Int @id @default(autoincrement()) + is_pinned Boolean @default(false) + left_at DateTime? + room_id Int + user_id Int + last_read_message_id Int? + + chatRoom ChatRoom @relation("RoomParticipants", fields: [room_id], references: [room_id], onDelete: Cascade) + user User @relation(fields: [user_id], references: [user_id], onDelete: Cascade) + lastReadMessage ChatMessage? @relation("LastReadMessage", fields: [last_read_message_id], references: [message_id], onDelete: SetNull) + + @@unique([room_id, user_id]) } From 0805a6a8907a27ab616484b5f1865c4cafaecf10 Mon Sep 17 00:00:00 2001 From: Arin0303 Date: Mon, 19 Jan 2026 02:46:46 +0900 Subject: [PATCH 4/7] =?UTF-8?q?feat:=20UserBlock=20=EB=AA=A8=EB=8D=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- prisma/schema.prisma | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 2318657..6b9cf64 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -48,6 +48,10 @@ model User { chatRoomAs2 ChatRoom[] @relation("ChatUser2") sentChatMessages ChatMessage[] @relation("UserSentMessages") chatParticipants ChatParticipant[] + blocks UserBlock[] @relation("BlockerUser") + blockedBy UserBlock[] @relation("BlockedUser") + + } model UserConsent { @@ -517,6 +521,18 @@ model ChatParticipant { @@unique([room_id, user_id]) } +model UserBlock { + block_id Int @id @default(autoincrement()) + blocked_at DateTime @default(now()) + blocker_id Int + blocked_id Int + + @@unique([blocker_id, blocked_id]) + + blockerUser User @relation("BlockerUser", fields: [blocker_id], references: [user_id], onDelete: Cascade) + blockedUser User @relation("BlockedUser", fields: [blocked_id], references: [user_id], onDelete: Cascade) + +} enum Status { Pending From 7bfc264b1ee315028ab6a98c0bead83fee40dadc Mon Sep 17 00:00:00 2001 From: Arin0303 Date: Mon, 19 Jan 2026 02:57:57 +0900 Subject: [PATCH 5/7] =?UTF-8?q?feat:=20Attachment=20=EB=AA=A8=EB=8D=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- prisma/schema.prisma | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 6b9cf64..c869a6b 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -504,6 +504,8 @@ model ChatMessage { lastMessageOf ChatRoom? @relation("lastMessage") readByParticipants ChatParticipant[] @relation("LastReadMessage") + + attachments Attachment[] } model ChatParticipant { @@ -534,6 +536,20 @@ model UserBlock { } +model Attachment { + attachment_id Int @id @default(autoincrement()) + message_id Int + url String @db.Text + type AttachmentType + name String + size Int + created_at DateTime @default(now()) + + attachmentMessage ChatMessage @relation(fields: [message_id], references: [message_id], onDelete: Cascade) + + @@index([message_id]) +} + enum Status { Pending Succeed @@ -580,4 +596,9 @@ enum userStatus { active banned deleted +} + +enum AttachmentType { + IMAGE, + FILE } \ No newline at end of file From d9515f5a29789a641fc1f9a898f720289d24afc2 Mon Sep 17 00:00:00 2001 From: Arin0303 Date: Mon, 19 Jan 2026 03:05:26 +0900 Subject: [PATCH 6/7] =?UTF-8?q?fix:=20=EB=AC=B8=EB=B2=95=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- prisma/schema.prisma | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index c869a6b..f35ebf8 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -599,6 +599,6 @@ enum userStatus { } enum AttachmentType { - IMAGE, + IMAGE FILE } \ No newline at end of file From 00591c281afac75ecd47da887fdc02305edf8ea5 Mon Sep 17 00:00:00 2001 From: Arin0303 Date: Mon, 19 Jan 2026 03:06:04 +0900 Subject: [PATCH 7/7] =?UTF-8?q?feat:=20db=20=EB=A7=88=EC=9D=B4=EA=B7=B8?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=85=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migration.sql | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 prisma/migrations/20260118180043_add_chat_models/migration.sql diff --git a/prisma/migrations/20260118180043_add_chat_models/migration.sql b/prisma/migrations/20260118180043_add_chat_models/migration.sql new file mode 100644 index 0000000..9d1ccba --- /dev/null +++ b/prisma/migrations/20260118180043_add_chat_models/migration.sql @@ -0,0 +1,94 @@ +-- CreateTable +CREATE TABLE `ChatRoom` ( + `room_id` INTEGER NOT NULL AUTO_INCREMENT, + `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `last_message_id` INTEGER NULL, + `user_id1` INTEGER NOT NULL, + `user_id2` INTEGER NOT NULL, + + UNIQUE INDEX `ChatRoom_last_message_id_key`(`last_message_id`), + UNIQUE INDEX `ChatRoom_user_id1_user_id2_key`(`user_id1`, `user_id2`), + PRIMARY KEY (`room_id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `ChatMessage` ( + `message_id` INTEGER NOT NULL AUTO_INCREMENT, + `content` TEXT NULL, + `sent_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `sender_id` INTEGER NOT NULL, + `room_id` INTEGER NOT NULL, + + PRIMARY KEY (`message_id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `ChatParticipant` ( + `chat_participant_id` INTEGER NOT NULL AUTO_INCREMENT, + `is_pinned` BOOLEAN NOT NULL DEFAULT false, + `left_at` DATETIME(3) NULL, + `room_id` INTEGER NOT NULL, + `user_id` INTEGER NOT NULL, + `last_read_message_id` INTEGER NULL, + + UNIQUE INDEX `ChatParticipant_room_id_user_id_key`(`room_id`, `user_id`), + PRIMARY KEY (`chat_participant_id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `UserBlock` ( + `block_id` INTEGER NOT NULL AUTO_INCREMENT, + `blocked_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `blocker_id` INTEGER NOT NULL, + `blocked_id` INTEGER NOT NULL, + + UNIQUE INDEX `UserBlock_blocker_id_blocked_id_key`(`blocker_id`, `blocked_id`), + PRIMARY KEY (`block_id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `Attachment` ( + `attachment_id` INTEGER NOT NULL AUTO_INCREMENT, + `message_id` INTEGER NOT NULL, + `url` TEXT NOT NULL, + `type` ENUM('IMAGE', 'FILE') NOT NULL, + `name` VARCHAR(191) NOT NULL, + `size` INTEGER NOT NULL, + `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + + INDEX `Attachment_message_id_idx`(`message_id`), + PRIMARY KEY (`attachment_id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- AddForeignKey +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; + +-- AddForeignKey +ALTER TABLE `ChatRoom` ADD CONSTRAINT `ChatRoom_user_id1_fkey` FOREIGN KEY (`user_id1`) REFERENCES `User`(`user_id`) ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `ChatRoom` ADD CONSTRAINT `ChatRoom_user_id2_fkey` FOREIGN KEY (`user_id2`) REFERENCES `User`(`user_id`) ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `ChatMessage` ADD CONSTRAINT `ChatMessage_sender_id_fkey` FOREIGN KEY (`sender_id`) REFERENCES `User`(`user_id`) ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `ChatMessage` ADD CONSTRAINT `ChatMessage_room_id_fkey` FOREIGN KEY (`room_id`) REFERENCES `ChatRoom`(`room_id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `ChatParticipant` ADD CONSTRAINT `ChatParticipant_room_id_fkey` FOREIGN KEY (`room_id`) REFERENCES `ChatRoom`(`room_id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `ChatParticipant` ADD CONSTRAINT `ChatParticipant_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `User`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +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; + +-- AddForeignKey +ALTER TABLE `UserBlock` ADD CONSTRAINT `UserBlock_blocker_id_fkey` FOREIGN KEY (`blocker_id`) REFERENCES `User`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `UserBlock` ADD CONSTRAINT `UserBlock_blocked_id_fkey` FOREIGN KEY (`blocked_id`) REFERENCES `User`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `Attachment` ADD CONSTRAINT `Attachment_message_id_fkey` FOREIGN KEY (`message_id`) REFERENCES `ChatMessage`(`message_id`) ON DELETE CASCADE ON UPDATE CASCADE;