From 0f3b4d7b0d593818ae7b69025a164c3f40ce6e62 Mon Sep 17 00:00:00 2001 From: Ho Ngoc Hai Date: Sat, 18 Apr 2026 15:42:56 +0700 Subject: [PATCH] feat(messaging): R8.4 add missing Conversation/Message migration (TEC-2767) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Schema models cho Conversation + ConversationParticipant + Message đã được thêm trong commit 3b5da2d nhưng chưa có migration tương ứng. Bổ sung migration để DB ready cho in-app messaging (REST + WS /messaging). Co-Authored-By: Paperclip --- .../migration.sql | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 prisma/migrations/20260418100000_add_conversation_message/migration.sql diff --git a/prisma/migrations/20260418100000_add_conversation_message/migration.sql b/prisma/migrations/20260418100000_add_conversation_message/migration.sql new file mode 100644 index 0000000..0170105 --- /dev/null +++ b/prisma/migrations/20260418100000_add_conversation_message/migration.sql @@ -0,0 +1,76 @@ +-- CreateEnum +CREATE TYPE "ConversationStatus" AS ENUM ('ACTIVE', 'ARCHIVED', 'CLOSED'); + +-- CreateEnum +CREATE TYPE "MessageType" AS ENUM ('TEXT', 'IMAGE', 'FILE', 'SYSTEM'); + +-- CreateTable +CREATE TABLE "Conversation" ( + "id" TEXT NOT NULL, + "listingId" TEXT, + "subject" TEXT, + "status" "ConversationStatus" NOT NULL DEFAULT 'ACTIVE', + "lastMessage" TEXT, + "lastMessageAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Conversation_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ConversationParticipant" ( + "id" TEXT NOT NULL, + "conversationId" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "unreadCount" INTEGER NOT NULL DEFAULT 0, + "lastReadAt" TIMESTAMP(3), + "joinedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "ConversationParticipant_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Message" ( + "id" TEXT NOT NULL, + "conversationId" TEXT NOT NULL, + "senderId" TEXT NOT NULL, + "type" "MessageType" NOT NULL DEFAULT 'TEXT', + "content" TEXT NOT NULL, + "metadata" JSONB, + "editedAt" TIMESTAMP(3), + "deletedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Message_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE INDEX "Conversation_status_idx" ON "Conversation"("status"); + +-- CreateIndex +CREATE INDEX "Conversation_lastMessageAt_idx" ON "Conversation"("lastMessageAt" DESC); + +-- CreateIndex +CREATE INDEX "Conversation_listingId_idx" ON "Conversation"("listingId"); + +-- CreateIndex +CREATE UNIQUE INDEX "ConversationParticipant_conversationId_userId_key" ON "ConversationParticipant"("conversationId", "userId"); + +-- CreateIndex +CREATE INDEX "ConversationParticipant_userId_idx" ON "ConversationParticipant"("userId"); + +-- CreateIndex +CREATE INDEX "ConversationParticipant_conversationId_idx" ON "ConversationParticipant"("conversationId"); + +-- CreateIndex +CREATE INDEX "Message_conversationId_createdAt_idx" ON "Message"("conversationId", "createdAt"); + +-- CreateIndex +CREATE INDEX "Message_senderId_idx" ON "Message"("senderId"); + +-- AddForeignKey +ALTER TABLE "ConversationParticipant" ADD CONSTRAINT "ConversationParticipant_conversationId_fkey" FOREIGN KEY ("conversationId") REFERENCES "Conversation"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Message" ADD CONSTRAINT "Message_conversationId_fkey" FOREIGN KEY ("conversationId") REFERENCES "Conversation"("id") ON DELETE CASCADE ON UPDATE CASCADE;