271 lines
8.8 KiB
SQL
271 lines
8.8 KiB
SQL
-- CreateEnum
|
|
CREATE TYPE "AuthMethod" AS ENUM ('COOKIE', 'PASSKEY');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "PostType" AS ENUM ('FEATURE_REQUEST', 'BUG_REPORT');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "PostStatus" AS ENUM ('OPEN', 'UNDER_REVIEW', 'PLANNED', 'IN_PROGRESS', 'DONE', 'DECLINED');
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Board" (
|
|
"id" TEXT NOT NULL,
|
|
"slug" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"externalUrl" TEXT,
|
|
"isArchived" BOOLEAN NOT NULL DEFAULT false,
|
|
"voteBudget" INTEGER NOT NULL DEFAULT 10,
|
|
"voteBudgetReset" TEXT NOT NULL DEFAULT 'monthly',
|
|
"lastBudgetReset" TIMESTAMP(3),
|
|
"allowMultiVote" BOOLEAN NOT NULL DEFAULT false,
|
|
"rssEnabled" BOOLEAN NOT NULL DEFAULT true,
|
|
"rssFeedCount" INTEGER NOT NULL DEFAULT 50,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "Board_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "User" (
|
|
"id" TEXT NOT NULL,
|
|
"authMethod" "AuthMethod" NOT NULL DEFAULT 'COOKIE',
|
|
"tokenHash" TEXT,
|
|
"username" TEXT,
|
|
"usernameIdx" TEXT,
|
|
"displayName" TEXT,
|
|
"darkMode" TEXT NOT NULL DEFAULT 'system',
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Passkey" (
|
|
"id" TEXT NOT NULL,
|
|
"credentialId" TEXT NOT NULL,
|
|
"credentialIdIdx" TEXT NOT NULL,
|
|
"credentialPublicKey" BYTEA NOT NULL,
|
|
"counter" BIGINT NOT NULL,
|
|
"credentialDeviceType" TEXT NOT NULL,
|
|
"credentialBackedUp" BOOLEAN NOT NULL,
|
|
"transports" TEXT,
|
|
"userId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "Passkey_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Post" (
|
|
"id" TEXT NOT NULL,
|
|
"type" "PostType" NOT NULL,
|
|
"title" TEXT NOT NULL,
|
|
"description" JSONB NOT NULL,
|
|
"status" "PostStatus" NOT NULL DEFAULT 'OPEN',
|
|
"category" TEXT,
|
|
"voteCount" INTEGER NOT NULL DEFAULT 0,
|
|
"isPinned" BOOLEAN NOT NULL DEFAULT false,
|
|
"boardId" TEXT NOT NULL,
|
|
"authorId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "Post_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "StatusChange" (
|
|
"id" TEXT NOT NULL,
|
|
"postId" TEXT NOT NULL,
|
|
"fromStatus" "PostStatus" NOT NULL,
|
|
"toStatus" "PostStatus" NOT NULL,
|
|
"changedBy" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "StatusChange_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Comment" (
|
|
"id" TEXT NOT NULL,
|
|
"body" TEXT NOT NULL,
|
|
"postId" TEXT NOT NULL,
|
|
"authorId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "Comment_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Reaction" (
|
|
"id" TEXT NOT NULL,
|
|
"emoji" TEXT NOT NULL,
|
|
"commentId" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "Reaction_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Vote" (
|
|
"id" TEXT NOT NULL,
|
|
"weight" INTEGER NOT NULL DEFAULT 1,
|
|
"postId" TEXT NOT NULL,
|
|
"voterId" TEXT NOT NULL,
|
|
"budgetPeriod" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "Vote_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "AdminUser" (
|
|
"id" TEXT NOT NULL,
|
|
"email" TEXT NOT NULL,
|
|
"passwordHash" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "AdminUser_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "AdminResponse" (
|
|
"id" TEXT NOT NULL,
|
|
"body" TEXT NOT NULL,
|
|
"postId" TEXT NOT NULL,
|
|
"adminId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "AdminResponse_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ActivityEvent" (
|
|
"id" TEXT NOT NULL,
|
|
"type" TEXT NOT NULL,
|
|
"boardId" TEXT NOT NULL,
|
|
"postId" TEXT,
|
|
"metadata" JSONB NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "ActivityEvent_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "PushSubscription" (
|
|
"id" TEXT NOT NULL,
|
|
"endpoint" TEXT NOT NULL,
|
|
"endpointIdx" TEXT NOT NULL,
|
|
"keysP256dh" TEXT NOT NULL,
|
|
"keysAuth" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"boardId" TEXT,
|
|
"postId" TEXT,
|
|
"failureCount" INTEGER NOT NULL DEFAULT 0,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "PushSubscription_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Category" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"slug" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "Category_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Board_slug_key" ON "Board"("slug");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "User_tokenHash_key" ON "User"("tokenHash");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "User_usernameIdx_key" ON "User"("usernameIdx");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Passkey_credentialIdIdx_key" ON "Passkey"("credentialIdIdx");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Reaction_commentId_userId_emoji_key" ON "Reaction"("commentId", "userId", "emoji");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Vote_postId_voterId_key" ON "Vote"("postId", "voterId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "AdminUser_email_key" ON "AdminUser"("email");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ActivityEvent_boardId_createdAt_idx" ON "ActivityEvent"("boardId", "createdAt");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ActivityEvent_createdAt_idx" ON "ActivityEvent"("createdAt");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "PushSubscription_endpointIdx_key" ON "PushSubscription"("endpointIdx");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Category_name_key" ON "Category"("name");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Category_slug_key" ON "Category"("slug");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Passkey" ADD CONSTRAINT "Passkey_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Post" ADD CONSTRAINT "Post_boardId_fkey" FOREIGN KEY ("boardId") REFERENCES "Board"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Post" ADD CONSTRAINT "Post_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "StatusChange" ADD CONSTRAINT "StatusChange_postId_fkey" FOREIGN KEY ("postId") REFERENCES "Post"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Comment" ADD CONSTRAINT "Comment_postId_fkey" FOREIGN KEY ("postId") REFERENCES "Post"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Comment" ADD CONSTRAINT "Comment_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Reaction" ADD CONSTRAINT "Reaction_commentId_fkey" FOREIGN KEY ("commentId") REFERENCES "Comment"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Reaction" ADD CONSTRAINT "Reaction_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Vote" ADD CONSTRAINT "Vote_postId_fkey" FOREIGN KEY ("postId") REFERENCES "Post"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Vote" ADD CONSTRAINT "Vote_voterId_fkey" FOREIGN KEY ("voterId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "AdminResponse" ADD CONSTRAINT "AdminResponse_postId_fkey" FOREIGN KEY ("postId") REFERENCES "Post"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "AdminResponse" ADD CONSTRAINT "AdminResponse_adminId_fkey" FOREIGN KEY ("adminId") REFERENCES "AdminUser"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ActivityEvent" ADD CONSTRAINT "ActivityEvent_boardId_fkey" FOREIGN KEY ("boardId") REFERENCES "Board"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ActivityEvent" ADD CONSTRAINT "ActivityEvent_postId_fkey" FOREIGN KEY ("postId") REFERENCES "Post"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "PushSubscription" ADD CONSTRAINT "PushSubscription_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "PushSubscription" ADD CONSTRAINT "PushSubscription_boardId_fkey" FOREIGN KEY ("boardId") REFERENCES "Board"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "PushSubscription" ADD CONSTRAINT "PushSubscription_postId_fkey" FOREIGN KEY ("postId") REFERENCES "Post"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|