172 lines
5.6 KiB
SQL
172 lines
5.6 KiB
SQL
-- CreateEnum
|
|
CREATE TYPE "ChatTypeEnum" AS ENUM ('DIRECT', 'GROUP', 'CHANNEL');
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "User" (
|
|
"id" TEXT NOT NULL,
|
|
"email" TEXT NOT NULL,
|
|
"passwordHash" TEXT NOT NULL,
|
|
"displayName" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Device" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"name" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"lastSeenAt" TIMESTAMP(3),
|
|
|
|
CONSTRAINT "Device_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "RefreshToken" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"deviceId" TEXT,
|
|
"tokenHash" TEXT NOT NULL,
|
|
"expiresAt" TIMESTAMP(3) NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "RefreshToken_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Chat" (
|
|
"id" TEXT NOT NULL,
|
|
"type" "ChatTypeEnum" NOT NULL,
|
|
"title" TEXT,
|
|
"isBroadcast" BOOLEAN NOT NULL DEFAULT false,
|
|
"isPublic" BOOLEAN NOT NULL DEFAULT false,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "Chat_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ChatMember" (
|
|
"chatId" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"role" TEXT NOT NULL,
|
|
"lastReadSeq" INTEGER NOT NULL DEFAULT 0,
|
|
"lastDeliveredSeq" INTEGER NOT NULL DEFAULT 0,
|
|
|
|
CONSTRAINT "ChatMember_pkey" PRIMARY KEY ("chatId","userId")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Message" (
|
|
"id" TEXT NOT NULL,
|
|
"chatId" TEXT NOT NULL,
|
|
"senderId" TEXT,
|
|
"kind" TEXT NOT NULL,
|
|
"body" TEXT,
|
|
"replyToId" TEXT,
|
|
"seq" INTEGER NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"editedAt" TIMESTAMP(3),
|
|
"deletedAt" TIMESTAMP(3),
|
|
|
|
CONSTRAINT "Message_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "MediaObject" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"mimeType" TEXT NOT NULL,
|
|
"s3Key" TEXT NOT NULL,
|
|
"sizeBytes" INTEGER,
|
|
"thumbnailKey" TEXT,
|
|
"finalized" BOOLEAN NOT NULL DEFAULT false,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "MediaObject_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "MessageMedia" (
|
|
"messageId" TEXT NOT NULL,
|
|
"mediaId" TEXT NOT NULL,
|
|
|
|
CONSTRAINT "MessageMedia_pkey" PRIMARY KEY ("messageId","mediaId")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "PinnedMessage" (
|
|
"chatId" TEXT NOT NULL,
|
|
"messageId" TEXT NOT NULL,
|
|
|
|
CONSTRAINT "PinnedMessage_pkey" PRIMARY KEY ("chatId","messageId")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "CallSession" (
|
|
"id" TEXT NOT NULL,
|
|
"chatId" TEXT NOT NULL,
|
|
"createdBy" TEXT NOT NULL,
|
|
"status" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "CallSession_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Bot" (
|
|
"id" TEXT NOT NULL,
|
|
"ownerUserId" TEXT NOT NULL,
|
|
"displayName" TEXT NOT NULL,
|
|
"tokenHash" TEXT NOT NULL,
|
|
"webhookUrl" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "Bot_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "BotMember" (
|
|
"botId" TEXT NOT NULL,
|
|
"chatId" TEXT NOT NULL,
|
|
|
|
CONSTRAINT "BotMember_pkey" PRIMARY KEY ("botId","chatId")
|
|
);
|
|
|
|
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
|
|
|
|
CREATE UNIQUE INDEX "Message_chatId_seq_key" ON "Message"("chatId", "seq");
|
|
|
|
CREATE INDEX "Message_chatId_seq_idx" ON "Message"("chatId", "seq");
|
|
|
|
ALTER TABLE "Device" ADD CONSTRAINT "Device_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
ALTER TABLE "RefreshToken" ADD CONSTRAINT "RefreshToken_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
ALTER TABLE "ChatMember" ADD CONSTRAINT "ChatMember_chatId_fkey" FOREIGN KEY ("chatId") REFERENCES "Chat"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
ALTER TABLE "ChatMember" ADD CONSTRAINT "ChatMember_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
ALTER TABLE "Message" ADD CONSTRAINT "Message_chatId_fkey" FOREIGN KEY ("chatId") REFERENCES "Chat"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
ALTER TABLE "Message" ADD CONSTRAINT "Message_senderId_fkey" FOREIGN KEY ("senderId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
ALTER TABLE "MessageMedia" ADD CONSTRAINT "MessageMedia_messageId_fkey" FOREIGN KEY ("messageId") REFERENCES "Message"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
ALTER TABLE "MessageMedia" ADD CONSTRAINT "MessageMedia_mediaId_fkey" FOREIGN KEY ("mediaId") REFERENCES "MediaObject"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
ALTER TABLE "PinnedMessage" ADD CONSTRAINT "PinnedMessage_chatId_fkey" FOREIGN KEY ("chatId") REFERENCES "Chat"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
ALTER TABLE "PinnedMessage" ADD CONSTRAINT "PinnedMessage_messageId_fkey" FOREIGN KEY ("messageId") REFERENCES "Message"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
ALTER TABLE "CallSession" ADD CONSTRAINT "CallSession_chatId_fkey" FOREIGN KEY ("chatId") REFERENCES "Chat"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
ALTER TABLE "Bot" ADD CONSTRAINT "Bot_ownerUserId_fkey" FOREIGN KEY ("ownerUserId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
ALTER TABLE "BotMember" ADD CONSTRAINT "BotMember_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
ALTER TABLE "BotMember" ADD CONSTRAINT "BotMember_chatId_fkey" FOREIGN KEY ("chatId") REFERENCES "Chat"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|