Competition/Round architecture: full platform rewrite (Phases 1-9)
Replace Pipeline/Stage system with Competition/Round architecture.
New schema: Competition, Round (7 types), JuryGroup, AssignmentPolicy,
ProjectRoundState, DeliberationSession, ResultLock, SubmissionWindow.
New services: round-engine, round-assignment, deliberation, result-lock,
submission-manager, competition-context, ai-prompt-guard.
Full admin/jury/applicant/mentor UI rewrite. AI prompt hardening with
structured prompts, retry logic, and injection detection. All legacy
pipeline/stage code removed. 4 new migrations + seed aligned.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 23:04:15 +01:00
|
|
|
/*
|
|
|
|
|
Warnings:
|
|
|
|
|
|
|
|
|
|
- You are about to drop the `ApplicationForm` table. If the table is not empty, all the data it contains will be lost.
|
|
|
|
|
- You are about to drop the `ApplicationFormField` table. If the table is not empty, all the data it contains will be lost.
|
|
|
|
|
- You are about to drop the `ApplicationFormSubmission` table. If the table is not empty, all the data it contains will be lost.
|
|
|
|
|
- You are about to drop the `OnboardingStep` table. If the table is not empty, all the data it contains will be lost.
|
|
|
|
|
- You are about to drop the `SubmissionFile` table. If the table is not empty, all the data it contains will be lost.
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
-- AlterEnum
|
|
|
|
|
-- This migration adds more than one value to an enum.
|
|
|
|
|
-- With PostgreSQL versions 11 and earlier, this is not possible
|
|
|
|
|
-- in a single migration. This can be worked around by creating
|
|
|
|
|
-- multiple migrations, each migration adding only one value to
|
|
|
|
|
-- the enum.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ALTER TYPE "SettingCategory" ADD VALUE 'DIGEST';
|
|
|
|
|
ALTER TYPE "SettingCategory" ADD VALUE 'ANALYTICS';
|
|
|
|
|
ALTER TYPE "SettingCategory" ADD VALUE 'AUDIT_CONFIG';
|
|
|
|
|
ALTER TYPE "SettingCategory" ADD VALUE 'INTEGRATIONS';
|
|
|
|
|
ALTER TYPE "SettingCategory" ADD VALUE 'LOCALIZATION';
|
|
|
|
|
ALTER TYPE "SettingCategory" ADD VALUE 'COMMUNICATION';
|
|
|
|
|
|
|
|
|
|
-- DropForeignKey
|
|
|
|
|
ALTER TABLE "ApplicationForm" DROP CONSTRAINT "ApplicationForm_programId_fkey";
|
|
|
|
|
|
|
|
|
|
-- DropForeignKey
|
|
|
|
|
ALTER TABLE "ApplicationForm" DROP CONSTRAINT "ApplicationForm_roundId_fkey";
|
|
|
|
|
|
|
|
|
|
-- DropForeignKey
|
|
|
|
|
ALTER TABLE "ApplicationFormField" DROP CONSTRAINT "ApplicationFormField_formId_fkey";
|
|
|
|
|
|
|
|
|
|
-- DropForeignKey
|
|
|
|
|
ALTER TABLE "ApplicationFormField" DROP CONSTRAINT "ApplicationFormField_stepId_fkey";
|
|
|
|
|
|
|
|
|
|
-- DropForeignKey
|
|
|
|
|
ALTER TABLE "ApplicationFormSubmission" DROP CONSTRAINT "ApplicationFormSubmission_formId_fkey";
|
|
|
|
|
|
|
|
|
|
-- DropForeignKey
|
|
|
|
|
ALTER TABLE "OnboardingStep" DROP CONSTRAINT "OnboardingStep_formId_fkey";
|
|
|
|
|
|
|
|
|
|
-- DropForeignKey
|
|
|
|
|
ALTER TABLE "SubmissionFile" DROP CONSTRAINT "SubmissionFile_submissionId_fkey";
|
|
|
|
|
|
|
|
|
|
-- DropIndex
|
|
|
|
|
DROP INDEX "User_email_idx";
|
|
|
|
|
|
|
|
|
|
-- AlterTable
|
|
|
|
|
ALTER TABLE "AssignmentJob" ALTER COLUMN "updatedAt" DROP DEFAULT;
|
|
|
|
|
|
|
|
|
|
-- AlterTable
|
|
|
|
|
ALTER TABLE "AuditLog" ADD COLUMN "previousDataJson" JSONB,
|
|
|
|
|
ADD COLUMN "sessionId" TEXT;
|
|
|
|
|
|
|
|
|
|
-- AlterTable
|
|
|
|
|
ALTER TABLE "FilteringJob" ALTER COLUMN "updatedAt" DROP DEFAULT;
|
|
|
|
|
|
|
|
|
|
-- AlterTable
|
|
|
|
|
ALTER TABLE "LiveVote" ADD COLUMN "isAudienceVote" BOOLEAN NOT NULL DEFAULT false;
|
|
|
|
|
|
|
|
|
|
-- AlterTable
|
|
|
|
|
ALTER TABLE "LiveVotingSession" ADD COLUMN "allowAudienceVotes" BOOLEAN NOT NULL DEFAULT false,
|
|
|
|
|
ADD COLUMN "audienceVoteWeight" DOUBLE PRECISION NOT NULL DEFAULT 0,
|
|
|
|
|
ADD COLUMN "presentationSettingsJson" JSONB,
|
|
|
|
|
ADD COLUMN "tieBreakerMethod" TEXT NOT NULL DEFAULT 'admin_decides';
|
|
|
|
|
|
|
|
|
|
-- AlterTable
|
|
|
|
|
ALTER TABLE "MentorAssignment" ADD COLUMN "completionStatus" TEXT NOT NULL DEFAULT 'in_progress',
|
|
|
|
|
ADD COLUMN "lastViewedAt" TIMESTAMP(3);
|
|
|
|
|
|
|
|
|
|
-- AlterTable
|
|
|
|
|
ALTER TABLE "NotificationEmailSetting" ALTER COLUMN "updatedAt" DROP DEFAULT;
|
|
|
|
|
|
|
|
|
|
-- AlterTable
|
|
|
|
|
ALTER TABLE "Project" ADD COLUMN "draftDataJson" JSONB,
|
|
|
|
|
ADD COLUMN "draftExpiresAt" TIMESTAMP(3),
|
|
|
|
|
ADD COLUMN "isDraft" BOOLEAN NOT NULL DEFAULT false;
|
|
|
|
|
|
|
|
|
|
-- AlterTable
|
|
|
|
|
ALTER TABLE "ProjectFile" ADD COLUMN "isLate" BOOLEAN NOT NULL DEFAULT false,
|
|
|
|
|
ADD COLUMN "replacedById" TEXT,
|
|
|
|
|
ADD COLUMN "roundId" TEXT,
|
|
|
|
|
ADD COLUMN "version" INTEGER NOT NULL DEFAULT 1;
|
|
|
|
|
|
|
|
|
|
-- AlterTable
|
|
|
|
|
ALTER TABLE "TaggingJob" ALTER COLUMN "updatedAt" DROP DEFAULT;
|
|
|
|
|
|
|
|
|
|
-- AlterTable
|
|
|
|
|
ALTER TABLE "User" ADD COLUMN "availabilityJson" JSONB,
|
|
|
|
|
ADD COLUMN "digestFrequency" TEXT NOT NULL DEFAULT 'none',
|
|
|
|
|
ADD COLUMN "preferredWorkload" INTEGER;
|
|
|
|
|
|
|
|
|
|
-- DropTable
|
|
|
|
|
DROP TABLE "ApplicationForm";
|
|
|
|
|
|
|
|
|
|
-- DropTable
|
|
|
|
|
DROP TABLE "ApplicationFormField";
|
|
|
|
|
|
|
|
|
|
-- DropTable
|
|
|
|
|
DROP TABLE "ApplicationFormSubmission";
|
|
|
|
|
|
|
|
|
|
-- DropTable
|
|
|
|
|
DROP TABLE "OnboardingStep";
|
|
|
|
|
|
|
|
|
|
-- DropTable
|
|
|
|
|
DROP TABLE "SubmissionFile";
|
|
|
|
|
|
|
|
|
|
-- DropEnum
|
|
|
|
|
DROP TYPE "FormFieldType";
|
|
|
|
|
|
|
|
|
|
-- DropEnum
|
|
|
|
|
DROP TYPE "SpecialFieldType";
|
|
|
|
|
|
|
|
|
|
-- CreateTable
|
|
|
|
|
CREATE TABLE "ReminderLog" (
|
|
|
|
|
"id" TEXT NOT NULL,
|
|
|
|
|
"roundId" TEXT NOT NULL,
|
|
|
|
|
"userId" TEXT NOT NULL,
|
|
|
|
|
"type" TEXT NOT NULL,
|
|
|
|
|
"sentAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
|
|
|
|
|
CONSTRAINT "ReminderLog_pkey" PRIMARY KEY ("id")
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- CreateTable
|
|
|
|
|
CREATE TABLE "ConflictOfInterest" (
|
|
|
|
|
"id" TEXT NOT NULL,
|
|
|
|
|
"assignmentId" TEXT NOT NULL,
|
|
|
|
|
"userId" TEXT NOT NULL,
|
|
|
|
|
"projectId" TEXT NOT NULL,
|
|
|
|
|
"roundId" TEXT NOT NULL,
|
|
|
|
|
"hasConflict" BOOLEAN NOT NULL DEFAULT false,
|
|
|
|
|
"conflictType" TEXT,
|
|
|
|
|
"description" TEXT,
|
|
|
|
|
"declaredAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
"reviewedById" TEXT,
|
|
|
|
|
"reviewedAt" TIMESTAMP(3),
|
|
|
|
|
"reviewAction" TEXT,
|
|
|
|
|
|
|
|
|
|
CONSTRAINT "ConflictOfInterest_pkey" PRIMARY KEY ("id")
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- CreateTable
|
|
|
|
|
CREATE TABLE "EvaluationSummary" (
|
|
|
|
|
"id" TEXT NOT NULL,
|
|
|
|
|
"projectId" TEXT NOT NULL,
|
|
|
|
|
"roundId" TEXT NOT NULL,
|
|
|
|
|
"summaryJson" JSONB NOT NULL,
|
|
|
|
|
"generatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
"generatedById" TEXT NOT NULL,
|
|
|
|
|
"model" TEXT NOT NULL,
|
|
|
|
|
"tokensUsed" INTEGER NOT NULL,
|
|
|
|
|
|
|
|
|
|
CONSTRAINT "EvaluationSummary_pkey" PRIMARY KEY ("id")
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- CreateTable
|
|
|
|
|
CREATE TABLE "ProjectStatusHistory" (
|
|
|
|
|
"id" TEXT NOT NULL,
|
|
|
|
|
"projectId" TEXT NOT NULL,
|
|
|
|
|
"status" "ProjectStatus" NOT NULL,
|
|
|
|
|
"changedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
"changedBy" TEXT,
|
|
|
|
|
|
|
|
|
|
CONSTRAINT "ProjectStatusHistory_pkey" PRIMARY KEY ("id")
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- CreateTable
|
|
|
|
|
CREATE TABLE "MentorMessage" (
|
|
|
|
|
"id" TEXT NOT NULL,
|
|
|
|
|
"projectId" TEXT NOT NULL,
|
|
|
|
|
"senderId" TEXT NOT NULL,
|
|
|
|
|
"message" TEXT NOT NULL,
|
|
|
|
|
"isRead" BOOLEAN NOT NULL DEFAULT false,
|
|
|
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
|
|
|
|
|
CONSTRAINT "MentorMessage_pkey" PRIMARY KEY ("id")
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- CreateTable
|
|
|
|
|
CREATE TABLE "DigestLog" (
|
|
|
|
|
"id" TEXT NOT NULL,
|
|
|
|
|
"userId" TEXT NOT NULL,
|
|
|
|
|
"digestType" TEXT NOT NULL,
|
|
|
|
|
"contentJson" JSONB NOT NULL,
|
|
|
|
|
"sentAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
|
|
|
|
|
CONSTRAINT "DigestLog_pkey" PRIMARY KEY ("id")
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- CreateTable
|
|
|
|
|
CREATE TABLE "RoundTemplate" (
|
|
|
|
|
"id" TEXT NOT NULL,
|
|
|
|
|
"name" TEXT NOT NULL,
|
|
|
|
|
"description" TEXT,
|
|
|
|
|
"programId" TEXT,
|
|
|
|
|
"roundType" "RoundType" NOT NULL DEFAULT 'EVALUATION',
|
|
|
|
|
"criteriaJson" JSONB NOT NULL,
|
|
|
|
|
"settingsJson" JSONB,
|
|
|
|
|
"assignmentConfig" JSONB,
|
|
|
|
|
"createdBy" TEXT NOT NULL,
|
|
|
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
|
|
|
|
|
|
CONSTRAINT "RoundTemplate_pkey" PRIMARY KEY ("id")
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- CreateTable
|
|
|
|
|
CREATE TABLE "MentorNote" (
|
|
|
|
|
"id" TEXT NOT NULL,
|
|
|
|
|
"mentorAssignmentId" TEXT NOT NULL,
|
|
|
|
|
"authorId" TEXT NOT NULL,
|
|
|
|
|
"content" TEXT NOT NULL,
|
|
|
|
|
"isVisibleToAdmin" BOOLEAN NOT NULL DEFAULT true,
|
|
|
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
|
|
|
|
|
|
CONSTRAINT "MentorNote_pkey" PRIMARY KEY ("id")
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- CreateTable
|
|
|
|
|
CREATE TABLE "MentorMilestone" (
|
|
|
|
|
"id" TEXT NOT NULL,
|
|
|
|
|
"programId" TEXT NOT NULL,
|
|
|
|
|
"name" TEXT NOT NULL,
|
|
|
|
|
"description" TEXT,
|
|
|
|
|
"isRequired" BOOLEAN NOT NULL DEFAULT false,
|
|
|
|
|
"deadlineOffsetDays" INTEGER,
|
|
|
|
|
"sortOrder" INTEGER NOT NULL DEFAULT 0,
|
|
|
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
|
|
|
|
|
|
CONSTRAINT "MentorMilestone_pkey" PRIMARY KEY ("id")
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- CreateTable
|
|
|
|
|
CREATE TABLE "MentorMilestoneCompletion" (
|
|
|
|
|
"id" TEXT NOT NULL,
|
|
|
|
|
"milestoneId" TEXT NOT NULL,
|
|
|
|
|
"mentorAssignmentId" TEXT NOT NULL,
|
|
|
|
|
"completedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
"completedById" TEXT NOT NULL,
|
|
|
|
|
|
|
|
|
|
CONSTRAINT "MentorMilestoneCompletion_pkey" PRIMARY KEY ("id")
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- CreateTable
|
|
|
|
|
CREATE TABLE "Message" (
|
|
|
|
|
"id" TEXT NOT NULL,
|
|
|
|
|
"senderId" TEXT NOT NULL,
|
|
|
|
|
"recipientType" TEXT NOT NULL,
|
|
|
|
|
"recipientFilter" JSONB,
|
|
|
|
|
"roundId" TEXT,
|
|
|
|
|
"templateId" TEXT,
|
|
|
|
|
"subject" TEXT NOT NULL,
|
|
|
|
|
"body" TEXT NOT NULL,
|
|
|
|
|
"deliveryChannels" TEXT[],
|
|
|
|
|
"scheduledAt" TIMESTAMP(3),
|
|
|
|
|
"sentAt" TIMESTAMP(3),
|
|
|
|
|
"metadata" JSONB,
|
|
|
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
|
|
|
|
|
CONSTRAINT "Message_pkey" PRIMARY KEY ("id")
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- CreateTable
|
|
|
|
|
CREATE TABLE "MessageTemplate" (
|
|
|
|
|
"id" TEXT NOT NULL,
|
|
|
|
|
"name" TEXT NOT NULL,
|
|
|
|
|
"category" TEXT NOT NULL,
|
|
|
|
|
"subject" TEXT NOT NULL,
|
|
|
|
|
"body" TEXT NOT NULL,
|
|
|
|
|
"variables" JSONB,
|
|
|
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
|
|
|
"createdBy" TEXT NOT NULL,
|
|
|
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
|
|
|
|
|
|
CONSTRAINT "MessageTemplate_pkey" PRIMARY KEY ("id")
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- CreateTable
|
|
|
|
|
CREATE TABLE "MessageRecipient" (
|
|
|
|
|
"id" TEXT NOT NULL,
|
|
|
|
|
"messageId" TEXT NOT NULL,
|
|
|
|
|
"userId" TEXT NOT NULL,
|
|
|
|
|
"channel" TEXT NOT NULL,
|
|
|
|
|
"isRead" BOOLEAN NOT NULL DEFAULT false,
|
|
|
|
|
"readAt" TIMESTAMP(3),
|
|
|
|
|
"deliveredAt" TIMESTAMP(3),
|
|
|
|
|
|
|
|
|
|
CONSTRAINT "MessageRecipient_pkey" PRIMARY KEY ("id")
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- CreateTable
|
|
|
|
|
CREATE TABLE "Webhook" (
|
|
|
|
|
"id" TEXT NOT NULL,
|
|
|
|
|
"name" TEXT NOT NULL,
|
|
|
|
|
"url" TEXT NOT NULL,
|
|
|
|
|
"secret" TEXT NOT NULL,
|
|
|
|
|
"events" TEXT[],
|
|
|
|
|
"headers" JSONB,
|
|
|
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
|
|
|
"maxRetries" INTEGER NOT NULL DEFAULT 3,
|
|
|
|
|
"createdById" TEXT NOT NULL,
|
|
|
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
|
|
|
|
|
|
CONSTRAINT "Webhook_pkey" PRIMARY KEY ("id")
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- CreateTable
|
|
|
|
|
CREATE TABLE "WebhookDelivery" (
|
|
|
|
|
"id" TEXT NOT NULL,
|
|
|
|
|
"webhookId" TEXT NOT NULL,
|
|
|
|
|
"event" TEXT NOT NULL,
|
|
|
|
|
"payload" JSONB NOT NULL,
|
|
|
|
|
"responseStatus" INTEGER,
|
|
|
|
|
"responseBody" TEXT,
|
|
|
|
|
"attempts" INTEGER NOT NULL DEFAULT 0,
|
|
|
|
|
"lastAttemptAt" TIMESTAMP(3),
|
|
|
|
|
"status" TEXT NOT NULL DEFAULT 'PENDING',
|
|
|
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
|
|
|
|
|
CONSTRAINT "WebhookDelivery_pkey" PRIMARY KEY ("id")
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- CreateTable
|
|
|
|
|
CREATE TABLE "EvaluationDiscussion" (
|
|
|
|
|
"id" TEXT NOT NULL,
|
|
|
|
|
"projectId" TEXT NOT NULL,
|
|
|
|
|
"roundId" TEXT NOT NULL,
|
|
|
|
|
"status" TEXT NOT NULL DEFAULT 'open',
|
|
|
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
"closedAt" TIMESTAMP(3),
|
|
|
|
|
"closedById" TEXT,
|
|
|
|
|
|
|
|
|
|
CONSTRAINT "EvaluationDiscussion_pkey" PRIMARY KEY ("id")
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- CreateTable
|
|
|
|
|
CREATE TABLE "DiscussionComment" (
|
|
|
|
|
"id" TEXT NOT NULL,
|
|
|
|
|
"discussionId" TEXT NOT NULL,
|
|
|
|
|
"userId" TEXT NOT NULL,
|
|
|
|
|
"content" TEXT NOT NULL,
|
|
|
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
|
|
|
|
|
CONSTRAINT "DiscussionComment_pkey" PRIMARY KEY ("id")
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "ReminderLog_roundId_idx" ON "ReminderLog"("roundId");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE UNIQUE INDEX "ReminderLog_roundId_userId_type_key" ON "ReminderLog"("roundId", "userId", "type");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE UNIQUE INDEX "ConflictOfInterest_assignmentId_key" ON "ConflictOfInterest"("assignmentId");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "ConflictOfInterest_userId_idx" ON "ConflictOfInterest"("userId");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "ConflictOfInterest_roundId_hasConflict_idx" ON "ConflictOfInterest"("roundId", "hasConflict");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "EvaluationSummary_roundId_idx" ON "EvaluationSummary"("roundId");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE UNIQUE INDEX "EvaluationSummary_projectId_roundId_key" ON "EvaluationSummary"("projectId", "roundId");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "ProjectStatusHistory_projectId_changedAt_idx" ON "ProjectStatusHistory"("projectId", "changedAt");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "MentorMessage_projectId_createdAt_idx" ON "MentorMessage"("projectId", "createdAt");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "DigestLog_userId_idx" ON "DigestLog"("userId");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "DigestLog_sentAt_idx" ON "DigestLog"("sentAt");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "RoundTemplate_programId_idx" ON "RoundTemplate"("programId");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "MentorNote_mentorAssignmentId_idx" ON "MentorNote"("mentorAssignmentId");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "MentorMilestone_programId_idx" ON "MentorMilestone"("programId");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "MentorMilestone_sortOrder_idx" ON "MentorMilestone"("sortOrder");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "MentorMilestoneCompletion_mentorAssignmentId_idx" ON "MentorMilestoneCompletion"("mentorAssignmentId");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE UNIQUE INDEX "MentorMilestoneCompletion_milestoneId_mentorAssignmentId_key" ON "MentorMilestoneCompletion"("milestoneId", "mentorAssignmentId");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "Message_senderId_idx" ON "Message"("senderId");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "Message_sentAt_idx" ON "Message"("sentAt");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "Message_scheduledAt_idx" ON "Message"("scheduledAt");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "MessageTemplate_category_idx" ON "MessageTemplate"("category");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "MessageTemplate_isActive_idx" ON "MessageTemplate"("isActive");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "MessageRecipient_messageId_idx" ON "MessageRecipient"("messageId");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "MessageRecipient_userId_isRead_idx" ON "MessageRecipient"("userId", "isRead");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "Webhook_isActive_idx" ON "Webhook"("isActive");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "WebhookDelivery_webhookId_idx" ON "WebhookDelivery"("webhookId");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "WebhookDelivery_status_idx" ON "WebhookDelivery"("status");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "WebhookDelivery_createdAt_idx" ON "WebhookDelivery"("createdAt");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "EvaluationDiscussion_roundId_idx" ON "EvaluationDiscussion"("roundId");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "EvaluationDiscussion_status_idx" ON "EvaluationDiscussion"("status");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE UNIQUE INDEX "EvaluationDiscussion_projectId_roundId_key" ON "EvaluationDiscussion"("projectId", "roundId");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "DiscussionComment_discussionId_createdAt_idx" ON "DiscussionComment"("discussionId", "createdAt");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "AuditLog_entityType_entityId_timestamp_idx" ON "AuditLog"("entityType", "entityId", "timestamp");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "Evaluation_status_formId_idx" ON "Evaluation"("status", "formId");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "GracePeriod_roundId_userId_extendedUntil_idx" ON "GracePeriod"("roundId", "userId", "extendedUntil");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "LiveVote_isAudienceVote_idx" ON "LiveVote"("isAudienceVote");
|
|
|
|
|
|
|
|
|
|
-- CreateIndex
|
|
|
|
|
CREATE INDEX "ProjectFile_roundId_idx" ON "ProjectFile"("roundId");
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "ProjectFile" ADD CONSTRAINT "ProjectFile_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "SpecialAward" ADD CONSTRAINT "SpecialAward_winnerOverriddenBy_fkey" FOREIGN KEY ("winnerOverriddenBy") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "ReminderLog" ADD CONSTRAINT "ReminderLog_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "ReminderLog" ADD CONSTRAINT "ReminderLog_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "ConflictOfInterest" ADD CONSTRAINT "ConflictOfInterest_assignmentId_fkey" FOREIGN KEY ("assignmentId") REFERENCES "Assignment"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "ConflictOfInterest" ADD CONSTRAINT "ConflictOfInterest_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "ConflictOfInterest" ADD CONSTRAINT "ConflictOfInterest_reviewedById_fkey" FOREIGN KEY ("reviewedById") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "EvaluationSummary" ADD CONSTRAINT "EvaluationSummary_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "EvaluationSummary" ADD CONSTRAINT "EvaluationSummary_generatedById_fkey" FOREIGN KEY ("generatedById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "ProjectStatusHistory" ADD CONSTRAINT "ProjectStatusHistory_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "MentorMessage" ADD CONSTRAINT "MentorMessage_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "MentorMessage" ADD CONSTRAINT "MentorMessage_senderId_fkey" FOREIGN KEY ("senderId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "DigestLog" ADD CONSTRAINT "DigestLog_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "MentorNote" ADD CONSTRAINT "MentorNote_mentorAssignmentId_fkey" FOREIGN KEY ("mentorAssignmentId") REFERENCES "MentorAssignment"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "MentorNote" ADD CONSTRAINT "MentorNote_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "MentorMilestone" ADD CONSTRAINT "MentorMilestone_programId_fkey" FOREIGN KEY ("programId") REFERENCES "Program"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "MentorMilestoneCompletion" ADD CONSTRAINT "MentorMilestoneCompletion_milestoneId_fkey" FOREIGN KEY ("milestoneId") REFERENCES "MentorMilestone"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "MentorMilestoneCompletion" ADD CONSTRAINT "MentorMilestoneCompletion_mentorAssignmentId_fkey" FOREIGN KEY ("mentorAssignmentId") REFERENCES "MentorAssignment"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "MentorMilestoneCompletion" ADD CONSTRAINT "MentorMilestoneCompletion_completedById_fkey" FOREIGN KEY ("completedById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "Message" ADD CONSTRAINT "Message_senderId_fkey" FOREIGN KEY ("senderId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "Message" ADD CONSTRAINT "Message_templateId_fkey" FOREIGN KEY ("templateId") REFERENCES "MessageTemplate"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "MessageRecipient" ADD CONSTRAINT "MessageRecipient_messageId_fkey" FOREIGN KEY ("messageId") REFERENCES "Message"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "MessageRecipient" ADD CONSTRAINT "MessageRecipient_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "Webhook" ADD CONSTRAINT "Webhook_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "WebhookDelivery" ADD CONSTRAINT "WebhookDelivery_webhookId_fkey" FOREIGN KEY ("webhookId") REFERENCES "Webhook"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "EvaluationDiscussion" ADD CONSTRAINT "EvaluationDiscussion_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "EvaluationDiscussion" ADD CONSTRAINT "EvaluationDiscussion_closedById_fkey" FOREIGN KEY ("closedById") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "DiscussionComment" ADD CONSTRAINT "DiscussionComment_discussionId_fkey" FOREIGN KEY ("discussionId") REFERENCES "EvaluationDiscussion"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
|
|
|
|
|
|
-- AddForeignKey
|
|
|
|
|
ALTER TABLE "DiscussionComment" ADD CONSTRAINT "DiscussionComment_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|