201 lines
7.1 KiB
SQL
201 lines
7.1 KiB
SQL
-- CreateEnum
|
|
CREATE TYPE "Platform" AS ENUM ('VK', 'TELEGRAM', 'YOUTUBE');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "GiveawayStatus" AS ENUM ('DRAFT', 'FETCHING', 'READY', 'SNAPSHOT_LOCKED', 'DRAWN', 'PUBLISHED', 'CANCELLED');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "ParticipantSource" AS ENUM ('LIKES', 'COMMENTS', 'REPOSTS', 'COMBINED');
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "User" (
|
|
"id" TEXT NOT NULL,
|
|
"vkUserId" TEXT NOT NULL,
|
|
"firstName" TEXT,
|
|
"lastName" TEXT,
|
|
"username" TEXT,
|
|
"avatarUrl" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "UserCredential" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"encryptedAccessToken" TEXT NOT NULL,
|
|
"encryptedRefreshToken" TEXT,
|
|
"expiresAt" TIMESTAMP(3),
|
|
"scope" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "UserCredential_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Giveaway" (
|
|
"id" TEXT NOT NULL,
|
|
"platform" "Platform" NOT NULL DEFAULT 'VK',
|
|
"sourceUrl" TEXT NOT NULL,
|
|
"platformOwnerId" TEXT NOT NULL,
|
|
"platformPostId" TEXT NOT NULL,
|
|
"title" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"postImageUrl" TEXT,
|
|
"postLikesCount" INTEGER NOT NULL DEFAULT 0,
|
|
"postCommentsCount" INTEGER NOT NULL DEFAULT 0,
|
|
"postRepostsCount" INTEGER NOT NULL DEFAULT 0,
|
|
"status" "GiveawayStatus" NOT NULL DEFAULT 'DRAFT',
|
|
"filterRules" JSONB NOT NULL,
|
|
"winnersCount" INTEGER NOT NULL DEFAULT 1,
|
|
"reserveWinnersCount" INTEGER NOT NULL DEFAULT 0,
|
|
"seed" TEXT,
|
|
"organizerId" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
"drawnAt" TIMESTAMP(3),
|
|
|
|
CONSTRAINT "Giveaway_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Participant" (
|
|
"id" TEXT NOT NULL,
|
|
"giveawayId" TEXT NOT NULL,
|
|
"platformUserId" TEXT NOT NULL,
|
|
"firstName" TEXT NOT NULL,
|
|
"lastName" TEXT NOT NULL,
|
|
"username" TEXT,
|
|
"avatarUrl" TEXT,
|
|
"source" "ParticipantSource" NOT NULL DEFAULT 'LIKES',
|
|
"liked" BOOLEAN NOT NULL DEFAULT false,
|
|
"commented" BOOLEAN NOT NULL DEFAULT false,
|
|
"commentsCount" INTEGER NOT NULL DEFAULT 0,
|
|
"reposted" BOOLEAN NOT NULL DEFAULT false,
|
|
"subscribed" BOOLEAN NOT NULL DEFAULT false,
|
|
"eligible" BOOLEAN NOT NULL DEFAULT true,
|
|
"exclusionReason" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "Participant_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ParticipantSnapshot" (
|
|
"id" TEXT NOT NULL,
|
|
"giveawayId" TEXT NOT NULL,
|
|
"version" INTEGER NOT NULL DEFAULT 1,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"eligibleParticipants" JSONB NOT NULL,
|
|
"filterRulesSnapshot" JSONB NOT NULL,
|
|
"participantCount" INTEGER NOT NULL,
|
|
"participantsSnapshotHash" TEXT NOT NULL,
|
|
"conditionsHash" TEXT NOT NULL,
|
|
|
|
CONSTRAINT "ParticipantSnapshot_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "DrawResult" (
|
|
"id" TEXT NOT NULL,
|
|
"drawId" TEXT NOT NULL,
|
|
"giveawayId" TEXT NOT NULL,
|
|
"snapshotId" TEXT NOT NULL,
|
|
"winners" JSONB NOT NULL,
|
|
"reserveWinners" JSONB NOT NULL,
|
|
"winnerIds" JSONB NOT NULL,
|
|
"reserveWinnerIds" JSONB NOT NULL,
|
|
"totalEligibleCount" INTEGER NOT NULL,
|
|
"totalLoadedCount" INTEGER NOT NULL,
|
|
"seedUsed" TEXT NOT NULL,
|
|
"algorithmVersion" TEXT NOT NULL DEFAULT 'HMAC_SHA256_FY_V1',
|
|
"deterministicProofHash" TEXT NOT NULL,
|
|
"auditEventHash" TEXT NOT NULL,
|
|
"drawnAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "DrawResult_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "AuditRecord" (
|
|
"id" TEXT NOT NULL,
|
|
"giveawayId" TEXT NOT NULL,
|
|
"snapshotId" TEXT NOT NULL,
|
|
"algorithmVersion" TEXT NOT NULL DEFAULT 'HMAC_SHA256_FY_V1',
|
|
"seed" TEXT NOT NULL,
|
|
"participantsSnapshotHash" TEXT NOT NULL,
|
|
"conditionsHash" TEXT NOT NULL,
|
|
"deterministicProofHash" TEXT NOT NULL,
|
|
"auditEventHash" TEXT NOT NULL,
|
|
"winnerIds" JSONB NOT NULL,
|
|
"reserveWinnerIds" JSONB NOT NULL,
|
|
"eligibleCount" INTEGER NOT NULL,
|
|
"drawId" TEXT NOT NULL,
|
|
"drawnAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"verifiedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "AuditRecord_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "User_vkUserId_key" ON "User"("vkUserId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "UserCredential_userId_key" ON "UserCredential"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Giveaway_platform_platformOwnerId_platformPostId_idx" ON "Giveaway"("platform", "platformOwnerId", "platformPostId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Giveaway_organizerId_idx" ON "Giveaway"("organizerId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Participant_giveawayId_eligible_idx" ON "Participant"("giveawayId", "eligible");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Participant_giveawayId_platformUserId_key" ON "Participant"("giveawayId", "platformUserId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ParticipantSnapshot_giveawayId_idx" ON "ParticipantSnapshot"("giveawayId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "ParticipantSnapshot_giveawayId_version_key" ON "ParticipantSnapshot"("giveawayId", "version");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "DrawResult_giveawayId_key" ON "DrawResult"("giveawayId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "DrawResult_snapshotId_key" ON "DrawResult"("snapshotId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "AuditRecord_giveawayId_key" ON "AuditRecord"("giveawayId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "AuditRecord_snapshotId_key" ON "AuditRecord"("snapshotId");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "UserCredential" ADD CONSTRAINT "UserCredential_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Giveaway" ADD CONSTRAINT "Giveaway_organizerId_fkey" FOREIGN KEY ("organizerId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Participant" ADD CONSTRAINT "Participant_giveawayId_fkey" FOREIGN KEY ("giveawayId") REFERENCES "Giveaway"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ParticipantSnapshot" ADD CONSTRAINT "ParticipantSnapshot_giveawayId_fkey" FOREIGN KEY ("giveawayId") REFERENCES "Giveaway"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "DrawResult" ADD CONSTRAINT "DrawResult_giveawayId_fkey" FOREIGN KEY ("giveawayId") REFERENCES "Giveaway"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "DrawResult" ADD CONSTRAINT "DrawResult_snapshotId_fkey" FOREIGN KEY ("snapshotId") REFERENCES "ParticipantSnapshot"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "AuditRecord" ADD CONSTRAINT "AuditRecord_giveawayId_fkey" FOREIGN KEY ("giveawayId") REFERENCES "Giveaway"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "AuditRecord" ADD CONSTRAINT "AuditRecord_snapshotId_fkey" FOREIGN KEY ("snapshotId") REFERENCES "ParticipantSnapshot"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|