diff --git a/prisma/migrations/20260205223133_add_15_features/migration.sql b/prisma/migrations/20260205223133_add_15_features/migration.sql index 5ce6014..97aa31b 100644 --- a/prisma/migrations/20260205223133_add_15_features/migration.sql +++ b/prisma/migrations/20260205223133_add_15_features/migration.sql @@ -16,105 +16,143 @@ -- 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'; +DO $$ BEGIN ALTER TYPE "SettingCategory" ADD VALUE 'DIGEST'; EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN ALTER TYPE "SettingCategory" ADD VALUE 'ANALYTICS'; EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN ALTER TYPE "SettingCategory" ADD VALUE 'AUDIT_CONFIG'; EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN ALTER TYPE "SettingCategory" ADD VALUE 'INTEGRATIONS'; EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN ALTER TYPE "SettingCategory" ADD VALUE 'LOCALIZATION'; EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN ALTER TYPE "SettingCategory" ADD VALUE 'COMMUNICATION'; EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- DropForeignKey -ALTER TABLE "ApplicationForm" DROP CONSTRAINT "ApplicationForm_programId_fkey"; +ALTER TABLE "ApplicationForm" DROP CONSTRAINT IF EXISTS "ApplicationForm_programId_fkey"; -- DropForeignKey -ALTER TABLE "ApplicationForm" DROP CONSTRAINT "ApplicationForm_roundId_fkey"; +ALTER TABLE "ApplicationForm" DROP CONSTRAINT IF EXISTS "ApplicationForm_roundId_fkey"; -- DropForeignKey -ALTER TABLE "ApplicationFormField" DROP CONSTRAINT "ApplicationFormField_formId_fkey"; +ALTER TABLE "ApplicationFormField" DROP CONSTRAINT IF EXISTS "ApplicationFormField_formId_fkey"; -- DropForeignKey -ALTER TABLE "ApplicationFormField" DROP CONSTRAINT "ApplicationFormField_stepId_fkey"; +ALTER TABLE "ApplicationFormField" DROP CONSTRAINT IF EXISTS "ApplicationFormField_stepId_fkey"; -- DropForeignKey -ALTER TABLE "ApplicationFormSubmission" DROP CONSTRAINT "ApplicationFormSubmission_formId_fkey"; +ALTER TABLE "ApplicationFormSubmission" DROP CONSTRAINT IF EXISTS "ApplicationFormSubmission_formId_fkey"; -- DropForeignKey -ALTER TABLE "OnboardingStep" DROP CONSTRAINT "OnboardingStep_formId_fkey"; +ALTER TABLE "OnboardingStep" DROP CONSTRAINT IF EXISTS "OnboardingStep_formId_fkey"; -- DropForeignKey -ALTER TABLE "SubmissionFile" DROP CONSTRAINT "SubmissionFile_submissionId_fkey"; +ALTER TABLE "SubmissionFile" DROP CONSTRAINT IF EXISTS "SubmissionFile_submissionId_fkey"; -- DropIndex -DROP INDEX "User_email_idx"; +DROP INDEX IF EXISTS "User_email_idx"; -- AlterTable -ALTER TABLE "AssignmentJob" ALTER COLUMN "updatedAt" DROP DEFAULT; +DO $$ BEGIN ALTER TABLE "AssignmentJob" ALTER COLUMN "updatedAt" DROP DEFAULT; EXCEPTION WHEN others THEN NULL; END $$; -- AlterTable -ALTER TABLE "AuditLog" ADD COLUMN "previousDataJson" JSONB, -ADD COLUMN "sessionId" TEXT; +DO $$ BEGIN + ALTER TABLE "AuditLog" ADD COLUMN "previousDataJson" JSONB; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "AuditLog" ADD COLUMN "sessionId" TEXT; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; -- AlterTable -ALTER TABLE "FilteringJob" ALTER COLUMN "updatedAt" DROP DEFAULT; +DO $$ BEGIN ALTER TABLE "FilteringJob" ALTER COLUMN "updatedAt" DROP DEFAULT; EXCEPTION WHEN others THEN NULL; END $$; -- AlterTable -ALTER TABLE "LiveVote" ADD COLUMN "isAudienceVote" BOOLEAN NOT NULL DEFAULT false; +DO $$ BEGIN + ALTER TABLE "LiveVote" ADD COLUMN "isAudienceVote" BOOLEAN NOT NULL DEFAULT false; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; -- 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'; +DO $$ BEGIN + ALTER TABLE "LiveVotingSession" ADD COLUMN "allowAudienceVotes" BOOLEAN NOT NULL DEFAULT false; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "LiveVotingSession" ADD COLUMN "audienceVoteWeight" DOUBLE PRECISION NOT NULL DEFAULT 0; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "LiveVotingSession" ADD COLUMN "presentationSettingsJson" JSONB; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "LiveVotingSession" ADD COLUMN "tieBreakerMethod" TEXT NOT NULL DEFAULT 'admin_decides'; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; -- AlterTable -ALTER TABLE "MentorAssignment" ADD COLUMN "completionStatus" TEXT NOT NULL DEFAULT 'in_progress', -ADD COLUMN "lastViewedAt" TIMESTAMP(3); +DO $$ BEGIN + ALTER TABLE "MentorAssignment" ADD COLUMN "completionStatus" TEXT NOT NULL DEFAULT 'in_progress'; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "MentorAssignment" ADD COLUMN "lastViewedAt" TIMESTAMP(3); +EXCEPTION WHEN duplicate_column THEN NULL; END $$; -- AlterTable -ALTER TABLE "NotificationEmailSetting" ALTER COLUMN "updatedAt" DROP DEFAULT; +DO $$ BEGIN ALTER TABLE "NotificationEmailSetting" ALTER COLUMN "updatedAt" DROP DEFAULT; EXCEPTION WHEN others THEN NULL; END $$; -- AlterTable -ALTER TABLE "Project" ADD COLUMN "draftDataJson" JSONB, -ADD COLUMN "draftExpiresAt" TIMESTAMP(3), -ADD COLUMN "isDraft" BOOLEAN NOT NULL DEFAULT false; +DO $$ BEGIN + ALTER TABLE "Project" ADD COLUMN "draftDataJson" JSONB; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "Project" ADD COLUMN "draftExpiresAt" TIMESTAMP(3); +EXCEPTION WHEN duplicate_column THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "Project" ADD COLUMN "isDraft" BOOLEAN NOT NULL DEFAULT false; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; -- 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; +DO $$ BEGIN + ALTER TABLE "ProjectFile" ADD COLUMN "isLate" BOOLEAN NOT NULL DEFAULT false; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "ProjectFile" ADD COLUMN "replacedById" TEXT; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "ProjectFile" ADD COLUMN "roundId" TEXT; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "ProjectFile" ADD COLUMN "version" INTEGER NOT NULL DEFAULT 1; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; -- AlterTable -ALTER TABLE "TaggingJob" ALTER COLUMN "updatedAt" DROP DEFAULT; +DO $$ BEGIN ALTER TABLE "TaggingJob" ALTER COLUMN "updatedAt" DROP DEFAULT; EXCEPTION WHEN others THEN NULL; END $$; -- AlterTable -ALTER TABLE "User" ADD COLUMN "availabilityJson" JSONB, -ADD COLUMN "digestFrequency" TEXT NOT NULL DEFAULT 'none', -ADD COLUMN "preferredWorkload" INTEGER; +DO $$ BEGIN + ALTER TABLE "User" ADD COLUMN "availabilityJson" JSONB; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "User" ADD COLUMN "digestFrequency" TEXT NOT NULL DEFAULT 'none'; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "User" ADD COLUMN "preferredWorkload" INTEGER; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; -- DropTable -DROP TABLE "ApplicationForm"; +DROP TABLE IF EXISTS "ApplicationForm"; -- DropTable -DROP TABLE "ApplicationFormField"; +DROP TABLE IF EXISTS "ApplicationFormField"; -- DropTable -DROP TABLE "ApplicationFormSubmission"; +DROP TABLE IF EXISTS "ApplicationFormSubmission"; -- DropTable -DROP TABLE "OnboardingStep"; +DROP TABLE IF EXISTS "OnboardingStep"; -- DropTable -DROP TABLE "SubmissionFile"; +DROP TABLE IF EXISTS "SubmissionFile"; -- DropEnum -DROP TYPE "FormFieldType"; +DROP TYPE IF EXISTS "FormFieldType"; -- DropEnum -DROP TYPE "SpecialFieldType"; +DROP TYPE IF EXISTS "SpecialFieldType"; -- CreateTable -CREATE TABLE "ReminderLog" ( +CREATE TABLE IF NOT EXISTS "ReminderLog" ( "id" TEXT NOT NULL, "roundId" TEXT NOT NULL, "userId" TEXT NOT NULL, @@ -125,7 +163,7 @@ CREATE TABLE "ReminderLog" ( ); -- CreateTable -CREATE TABLE "ConflictOfInterest" ( +CREATE TABLE IF NOT EXISTS "ConflictOfInterest" ( "id" TEXT NOT NULL, "assignmentId" TEXT NOT NULL, "userId" TEXT NOT NULL, @@ -143,7 +181,7 @@ CREATE TABLE "ConflictOfInterest" ( ); -- CreateTable -CREATE TABLE "EvaluationSummary" ( +CREATE TABLE IF NOT EXISTS "EvaluationSummary" ( "id" TEXT NOT NULL, "projectId" TEXT NOT NULL, "roundId" TEXT NOT NULL, @@ -157,7 +195,7 @@ CREATE TABLE "EvaluationSummary" ( ); -- CreateTable -CREATE TABLE "ProjectStatusHistory" ( +CREATE TABLE IF NOT EXISTS "ProjectStatusHistory" ( "id" TEXT NOT NULL, "projectId" TEXT NOT NULL, "status" "ProjectStatus" NOT NULL, @@ -168,7 +206,7 @@ CREATE TABLE "ProjectStatusHistory" ( ); -- CreateTable -CREATE TABLE "MentorMessage" ( +CREATE TABLE IF NOT EXISTS "MentorMessage" ( "id" TEXT NOT NULL, "projectId" TEXT NOT NULL, "senderId" TEXT NOT NULL, @@ -180,7 +218,7 @@ CREATE TABLE "MentorMessage" ( ); -- CreateTable -CREATE TABLE "DigestLog" ( +CREATE TABLE IF NOT EXISTS "DigestLog" ( "id" TEXT NOT NULL, "userId" TEXT NOT NULL, "digestType" TEXT NOT NULL, @@ -191,7 +229,7 @@ CREATE TABLE "DigestLog" ( ); -- CreateTable -CREATE TABLE "RoundTemplate" ( +CREATE TABLE IF NOT EXISTS "RoundTemplate" ( "id" TEXT NOT NULL, "name" TEXT NOT NULL, "description" TEXT, @@ -208,7 +246,7 @@ CREATE TABLE "RoundTemplate" ( ); -- CreateTable -CREATE TABLE "MentorNote" ( +CREATE TABLE IF NOT EXISTS "MentorNote" ( "id" TEXT NOT NULL, "mentorAssignmentId" TEXT NOT NULL, "authorId" TEXT NOT NULL, @@ -221,7 +259,7 @@ CREATE TABLE "MentorNote" ( ); -- CreateTable -CREATE TABLE "MentorMilestone" ( +CREATE TABLE IF NOT EXISTS "MentorMilestone" ( "id" TEXT NOT NULL, "programId" TEXT NOT NULL, "name" TEXT NOT NULL, @@ -236,7 +274,7 @@ CREATE TABLE "MentorMilestone" ( ); -- CreateTable -CREATE TABLE "MentorMilestoneCompletion" ( +CREATE TABLE IF NOT EXISTS "MentorMilestoneCompletion" ( "id" TEXT NOT NULL, "milestoneId" TEXT NOT NULL, "mentorAssignmentId" TEXT NOT NULL, @@ -247,7 +285,7 @@ CREATE TABLE "MentorMilestoneCompletion" ( ); -- CreateTable -CREATE TABLE "Message" ( +CREATE TABLE IF NOT EXISTS "Message" ( "id" TEXT NOT NULL, "senderId" TEXT NOT NULL, "recipientType" TEXT NOT NULL, @@ -266,7 +304,7 @@ CREATE TABLE "Message" ( ); -- CreateTable -CREATE TABLE "MessageTemplate" ( +CREATE TABLE IF NOT EXISTS "MessageTemplate" ( "id" TEXT NOT NULL, "name" TEXT NOT NULL, "category" TEXT NOT NULL, @@ -282,7 +320,7 @@ CREATE TABLE "MessageTemplate" ( ); -- CreateTable -CREATE TABLE "MessageRecipient" ( +CREATE TABLE IF NOT EXISTS "MessageRecipient" ( "id" TEXT NOT NULL, "messageId" TEXT NOT NULL, "userId" TEXT NOT NULL, @@ -295,7 +333,7 @@ CREATE TABLE "MessageRecipient" ( ); -- CreateTable -CREATE TABLE "Webhook" ( +CREATE TABLE IF NOT EXISTS "Webhook" ( "id" TEXT NOT NULL, "name" TEXT NOT NULL, "url" TEXT NOT NULL, @@ -312,7 +350,7 @@ CREATE TABLE "Webhook" ( ); -- CreateTable -CREATE TABLE "WebhookDelivery" ( +CREATE TABLE IF NOT EXISTS "WebhookDelivery" ( "id" TEXT NOT NULL, "webhookId" TEXT NOT NULL, "event" TEXT NOT NULL, @@ -328,7 +366,7 @@ CREATE TABLE "WebhookDelivery" ( ); -- CreateTable -CREATE TABLE "EvaluationDiscussion" ( +CREATE TABLE IF NOT EXISTS "EvaluationDiscussion" ( "id" TEXT NOT NULL, "projectId" TEXT NOT NULL, "roundId" TEXT NOT NULL, @@ -341,7 +379,7 @@ CREATE TABLE "EvaluationDiscussion" ( ); -- CreateTable -CREATE TABLE "DiscussionComment" ( +CREATE TABLE IF NOT EXISTS "DiscussionComment" ( "id" TEXT NOT NULL, "discussionId" TEXT NOT NULL, "userId" TEXT NOT NULL, @@ -352,199 +390,257 @@ CREATE TABLE "DiscussionComment" ( ); -- CreateIndex -CREATE INDEX "ReminderLog_roundId_idx" ON "ReminderLog"("roundId"); +CREATE INDEX IF NOT EXISTS "ReminderLog_roundId_idx" ON "ReminderLog"("roundId"); -- CreateIndex -CREATE UNIQUE INDEX "ReminderLog_roundId_userId_type_key" ON "ReminderLog"("roundId", "userId", "type"); +CREATE UNIQUE INDEX IF NOT EXISTS "ReminderLog_roundId_userId_type_key" ON "ReminderLog"("roundId", "userId", "type"); -- CreateIndex -CREATE UNIQUE INDEX "ConflictOfInterest_assignmentId_key" ON "ConflictOfInterest"("assignmentId"); +CREATE UNIQUE INDEX IF NOT EXISTS "ConflictOfInterest_assignmentId_key" ON "ConflictOfInterest"("assignmentId"); -- CreateIndex -CREATE INDEX "ConflictOfInterest_userId_idx" ON "ConflictOfInterest"("userId"); +CREATE INDEX IF NOT EXISTS "ConflictOfInterest_userId_idx" ON "ConflictOfInterest"("userId"); -- CreateIndex -CREATE INDEX "ConflictOfInterest_roundId_hasConflict_idx" ON "ConflictOfInterest"("roundId", "hasConflict"); +CREATE INDEX IF NOT EXISTS "ConflictOfInterest_roundId_hasConflict_idx" ON "ConflictOfInterest"("roundId", "hasConflict"); -- CreateIndex -CREATE INDEX "EvaluationSummary_roundId_idx" ON "EvaluationSummary"("roundId"); +CREATE INDEX IF NOT EXISTS "EvaluationSummary_roundId_idx" ON "EvaluationSummary"("roundId"); -- CreateIndex -CREATE UNIQUE INDEX "EvaluationSummary_projectId_roundId_key" ON "EvaluationSummary"("projectId", "roundId"); +CREATE UNIQUE INDEX IF NOT EXISTS "EvaluationSummary_projectId_roundId_key" ON "EvaluationSummary"("projectId", "roundId"); -- CreateIndex -CREATE INDEX "ProjectStatusHistory_projectId_changedAt_idx" ON "ProjectStatusHistory"("projectId", "changedAt"); +CREATE INDEX IF NOT EXISTS "ProjectStatusHistory_projectId_changedAt_idx" ON "ProjectStatusHistory"("projectId", "changedAt"); -- CreateIndex -CREATE INDEX "MentorMessage_projectId_createdAt_idx" ON "MentorMessage"("projectId", "createdAt"); +CREATE INDEX IF NOT EXISTS "MentorMessage_projectId_createdAt_idx" ON "MentorMessage"("projectId", "createdAt"); -- CreateIndex -CREATE INDEX "DigestLog_userId_idx" ON "DigestLog"("userId"); +CREATE INDEX IF NOT EXISTS "DigestLog_userId_idx" ON "DigestLog"("userId"); -- CreateIndex -CREATE INDEX "DigestLog_sentAt_idx" ON "DigestLog"("sentAt"); +CREATE INDEX IF NOT EXISTS "DigestLog_sentAt_idx" ON "DigestLog"("sentAt"); -- CreateIndex -CREATE INDEX "RoundTemplate_programId_idx" ON "RoundTemplate"("programId"); +CREATE INDEX IF NOT EXISTS "RoundTemplate_programId_idx" ON "RoundTemplate"("programId"); -- CreateIndex -CREATE INDEX "MentorNote_mentorAssignmentId_idx" ON "MentorNote"("mentorAssignmentId"); +CREATE INDEX IF NOT EXISTS "MentorNote_mentorAssignmentId_idx" ON "MentorNote"("mentorAssignmentId"); -- CreateIndex -CREATE INDEX "MentorMilestone_programId_idx" ON "MentorMilestone"("programId"); +CREATE INDEX IF NOT EXISTS "MentorMilestone_programId_idx" ON "MentorMilestone"("programId"); -- CreateIndex -CREATE INDEX "MentorMilestone_sortOrder_idx" ON "MentorMilestone"("sortOrder"); +CREATE INDEX IF NOT EXISTS "MentorMilestone_sortOrder_idx" ON "MentorMilestone"("sortOrder"); -- CreateIndex -CREATE INDEX "MentorMilestoneCompletion_mentorAssignmentId_idx" ON "MentorMilestoneCompletion"("mentorAssignmentId"); +CREATE INDEX IF NOT EXISTS "MentorMilestoneCompletion_mentorAssignmentId_idx" ON "MentorMilestoneCompletion"("mentorAssignmentId"); -- CreateIndex -CREATE UNIQUE INDEX "MentorMilestoneCompletion_milestoneId_mentorAssignmentId_key" ON "MentorMilestoneCompletion"("milestoneId", "mentorAssignmentId"); +CREATE UNIQUE INDEX IF NOT EXISTS "MentorMilestoneCompletion_milestoneId_mentorAssignmentId_key" ON "MentorMilestoneCompletion"("milestoneId", "mentorAssignmentId"); -- CreateIndex -CREATE INDEX "Message_senderId_idx" ON "Message"("senderId"); +CREATE INDEX IF NOT EXISTS "Message_senderId_idx" ON "Message"("senderId"); -- CreateIndex -CREATE INDEX "Message_sentAt_idx" ON "Message"("sentAt"); +CREATE INDEX IF NOT EXISTS "Message_sentAt_idx" ON "Message"("sentAt"); -- CreateIndex -CREATE INDEX "Message_scheduledAt_idx" ON "Message"("scheduledAt"); +CREATE INDEX IF NOT EXISTS "Message_scheduledAt_idx" ON "Message"("scheduledAt"); -- CreateIndex -CREATE INDEX "MessageTemplate_category_idx" ON "MessageTemplate"("category"); +CREATE INDEX IF NOT EXISTS "MessageTemplate_category_idx" ON "MessageTemplate"("category"); -- CreateIndex -CREATE INDEX "MessageTemplate_isActive_idx" ON "MessageTemplate"("isActive"); +CREATE INDEX IF NOT EXISTS "MessageTemplate_isActive_idx" ON "MessageTemplate"("isActive"); -- CreateIndex -CREATE INDEX "MessageRecipient_messageId_idx" ON "MessageRecipient"("messageId"); +CREATE INDEX IF NOT EXISTS "MessageRecipient_messageId_idx" ON "MessageRecipient"("messageId"); -- CreateIndex -CREATE INDEX "MessageRecipient_userId_isRead_idx" ON "MessageRecipient"("userId", "isRead"); +CREATE INDEX IF NOT EXISTS "MessageRecipient_userId_isRead_idx" ON "MessageRecipient"("userId", "isRead"); -- CreateIndex -CREATE INDEX "Webhook_isActive_idx" ON "Webhook"("isActive"); +CREATE INDEX IF NOT EXISTS "Webhook_isActive_idx" ON "Webhook"("isActive"); -- CreateIndex -CREATE INDEX "WebhookDelivery_webhookId_idx" ON "WebhookDelivery"("webhookId"); +CREATE INDEX IF NOT EXISTS "WebhookDelivery_webhookId_idx" ON "WebhookDelivery"("webhookId"); -- CreateIndex -CREATE INDEX "WebhookDelivery_status_idx" ON "WebhookDelivery"("status"); +CREATE INDEX IF NOT EXISTS "WebhookDelivery_status_idx" ON "WebhookDelivery"("status"); -- CreateIndex -CREATE INDEX "WebhookDelivery_createdAt_idx" ON "WebhookDelivery"("createdAt"); +CREATE INDEX IF NOT EXISTS "WebhookDelivery_createdAt_idx" ON "WebhookDelivery"("createdAt"); -- CreateIndex -CREATE INDEX "EvaluationDiscussion_roundId_idx" ON "EvaluationDiscussion"("roundId"); +CREATE INDEX IF NOT EXISTS "EvaluationDiscussion_roundId_idx" ON "EvaluationDiscussion"("roundId"); -- CreateIndex -CREATE INDEX "EvaluationDiscussion_status_idx" ON "EvaluationDiscussion"("status"); +CREATE INDEX IF NOT EXISTS "EvaluationDiscussion_status_idx" ON "EvaluationDiscussion"("status"); -- CreateIndex -CREATE UNIQUE INDEX "EvaluationDiscussion_projectId_roundId_key" ON "EvaluationDiscussion"("projectId", "roundId"); +CREATE UNIQUE INDEX IF NOT EXISTS "EvaluationDiscussion_projectId_roundId_key" ON "EvaluationDiscussion"("projectId", "roundId"); -- CreateIndex -CREATE INDEX "DiscussionComment_discussionId_createdAt_idx" ON "DiscussionComment"("discussionId", "createdAt"); +CREATE INDEX IF NOT EXISTS "DiscussionComment_discussionId_createdAt_idx" ON "DiscussionComment"("discussionId", "createdAt"); -- CreateIndex -CREATE INDEX "AuditLog_entityType_entityId_timestamp_idx" ON "AuditLog"("entityType", "entityId", "timestamp"); +CREATE INDEX IF NOT EXISTS "AuditLog_entityType_entityId_timestamp_idx" ON "AuditLog"("entityType", "entityId", "timestamp"); -- CreateIndex -CREATE INDEX "Evaluation_status_formId_idx" ON "Evaluation"("status", "formId"); +CREATE INDEX IF NOT EXISTS "Evaluation_status_formId_idx" ON "Evaluation"("status", "formId"); -- CreateIndex -CREATE INDEX "GracePeriod_roundId_userId_extendedUntil_idx" ON "GracePeriod"("roundId", "userId", "extendedUntil"); +CREATE INDEX IF NOT EXISTS "GracePeriod_roundId_userId_extendedUntil_idx" ON "GracePeriod"("roundId", "userId", "extendedUntil"); -- CreateIndex -CREATE INDEX "LiveVote_isAudienceVote_idx" ON "LiveVote"("isAudienceVote"); +CREATE INDEX IF NOT EXISTS "LiveVote_isAudienceVote_idx" ON "LiveVote"("isAudienceVote"); -- CreateIndex -CREATE INDEX "ProjectFile_roundId_idx" ON "ProjectFile"("roundId"); +CREATE INDEX IF NOT EXISTS "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; +DO $$ BEGIN + ALTER TABLE "ProjectFile" ADD CONSTRAINT "ProjectFile_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE SET NULL ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "SpecialAward" ADD CONSTRAINT "SpecialAward_winnerOverriddenBy_fkey" FOREIGN KEY ("winnerOverriddenBy") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "SpecialAward" ADD CONSTRAINT "SpecialAward_winnerOverriddenBy_fkey" FOREIGN KEY ("winnerOverriddenBy") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "ReminderLog" ADD CONSTRAINT "ReminderLog_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "ReminderLog" ADD CONSTRAINT "ReminderLog_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "ReminderLog" ADD CONSTRAINT "ReminderLog_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "ReminderLog" ADD CONSTRAINT "ReminderLog_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "ConflictOfInterest" ADD CONSTRAINT "ConflictOfInterest_assignmentId_fkey" FOREIGN KEY ("assignmentId") REFERENCES "Assignment"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "ConflictOfInterest" ADD CONSTRAINT "ConflictOfInterest_assignmentId_fkey" FOREIGN KEY ("assignmentId") REFERENCES "Assignment"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "ConflictOfInterest" ADD CONSTRAINT "ConflictOfInterest_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "ConflictOfInterest" ADD CONSTRAINT "ConflictOfInterest_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "ConflictOfInterest" ADD CONSTRAINT "ConflictOfInterest_reviewedById_fkey" FOREIGN KEY ("reviewedById") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "ConflictOfInterest" ADD CONSTRAINT "ConflictOfInterest_reviewedById_fkey" FOREIGN KEY ("reviewedById") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "EvaluationSummary" ADD CONSTRAINT "EvaluationSummary_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "EvaluationSummary" ADD CONSTRAINT "EvaluationSummary_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "EvaluationSummary" ADD CONSTRAINT "EvaluationSummary_generatedById_fkey" FOREIGN KEY ("generatedById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "EvaluationSummary" ADD CONSTRAINT "EvaluationSummary_generatedById_fkey" FOREIGN KEY ("generatedById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "ProjectStatusHistory" ADD CONSTRAINT "ProjectStatusHistory_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "ProjectStatusHistory" ADD CONSTRAINT "ProjectStatusHistory_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "MentorMessage" ADD CONSTRAINT "MentorMessage_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "MentorMessage" ADD CONSTRAINT "MentorMessage_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "MentorMessage" ADD CONSTRAINT "MentorMessage_senderId_fkey" FOREIGN KEY ("senderId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "MentorMessage" ADD CONSTRAINT "MentorMessage_senderId_fkey" FOREIGN KEY ("senderId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "DigestLog" ADD CONSTRAINT "DigestLog_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "DigestLog" ADD CONSTRAINT "DigestLog_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "MentorNote" ADD CONSTRAINT "MentorNote_mentorAssignmentId_fkey" FOREIGN KEY ("mentorAssignmentId") REFERENCES "MentorAssignment"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "MentorNote" ADD CONSTRAINT "MentorNote_mentorAssignmentId_fkey" FOREIGN KEY ("mentorAssignmentId") REFERENCES "MentorAssignment"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "MentorNote" ADD CONSTRAINT "MentorNote_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "MentorNote" ADD CONSTRAINT "MentorNote_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "MentorMilestone" ADD CONSTRAINT "MentorMilestone_programId_fkey" FOREIGN KEY ("programId") REFERENCES "Program"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "MentorMilestone" ADD CONSTRAINT "MentorMilestone_programId_fkey" FOREIGN KEY ("programId") REFERENCES "Program"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "MentorMilestoneCompletion" ADD CONSTRAINT "MentorMilestoneCompletion_milestoneId_fkey" FOREIGN KEY ("milestoneId") REFERENCES "MentorMilestone"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "MentorMilestoneCompletion" ADD CONSTRAINT "MentorMilestoneCompletion_milestoneId_fkey" FOREIGN KEY ("milestoneId") REFERENCES "MentorMilestone"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "MentorMilestoneCompletion" ADD CONSTRAINT "MentorMilestoneCompletion_mentorAssignmentId_fkey" FOREIGN KEY ("mentorAssignmentId") REFERENCES "MentorAssignment"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "MentorMilestoneCompletion" ADD CONSTRAINT "MentorMilestoneCompletion_mentorAssignmentId_fkey" FOREIGN KEY ("mentorAssignmentId") REFERENCES "MentorAssignment"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "MentorMilestoneCompletion" ADD CONSTRAINT "MentorMilestoneCompletion_completedById_fkey" FOREIGN KEY ("completedById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "MentorMilestoneCompletion" ADD CONSTRAINT "MentorMilestoneCompletion_completedById_fkey" FOREIGN KEY ("completedById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "Message" ADD CONSTRAINT "Message_senderId_fkey" FOREIGN KEY ("senderId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "Message" ADD CONSTRAINT "Message_senderId_fkey" FOREIGN KEY ("senderId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "Message" ADD CONSTRAINT "Message_templateId_fkey" FOREIGN KEY ("templateId") REFERENCES "MessageTemplate"("id") ON DELETE SET NULL ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "Message" ADD CONSTRAINT "Message_templateId_fkey" FOREIGN KEY ("templateId") REFERENCES "MessageTemplate"("id") ON DELETE SET NULL ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "MessageRecipient" ADD CONSTRAINT "MessageRecipient_messageId_fkey" FOREIGN KEY ("messageId") REFERENCES "Message"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "MessageRecipient" ADD CONSTRAINT "MessageRecipient_messageId_fkey" FOREIGN KEY ("messageId") REFERENCES "Message"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "MessageRecipient" ADD CONSTRAINT "MessageRecipient_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "MessageRecipient" ADD CONSTRAINT "MessageRecipient_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "Webhook" ADD CONSTRAINT "Webhook_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "Webhook" ADD CONSTRAINT "Webhook_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "WebhookDelivery" ADD CONSTRAINT "WebhookDelivery_webhookId_fkey" FOREIGN KEY ("webhookId") REFERENCES "Webhook"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "WebhookDelivery" ADD CONSTRAINT "WebhookDelivery_webhookId_fkey" FOREIGN KEY ("webhookId") REFERENCES "Webhook"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "EvaluationDiscussion" ADD CONSTRAINT "EvaluationDiscussion_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "EvaluationDiscussion" ADD CONSTRAINT "EvaluationDiscussion_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "EvaluationDiscussion" ADD CONSTRAINT "EvaluationDiscussion_closedById_fkey" FOREIGN KEY ("closedById") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "EvaluationDiscussion" ADD CONSTRAINT "EvaluationDiscussion_closedById_fkey" FOREIGN KEY ("closedById") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "DiscussionComment" ADD CONSTRAINT "DiscussionComment_discussionId_fkey" FOREIGN KEY ("discussionId") REFERENCES "EvaluationDiscussion"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "DiscussionComment" ADD CONSTRAINT "DiscussionComment_discussionId_fkey" FOREIGN KEY ("discussionId") REFERENCES "EvaluationDiscussion"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AddForeignKey -ALTER TABLE "DiscussionComment" ADD CONSTRAINT "DiscussionComment_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "DiscussionComment" ADD CONSTRAINT "DiscussionComment_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; diff --git a/prisma/migrations/20260208000000_add_missing_fks_indexes/migration.sql b/prisma/migrations/20260208000000_add_missing_fks_indexes/migration.sql index c269885..c52139b 100644 --- a/prisma/migrations/20260208000000_add_missing_fks_indexes/migration.sql +++ b/prisma/migrations/20260208000000_add_missing_fks_indexes/migration.sql @@ -6,36 +6,46 @@ -- Missing Foreign Keys -- ===================================================== --- RoundTemplate → Program -ALTER TABLE "RoundTemplate" ADD CONSTRAINT "RoundTemplate_programId_fkey" - FOREIGN KEY ("programId") REFERENCES "Program"("id") ON DELETE CASCADE ON UPDATE CASCADE; +-- RoundTemplate -> Program +DO $$ BEGIN + ALTER TABLE "RoundTemplate" ADD CONSTRAINT "RoundTemplate_programId_fkey" + FOREIGN KEY ("programId") REFERENCES "Program"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; --- RoundTemplate → User (creator) -ALTER TABLE "RoundTemplate" ADD CONSTRAINT "RoundTemplate_createdBy_fkey" - FOREIGN KEY ("createdBy") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +-- RoundTemplate -> User (creator) +DO $$ BEGIN + ALTER TABLE "RoundTemplate" ADD CONSTRAINT "RoundTemplate_createdBy_fkey" + FOREIGN KEY ("createdBy") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; --- Message → Round -ALTER TABLE "Message" ADD CONSTRAINT "Message_roundId_fkey" - FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE SET NULL ON UPDATE CASCADE; +-- Message -> Round +DO $$ BEGIN + ALTER TABLE "Message" ADD CONSTRAINT "Message_roundId_fkey" + FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE SET NULL ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; --- EvaluationDiscussion → Round -ALTER TABLE "EvaluationDiscussion" ADD CONSTRAINT "EvaluationDiscussion_roundId_fkey" - FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +-- EvaluationDiscussion -> Round +DO $$ BEGIN + ALTER TABLE "EvaluationDiscussion" ADD CONSTRAINT "EvaluationDiscussion_roundId_fkey" + FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; --- ProjectFile → ProjectFile (self-relation for file versioning) -ALTER TABLE "ProjectFile" ADD CONSTRAINT "ProjectFile_replacedById_fkey" - FOREIGN KEY ("replacedById") REFERENCES "ProjectFile"("id") ON DELETE SET NULL ON UPDATE CASCADE; +-- ProjectFile -> ProjectFile (self-relation for file versioning) +DO $$ BEGIN + ALTER TABLE "ProjectFile" ADD CONSTRAINT "ProjectFile_replacedById_fkey" + FOREIGN KEY ("replacedById") REFERENCES "ProjectFile"("id") ON DELETE SET NULL ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- ===================================================== -- Missing Indexes -- ===================================================== -CREATE INDEX "RoundTemplate_roundType_idx" ON "RoundTemplate"("roundType"); -CREATE INDEX "MentorNote_authorId_idx" ON "MentorNote"("authorId"); -CREATE INDEX "MentorMilestoneCompletion_completedById_idx" ON "MentorMilestoneCompletion"("completedById"); -CREATE INDEX "Webhook_createdById_idx" ON "Webhook"("createdById"); -CREATE INDEX "WebhookDelivery_event_idx" ON "WebhookDelivery"("event"); -CREATE INDEX "Message_roundId_idx" ON "Message"("roundId"); -CREATE INDEX "EvaluationDiscussion_closedById_idx" ON "EvaluationDiscussion"("closedById"); -CREATE INDEX "DiscussionComment_discussionId_idx" ON "DiscussionComment"("discussionId"); -CREATE INDEX "DiscussionComment_userId_idx" ON "DiscussionComment"("userId"); +CREATE INDEX IF NOT EXISTS "RoundTemplate_roundType_idx" ON "RoundTemplate"("roundType"); +CREATE INDEX IF NOT EXISTS "MentorNote_authorId_idx" ON "MentorNote"("authorId"); +CREATE INDEX IF NOT EXISTS "MentorMilestoneCompletion_completedById_idx" ON "MentorMilestoneCompletion"("completedById"); +CREATE INDEX IF NOT EXISTS "Webhook_createdById_idx" ON "Webhook"("createdById"); +CREATE INDEX IF NOT EXISTS "WebhookDelivery_event_idx" ON "WebhookDelivery"("event"); +CREATE INDEX IF NOT EXISTS "Message_roundId_idx" ON "Message"("roundId"); +CREATE INDEX IF NOT EXISTS "EvaluationDiscussion_closedById_idx" ON "EvaluationDiscussion"("closedById"); +CREATE INDEX IF NOT EXISTS "DiscussionComment_discussionId_idx" ON "DiscussionComment"("discussionId"); +CREATE INDEX IF NOT EXISTS "DiscussionComment_userId_idx" ON "DiscussionComment"("userId"); diff --git a/prisma/migrations/20260210000000_fix_round_delete_cascades/migration.sql b/prisma/migrations/20260210000000_fix_round_delete_cascades/migration.sql index 2461453..33cd2d5 100644 --- a/prisma/migrations/20260210000000_fix_round_delete_cascades/migration.sql +++ b/prisma/migrations/20260210000000_fix_round_delete_cascades/migration.sql @@ -3,11 +3,15 @@ -- Add SET NULL on ProjectFile.roundId so deleting Round nullifies the reference -- AlterTable: Evaluation.formId -> onDelete CASCADE -ALTER TABLE "Evaluation" DROP CONSTRAINT "Evaluation_formId_fkey"; -ALTER TABLE "Evaluation" ADD CONSTRAINT "Evaluation_formId_fkey" - FOREIGN KEY ("formId") REFERENCES "EvaluationForm"("id") ON DELETE CASCADE ON UPDATE CASCADE; +ALTER TABLE "Evaluation" DROP CONSTRAINT IF EXISTS "Evaluation_formId_fkey"; +DO $$ BEGIN + ALTER TABLE "Evaluation" ADD CONSTRAINT "Evaluation_formId_fkey" + FOREIGN KEY ("formId") REFERENCES "EvaluationForm"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AlterTable: ProjectFile.roundId -> onDelete SET NULL -ALTER TABLE "ProjectFile" DROP CONSTRAINT "ProjectFile_roundId_fkey"; -ALTER TABLE "ProjectFile" ADD CONSTRAINT "ProjectFile_roundId_fkey" - FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE SET NULL ON UPDATE CASCADE; +ALTER TABLE "ProjectFile" DROP CONSTRAINT IF EXISTS "ProjectFile_roundId_fkey"; +DO $$ BEGIN + ALTER TABLE "ProjectFile" ADD CONSTRAINT "ProjectFile_roundId_fkey" + FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE SET NULL ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; diff --git a/prisma/migrations/20260211000000_add_file_requirements/migration.sql b/prisma/migrations/20260211000000_add_file_requirements/migration.sql index d132a75..4d86b4b 100644 --- a/prisma/migrations/20260211000000_add_file_requirements/migration.sql +++ b/prisma/migrations/20260211000000_add_file_requirements/migration.sql @@ -1,5 +1,5 @@ -- CreateTable -CREATE TABLE "FileRequirement" ( +CREATE TABLE IF NOT EXISTS "FileRequirement" ( "id" TEXT NOT NULL, "roundId" TEXT NOT NULL, "name" TEXT NOT NULL, @@ -15,16 +15,22 @@ CREATE TABLE "FileRequirement" ( ); -- CreateIndex -CREATE INDEX "FileRequirement_roundId_idx" ON "FileRequirement"("roundId"); +CREATE INDEX IF NOT EXISTS "FileRequirement_roundId_idx" ON "FileRequirement"("roundId"); -- AddForeignKey -ALTER TABLE "FileRequirement" ADD CONSTRAINT "FileRequirement_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "FileRequirement" ADD CONSTRAINT "FileRequirement_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AlterTable: add requirementId to ProjectFile -ALTER TABLE "ProjectFile" ADD COLUMN "requirementId" TEXT; +DO $$ BEGIN + ALTER TABLE "ProjectFile" ADD COLUMN "requirementId" TEXT; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; -- CreateIndex -CREATE INDEX "ProjectFile_requirementId_idx" ON "ProjectFile"("requirementId"); +CREATE INDEX IF NOT EXISTS "ProjectFile_requirementId_idx" ON "ProjectFile"("requirementId"); -- AddForeignKey -ALTER TABLE "ProjectFile" ADD CONSTRAINT "ProjectFile_requirementId_fkey" FOREIGN KEY ("requirementId") REFERENCES "FileRequirement"("id") ON DELETE SET NULL ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "ProjectFile" ADD CONSTRAINT "ProjectFile_requirementId_fkey" FOREIGN KEY ("requirementId") REFERENCES "FileRequirement"("id") ON DELETE SET NULL ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; diff --git a/prisma/migrations/20260211120000_add_award_vote_composite_index/migration.sql b/prisma/migrations/20260211120000_add_award_vote_composite_index/migration.sql index 51717bd..7b97455 100644 --- a/prisma/migrations/20260211120000_add_award_vote_composite_index/migration.sql +++ b/prisma/migrations/20260211120000_add_award_vote_composite_index/migration.sql @@ -1,2 +1,2 @@ -- CreateIndex -CREATE INDEX "AwardVote_awardId_userId_idx" ON "AwardVote"("awardId", "userId"); +CREATE INDEX IF NOT EXISTS "AwardVote_awardId_userId_idx" ON "AwardVote"("awardId", "userId"); diff --git a/prisma/migrations/20260214000000_simplify_routing_to_award_assignment/migration.sql b/prisma/migrations/20260214000000_simplify_routing_to_award_assignment/migration.sql index 746da65..0c910e6 100644 --- a/prisma/migrations/20260214000000_simplify_routing_to_award_assignment/migration.sql +++ b/prisma/migrations/20260214000000_simplify_routing_to_award_assignment/migration.sql @@ -1,28 +1,36 @@ --- Simplify RoutingMode enum: remove POST_MAIN, rename PARALLEL → SHARED +-- Simplify RoutingMode enum: remove POST_MAIN, rename PARALLEL -> SHARED -- Drop RoutingRule table (routing is now handled via award assignment) -- 1. Update existing PARALLEL values to SHARED, POST_MAIN to SHARED +-- (safe to run even if no rows match) UPDATE "Track" SET "routingMode" = 'PARALLEL' WHERE "routingMode" = 'POST_MAIN'; --- 2. Rename PARALLEL → SHARED in the enum -ALTER TYPE "RoutingMode" RENAME VALUE 'PARALLEL' TO 'SHARED'; +-- 2. Rename PARALLEL -> SHARED in the enum (only if PARALLEL still exists) +DO $$ BEGIN + ALTER TYPE "RoutingMode" RENAME VALUE 'PARALLEL' TO 'SHARED'; +EXCEPTION WHEN invalid_parameter_value THEN NULL; WHEN others THEN NULL; END $$; -- 3. Remove POST_MAIN from the enum -- PostgreSQL doesn't support DROP VALUE directly, so we recreate the enum -- Since we already converted POST_MAIN values to PARALLEL (now SHARED), this is safe --- Create new enum without POST_MAIN --- Actually, since we already renamed PARALLEL to SHARED and converted POST_MAIN rows, --- we just need to remove the POST_MAIN value. PostgreSQL 13+ doesn't support dropping --- enum values natively, but since all rows are already migrated, we can: -CREATE TYPE "RoutingMode_new" AS ENUM ('SHARED', 'EXCLUSIVE'); +-- Only recreate if the old enum still has POST_MAIN (i.e., hasn't been done yet) +DO $$ BEGIN + IF EXISTS ( + SELECT 1 FROM pg_enum + WHERE enumlabel = 'POST_MAIN' + AND enumtypid = (SELECT oid FROM pg_type WHERE typname = 'RoutingMode') + ) THEN + CREATE TYPE "RoutingMode_new" AS ENUM ('SHARED', 'EXCLUSIVE'); -ALTER TABLE "Track" - ALTER COLUMN "routingMode" TYPE "RoutingMode_new" - USING ("routingMode"::text::"RoutingMode_new"); + ALTER TABLE "Track" + ALTER COLUMN "routingMode" TYPE "RoutingMode_new" + USING ("routingMode"::text::"RoutingMode_new"); -DROP TYPE "RoutingMode"; -ALTER TYPE "RoutingMode_new" RENAME TO "RoutingMode"; + DROP TYPE "RoutingMode"; + ALTER TYPE "RoutingMode_new" RENAME TO "RoutingMode"; + END IF; +END $$; -- 4. Drop the RoutingRule table (no longer needed) DROP TABLE IF EXISTS "RoutingRule"; diff --git a/prisma/migrations/20260215000000_add_competition_round_architecture/migration.sql b/prisma/migrations/20260215000000_add_competition_round_architecture/migration.sql index 5e283c0..4b681db 100644 --- a/prisma/migrations/20260215000000_add_competition_round_architecture/migration.sql +++ b/prisma/migrations/20260215000000_add_competition_round_architecture/migration.sql @@ -1,36 +1,36 @@ -- ============================================================================= --- Phase 0+1: Add Competition/Round Architecture (additive — no breaking changes) +-- Phase 0+1: Add Competition/Round Architecture (additive -- no breaking changes) -- ============================================================================= -- New enums, new tables, new optional columns on existing tables. -- Old Pipeline/Track/Stage tables are untouched. --- ─── New Enum Types ────────────────────────────────────────────────────────── +-- --- New Enum Types --- -CREATE TYPE "CompetitionStatus" AS ENUM ('DRAFT', 'ACTIVE', 'CLOSED', 'ARCHIVED'); -CREATE TYPE "RoundType" AS ENUM ('INTAKE', 'FILTERING', 'EVALUATION', 'SUBMISSION', 'MENTORING', 'LIVE_FINAL', 'DELIBERATION'); -CREATE TYPE "RoundStatus" AS ENUM ('ROUND_DRAFT', 'ROUND_ACTIVE', 'ROUND_CLOSED', 'ROUND_ARCHIVED'); -CREATE TYPE "ProjectRoundStateValue" AS ENUM ('PENDING', 'IN_PROGRESS', 'PASSED', 'REJECTED', 'COMPLETED', 'WITHDRAWN'); -CREATE TYPE "AdvancementRuleType" AS ENUM ('AUTO_ADVANCE', 'SCORE_THRESHOLD', 'TOP_N', 'ADMIN_SELECTION', 'AI_RECOMMENDED'); -CREATE TYPE "CapMode" AS ENUM ('HARD', 'SOFT', 'NONE'); -CREATE TYPE "DeadlinePolicy" AS ENUM ('HARD_DEADLINE', 'FLAG', 'GRACE'); -CREATE TYPE "JuryGroupMemberRole" AS ENUM ('CHAIR', 'MEMBER', 'OBSERVER'); -CREATE TYPE "AssignmentIntentSource" AS ENUM ('INVITE', 'ADMIN', 'SYSTEM'); -CREATE TYPE "AssignmentIntentStatus" AS ENUM ('INTENT_PENDING', 'HONORED', 'OVERRIDDEN', 'EXPIRED', 'CANCELLED'); -CREATE TYPE "MentorMessageRole" AS ENUM ('MENTOR_ROLE', 'APPLICANT_ROLE', 'ADMIN_ROLE'); -CREATE TYPE "SubmissionPromotionSource" AS ENUM ('MENTOR_FILE', 'ADMIN_REPLACEMENT'); -CREATE TYPE "DeliberationMode" AS ENUM ('SINGLE_WINNER_VOTE', 'FULL_RANKING'); -CREATE TYPE "DeliberationStatus" AS ENUM ('DELIB_OPEN', 'VOTING', 'TALLYING', 'RUNOFF', 'DELIB_LOCKED'); -CREATE TYPE "TieBreakMethod" AS ENUM ('TIE_RUNOFF', 'TIE_ADMIN_DECIDES', 'SCORE_FALLBACK'); -CREATE TYPE "DeliberationParticipantStatus" AS ENUM ('REQUIRED', 'ABSENT_EXCUSED', 'REPLACED', 'REPLACEMENT_ACTIVE'); -CREATE TYPE "AwardEligibilityMode" AS ENUM ('SEPARATE_POOL', 'STAY_IN_MAIN'); +DO $$ BEGIN CREATE TYPE "CompetitionStatus" AS ENUM ('DRAFT', 'ACTIVE', 'CLOSED', 'ARCHIVED'); EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN CREATE TYPE "RoundType" AS ENUM ('INTAKE', 'FILTERING', 'EVALUATION', 'SUBMISSION', 'MENTORING', 'LIVE_FINAL', 'DELIBERATION'); EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN CREATE TYPE "RoundStatus" AS ENUM ('ROUND_DRAFT', 'ROUND_ACTIVE', 'ROUND_CLOSED', 'ROUND_ARCHIVED'); EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN CREATE TYPE "ProjectRoundStateValue" AS ENUM ('PENDING', 'IN_PROGRESS', 'PASSED', 'REJECTED', 'COMPLETED', 'WITHDRAWN'); EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN CREATE TYPE "AdvancementRuleType" AS ENUM ('AUTO_ADVANCE', 'SCORE_THRESHOLD', 'TOP_N', 'ADMIN_SELECTION', 'AI_RECOMMENDED'); EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN CREATE TYPE "CapMode" AS ENUM ('HARD', 'SOFT', 'NONE'); EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN CREATE TYPE "DeadlinePolicy" AS ENUM ('HARD_DEADLINE', 'FLAG', 'GRACE'); EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN CREATE TYPE "JuryGroupMemberRole" AS ENUM ('CHAIR', 'MEMBER', 'OBSERVER'); EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN CREATE TYPE "AssignmentIntentSource" AS ENUM ('INVITE', 'ADMIN', 'SYSTEM'); EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN CREATE TYPE "AssignmentIntentStatus" AS ENUM ('INTENT_PENDING', 'HONORED', 'OVERRIDDEN', 'EXPIRED', 'CANCELLED'); EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN CREATE TYPE "MentorMessageRole" AS ENUM ('MENTOR_ROLE', 'APPLICANT_ROLE', 'ADMIN_ROLE'); EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN CREATE TYPE "SubmissionPromotionSource" AS ENUM ('MENTOR_FILE', 'ADMIN_REPLACEMENT'); EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN CREATE TYPE "DeliberationMode" AS ENUM ('SINGLE_WINNER_VOTE', 'FULL_RANKING'); EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN CREATE TYPE "DeliberationStatus" AS ENUM ('DELIB_OPEN', 'VOTING', 'TALLYING', 'RUNOFF', 'DELIB_LOCKED'); EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN CREATE TYPE "TieBreakMethod" AS ENUM ('TIE_RUNOFF', 'TIE_ADMIN_DECIDES', 'SCORE_FALLBACK'); EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN CREATE TYPE "DeliberationParticipantStatus" AS ENUM ('REQUIRED', 'ABSENT_EXCUSED', 'REPLACED', 'REPLACEMENT_ACTIVE'); EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN CREATE TYPE "AwardEligibilityMode" AS ENUM ('SEPARATE_POOL', 'STAY_IN_MAIN'); EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- Add FEATURE_FLAGS to SettingCategory enum -ALTER TYPE "SettingCategory" ADD VALUE 'FEATURE_FLAGS'; +DO $$ BEGIN ALTER TYPE "SettingCategory" ADD VALUE 'FEATURE_FLAGS'; EXCEPTION WHEN duplicate_object THEN NULL; END $$; --- ─── New Tables ────────────────────────────────────────────────────────────── +-- --- New Tables --- -- Competition (replaces Pipeline) -CREATE TABLE "Competition" ( +CREATE TABLE IF NOT EXISTS "Competition" ( "id" TEXT NOT NULL, "programId" TEXT NOT NULL, "name" TEXT NOT NULL, @@ -49,7 +49,7 @@ CREATE TABLE "Competition" ( ); -- Round (replaces Stage) -CREATE TABLE "Round" ( +CREATE TABLE IF NOT EXISTS "Round" ( "id" TEXT NOT NULL, "competitionId" TEXT NOT NULL, "name" TEXT NOT NULL, @@ -70,7 +70,7 @@ CREATE TABLE "Round" ( ); -- ProjectRoundState -CREATE TABLE "ProjectRoundState" ( +CREATE TABLE IF NOT EXISTS "ProjectRoundState" ( "id" TEXT NOT NULL, "projectId" TEXT NOT NULL, "roundId" TEXT NOT NULL, @@ -85,7 +85,7 @@ CREATE TABLE "ProjectRoundState" ( ); -- AdvancementRule -CREATE TABLE "AdvancementRule" ( +CREATE TABLE IF NOT EXISTS "AdvancementRule" ( "id" TEXT NOT NULL, "roundId" TEXT NOT NULL, "targetRoundId" TEXT, @@ -99,7 +99,7 @@ CREATE TABLE "AdvancementRule" ( ); -- JuryGroup -CREATE TABLE "JuryGroup" ( +CREATE TABLE IF NOT EXISTS "JuryGroup" ( "id" TEXT NOT NULL, "competitionId" TEXT NOT NULL, "name" TEXT NOT NULL, @@ -120,7 +120,7 @@ CREATE TABLE "JuryGroup" ( ); -- JuryGroupMember -CREATE TABLE "JuryGroupMember" ( +CREATE TABLE IF NOT EXISTS "JuryGroupMember" ( "id" TEXT NOT NULL, "juryGroupId" TEXT NOT NULL, "userId" TEXT NOT NULL, @@ -138,7 +138,7 @@ CREATE TABLE "JuryGroupMember" ( ); -- SubmissionWindow -CREATE TABLE "SubmissionWindow" ( +CREATE TABLE IF NOT EXISTS "SubmissionWindow" ( "id" TEXT NOT NULL, "competitionId" TEXT NOT NULL, "name" TEXT NOT NULL, @@ -158,7 +158,7 @@ CREATE TABLE "SubmissionWindow" ( ); -- SubmissionFileRequirement -CREATE TABLE "SubmissionFileRequirement" ( +CREATE TABLE IF NOT EXISTS "SubmissionFileRequirement" ( "id" TEXT NOT NULL, "submissionWindowId" TEXT NOT NULL, "label" TEXT NOT NULL, @@ -175,7 +175,7 @@ CREATE TABLE "SubmissionFileRequirement" ( ); -- RoundSubmissionVisibility -CREATE TABLE "RoundSubmissionVisibility" ( +CREATE TABLE IF NOT EXISTS "RoundSubmissionVisibility" ( "id" TEXT NOT NULL, "roundId" TEXT NOT NULL, "submissionWindowId" TEXT NOT NULL, @@ -186,7 +186,7 @@ CREATE TABLE "RoundSubmissionVisibility" ( ); -- AssignmentIntent -CREATE TABLE "AssignmentIntent" ( +CREATE TABLE IF NOT EXISTS "AssignmentIntent" ( "id" TEXT NOT NULL, "juryGroupMemberId" TEXT NOT NULL, "roundId" TEXT NOT NULL, @@ -200,7 +200,7 @@ CREATE TABLE "AssignmentIntent" ( ); -- AssignmentException -CREATE TABLE "AssignmentException" ( +CREATE TABLE IF NOT EXISTS "AssignmentException" ( "id" TEXT NOT NULL, "assignmentId" TEXT NOT NULL, "reason" TEXT NOT NULL, @@ -212,7 +212,7 @@ CREATE TABLE "AssignmentException" ( ); -- MentorFile -CREATE TABLE "MentorFile" ( +CREATE TABLE IF NOT EXISTS "MentorFile" ( "id" TEXT NOT NULL, "mentorAssignmentId" TEXT NOT NULL, "uploadedByUserId" TEXT NOT NULL, @@ -232,7 +232,7 @@ CREATE TABLE "MentorFile" ( ); -- MentorFileComment -CREATE TABLE "MentorFileComment" ( +CREATE TABLE IF NOT EXISTS "MentorFileComment" ( "id" TEXT NOT NULL, "mentorFileId" TEXT NOT NULL, "authorId" TEXT NOT NULL, @@ -245,7 +245,7 @@ CREATE TABLE "MentorFileComment" ( ); -- SubmissionPromotionEvent -CREATE TABLE "SubmissionPromotionEvent" ( +CREATE TABLE IF NOT EXISTS "SubmissionPromotionEvent" ( "id" TEXT NOT NULL, "projectId" TEXT NOT NULL, "roundId" TEXT NOT NULL, @@ -259,7 +259,7 @@ CREATE TABLE "SubmissionPromotionEvent" ( ); -- DeliberationSession -CREATE TABLE "DeliberationSession" ( +CREATE TABLE IF NOT EXISTS "DeliberationSession" ( "id" TEXT NOT NULL, "competitionId" TEXT NOT NULL, "roundId" TEXT NOT NULL, @@ -277,7 +277,7 @@ CREATE TABLE "DeliberationSession" ( ); -- DeliberationVote -CREATE TABLE "DeliberationVote" ( +CREATE TABLE IF NOT EXISTS "DeliberationVote" ( "id" TEXT NOT NULL, "sessionId" TEXT NOT NULL, "juryMemberId" TEXT NOT NULL, @@ -291,7 +291,7 @@ CREATE TABLE "DeliberationVote" ( ); -- DeliberationResult -CREATE TABLE "DeliberationResult" ( +CREATE TABLE IF NOT EXISTS "DeliberationResult" ( "id" TEXT NOT NULL, "sessionId" TEXT NOT NULL, "projectId" TEXT NOT NULL, @@ -304,7 +304,7 @@ CREATE TABLE "DeliberationResult" ( ); -- DeliberationParticipant -CREATE TABLE "DeliberationParticipant" ( +CREATE TABLE IF NOT EXISTS "DeliberationParticipant" ( "id" TEXT NOT NULL, "sessionId" TEXT NOT NULL, "userId" TEXT NOT NULL, @@ -315,7 +315,7 @@ CREATE TABLE "DeliberationParticipant" ( ); -- ResultLock -CREATE TABLE "ResultLock" ( +CREATE TABLE IF NOT EXISTS "ResultLock" ( "id" TEXT NOT NULL, "competitionId" TEXT NOT NULL, "roundId" TEXT NOT NULL, @@ -328,7 +328,7 @@ CREATE TABLE "ResultLock" ( ); -- ResultUnlockEvent -CREATE TABLE "ResultUnlockEvent" ( +CREATE TABLE IF NOT EXISTS "ResultUnlockEvent" ( "id" TEXT NOT NULL, "resultLockId" TEXT NOT NULL, "unlockedById" TEXT NOT NULL, @@ -338,235 +338,365 @@ CREATE TABLE "ResultUnlockEvent" ( CONSTRAINT "ResultUnlockEvent_pkey" PRIMARY KEY ("id") ); --- ─── Add Columns to Existing Tables ────────────────────────────────────────── +-- --- Add Columns to Existing Tables --- -- Assignment: add juryGroupId -ALTER TABLE "Assignment" ADD COLUMN "juryGroupId" TEXT; +DO $$ BEGIN + ALTER TABLE "Assignment" ADD COLUMN "juryGroupId" TEXT; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; -- SpecialAward: add competition/round architecture fields -ALTER TABLE "SpecialAward" ADD COLUMN "competitionId" TEXT; -ALTER TABLE "SpecialAward" ADD COLUMN "evaluationRoundId" TEXT; -ALTER TABLE "SpecialAward" ADD COLUMN "juryGroupId" TEXT; -ALTER TABLE "SpecialAward" ADD COLUMN "eligibilityMode" "AwardEligibilityMode" NOT NULL DEFAULT 'STAY_IN_MAIN'; -ALTER TABLE "SpecialAward" ADD COLUMN "decisionMode" TEXT; +DO $$ BEGIN + ALTER TABLE "SpecialAward" ADD COLUMN "competitionId" TEXT; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "SpecialAward" ADD COLUMN "evaluationRoundId" TEXT; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "SpecialAward" ADD COLUMN "juryGroupId" TEXT; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "SpecialAward" ADD COLUMN "eligibilityMode" "AwardEligibilityMode" NOT NULL DEFAULT 'STAY_IN_MAIN'; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "SpecialAward" ADD COLUMN "decisionMode" TEXT; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; -- MentorAssignment: add workspace fields -ALTER TABLE "MentorAssignment" ADD COLUMN "workspaceEnabled" BOOLEAN NOT NULL DEFAULT false; -ALTER TABLE "MentorAssignment" ADD COLUMN "workspaceOpenAt" TIMESTAMP(3); -ALTER TABLE "MentorAssignment" ADD COLUMN "workspaceCloseAt" TIMESTAMP(3); +DO $$ BEGIN + ALTER TABLE "MentorAssignment" ADD COLUMN "workspaceEnabled" BOOLEAN NOT NULL DEFAULT false; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "MentorAssignment" ADD COLUMN "workspaceOpenAt" TIMESTAMP(3); +EXCEPTION WHEN duplicate_column THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "MentorAssignment" ADD COLUMN "workspaceCloseAt" TIMESTAMP(3); +EXCEPTION WHEN duplicate_column THEN NULL; END $$; -- MentorMessage: add workspace fields -ALTER TABLE "MentorMessage" ADD COLUMN "workspaceId" TEXT; -ALTER TABLE "MentorMessage" ADD COLUMN "senderRole" "MentorMessageRole"; +DO $$ BEGIN + ALTER TABLE "MentorMessage" ADD COLUMN "workspaceId" TEXT; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "MentorMessage" ADD COLUMN "senderRole" "MentorMessageRole"; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; -- ProjectFile: add submission window link -ALTER TABLE "ProjectFile" ADD COLUMN "submissionWindowId" TEXT; -ALTER TABLE "ProjectFile" ADD COLUMN "submissionFileRequirementId" TEXT; +DO $$ BEGIN + ALTER TABLE "ProjectFile" ADD COLUMN "submissionWindowId" TEXT; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "ProjectFile" ADD COLUMN "submissionFileRequirementId" TEXT; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; --- ─── Unique Constraints ────────────────────────────────────────────────────── +-- --- Unique Constraints --- -CREATE UNIQUE INDEX "Competition_slug_key" ON "Competition"("slug"); -CREATE UNIQUE INDEX "Round_competitionId_slug_key" ON "Round"("competitionId", "slug"); -CREATE UNIQUE INDEX "Round_competitionId_sortOrder_key" ON "Round"("competitionId", "sortOrder"); -CREATE UNIQUE INDEX "ProjectRoundState_projectId_roundId_key" ON "ProjectRoundState"("projectId", "roundId"); -CREATE UNIQUE INDEX "JuryGroup_competitionId_slug_key" ON "JuryGroup"("competitionId", "slug"); -CREATE UNIQUE INDEX "JuryGroupMember_juryGroupId_userId_key" ON "JuryGroupMember"("juryGroupId", "userId"); -CREATE UNIQUE INDEX "SubmissionWindow_competitionId_slug_key" ON "SubmissionWindow"("competitionId", "slug"); -CREATE UNIQUE INDEX "SubmissionWindow_competitionId_roundNumber_key" ON "SubmissionWindow"("competitionId", "roundNumber"); -CREATE UNIQUE INDEX "RoundSubmissionVisibility_roundId_submissionWindowId_key" ON "RoundSubmissionVisibility"("roundId", "submissionWindowId"); -CREATE UNIQUE INDEX "AssignmentIntent_juryGroupMemberId_roundId_projectId_key" ON "AssignmentIntent"("juryGroupMemberId", "roundId", "projectId"); -CREATE UNIQUE INDEX "MentorFile_promotedToFileId_key" ON "MentorFile"("promotedToFileId"); -CREATE UNIQUE INDEX "DeliberationVote_sessionId_juryMemberId_projectId_runoffRo_key" ON "DeliberationVote"("sessionId", "juryMemberId", "projectId", "runoffRound"); -CREATE UNIQUE INDEX "DeliberationResult_sessionId_projectId_key" ON "DeliberationResult"("sessionId", "projectId"); -CREATE UNIQUE INDEX "DeliberationParticipant_sessionId_userId_key" ON "DeliberationParticipant"("sessionId", "userId"); -CREATE UNIQUE INDEX "SubmissionFileRequirement_submissionWindowId_slug_key" ON "SubmissionFileRequirement"("submissionWindowId", "slug"); -CREATE UNIQUE INDEX "AdvancementRule_roundId_sortOrder_key" ON "AdvancementRule"("roundId", "sortOrder"); +CREATE UNIQUE INDEX IF NOT EXISTS "Competition_slug_key" ON "Competition"("slug"); +CREATE UNIQUE INDEX IF NOT EXISTS "Round_competitionId_slug_key" ON "Round"("competitionId", "slug"); +CREATE UNIQUE INDEX IF NOT EXISTS "Round_competitionId_sortOrder_key" ON "Round"("competitionId", "sortOrder"); +CREATE UNIQUE INDEX IF NOT EXISTS "ProjectRoundState_projectId_roundId_key" ON "ProjectRoundState"("projectId", "roundId"); +CREATE UNIQUE INDEX IF NOT EXISTS "JuryGroup_competitionId_slug_key" ON "JuryGroup"("competitionId", "slug"); +CREATE UNIQUE INDEX IF NOT EXISTS "JuryGroupMember_juryGroupId_userId_key" ON "JuryGroupMember"("juryGroupId", "userId"); +CREATE UNIQUE INDEX IF NOT EXISTS "SubmissionWindow_competitionId_slug_key" ON "SubmissionWindow"("competitionId", "slug"); +CREATE UNIQUE INDEX IF NOT EXISTS "SubmissionWindow_competitionId_roundNumber_key" ON "SubmissionWindow"("competitionId", "roundNumber"); +CREATE UNIQUE INDEX IF NOT EXISTS "RoundSubmissionVisibility_roundId_submissionWindowId_key" ON "RoundSubmissionVisibility"("roundId", "submissionWindowId"); +CREATE UNIQUE INDEX IF NOT EXISTS "AssignmentIntent_juryGroupMemberId_roundId_projectId_key" ON "AssignmentIntent"("juryGroupMemberId", "roundId", "projectId"); +CREATE UNIQUE INDEX IF NOT EXISTS "MentorFile_promotedToFileId_key" ON "MentorFile"("promotedToFileId"); +CREATE UNIQUE INDEX IF NOT EXISTS "DeliberationVote_sessionId_juryMemberId_projectId_runoffRo_key" ON "DeliberationVote"("sessionId", "juryMemberId", "projectId", "runoffRound"); +CREATE UNIQUE INDEX IF NOT EXISTS "DeliberationResult_sessionId_projectId_key" ON "DeliberationResult"("sessionId", "projectId"); +CREATE UNIQUE INDEX IF NOT EXISTS "DeliberationParticipant_sessionId_userId_key" ON "DeliberationParticipant"("sessionId", "userId"); +CREATE UNIQUE INDEX IF NOT EXISTS "SubmissionFileRequirement_submissionWindowId_slug_key" ON "SubmissionFileRequirement"("submissionWindowId", "slug"); +CREATE UNIQUE INDEX IF NOT EXISTS "AdvancementRule_roundId_sortOrder_key" ON "AdvancementRule"("roundId", "sortOrder"); --- ─── Indexes ───────────────────────────────────────────────────────────────── +-- --- Indexes --- -- Competition -CREATE INDEX "Competition_programId_idx" ON "Competition"("programId"); -CREATE INDEX "Competition_status_idx" ON "Competition"("status"); +CREATE INDEX IF NOT EXISTS "Competition_programId_idx" ON "Competition"("programId"); +CREATE INDEX IF NOT EXISTS "Competition_status_idx" ON "Competition"("status"); -- Round -CREATE INDEX "Round_competitionId_idx" ON "Round"("competitionId"); -CREATE INDEX "Round_roundType_idx" ON "Round"("roundType"); -CREATE INDEX "Round_status_idx" ON "Round"("status"); +CREATE INDEX IF NOT EXISTS "Round_competitionId_idx" ON "Round"("competitionId"); +CREATE INDEX IF NOT EXISTS "Round_roundType_idx" ON "Round"("roundType"); +CREATE INDEX IF NOT EXISTS "Round_status_idx" ON "Round"("status"); -- ProjectRoundState -CREATE INDEX "ProjectRoundState_projectId_idx" ON "ProjectRoundState"("projectId"); -CREATE INDEX "ProjectRoundState_roundId_idx" ON "ProjectRoundState"("roundId"); -CREATE INDEX "ProjectRoundState_state_idx" ON "ProjectRoundState"("state"); +CREATE INDEX IF NOT EXISTS "ProjectRoundState_projectId_idx" ON "ProjectRoundState"("projectId"); +CREATE INDEX IF NOT EXISTS "ProjectRoundState_roundId_idx" ON "ProjectRoundState"("roundId"); +CREATE INDEX IF NOT EXISTS "ProjectRoundState_state_idx" ON "ProjectRoundState"("state"); -- AdvancementRule -CREATE INDEX "AdvancementRule_roundId_idx" ON "AdvancementRule"("roundId"); +CREATE INDEX IF NOT EXISTS "AdvancementRule_roundId_idx" ON "AdvancementRule"("roundId"); -- JuryGroup -CREATE INDEX "JuryGroup_competitionId_idx" ON "JuryGroup"("competitionId"); +CREATE INDEX IF NOT EXISTS "JuryGroup_competitionId_idx" ON "JuryGroup"("competitionId"); -- JuryGroupMember -CREATE INDEX "JuryGroupMember_juryGroupId_idx" ON "JuryGroupMember"("juryGroupId"); -CREATE INDEX "JuryGroupMember_userId_idx" ON "JuryGroupMember"("userId"); +CREATE INDEX IF NOT EXISTS "JuryGroupMember_juryGroupId_idx" ON "JuryGroupMember"("juryGroupId"); +CREATE INDEX IF NOT EXISTS "JuryGroupMember_userId_idx" ON "JuryGroupMember"("userId"); -- SubmissionWindow -CREATE INDEX "SubmissionWindow_competitionId_idx" ON "SubmissionWindow"("competitionId"); +CREATE INDEX IF NOT EXISTS "SubmissionWindow_competitionId_idx" ON "SubmissionWindow"("competitionId"); -- SubmissionFileRequirement -CREATE INDEX "SubmissionFileRequirement_submissionWindowId_idx" ON "SubmissionFileRequirement"("submissionWindowId"); +CREATE INDEX IF NOT EXISTS "SubmissionFileRequirement_submissionWindowId_idx" ON "SubmissionFileRequirement"("submissionWindowId"); -- RoundSubmissionVisibility -CREATE INDEX "RoundSubmissionVisibility_roundId_idx" ON "RoundSubmissionVisibility"("roundId"); +CREATE INDEX IF NOT EXISTS "RoundSubmissionVisibility_roundId_idx" ON "RoundSubmissionVisibility"("roundId"); -- AssignmentIntent -CREATE INDEX "AssignmentIntent_roundId_idx" ON "AssignmentIntent"("roundId"); -CREATE INDEX "AssignmentIntent_projectId_idx" ON "AssignmentIntent"("projectId"); -CREATE INDEX "AssignmentIntent_status_idx" ON "AssignmentIntent"("status"); +CREATE INDEX IF NOT EXISTS "AssignmentIntent_roundId_idx" ON "AssignmentIntent"("roundId"); +CREATE INDEX IF NOT EXISTS "AssignmentIntent_projectId_idx" ON "AssignmentIntent"("projectId"); +CREATE INDEX IF NOT EXISTS "AssignmentIntent_status_idx" ON "AssignmentIntent"("status"); -- AssignmentException -CREATE INDEX "AssignmentException_assignmentId_idx" ON "AssignmentException"("assignmentId"); -CREATE INDEX "AssignmentException_approvedById_idx" ON "AssignmentException"("approvedById"); +CREATE INDEX IF NOT EXISTS "AssignmentException_assignmentId_idx" ON "AssignmentException"("assignmentId"); +CREATE INDEX IF NOT EXISTS "AssignmentException_approvedById_idx" ON "AssignmentException"("approvedById"); -- MentorFile -CREATE INDEX "MentorFile_mentorAssignmentId_idx" ON "MentorFile"("mentorAssignmentId"); -CREATE INDEX "MentorFile_uploadedByUserId_idx" ON "MentorFile"("uploadedByUserId"); +CREATE INDEX IF NOT EXISTS "MentorFile_mentorAssignmentId_idx" ON "MentorFile"("mentorAssignmentId"); +CREATE INDEX IF NOT EXISTS "MentorFile_uploadedByUserId_idx" ON "MentorFile"("uploadedByUserId"); -- MentorFileComment -CREATE INDEX "MentorFileComment_mentorFileId_idx" ON "MentorFileComment"("mentorFileId"); -CREATE INDEX "MentorFileComment_authorId_idx" ON "MentorFileComment"("authorId"); -CREATE INDEX "MentorFileComment_parentCommentId_idx" ON "MentorFileComment"("parentCommentId"); +CREATE INDEX IF NOT EXISTS "MentorFileComment_mentorFileId_idx" ON "MentorFileComment"("mentorFileId"); +CREATE INDEX IF NOT EXISTS "MentorFileComment_authorId_idx" ON "MentorFileComment"("authorId"); +CREATE INDEX IF NOT EXISTS "MentorFileComment_parentCommentId_idx" ON "MentorFileComment"("parentCommentId"); -- SubmissionPromotionEvent -CREATE INDEX "SubmissionPromotionEvent_projectId_idx" ON "SubmissionPromotionEvent"("projectId"); -CREATE INDEX "SubmissionPromotionEvent_roundId_idx" ON "SubmissionPromotionEvent"("roundId"); -CREATE INDEX "SubmissionPromotionEvent_sourceFileId_idx" ON "SubmissionPromotionEvent"("sourceFileId"); +CREATE INDEX IF NOT EXISTS "SubmissionPromotionEvent_projectId_idx" ON "SubmissionPromotionEvent"("projectId"); +CREATE INDEX IF NOT EXISTS "SubmissionPromotionEvent_roundId_idx" ON "SubmissionPromotionEvent"("roundId"); +CREATE INDEX IF NOT EXISTS "SubmissionPromotionEvent_sourceFileId_idx" ON "SubmissionPromotionEvent"("sourceFileId"); -- DeliberationSession -CREATE INDEX "DeliberationSession_competitionId_idx" ON "DeliberationSession"("competitionId"); -CREATE INDEX "DeliberationSession_roundId_idx" ON "DeliberationSession"("roundId"); -CREATE INDEX "DeliberationSession_status_idx" ON "DeliberationSession"("status"); +CREATE INDEX IF NOT EXISTS "DeliberationSession_competitionId_idx" ON "DeliberationSession"("competitionId"); +CREATE INDEX IF NOT EXISTS "DeliberationSession_roundId_idx" ON "DeliberationSession"("roundId"); +CREATE INDEX IF NOT EXISTS "DeliberationSession_status_idx" ON "DeliberationSession"("status"); -- DeliberationVote -CREATE INDEX "DeliberationVote_sessionId_idx" ON "DeliberationVote"("sessionId"); -CREATE INDEX "DeliberationVote_juryMemberId_idx" ON "DeliberationVote"("juryMemberId"); -CREATE INDEX "DeliberationVote_projectId_idx" ON "DeliberationVote"("projectId"); +CREATE INDEX IF NOT EXISTS "DeliberationVote_sessionId_idx" ON "DeliberationVote"("sessionId"); +CREATE INDEX IF NOT EXISTS "DeliberationVote_juryMemberId_idx" ON "DeliberationVote"("juryMemberId"); +CREATE INDEX IF NOT EXISTS "DeliberationVote_projectId_idx" ON "DeliberationVote"("projectId"); -- DeliberationResult -CREATE INDEX "DeliberationResult_sessionId_idx" ON "DeliberationResult"("sessionId"); -CREATE INDEX "DeliberationResult_projectId_idx" ON "DeliberationResult"("projectId"); +CREATE INDEX IF NOT EXISTS "DeliberationResult_sessionId_idx" ON "DeliberationResult"("sessionId"); +CREATE INDEX IF NOT EXISTS "DeliberationResult_projectId_idx" ON "DeliberationResult"("projectId"); -- DeliberationParticipant -CREATE INDEX "DeliberationParticipant_sessionId_idx" ON "DeliberationParticipant"("sessionId"); -CREATE INDEX "DeliberationParticipant_userId_idx" ON "DeliberationParticipant"("userId"); +CREATE INDEX IF NOT EXISTS "DeliberationParticipant_sessionId_idx" ON "DeliberationParticipant"("sessionId"); +CREATE INDEX IF NOT EXISTS "DeliberationParticipant_userId_idx" ON "DeliberationParticipant"("userId"); -- ResultLock -CREATE INDEX "ResultLock_competitionId_idx" ON "ResultLock"("competitionId"); -CREATE INDEX "ResultLock_roundId_idx" ON "ResultLock"("roundId"); -CREATE INDEX "ResultLock_category_idx" ON "ResultLock"("category"); +CREATE INDEX IF NOT EXISTS "ResultLock_competitionId_idx" ON "ResultLock"("competitionId"); +CREATE INDEX IF NOT EXISTS "ResultLock_roundId_idx" ON "ResultLock"("roundId"); +CREATE INDEX IF NOT EXISTS "ResultLock_category_idx" ON "ResultLock"("category"); -- ResultUnlockEvent -CREATE INDEX "ResultUnlockEvent_resultLockId_idx" ON "ResultUnlockEvent"("resultLockId"); -CREATE INDEX "ResultUnlockEvent_unlockedById_idx" ON "ResultUnlockEvent"("unlockedById"); +CREATE INDEX IF NOT EXISTS "ResultUnlockEvent_resultLockId_idx" ON "ResultUnlockEvent"("resultLockId"); +CREATE INDEX IF NOT EXISTS "ResultUnlockEvent_unlockedById_idx" ON "ResultUnlockEvent"("unlockedById"); -- Indexes on modified existing tables -CREATE INDEX "Assignment_juryGroupId_idx" ON "Assignment"("juryGroupId"); -CREATE INDEX "SpecialAward_competitionId_idx" ON "SpecialAward"("competitionId"); -CREATE INDEX "SpecialAward_evaluationRoundId_idx" ON "SpecialAward"("evaluationRoundId"); -CREATE INDEX "MentorMessage_workspaceId_idx" ON "MentorMessage"("workspaceId"); -CREATE INDEX "ProjectFile_submissionWindowId_idx" ON "ProjectFile"("submissionWindowId"); -CREATE INDEX "ProjectFile_submissionFileRequirementId_idx" ON "ProjectFile"("submissionFileRequirementId"); +CREATE INDEX IF NOT EXISTS "Assignment_juryGroupId_idx" ON "Assignment"("juryGroupId"); +CREATE INDEX IF NOT EXISTS "SpecialAward_competitionId_idx" ON "SpecialAward"("competitionId"); +CREATE INDEX IF NOT EXISTS "SpecialAward_evaluationRoundId_idx" ON "SpecialAward"("evaluationRoundId"); +CREATE INDEX IF NOT EXISTS "MentorMessage_workspaceId_idx" ON "MentorMessage"("workspaceId"); +CREATE INDEX IF NOT EXISTS "ProjectFile_submissionWindowId_idx" ON "ProjectFile"("submissionWindowId"); +CREATE INDEX IF NOT EXISTS "ProjectFile_submissionFileRequirementId_idx" ON "ProjectFile"("submissionFileRequirementId"); --- ─── Foreign Keys ──────────────────────────────────────────────────────────── +-- --- Foreign Keys --- -- Competition -ALTER TABLE "Competition" ADD CONSTRAINT "Competition_programId_fkey" FOREIGN KEY ("programId") REFERENCES "Program"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "Competition" ADD CONSTRAINT "Competition_programId_fkey" FOREIGN KEY ("programId") REFERENCES "Program"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- Round -ALTER TABLE "Round" ADD CONSTRAINT "Round_competitionId_fkey" FOREIGN KEY ("competitionId") REFERENCES "Competition"("id") ON DELETE CASCADE ON UPDATE CASCADE; -ALTER TABLE "Round" ADD CONSTRAINT "Round_juryGroupId_fkey" FOREIGN KEY ("juryGroupId") REFERENCES "JuryGroup"("id") ON DELETE SET NULL ON UPDATE CASCADE; -ALTER TABLE "Round" ADD CONSTRAINT "Round_submissionWindowId_fkey" FOREIGN KEY ("submissionWindowId") REFERENCES "SubmissionWindow"("id") ON DELETE SET NULL ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "Round" ADD CONSTRAINT "Round_competitionId_fkey" FOREIGN KEY ("competitionId") REFERENCES "Competition"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "Round" ADD CONSTRAINT "Round_juryGroupId_fkey" FOREIGN KEY ("juryGroupId") REFERENCES "JuryGroup"("id") ON DELETE SET NULL ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "Round" ADD CONSTRAINT "Round_submissionWindowId_fkey" FOREIGN KEY ("submissionWindowId") REFERENCES "SubmissionWindow"("id") ON DELETE SET NULL ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- ProjectRoundState -ALTER TABLE "ProjectRoundState" ADD CONSTRAINT "ProjectRoundState_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; -ALTER TABLE "ProjectRoundState" ADD CONSTRAINT "ProjectRoundState_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "ProjectRoundState" ADD CONSTRAINT "ProjectRoundState_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "ProjectRoundState" ADD CONSTRAINT "ProjectRoundState_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AdvancementRule -ALTER TABLE "AdvancementRule" ADD CONSTRAINT "AdvancementRule_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "AdvancementRule" ADD CONSTRAINT "AdvancementRule_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- JuryGroup -ALTER TABLE "JuryGroup" ADD CONSTRAINT "JuryGroup_competitionId_fkey" FOREIGN KEY ("competitionId") REFERENCES "Competition"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "JuryGroup" ADD CONSTRAINT "JuryGroup_competitionId_fkey" FOREIGN KEY ("competitionId") REFERENCES "Competition"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- JuryGroupMember -ALTER TABLE "JuryGroupMember" ADD CONSTRAINT "JuryGroupMember_juryGroupId_fkey" FOREIGN KEY ("juryGroupId") REFERENCES "JuryGroup"("id") ON DELETE CASCADE ON UPDATE CASCADE; -ALTER TABLE "JuryGroupMember" ADD CONSTRAINT "JuryGroupMember_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "JuryGroupMember" ADD CONSTRAINT "JuryGroupMember_juryGroupId_fkey" FOREIGN KEY ("juryGroupId") REFERENCES "JuryGroup"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "JuryGroupMember" ADD CONSTRAINT "JuryGroupMember_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- SubmissionWindow -ALTER TABLE "SubmissionWindow" ADD CONSTRAINT "SubmissionWindow_competitionId_fkey" FOREIGN KEY ("competitionId") REFERENCES "Competition"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "SubmissionWindow" ADD CONSTRAINT "SubmissionWindow_competitionId_fkey" FOREIGN KEY ("competitionId") REFERENCES "Competition"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- SubmissionFileRequirement -ALTER TABLE "SubmissionFileRequirement" ADD CONSTRAINT "SubmissionFileRequirement_submissionWindowId_fkey" FOREIGN KEY ("submissionWindowId") REFERENCES "SubmissionWindow"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "SubmissionFileRequirement" ADD CONSTRAINT "SubmissionFileRequirement_submissionWindowId_fkey" FOREIGN KEY ("submissionWindowId") REFERENCES "SubmissionWindow"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- RoundSubmissionVisibility -ALTER TABLE "RoundSubmissionVisibility" ADD CONSTRAINT "RoundSubmissionVisibility_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; -ALTER TABLE "RoundSubmissionVisibility" ADD CONSTRAINT "RoundSubmissionVisibility_submissionWindowId_fkey" FOREIGN KEY ("submissionWindowId") REFERENCES "SubmissionWindow"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "RoundSubmissionVisibility" ADD CONSTRAINT "RoundSubmissionVisibility_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "RoundSubmissionVisibility" ADD CONSTRAINT "RoundSubmissionVisibility_submissionWindowId_fkey" FOREIGN KEY ("submissionWindowId") REFERENCES "SubmissionWindow"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AssignmentIntent -ALTER TABLE "AssignmentIntent" ADD CONSTRAINT "AssignmentIntent_juryGroupMemberId_fkey" FOREIGN KEY ("juryGroupMemberId") REFERENCES "JuryGroupMember"("id") ON DELETE CASCADE ON UPDATE CASCADE; -ALTER TABLE "AssignmentIntent" ADD CONSTRAINT "AssignmentIntent_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; -ALTER TABLE "AssignmentIntent" ADD CONSTRAINT "AssignmentIntent_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "AssignmentIntent" ADD CONSTRAINT "AssignmentIntent_juryGroupMemberId_fkey" FOREIGN KEY ("juryGroupMemberId") REFERENCES "JuryGroupMember"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "AssignmentIntent" ADD CONSTRAINT "AssignmentIntent_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "AssignmentIntent" ADD CONSTRAINT "AssignmentIntent_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- AssignmentException -ALTER TABLE "AssignmentException" ADD CONSTRAINT "AssignmentException_assignmentId_fkey" FOREIGN KEY ("assignmentId") REFERENCES "Assignment"("id") ON DELETE CASCADE ON UPDATE CASCADE; -ALTER TABLE "AssignmentException" ADD CONSTRAINT "AssignmentException_approvedById_fkey" FOREIGN KEY ("approvedById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "AssignmentException" ADD CONSTRAINT "AssignmentException_assignmentId_fkey" FOREIGN KEY ("assignmentId") REFERENCES "Assignment"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "AssignmentException" ADD CONSTRAINT "AssignmentException_approvedById_fkey" FOREIGN KEY ("approvedById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- MentorFile -ALTER TABLE "MentorFile" ADD CONSTRAINT "MentorFile_mentorAssignmentId_fkey" FOREIGN KEY ("mentorAssignmentId") REFERENCES "MentorAssignment"("id") ON DELETE CASCADE ON UPDATE CASCADE; -ALTER TABLE "MentorFile" ADD CONSTRAINT "MentorFile_uploadedByUserId_fkey" FOREIGN KEY ("uploadedByUserId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -ALTER TABLE "MentorFile" ADD CONSTRAINT "MentorFile_promotedByUserId_fkey" FOREIGN KEY ("promotedByUserId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; -ALTER TABLE "MentorFile" ADD CONSTRAINT "MentorFile_promotedToFileId_fkey" FOREIGN KEY ("promotedToFileId") REFERENCES "ProjectFile"("id") ON DELETE SET NULL ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "MentorFile" ADD CONSTRAINT "MentorFile_mentorAssignmentId_fkey" FOREIGN KEY ("mentorAssignmentId") REFERENCES "MentorAssignment"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "MentorFile" ADD CONSTRAINT "MentorFile_uploadedByUserId_fkey" FOREIGN KEY ("uploadedByUserId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "MentorFile" ADD CONSTRAINT "MentorFile_promotedByUserId_fkey" FOREIGN KEY ("promotedByUserId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "MentorFile" ADD CONSTRAINT "MentorFile_promotedToFileId_fkey" FOREIGN KEY ("promotedToFileId") REFERENCES "ProjectFile"("id") ON DELETE SET NULL ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- MentorFileComment -ALTER TABLE "MentorFileComment" ADD CONSTRAINT "MentorFileComment_mentorFileId_fkey" FOREIGN KEY ("mentorFileId") REFERENCES "MentorFile"("id") ON DELETE CASCADE ON UPDATE CASCADE; -ALTER TABLE "MentorFileComment" ADD CONSTRAINT "MentorFileComment_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -ALTER TABLE "MentorFileComment" ADD CONSTRAINT "MentorFileComment_parentCommentId_fkey" FOREIGN KEY ("parentCommentId") REFERENCES "MentorFileComment"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "MentorFileComment" ADD CONSTRAINT "MentorFileComment_mentorFileId_fkey" FOREIGN KEY ("mentorFileId") REFERENCES "MentorFile"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "MentorFileComment" ADD CONSTRAINT "MentorFileComment_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "MentorFileComment" ADD CONSTRAINT "MentorFileComment_parentCommentId_fkey" FOREIGN KEY ("parentCommentId") REFERENCES "MentorFileComment"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- SubmissionPromotionEvent -ALTER TABLE "SubmissionPromotionEvent" ADD CONSTRAINT "SubmissionPromotionEvent_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; -ALTER TABLE "SubmissionPromotionEvent" ADD CONSTRAINT "SubmissionPromotionEvent_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; -ALTER TABLE "SubmissionPromotionEvent" ADD CONSTRAINT "SubmissionPromotionEvent_sourceFileId_fkey" FOREIGN KEY ("sourceFileId") REFERENCES "MentorFile"("id") ON DELETE SET NULL ON UPDATE CASCADE; -ALTER TABLE "SubmissionPromotionEvent" ADD CONSTRAINT "SubmissionPromotionEvent_promotedById_fkey" FOREIGN KEY ("promotedById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "SubmissionPromotionEvent" ADD CONSTRAINT "SubmissionPromotionEvent_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "SubmissionPromotionEvent" ADD CONSTRAINT "SubmissionPromotionEvent_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "SubmissionPromotionEvent" ADD CONSTRAINT "SubmissionPromotionEvent_sourceFileId_fkey" FOREIGN KEY ("sourceFileId") REFERENCES "MentorFile"("id") ON DELETE SET NULL ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "SubmissionPromotionEvent" ADD CONSTRAINT "SubmissionPromotionEvent_promotedById_fkey" FOREIGN KEY ("promotedById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- DeliberationSession -ALTER TABLE "DeliberationSession" ADD CONSTRAINT "DeliberationSession_competitionId_fkey" FOREIGN KEY ("competitionId") REFERENCES "Competition"("id") ON DELETE CASCADE ON UPDATE CASCADE; -ALTER TABLE "DeliberationSession" ADD CONSTRAINT "DeliberationSession_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "DeliberationSession" ADD CONSTRAINT "DeliberationSession_competitionId_fkey" FOREIGN KEY ("competitionId") REFERENCES "Competition"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "DeliberationSession" ADD CONSTRAINT "DeliberationSession_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- DeliberationVote -ALTER TABLE "DeliberationVote" ADD CONSTRAINT "DeliberationVote_sessionId_fkey" FOREIGN KEY ("sessionId") REFERENCES "DeliberationSession"("id") ON DELETE CASCADE ON UPDATE CASCADE; -ALTER TABLE "DeliberationVote" ADD CONSTRAINT "DeliberationVote_juryMemberId_fkey" FOREIGN KEY ("juryMemberId") REFERENCES "JuryGroupMember"("id") ON DELETE CASCADE ON UPDATE CASCADE; -ALTER TABLE "DeliberationVote" ADD CONSTRAINT "DeliberationVote_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "DeliberationVote" ADD CONSTRAINT "DeliberationVote_sessionId_fkey" FOREIGN KEY ("sessionId") REFERENCES "DeliberationSession"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "DeliberationVote" ADD CONSTRAINT "DeliberationVote_juryMemberId_fkey" FOREIGN KEY ("juryMemberId") REFERENCES "JuryGroupMember"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "DeliberationVote" ADD CONSTRAINT "DeliberationVote_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- DeliberationResult -ALTER TABLE "DeliberationResult" ADD CONSTRAINT "DeliberationResult_sessionId_fkey" FOREIGN KEY ("sessionId") REFERENCES "DeliberationSession"("id") ON DELETE CASCADE ON UPDATE CASCADE; -ALTER TABLE "DeliberationResult" ADD CONSTRAINT "DeliberationResult_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "DeliberationResult" ADD CONSTRAINT "DeliberationResult_sessionId_fkey" FOREIGN KEY ("sessionId") REFERENCES "DeliberationSession"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "DeliberationResult" ADD CONSTRAINT "DeliberationResult_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- DeliberationParticipant -ALTER TABLE "DeliberationParticipant" ADD CONSTRAINT "DeliberationParticipant_sessionId_fkey" FOREIGN KEY ("sessionId") REFERENCES "DeliberationSession"("id") ON DELETE CASCADE ON UPDATE CASCADE; -ALTER TABLE "DeliberationParticipant" ADD CONSTRAINT "DeliberationParticipant_userId_fkey" FOREIGN KEY ("userId") REFERENCES "JuryGroupMember"("id") ON DELETE CASCADE ON UPDATE CASCADE; -ALTER TABLE "DeliberationParticipant" ADD CONSTRAINT "DeliberationParticipant_replacedById_fkey" FOREIGN KEY ("replacedById") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "DeliberationParticipant" ADD CONSTRAINT "DeliberationParticipant_sessionId_fkey" FOREIGN KEY ("sessionId") REFERENCES "DeliberationSession"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "DeliberationParticipant" ADD CONSTRAINT "DeliberationParticipant_userId_fkey" FOREIGN KEY ("userId") REFERENCES "JuryGroupMember"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "DeliberationParticipant" ADD CONSTRAINT "DeliberationParticipant_replacedById_fkey" FOREIGN KEY ("replacedById") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- ResultLock -ALTER TABLE "ResultLock" ADD CONSTRAINT "ResultLock_competitionId_fkey" FOREIGN KEY ("competitionId") REFERENCES "Competition"("id") ON DELETE CASCADE ON UPDATE CASCADE; -ALTER TABLE "ResultLock" ADD CONSTRAINT "ResultLock_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; -ALTER TABLE "ResultLock" ADD CONSTRAINT "ResultLock_lockedById_fkey" FOREIGN KEY ("lockedById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "ResultLock" ADD CONSTRAINT "ResultLock_competitionId_fkey" FOREIGN KEY ("competitionId") REFERENCES "Competition"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "ResultLock" ADD CONSTRAINT "ResultLock_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "ResultLock" ADD CONSTRAINT "ResultLock_lockedById_fkey" FOREIGN KEY ("lockedById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- ResultUnlockEvent -ALTER TABLE "ResultUnlockEvent" ADD CONSTRAINT "ResultUnlockEvent_resultLockId_fkey" FOREIGN KEY ("resultLockId") REFERENCES "ResultLock"("id") ON DELETE CASCADE ON UPDATE CASCADE; -ALTER TABLE "ResultUnlockEvent" ADD CONSTRAINT "ResultUnlockEvent_unlockedById_fkey" FOREIGN KEY ("unlockedById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "ResultUnlockEvent" ADD CONSTRAINT "ResultUnlockEvent_resultLockId_fkey" FOREIGN KEY ("resultLockId") REFERENCES "ResultLock"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "ResultUnlockEvent" ADD CONSTRAINT "ResultUnlockEvent_unlockedById_fkey" FOREIGN KEY ("unlockedById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; -- FKs on modified existing tables -ALTER TABLE "Assignment" ADD CONSTRAINT "Assignment_juryGroupId_fkey" FOREIGN KEY ("juryGroupId") REFERENCES "JuryGroup"("id") ON DELETE SET NULL ON UPDATE CASCADE; -ALTER TABLE "SpecialAward" ADD CONSTRAINT "SpecialAward_competitionId_fkey" FOREIGN KEY ("competitionId") REFERENCES "Competition"("id") ON DELETE SET NULL ON UPDATE CASCADE; -ALTER TABLE "SpecialAward" ADD CONSTRAINT "SpecialAward_evaluationRoundId_fkey" FOREIGN KEY ("evaluationRoundId") REFERENCES "Round"("id") ON DELETE SET NULL ON UPDATE CASCADE; -ALTER TABLE "SpecialAward" ADD CONSTRAINT "SpecialAward_juryGroupId_fkey" FOREIGN KEY ("juryGroupId") REFERENCES "JuryGroup"("id") ON DELETE SET NULL ON UPDATE CASCADE; -ALTER TABLE "MentorMessage" ADD CONSTRAINT "MentorMessage_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "MentorAssignment"("id") ON DELETE CASCADE ON UPDATE CASCADE; -ALTER TABLE "ProjectFile" ADD CONSTRAINT "ProjectFile_submissionWindowId_fkey" FOREIGN KEY ("submissionWindowId") REFERENCES "SubmissionWindow"("id") ON DELETE SET NULL ON UPDATE CASCADE; -ALTER TABLE "ProjectFile" ADD CONSTRAINT "ProjectFile_submissionFileRequirementId_fkey" FOREIGN KEY ("submissionFileRequirementId") REFERENCES "SubmissionFileRequirement"("id") ON DELETE SET NULL ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "Assignment" ADD CONSTRAINT "Assignment_juryGroupId_fkey" FOREIGN KEY ("juryGroupId") REFERENCES "JuryGroup"("id") ON DELETE SET NULL ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "SpecialAward" ADD CONSTRAINT "SpecialAward_competitionId_fkey" FOREIGN KEY ("competitionId") REFERENCES "Competition"("id") ON DELETE SET NULL ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "SpecialAward" ADD CONSTRAINT "SpecialAward_evaluationRoundId_fkey" FOREIGN KEY ("evaluationRoundId") REFERENCES "Round"("id") ON DELETE SET NULL ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "SpecialAward" ADD CONSTRAINT "SpecialAward_juryGroupId_fkey" FOREIGN KEY ("juryGroupId") REFERENCES "JuryGroup"("id") ON DELETE SET NULL ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "MentorMessage" ADD CONSTRAINT "MentorMessage_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "MentorAssignment"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "ProjectFile" ADD CONSTRAINT "ProjectFile_submissionWindowId_fkey" FOREIGN KEY ("submissionWindowId") REFERENCES "SubmissionWindow"("id") ON DELETE SET NULL ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "ProjectFile" ADD CONSTRAINT "ProjectFile_submissionFileRequirementId_fkey" FOREIGN KEY ("submissionFileRequirementId") REFERENCES "SubmissionFileRequirement"("id") ON DELETE SET NULL ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; diff --git a/prisma/migrations/20260215100000_add_self_service_fields/migration.sql b/prisma/migrations/20260215100000_add_self_service_fields/migration.sql index 863b33f..6827693 100644 --- a/prisma/migrations/20260215100000_add_self_service_fields/migration.sql +++ b/prisma/migrations/20260215100000_add_self_service_fields/migration.sql @@ -1,3 +1,7 @@ -- AlterTable -ALTER TABLE "JuryGroupMember" ADD COLUMN "selfServiceCap" INTEGER, -ADD COLUMN "selfServiceRatio" DOUBLE PRECISION; +DO $$ BEGIN + ALTER TABLE "JuryGroupMember" ADD COLUMN "selfServiceCap" INTEGER; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; +DO $$ BEGIN + ALTER TABLE "JuryGroupMember" ADD COLUMN "selfServiceRatio" DOUBLE PRECISION; +EXCEPTION WHEN duplicate_column THEN NULL; END $$; diff --git a/prisma/migrations/20260215200000_phase7_fk_renames/migration.sql b/prisma/migrations/20260215200000_phase7_fk_renames/migration.sql index fddf65b..3fb6950 100644 --- a/prisma/migrations/20260215200000_phase7_fk_renames/migration.sql +++ b/prisma/migrations/20260215200000_phase7_fk_renames/migration.sql @@ -1,14 +1,14 @@ -- ============================================================================= --- Phase 7/8 Migration Part 1: Rename stageId → roundId on 15 tables +-- Phase 7/8 Migration Part 1: Rename stageId -> roundId on 15 tables -- ============================================================================= -- This migration renames stageId columns to roundId and updates FK constraints -- to point to the Round table instead of Stage table. -- -- NOTE: After the pipeline migration (20260213), most tables have BOTH a -- nullable roundId column (legacy, no FK) AND a stageId column. We must --- drop the old roundId column before renaming stageId → roundId. +-- drop the old roundId column before renaming stageId -> roundId. --- ─── 1. EvaluationForm ─────────────────────────────────────────────────────── +-- --- 1. EvaluationForm --- -- Drop old roundId column (nullable, no FK since 20260213 migration) ALTER TABLE "EvaluationForm" DROP COLUMN IF EXISTS "roundId"; @@ -20,18 +20,22 @@ ALTER TABLE "EvaluationForm" DROP CONSTRAINT IF EXISTS "EvaluationForm_stageId_f DROP INDEX IF EXISTS "EvaluationForm_stageId_version_key"; DROP INDEX IF EXISTS "EvaluationForm_stageId_isActive_idx"; --- Rename column -ALTER TABLE "EvaluationForm" RENAME COLUMN "stageId" TO "roundId"; +-- Rename column (only if stageId exists) +DO $$ BEGIN + ALTER TABLE "EvaluationForm" RENAME COLUMN "stageId" TO "roundId"; +EXCEPTION WHEN undefined_column THEN NULL; END $$; -- Recreate indexes with new name -CREATE UNIQUE INDEX "EvaluationForm_roundId_version_key" ON "EvaluationForm"("roundId", "version"); -CREATE INDEX "EvaluationForm_roundId_isActive_idx" ON "EvaluationForm"("roundId", "isActive"); +CREATE UNIQUE INDEX IF NOT EXISTS "EvaluationForm_roundId_version_key" ON "EvaluationForm"("roundId", "version"); +CREATE INDEX IF NOT EXISTS "EvaluationForm_roundId_isActive_idx" ON "EvaluationForm"("roundId", "isActive"); -- Recreate FK pointing to Round -ALTER TABLE "EvaluationForm" ADD CONSTRAINT "EvaluationForm_roundId_fkey" - FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "EvaluationForm" ADD CONSTRAINT "EvaluationForm_roundId_fkey" + FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; --- ─── 2. FileRequirement ────────────────────────────────────────────────────── +-- --- 2. FileRequirement --- ALTER TABLE "FileRequirement" DROP COLUMN IF EXISTS "roundId"; @@ -39,14 +43,18 @@ ALTER TABLE "FileRequirement" DROP CONSTRAINT IF EXISTS "FileRequirement_stageId DROP INDEX IF EXISTS "FileRequirement_stageId_idx"; -ALTER TABLE "FileRequirement" RENAME COLUMN "stageId" TO "roundId"; +DO $$ BEGIN + ALTER TABLE "FileRequirement" RENAME COLUMN "stageId" TO "roundId"; +EXCEPTION WHEN undefined_column THEN NULL; END $$; -CREATE INDEX "FileRequirement_roundId_idx" ON "FileRequirement"("roundId"); +CREATE INDEX IF NOT EXISTS "FileRequirement_roundId_idx" ON "FileRequirement"("roundId"); -ALTER TABLE "FileRequirement" ADD CONSTRAINT "FileRequirement_roundId_fkey" - FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "FileRequirement" ADD CONSTRAINT "FileRequirement_roundId_fkey" + FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; --- ─── 3. Assignment ─────────────────────────────────────────────────────────── +-- --- 3. Assignment --- ALTER TABLE "Assignment" DROP COLUMN IF EXISTS "roundId"; @@ -55,15 +63,19 @@ ALTER TABLE "Assignment" DROP CONSTRAINT IF EXISTS "Assignment_stageId_fkey"; DROP INDEX IF EXISTS "Assignment_userId_projectId_stageId_key"; DROP INDEX IF EXISTS "Assignment_stageId_idx"; -ALTER TABLE "Assignment" RENAME COLUMN "stageId" TO "roundId"; +DO $$ BEGIN + ALTER TABLE "Assignment" RENAME COLUMN "stageId" TO "roundId"; +EXCEPTION WHEN undefined_column THEN NULL; END $$; -CREATE UNIQUE INDEX "Assignment_userId_projectId_roundId_key" ON "Assignment"("userId", "projectId", "roundId"); -CREATE INDEX "Assignment_roundId_idx" ON "Assignment"("roundId"); +CREATE UNIQUE INDEX IF NOT EXISTS "Assignment_userId_projectId_roundId_key" ON "Assignment"("userId", "projectId", "roundId"); +CREATE INDEX IF NOT EXISTS "Assignment_roundId_idx" ON "Assignment"("roundId"); -ALTER TABLE "Assignment" ADD CONSTRAINT "Assignment_roundId_fkey" - FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "Assignment" ADD CONSTRAINT "Assignment_roundId_fkey" + FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; --- ─── 4. GracePeriod ────────────────────────────────────────────────────────── +-- --- 4. GracePeriod --- ALTER TABLE "GracePeriod" DROP COLUMN IF EXISTS "roundId"; @@ -72,15 +84,19 @@ ALTER TABLE "GracePeriod" DROP CONSTRAINT IF EXISTS "GracePeriod_stageId_fkey"; DROP INDEX IF EXISTS "GracePeriod_stageId_idx"; DROP INDEX IF EXISTS "GracePeriod_stageId_userId_extendedUntil_idx"; -ALTER TABLE "GracePeriod" RENAME COLUMN "stageId" TO "roundId"; +DO $$ BEGIN + ALTER TABLE "GracePeriod" RENAME COLUMN "stageId" TO "roundId"; +EXCEPTION WHEN undefined_column THEN NULL; END $$; -CREATE INDEX "GracePeriod_roundId_idx" ON "GracePeriod"("roundId"); -CREATE INDEX "GracePeriod_roundId_userId_extendedUntil_idx" ON "GracePeriod"("roundId", "userId", "extendedUntil"); +CREATE INDEX IF NOT EXISTS "GracePeriod_roundId_idx" ON "GracePeriod"("roundId"); +CREATE INDEX IF NOT EXISTS "GracePeriod_roundId_userId_extendedUntil_idx" ON "GracePeriod"("roundId", "userId", "extendedUntil"); -ALTER TABLE "GracePeriod" ADD CONSTRAINT "GracePeriod_roundId_fkey" - FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "GracePeriod" ADD CONSTRAINT "GracePeriod_roundId_fkey" + FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; --- ─── 5. LiveVotingSession ──────────────────────────────────────────────────── +-- --- 5. LiveVotingSession --- ALTER TABLE "LiveVotingSession" DROP COLUMN IF EXISTS "roundId"; @@ -88,14 +104,18 @@ ALTER TABLE "LiveVotingSession" DROP CONSTRAINT IF EXISTS "LiveVotingSession_sta DROP INDEX IF EXISTS "LiveVotingSession_stageId_key"; -ALTER TABLE "LiveVotingSession" RENAME COLUMN "stageId" TO "roundId"; +DO $$ BEGIN + ALTER TABLE "LiveVotingSession" RENAME COLUMN "stageId" TO "roundId"; +EXCEPTION WHEN undefined_column THEN NULL; END $$; -CREATE UNIQUE INDEX "LiveVotingSession_roundId_key" ON "LiveVotingSession"("roundId"); +CREATE UNIQUE INDEX IF NOT EXISTS "LiveVotingSession_roundId_key" ON "LiveVotingSession"("roundId"); -ALTER TABLE "LiveVotingSession" ADD CONSTRAINT "LiveVotingSession_roundId_fkey" - FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "LiveVotingSession" ADD CONSTRAINT "LiveVotingSession_roundId_fkey" + FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; --- ─── 6. FilteringRule ──────────────────────────────────────────────────────── +-- --- 6. FilteringRule --- ALTER TABLE "FilteringRule" DROP COLUMN IF EXISTS "roundId"; @@ -103,14 +123,18 @@ ALTER TABLE "FilteringRule" DROP CONSTRAINT IF EXISTS "FilteringRule_stageId_fke DROP INDEX IF EXISTS "FilteringRule_stageId_idx"; -ALTER TABLE "FilteringRule" RENAME COLUMN "stageId" TO "roundId"; +DO $$ BEGIN + ALTER TABLE "FilteringRule" RENAME COLUMN "stageId" TO "roundId"; +EXCEPTION WHEN undefined_column THEN NULL; END $$; -CREATE INDEX "FilteringRule_roundId_idx" ON "FilteringRule"("roundId"); +CREATE INDEX IF NOT EXISTS "FilteringRule_roundId_idx" ON "FilteringRule"("roundId"); -ALTER TABLE "FilteringRule" ADD CONSTRAINT "FilteringRule_roundId_fkey" - FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "FilteringRule" ADD CONSTRAINT "FilteringRule_roundId_fkey" + FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; --- ─── 7. FilteringResult ────────────────────────────────────────────────────── +-- --- 7. FilteringResult --- ALTER TABLE "FilteringResult" DROP COLUMN IF EXISTS "roundId"; @@ -119,15 +143,19 @@ ALTER TABLE "FilteringResult" DROP CONSTRAINT IF EXISTS "FilteringResult_stageId DROP INDEX IF EXISTS "FilteringResult_stageId_projectId_key"; DROP INDEX IF EXISTS "FilteringResult_stageId_idx"; -ALTER TABLE "FilteringResult" RENAME COLUMN "stageId" TO "roundId"; +DO $$ BEGIN + ALTER TABLE "FilteringResult" RENAME COLUMN "stageId" TO "roundId"; +EXCEPTION WHEN undefined_column THEN NULL; END $$; -CREATE UNIQUE INDEX "FilteringResult_roundId_projectId_key" ON "FilteringResult"("roundId", "projectId"); -CREATE INDEX "FilteringResult_roundId_idx" ON "FilteringResult"("roundId"); +CREATE UNIQUE INDEX IF NOT EXISTS "FilteringResult_roundId_projectId_key" ON "FilteringResult"("roundId", "projectId"); +CREATE INDEX IF NOT EXISTS "FilteringResult_roundId_idx" ON "FilteringResult"("roundId"); -ALTER TABLE "FilteringResult" ADD CONSTRAINT "FilteringResult_roundId_fkey" - FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "FilteringResult" ADD CONSTRAINT "FilteringResult_roundId_fkey" + FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; --- ─── 8. FilteringJob ───────────────────────────────────────────────────────── +-- --- 8. FilteringJob --- ALTER TABLE "FilteringJob" DROP COLUMN IF EXISTS "roundId"; @@ -135,14 +163,18 @@ ALTER TABLE "FilteringJob" DROP CONSTRAINT IF EXISTS "FilteringJob_stageId_fkey" DROP INDEX IF EXISTS "FilteringJob_stageId_idx"; -ALTER TABLE "FilteringJob" RENAME COLUMN "stageId" TO "roundId"; +DO $$ BEGIN + ALTER TABLE "FilteringJob" RENAME COLUMN "stageId" TO "roundId"; +EXCEPTION WHEN undefined_column THEN NULL; END $$; -CREATE INDEX "FilteringJob_roundId_idx" ON "FilteringJob"("roundId"); +CREATE INDEX IF NOT EXISTS "FilteringJob_roundId_idx" ON "FilteringJob"("roundId"); -ALTER TABLE "FilteringJob" ADD CONSTRAINT "FilteringJob_roundId_fkey" - FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "FilteringJob" ADD CONSTRAINT "FilteringJob_roundId_fkey" + FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; --- ─── 9. AssignmentJob ──────────────────────────────────────────────────────── +-- --- 9. AssignmentJob --- ALTER TABLE "AssignmentJob" DROP COLUMN IF EXISTS "roundId"; @@ -150,14 +182,18 @@ ALTER TABLE "AssignmentJob" DROP CONSTRAINT IF EXISTS "AssignmentJob_stageId_fke DROP INDEX IF EXISTS "AssignmentJob_stageId_idx"; -ALTER TABLE "AssignmentJob" RENAME COLUMN "stageId" TO "roundId"; +DO $$ BEGIN + ALTER TABLE "AssignmentJob" RENAME COLUMN "stageId" TO "roundId"; +EXCEPTION WHEN undefined_column THEN NULL; END $$; -CREATE INDEX "AssignmentJob_roundId_idx" ON "AssignmentJob"("roundId"); +CREATE INDEX IF NOT EXISTS "AssignmentJob_roundId_idx" ON "AssignmentJob"("roundId"); -ALTER TABLE "AssignmentJob" ADD CONSTRAINT "AssignmentJob_roundId_fkey" - FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "AssignmentJob" ADD CONSTRAINT "AssignmentJob_roundId_fkey" + FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; --- ─── 10. ReminderLog ───────────────────────────────────────────────────────── +-- --- 10. ReminderLog --- ALTER TABLE "ReminderLog" DROP COLUMN IF EXISTS "roundId"; @@ -166,15 +202,19 @@ ALTER TABLE "ReminderLog" DROP CONSTRAINT IF EXISTS "ReminderLog_stageId_fkey"; DROP INDEX IF EXISTS "ReminderLog_stageId_userId_type_key"; DROP INDEX IF EXISTS "ReminderLog_stageId_idx"; -ALTER TABLE "ReminderLog" RENAME COLUMN "stageId" TO "roundId"; +DO $$ BEGIN + ALTER TABLE "ReminderLog" RENAME COLUMN "stageId" TO "roundId"; +EXCEPTION WHEN undefined_column THEN NULL; END $$; -CREATE UNIQUE INDEX "ReminderLog_roundId_userId_type_key" ON "ReminderLog"("roundId", "userId", "type"); -CREATE INDEX "ReminderLog_roundId_idx" ON "ReminderLog"("roundId"); +CREATE UNIQUE INDEX IF NOT EXISTS "ReminderLog_roundId_userId_type_key" ON "ReminderLog"("roundId", "userId", "type"); +CREATE INDEX IF NOT EXISTS "ReminderLog_roundId_idx" ON "ReminderLog"("roundId"); -ALTER TABLE "ReminderLog" ADD CONSTRAINT "ReminderLog_roundId_fkey" - FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "ReminderLog" ADD CONSTRAINT "ReminderLog_roundId_fkey" + FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; --- ─── 11. EvaluationSummary ─────────────────────────────────────────────────── +-- --- 11. EvaluationSummary --- ALTER TABLE "EvaluationSummary" DROP COLUMN IF EXISTS "roundId"; @@ -183,15 +223,19 @@ ALTER TABLE "EvaluationSummary" DROP CONSTRAINT IF EXISTS "EvaluationSummary_sta DROP INDEX IF EXISTS "EvaluationSummary_projectId_stageId_key"; DROP INDEX IF EXISTS "EvaluationSummary_stageId_idx"; -ALTER TABLE "EvaluationSummary" RENAME COLUMN "stageId" TO "roundId"; +DO $$ BEGIN + ALTER TABLE "EvaluationSummary" RENAME COLUMN "stageId" TO "roundId"; +EXCEPTION WHEN undefined_column THEN NULL; END $$; -CREATE UNIQUE INDEX "EvaluationSummary_projectId_roundId_key" ON "EvaluationSummary"("projectId", "roundId"); -CREATE INDEX "EvaluationSummary_roundId_idx" ON "EvaluationSummary"("roundId"); +CREATE UNIQUE INDEX IF NOT EXISTS "EvaluationSummary_projectId_roundId_key" ON "EvaluationSummary"("projectId", "roundId"); +CREATE INDEX IF NOT EXISTS "EvaluationSummary_roundId_idx" ON "EvaluationSummary"("roundId"); -ALTER TABLE "EvaluationSummary" ADD CONSTRAINT "EvaluationSummary_roundId_fkey" - FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "EvaluationSummary" ADD CONSTRAINT "EvaluationSummary_roundId_fkey" + FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; --- ─── 12. EvaluationDiscussion ──────────────────────────────────────────────── +-- --- 12. EvaluationDiscussion --- ALTER TABLE "EvaluationDiscussion" DROP COLUMN IF EXISTS "roundId"; @@ -200,15 +244,19 @@ ALTER TABLE "EvaluationDiscussion" DROP CONSTRAINT IF EXISTS "EvaluationDiscussi DROP INDEX IF EXISTS "EvaluationDiscussion_projectId_stageId_key"; DROP INDEX IF EXISTS "EvaluationDiscussion_stageId_idx"; -ALTER TABLE "EvaluationDiscussion" RENAME COLUMN "stageId" TO "roundId"; +DO $$ BEGIN + ALTER TABLE "EvaluationDiscussion" RENAME COLUMN "stageId" TO "roundId"; +EXCEPTION WHEN undefined_column THEN NULL; END $$; -CREATE UNIQUE INDEX "EvaluationDiscussion_projectId_roundId_key" ON "EvaluationDiscussion"("projectId", "roundId"); -CREATE INDEX "EvaluationDiscussion_roundId_idx" ON "EvaluationDiscussion"("roundId"); +CREATE UNIQUE INDEX IF NOT EXISTS "EvaluationDiscussion_projectId_roundId_key" ON "EvaluationDiscussion"("projectId", "roundId"); +CREATE INDEX IF NOT EXISTS "EvaluationDiscussion_roundId_idx" ON "EvaluationDiscussion"("roundId"); -ALTER TABLE "EvaluationDiscussion" ADD CONSTRAINT "EvaluationDiscussion_roundId_fkey" - FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "EvaluationDiscussion" ADD CONSTRAINT "EvaluationDiscussion_roundId_fkey" + FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; --- ─── 13. Message ───────────────────────────────────────────────────────────── +-- --- 13. Message --- -- Message has roundId (from init, nullable) and stageId (from pipeline, nullable) ALTER TABLE "Message" DROP COLUMN IF EXISTS "roundId"; @@ -217,42 +265,54 @@ ALTER TABLE "Message" DROP CONSTRAINT IF EXISTS "Message_stageId_fkey"; DROP INDEX IF EXISTS "Message_stageId_idx"; -ALTER TABLE "Message" RENAME COLUMN "stageId" TO "roundId"; +DO $$ BEGIN + ALTER TABLE "Message" RENAME COLUMN "stageId" TO "roundId"; +EXCEPTION WHEN undefined_column THEN NULL; END $$; -CREATE INDEX "Message_roundId_idx" ON "Message"("roundId"); +CREATE INDEX IF NOT EXISTS "Message_roundId_idx" ON "Message"("roundId"); -ALTER TABLE "Message" ADD CONSTRAINT "Message_roundId_fkey" - FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE SET NULL ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "Message" ADD CONSTRAINT "Message_roundId_fkey" + FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE SET NULL ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; --- ─── 14. Cohort ────────────────────────────────────────────────────────────── +-- --- 14. Cohort --- -- Cohort was created in pipeline migration with stageId only (no roundId) ALTER TABLE "Cohort" DROP CONSTRAINT IF EXISTS "Cohort_stageId_fkey"; DROP INDEX IF EXISTS "Cohort_stageId_idx"; -ALTER TABLE "Cohort" RENAME COLUMN "stageId" TO "roundId"; +DO $$ BEGIN + ALTER TABLE "Cohort" RENAME COLUMN "stageId" TO "roundId"; +EXCEPTION WHEN undefined_column THEN NULL; END $$; -CREATE INDEX "Cohort_roundId_idx" ON "Cohort"("roundId"); +CREATE INDEX IF NOT EXISTS "Cohort_roundId_idx" ON "Cohort"("roundId"); -ALTER TABLE "Cohort" ADD CONSTRAINT "Cohort_roundId_fkey" - FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "Cohort" ADD CONSTRAINT "Cohort_roundId_fkey" + FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; --- ─── 15. LiveProgressCursor ────────────────────────────────────────────────── +-- --- 15. LiveProgressCursor --- -- LiveProgressCursor was created in pipeline migration with stageId only (no roundId) ALTER TABLE "LiveProgressCursor" DROP CONSTRAINT IF EXISTS "LiveProgressCursor_stageId_fkey"; DROP INDEX IF EXISTS "LiveProgressCursor_stageId_key"; -ALTER TABLE "LiveProgressCursor" RENAME COLUMN "stageId" TO "roundId"; +DO $$ BEGIN + ALTER TABLE "LiveProgressCursor" RENAME COLUMN "stageId" TO "roundId"; +EXCEPTION WHEN undefined_column THEN NULL; END $$; -CREATE UNIQUE INDEX "LiveProgressCursor_roundId_key" ON "LiveProgressCursor"("roundId"); +CREATE UNIQUE INDEX IF NOT EXISTS "LiveProgressCursor_roundId_key" ON "LiveProgressCursor"("roundId"); -ALTER TABLE "LiveProgressCursor" ADD CONSTRAINT "LiveProgressCursor_roundId_fkey" - FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "LiveProgressCursor" ADD CONSTRAINT "LiveProgressCursor_roundId_fkey" + FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; --- ─── 16. SpecialAward: Drop trackId column ─────────────────────────────────── +-- --- 16. SpecialAward: Drop trackId column --- ALTER TABLE "SpecialAward" DROP CONSTRAINT IF EXISTS "SpecialAward_trackId_fkey"; @@ -260,12 +320,16 @@ DROP INDEX IF EXISTS "SpecialAward_trackId_key"; ALTER TABLE "SpecialAward" DROP COLUMN IF EXISTS "trackId"; --- ─── 17. ConflictOfInterest: roundId was made nullable in pipeline migration ─ +-- --- 17. ConflictOfInterest: roundId was made nullable in pipeline migration --- -- It still exists, just restore FK to new Round table -ALTER TABLE "ConflictOfInterest" ADD CONSTRAINT "ConflictOfInterest_roundId_fkey" - FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "ConflictOfInterest" ADD CONSTRAINT "ConflictOfInterest_roundId_fkey" + FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$; --- ─── 18. TaggingJob: roundId was made nullable in pipeline migration ───────── +-- --- 18. TaggingJob: roundId was made nullable in pipeline migration --- -- Restore FK to new Round table -ALTER TABLE "TaggingJob" ADD CONSTRAINT "TaggingJob_roundId_fkey" - FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE SET NULL ON UPDATE CASCADE; +DO $$ BEGIN + ALTER TABLE "TaggingJob" ADD CONSTRAINT "TaggingJob_roundId_fkey" + FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE SET NULL ON UPDATE CASCADE; +EXCEPTION WHEN duplicate_object THEN NULL; END $$;