From 4071606005b725be9b277918e3fc39d5f061a24d Mon Sep 17 00:00:00 2001 From: Matt Date: Fri, 30 Jan 2026 19:10:27 +0100 Subject: [PATCH] Add initial Prisma migration from schema Generated via prisma migrate diff --from-empty for fresh DB deployment. Co-Authored-By: Claude Opus 4.5 --- .../20260130000000_init/migration.sql | 909 ++++++++++++++++++ 1 file changed, 909 insertions(+) create mode 100644 prisma/migrations/20260130000000_init/migration.sql diff --git a/prisma/migrations/20260130000000_init/migration.sql b/prisma/migrations/20260130000000_init/migration.sql new file mode 100644 index 0000000..272572e --- /dev/null +++ b/prisma/migrations/20260130000000_init/migration.sql @@ -0,0 +1,909 @@ +-- CreateSchema +CREATE SCHEMA IF NOT EXISTS "public"; + +-- CreateEnum +CREATE TYPE "UserRole" AS ENUM ('SUPER_ADMIN', 'PROGRAM_ADMIN', 'JURY_MEMBER', 'MENTOR', 'OBSERVER', 'APPLICANT'); + +-- CreateEnum +CREATE TYPE "UserStatus" AS ENUM ('INVITED', 'ACTIVE', 'SUSPENDED'); + +-- CreateEnum +CREATE TYPE "ProgramStatus" AS ENUM ('DRAFT', 'ACTIVE', 'ARCHIVED'); + +-- CreateEnum +CREATE TYPE "RoundStatus" AS ENUM ('DRAFT', 'ACTIVE', 'CLOSED', 'ARCHIVED'); + +-- CreateEnum +CREATE TYPE "ProjectStatus" AS ENUM ('SUBMITTED', 'ELIGIBLE', 'ASSIGNED', 'SEMIFINALIST', 'FINALIST', 'REJECTED'); + +-- CreateEnum +CREATE TYPE "EvaluationStatus" AS ENUM ('NOT_STARTED', 'DRAFT', 'SUBMITTED', 'LOCKED'); + +-- CreateEnum +CREATE TYPE "AssignmentMethod" AS ENUM ('MANUAL', 'BULK', 'AI_SUGGESTED', 'AI_AUTO', 'ALGORITHM'); + +-- CreateEnum +CREATE TYPE "FileType" AS ENUM ('EXEC_SUMMARY', 'PRESENTATION', 'VIDEO', 'OTHER', 'BUSINESS_PLAN', 'VIDEO_PITCH', 'SUPPORTING_DOC'); + +-- CreateEnum +CREATE TYPE "SubmissionSource" AS ENUM ('MANUAL', 'CSV', 'NOTION', 'TYPEFORM', 'PUBLIC_FORM'); + +-- CreateEnum +CREATE TYPE "RoundType" AS ENUM ('FILTERING', 'EVALUATION', 'LIVE_EVENT'); + +-- CreateEnum +CREATE TYPE "SettingType" AS ENUM ('STRING', 'NUMBER', 'BOOLEAN', 'JSON', 'SECRET'); + +-- CreateEnum +CREATE TYPE "SettingCategory" AS ENUM ('AI', 'BRANDING', 'EMAIL', 'STORAGE', 'SECURITY', 'DEFAULTS', 'WHATSAPP'); + +-- CreateEnum +CREATE TYPE "NotificationChannel" AS ENUM ('EMAIL', 'WHATSAPP', 'BOTH', 'NONE'); + +-- CreateEnum +CREATE TYPE "ResourceType" AS ENUM ('PDF', 'VIDEO', 'DOCUMENT', 'LINK', 'OTHER'); + +-- CreateEnum +CREATE TYPE "CohortLevel" AS ENUM ('ALL', 'SEMIFINALIST', 'FINALIST'); + +-- CreateEnum +CREATE TYPE "PartnerVisibility" AS ENUM ('ADMIN_ONLY', 'JURY_VISIBLE', 'PUBLIC'); + +-- CreateEnum +CREATE TYPE "PartnerType" AS ENUM ('SPONSOR', 'PARTNER', 'SUPPORTER', 'MEDIA', 'OTHER'); + +-- CreateEnum +CREATE TYPE "FormFieldType" AS ENUM ('TEXT', 'TEXTAREA', 'NUMBER', 'EMAIL', 'PHONE', 'URL', 'DATE', 'DATETIME', 'SELECT', 'MULTI_SELECT', 'RADIO', 'CHECKBOX', 'CHECKBOX_GROUP', 'FILE', 'FILE_MULTIPLE', 'SECTION', 'INSTRUCTIONS'); + +-- CreateEnum +CREATE TYPE "CompetitionCategory" AS ENUM ('STARTUP', 'BUSINESS_CONCEPT'); + +-- CreateEnum +CREATE TYPE "OceanIssue" AS ENUM ('POLLUTION_REDUCTION', 'CLIMATE_MITIGATION', 'TECHNOLOGY_INNOVATION', 'SUSTAINABLE_SHIPPING', 'BLUE_CARBON', 'HABITAT_RESTORATION', 'COMMUNITY_CAPACITY', 'SUSTAINABLE_FISHING', 'CONSUMER_AWARENESS', 'OCEAN_ACIDIFICATION', 'OTHER'); + +-- CreateEnum +CREATE TYPE "TeamMemberRole" AS ENUM ('LEAD', 'MEMBER', 'ADVISOR'); + +-- CreateEnum +CREATE TYPE "MentorAssignmentMethod" AS ENUM ('MANUAL', 'AI_SUGGESTED', 'AI_AUTO', 'ALGORITHM'); + +-- CreateTable +CREATE TABLE "User" ( + "id" TEXT NOT NULL, + "email" TEXT NOT NULL, + "name" TEXT, + "emailVerified" TIMESTAMP(3), + "role" "UserRole" NOT NULL DEFAULT 'JURY_MEMBER', + "status" "UserStatus" NOT NULL DEFAULT 'INVITED', + "expertiseTags" TEXT[] DEFAULT ARRAY[]::TEXT[], + "maxAssignments" INTEGER, + "metadataJson" JSONB, + "profileImageKey" TEXT, + "profileImageProvider" TEXT, + "phoneNumber" TEXT, + "phoneNumberVerified" BOOLEAN NOT NULL DEFAULT false, + "notificationPreference" "NotificationChannel" NOT NULL DEFAULT 'EMAIL', + "whatsappOptIn" BOOLEAN NOT NULL DEFAULT false, + "onboardingCompletedAt" TIMESTAMP(3), + "passwordHash" TEXT, + "passwordSetAt" TIMESTAMP(3), + "mustSetPassword" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "lastLoginAt" TIMESTAMP(3), + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Account" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "type" TEXT NOT NULL, + "provider" TEXT NOT NULL, + "providerAccountId" TEXT NOT NULL, + "refresh_token" TEXT, + "access_token" TEXT, + "expires_at" INTEGER, + "token_type" TEXT, + "scope" TEXT, + "id_token" TEXT, + "session_state" TEXT, + + CONSTRAINT "Account_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Session" ( + "id" TEXT NOT NULL, + "sessionToken" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "expires" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Session_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "VerificationToken" ( + "identifier" TEXT NOT NULL, + "token" TEXT NOT NULL, + "expires" TIMESTAMP(3) NOT NULL +); + +-- CreateTable +CREATE TABLE "Program" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "year" INTEGER NOT NULL, + "status" "ProgramStatus" NOT NULL DEFAULT 'DRAFT', + "description" TEXT, + "settingsJson" JSONB, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Program_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Round" ( + "id" TEXT NOT NULL, + "programId" TEXT NOT NULL, + "name" TEXT NOT NULL, + "slug" TEXT, + "status" "RoundStatus" NOT NULL DEFAULT 'DRAFT', + "roundType" "RoundType" NOT NULL DEFAULT 'EVALUATION', + "submissionDeadline" TIMESTAMP(3), + "submissionStartDate" TIMESTAMP(3), + "submissionEndDate" TIMESTAMP(3), + "lateSubmissionGrace" INTEGER, + "phase1Deadline" TIMESTAMP(3), + "phase2Deadline" TIMESTAMP(3), + "votingStartAt" TIMESTAMP(3), + "votingEndAt" TIMESTAMP(3), + "requiredReviews" INTEGER NOT NULL DEFAULT 3, + "settingsJson" JSONB, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Round_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "EvaluationForm" ( + "id" TEXT NOT NULL, + "roundId" TEXT NOT NULL, + "version" INTEGER NOT NULL DEFAULT 1, + "criteriaJson" JSONB NOT NULL, + "scalesJson" JSONB, + "isActive" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "EvaluationForm_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Project" ( + "id" TEXT NOT NULL, + "roundId" TEXT NOT NULL, + "title" TEXT NOT NULL, + "teamName" TEXT, + "description" TEXT, + "status" "ProjectStatus" NOT NULL DEFAULT 'SUBMITTED', + "competitionCategory" "CompetitionCategory", + "oceanIssue" "OceanIssue", + "country" TEXT, + "geographicZone" TEXT, + "institution" TEXT, + "wantsMentorship" BOOLEAN NOT NULL DEFAULT false, + "phase1SubmissionUrl" TEXT, + "phase2SubmissionUrl" TEXT, + "referralSource" TEXT, + "internalComments" TEXT, + "applicationStatus" TEXT, + "submissionSource" "SubmissionSource" NOT NULL DEFAULT 'MANUAL', + "submittedByEmail" TEXT, + "submittedAt" TIMESTAMP(3), + "submittedByUserId" TEXT, + "logoKey" TEXT, + "logoProvider" TEXT, + "tags" TEXT[] DEFAULT ARRAY[]::TEXT[], + "metadataJson" JSONB, + "externalIdsJson" JSONB, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Project_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ProjectFile" ( + "id" TEXT NOT NULL, + "projectId" TEXT NOT NULL, + "fileType" "FileType" NOT NULL, + "fileName" TEXT NOT NULL, + "mimeType" TEXT NOT NULL, + "size" INTEGER NOT NULL, + "bucket" TEXT NOT NULL, + "objectKey" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "ProjectFile_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Assignment" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "projectId" TEXT NOT NULL, + "roundId" TEXT NOT NULL, + "method" "AssignmentMethod" NOT NULL DEFAULT 'MANUAL', + "isRequired" BOOLEAN NOT NULL DEFAULT true, + "isCompleted" BOOLEAN NOT NULL DEFAULT false, + "aiConfidenceScore" DOUBLE PRECISION, + "expertiseMatchScore" DOUBLE PRECISION, + "aiReasoning" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "createdBy" TEXT, + + CONSTRAINT "Assignment_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Evaluation" ( + "id" TEXT NOT NULL, + "assignmentId" TEXT NOT NULL, + "formId" TEXT NOT NULL, + "status" "EvaluationStatus" NOT NULL DEFAULT 'NOT_STARTED', + "criterionScoresJson" JSONB, + "globalScore" INTEGER, + "binaryDecision" BOOLEAN, + "feedbackText" TEXT, + "version" INTEGER NOT NULL DEFAULT 1, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "submittedAt" TIMESTAMP(3), + + CONSTRAINT "Evaluation_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "GracePeriod" ( + "id" TEXT NOT NULL, + "roundId" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "projectId" TEXT, + "extendedUntil" TIMESTAMP(3) NOT NULL, + "reason" TEXT, + "grantedById" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "GracePeriod_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "SystemSettings" ( + "id" TEXT NOT NULL, + "key" TEXT NOT NULL, + "value" TEXT NOT NULL, + "type" "SettingType" NOT NULL DEFAULT 'STRING', + "category" "SettingCategory" NOT NULL, + "description" TEXT, + "isSecret" BOOLEAN NOT NULL DEFAULT false, + "updatedAt" TIMESTAMP(3) NOT NULL, + "updatedBy" TEXT, + + CONSTRAINT "SystemSettings_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "AuditLog" ( + "id" TEXT NOT NULL, + "userId" TEXT, + "action" TEXT NOT NULL, + "entityType" TEXT NOT NULL, + "entityId" TEXT, + "detailsJson" JSONB, + "ipAddress" TEXT, + "userAgent" TEXT, + "timestamp" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "AuditLog_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "NotificationLog" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "channel" "NotificationChannel" NOT NULL, + "provider" TEXT, + "type" TEXT NOT NULL, + "status" TEXT NOT NULL, + "externalId" TEXT, + "errorMsg" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "NotificationLog_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "LearningResource" ( + "id" TEXT NOT NULL, + "programId" TEXT, + "title" TEXT NOT NULL, + "description" TEXT, + "contentJson" JSONB, + "resourceType" "ResourceType" NOT NULL, + "cohortLevel" "CohortLevel" NOT NULL DEFAULT 'ALL', + "fileName" TEXT, + "mimeType" TEXT, + "size" INTEGER, + "bucket" TEXT, + "objectKey" TEXT, + "externalUrl" TEXT, + "sortOrder" INTEGER NOT NULL DEFAULT 0, + "isPublished" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "createdById" TEXT NOT NULL, + + CONSTRAINT "LearningResource_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ResourceAccess" ( + "id" TEXT NOT NULL, + "resourceId" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "accessedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "ipAddress" TEXT, + + CONSTRAINT "ResourceAccess_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Partner" ( + "id" TEXT NOT NULL, + "programId" TEXT, + "name" TEXT NOT NULL, + "description" TEXT, + "website" TEXT, + "partnerType" "PartnerType" NOT NULL DEFAULT 'PARTNER', + "visibility" "PartnerVisibility" NOT NULL DEFAULT 'ADMIN_ONLY', + "logoFileName" TEXT, + "logoBucket" TEXT, + "logoObjectKey" TEXT, + "sortOrder" INTEGER NOT NULL DEFAULT 0, + "isActive" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Partner_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ApplicationForm" ( + "id" TEXT NOT NULL, + "programId" TEXT, + "name" TEXT NOT NULL, + "description" TEXT, + "status" TEXT NOT NULL DEFAULT 'DRAFT', + "isPublic" BOOLEAN NOT NULL DEFAULT false, + "publicSlug" TEXT, + "submissionLimit" INTEGER, + "opensAt" TIMESTAMP(3), + "closesAt" TIMESTAMP(3), + "confirmationMessage" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "ApplicationForm_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ApplicationFormField" ( + "id" TEXT NOT NULL, + "formId" TEXT NOT NULL, + "fieldType" "FormFieldType" NOT NULL, + "name" TEXT NOT NULL, + "label" TEXT NOT NULL, + "description" TEXT, + "placeholder" TEXT, + "required" BOOLEAN NOT NULL DEFAULT false, + "minLength" INTEGER, + "maxLength" INTEGER, + "minValue" DOUBLE PRECISION, + "maxValue" DOUBLE PRECISION, + "optionsJson" JSONB, + "conditionJson" JSONB, + "sortOrder" INTEGER NOT NULL DEFAULT 0, + "width" TEXT NOT NULL DEFAULT 'full', + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "ApplicationFormField_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ApplicationFormSubmission" ( + "id" TEXT NOT NULL, + "formId" TEXT NOT NULL, + "email" TEXT, + "name" TEXT, + "dataJson" JSONB NOT NULL, + "status" TEXT NOT NULL DEFAULT 'SUBMITTED', + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "ApplicationFormSubmission_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "SubmissionFile" ( + "id" TEXT NOT NULL, + "submissionId" TEXT NOT NULL, + "fieldName" TEXT NOT NULL, + "fileName" TEXT NOT NULL, + "mimeType" TEXT, + "size" INTEGER, + "bucket" TEXT NOT NULL, + "objectKey" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "SubmissionFile_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ExpertiseTag" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "description" TEXT, + "category" TEXT, + "color" TEXT, + "isActive" BOOLEAN NOT NULL DEFAULT true, + "sortOrder" INTEGER NOT NULL DEFAULT 0, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "ExpertiseTag_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "LiveVotingSession" ( + "id" TEXT NOT NULL, + "roundId" TEXT NOT NULL, + "status" TEXT NOT NULL DEFAULT 'NOT_STARTED', + "currentProjectIndex" INTEGER NOT NULL DEFAULT 0, + "currentProjectId" TEXT, + "votingStartedAt" TIMESTAMP(3), + "votingEndsAt" TIMESTAMP(3), + "projectOrderJson" JSONB, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "LiveVotingSession_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "LiveVote" ( + "id" TEXT NOT NULL, + "sessionId" TEXT NOT NULL, + "projectId" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "score" INTEGER NOT NULL, + "votedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "LiveVote_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "TeamMember" ( + "id" TEXT NOT NULL, + "projectId" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "role" "TeamMemberRole" NOT NULL DEFAULT 'MEMBER', + "title" TEXT, + "joinedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "TeamMember_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "MentorAssignment" ( + "id" TEXT NOT NULL, + "projectId" TEXT NOT NULL, + "mentorId" TEXT NOT NULL, + "method" "MentorAssignmentMethod" NOT NULL DEFAULT 'MANUAL', + "assignedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "assignedBy" TEXT, + "aiConfidenceScore" DOUBLE PRECISION, + "expertiseMatchScore" DOUBLE PRECISION, + "aiReasoning" TEXT, + + CONSTRAINT "MentorAssignment_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); + +-- CreateIndex +CREATE INDEX "User_email_idx" ON "User"("email"); + +-- CreateIndex +CREATE INDEX "User_role_idx" ON "User"("role"); + +-- CreateIndex +CREATE INDEX "User_status_idx" ON "User"("status"); + +-- CreateIndex +CREATE INDEX "Account_userId_idx" ON "Account"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Account_provider_providerAccountId_key" ON "Account"("provider", "providerAccountId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Session_sessionToken_key" ON "Session"("sessionToken"); + +-- CreateIndex +CREATE INDEX "Session_userId_idx" ON "Session"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "VerificationToken_token_key" ON "VerificationToken"("token"); + +-- CreateIndex +CREATE UNIQUE INDEX "VerificationToken_identifier_token_key" ON "VerificationToken"("identifier", "token"); + +-- CreateIndex +CREATE INDEX "Program_status_idx" ON "Program"("status"); + +-- CreateIndex +CREATE UNIQUE INDEX "Program_name_year_key" ON "Program"("name", "year"); + +-- CreateIndex +CREATE UNIQUE INDEX "Round_slug_key" ON "Round"("slug"); + +-- CreateIndex +CREATE INDEX "Round_programId_idx" ON "Round"("programId"); + +-- CreateIndex +CREATE INDEX "Round_status_idx" ON "Round"("status"); + +-- CreateIndex +CREATE INDEX "Round_roundType_idx" ON "Round"("roundType"); + +-- CreateIndex +CREATE INDEX "Round_votingStartAt_votingEndAt_idx" ON "Round"("votingStartAt", "votingEndAt"); + +-- CreateIndex +CREATE INDEX "Round_submissionStartDate_submissionEndDate_idx" ON "Round"("submissionStartDate", "submissionEndDate"); + +-- CreateIndex +CREATE INDEX "EvaluationForm_roundId_isActive_idx" ON "EvaluationForm"("roundId", "isActive"); + +-- CreateIndex +CREATE UNIQUE INDEX "EvaluationForm_roundId_version_key" ON "EvaluationForm"("roundId", "version"); + +-- CreateIndex +CREATE INDEX "Project_roundId_idx" ON "Project"("roundId"); + +-- CreateIndex +CREATE INDEX "Project_status_idx" ON "Project"("status"); + +-- CreateIndex +CREATE INDEX "Project_tags_idx" ON "Project"("tags"); + +-- CreateIndex +CREATE INDEX "Project_submissionSource_idx" ON "Project"("submissionSource"); + +-- CreateIndex +CREATE INDEX "Project_submittedByUserId_idx" ON "Project"("submittedByUserId"); + +-- CreateIndex +CREATE INDEX "Project_competitionCategory_idx" ON "Project"("competitionCategory"); + +-- CreateIndex +CREATE INDEX "Project_oceanIssue_idx" ON "Project"("oceanIssue"); + +-- CreateIndex +CREATE INDEX "Project_country_idx" ON "Project"("country"); + +-- CreateIndex +CREATE INDEX "ProjectFile_projectId_idx" ON "ProjectFile"("projectId"); + +-- CreateIndex +CREATE INDEX "ProjectFile_fileType_idx" ON "ProjectFile"("fileType"); + +-- CreateIndex +CREATE UNIQUE INDEX "ProjectFile_bucket_objectKey_key" ON "ProjectFile"("bucket", "objectKey"); + +-- CreateIndex +CREATE INDEX "Assignment_userId_idx" ON "Assignment"("userId"); + +-- CreateIndex +CREATE INDEX "Assignment_projectId_idx" ON "Assignment"("projectId"); + +-- CreateIndex +CREATE INDEX "Assignment_roundId_idx" ON "Assignment"("roundId"); + +-- CreateIndex +CREATE INDEX "Assignment_isCompleted_idx" ON "Assignment"("isCompleted"); + +-- CreateIndex +CREATE UNIQUE INDEX "Assignment_userId_projectId_roundId_key" ON "Assignment"("userId", "projectId", "roundId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Evaluation_assignmentId_key" ON "Evaluation"("assignmentId"); + +-- CreateIndex +CREATE INDEX "Evaluation_status_idx" ON "Evaluation"("status"); + +-- CreateIndex +CREATE INDEX "Evaluation_submittedAt_idx" ON "Evaluation"("submittedAt"); + +-- CreateIndex +CREATE INDEX "Evaluation_formId_idx" ON "Evaluation"("formId"); + +-- CreateIndex +CREATE INDEX "GracePeriod_roundId_idx" ON "GracePeriod"("roundId"); + +-- CreateIndex +CREATE INDEX "GracePeriod_userId_idx" ON "GracePeriod"("userId"); + +-- CreateIndex +CREATE INDEX "GracePeriod_extendedUntil_idx" ON "GracePeriod"("extendedUntil"); + +-- CreateIndex +CREATE INDEX "GracePeriod_grantedById_idx" ON "GracePeriod"("grantedById"); + +-- CreateIndex +CREATE INDEX "GracePeriod_projectId_idx" ON "GracePeriod"("projectId"); + +-- CreateIndex +CREATE UNIQUE INDEX "SystemSettings_key_key" ON "SystemSettings"("key"); + +-- CreateIndex +CREATE INDEX "SystemSettings_category_idx" ON "SystemSettings"("category"); + +-- CreateIndex +CREATE INDEX "AuditLog_userId_idx" ON "AuditLog"("userId"); + +-- CreateIndex +CREATE INDEX "AuditLog_action_idx" ON "AuditLog"("action"); + +-- CreateIndex +CREATE INDEX "AuditLog_entityType_entityId_idx" ON "AuditLog"("entityType", "entityId"); + +-- CreateIndex +CREATE INDEX "AuditLog_timestamp_idx" ON "AuditLog"("timestamp"); + +-- CreateIndex +CREATE INDEX "NotificationLog_userId_idx" ON "NotificationLog"("userId"); + +-- CreateIndex +CREATE INDEX "NotificationLog_status_idx" ON "NotificationLog"("status"); + +-- CreateIndex +CREATE INDEX "NotificationLog_createdAt_idx" ON "NotificationLog"("createdAt"); + +-- CreateIndex +CREATE INDEX "LearningResource_programId_idx" ON "LearningResource"("programId"); + +-- CreateIndex +CREATE INDEX "LearningResource_cohortLevel_idx" ON "LearningResource"("cohortLevel"); + +-- CreateIndex +CREATE INDEX "LearningResource_isPublished_idx" ON "LearningResource"("isPublished"); + +-- CreateIndex +CREATE INDEX "LearningResource_sortOrder_idx" ON "LearningResource"("sortOrder"); + +-- CreateIndex +CREATE INDEX "ResourceAccess_resourceId_idx" ON "ResourceAccess"("resourceId"); + +-- CreateIndex +CREATE INDEX "ResourceAccess_userId_idx" ON "ResourceAccess"("userId"); + +-- CreateIndex +CREATE INDEX "ResourceAccess_accessedAt_idx" ON "ResourceAccess"("accessedAt"); + +-- CreateIndex +CREATE INDEX "Partner_programId_idx" ON "Partner"("programId"); + +-- CreateIndex +CREATE INDEX "Partner_partnerType_idx" ON "Partner"("partnerType"); + +-- CreateIndex +CREATE INDEX "Partner_visibility_idx" ON "Partner"("visibility"); + +-- CreateIndex +CREATE INDEX "Partner_isActive_idx" ON "Partner"("isActive"); + +-- CreateIndex +CREATE INDEX "Partner_sortOrder_idx" ON "Partner"("sortOrder"); + +-- CreateIndex +CREATE UNIQUE INDEX "ApplicationForm_publicSlug_key" ON "ApplicationForm"("publicSlug"); + +-- CreateIndex +CREATE INDEX "ApplicationForm_programId_idx" ON "ApplicationForm"("programId"); + +-- CreateIndex +CREATE INDEX "ApplicationForm_status_idx" ON "ApplicationForm"("status"); + +-- CreateIndex +CREATE INDEX "ApplicationForm_isPublic_idx" ON "ApplicationForm"("isPublic"); + +-- CreateIndex +CREATE INDEX "ApplicationFormField_formId_idx" ON "ApplicationFormField"("formId"); + +-- CreateIndex +CREATE INDEX "ApplicationFormField_sortOrder_idx" ON "ApplicationFormField"("sortOrder"); + +-- CreateIndex +CREATE INDEX "ApplicationFormSubmission_formId_idx" ON "ApplicationFormSubmission"("formId"); + +-- CreateIndex +CREATE INDEX "ApplicationFormSubmission_status_idx" ON "ApplicationFormSubmission"("status"); + +-- CreateIndex +CREATE INDEX "ApplicationFormSubmission_email_idx" ON "ApplicationFormSubmission"("email"); + +-- CreateIndex +CREATE INDEX "ApplicationFormSubmission_createdAt_idx" ON "ApplicationFormSubmission"("createdAt"); + +-- CreateIndex +CREATE INDEX "SubmissionFile_submissionId_idx" ON "SubmissionFile"("submissionId"); + +-- CreateIndex +CREATE UNIQUE INDEX "SubmissionFile_bucket_objectKey_key" ON "SubmissionFile"("bucket", "objectKey"); + +-- CreateIndex +CREATE UNIQUE INDEX "ExpertiseTag_name_key" ON "ExpertiseTag"("name"); + +-- CreateIndex +CREATE INDEX "ExpertiseTag_category_idx" ON "ExpertiseTag"("category"); + +-- CreateIndex +CREATE INDEX "ExpertiseTag_isActive_idx" ON "ExpertiseTag"("isActive"); + +-- CreateIndex +CREATE INDEX "ExpertiseTag_sortOrder_idx" ON "ExpertiseTag"("sortOrder"); + +-- CreateIndex +CREATE UNIQUE INDEX "LiveVotingSession_roundId_key" ON "LiveVotingSession"("roundId"); + +-- CreateIndex +CREATE INDEX "LiveVotingSession_status_idx" ON "LiveVotingSession"("status"); + +-- CreateIndex +CREATE INDEX "LiveVote_sessionId_idx" ON "LiveVote"("sessionId"); + +-- CreateIndex +CREATE INDEX "LiveVote_projectId_idx" ON "LiveVote"("projectId"); + +-- CreateIndex +CREATE INDEX "LiveVote_userId_idx" ON "LiveVote"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "LiveVote_sessionId_projectId_userId_key" ON "LiveVote"("sessionId", "projectId", "userId"); + +-- CreateIndex +CREATE INDEX "TeamMember_projectId_idx" ON "TeamMember"("projectId"); + +-- CreateIndex +CREATE INDEX "TeamMember_userId_idx" ON "TeamMember"("userId"); + +-- CreateIndex +CREATE INDEX "TeamMember_role_idx" ON "TeamMember"("role"); + +-- CreateIndex +CREATE UNIQUE INDEX "TeamMember_projectId_userId_key" ON "TeamMember"("projectId", "userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "MentorAssignment_projectId_key" ON "MentorAssignment"("projectId"); + +-- CreateIndex +CREATE INDEX "MentorAssignment_mentorId_idx" ON "MentorAssignment"("mentorId"); + +-- CreateIndex +CREATE INDEX "MentorAssignment_method_idx" ON "MentorAssignment"("method"); + +-- AddForeignKey +ALTER TABLE "Account" ADD CONSTRAINT "Account_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Session" ADD CONSTRAINT "Session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Round" ADD CONSTRAINT "Round_programId_fkey" FOREIGN KEY ("programId") REFERENCES "Program"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "EvaluationForm" ADD CONSTRAINT "EvaluationForm_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Project" ADD CONSTRAINT "Project_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Project" ADD CONSTRAINT "Project_submittedByUserId_fkey" FOREIGN KEY ("submittedByUserId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ProjectFile" ADD CONSTRAINT "ProjectFile_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Assignment" ADD CONSTRAINT "Assignment_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Assignment" ADD CONSTRAINT "Assignment_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Assignment" ADD CONSTRAINT "Assignment_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Evaluation" ADD CONSTRAINT "Evaluation_assignmentId_fkey" FOREIGN KEY ("assignmentId") REFERENCES "Assignment"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Evaluation" ADD CONSTRAINT "Evaluation_formId_fkey" FOREIGN KEY ("formId") REFERENCES "EvaluationForm"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "GracePeriod" ADD CONSTRAINT "GracePeriod_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "GracePeriod" ADD CONSTRAINT "GracePeriod_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "GracePeriod" ADD CONSTRAINT "GracePeriod_grantedById_fkey" FOREIGN KEY ("grantedById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "AuditLog" ADD CONSTRAINT "AuditLog_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "NotificationLog" ADD CONSTRAINT "NotificationLog_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "LearningResource" ADD CONSTRAINT "LearningResource_programId_fkey" FOREIGN KEY ("programId") REFERENCES "Program"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "LearningResource" ADD CONSTRAINT "LearningResource_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ResourceAccess" ADD CONSTRAINT "ResourceAccess_resourceId_fkey" FOREIGN KEY ("resourceId") REFERENCES "LearningResource"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ResourceAccess" ADD CONSTRAINT "ResourceAccess_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Partner" ADD CONSTRAINT "Partner_programId_fkey" FOREIGN KEY ("programId") REFERENCES "Program"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ApplicationForm" ADD CONSTRAINT "ApplicationForm_programId_fkey" FOREIGN KEY ("programId") REFERENCES "Program"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ApplicationFormField" ADD CONSTRAINT "ApplicationFormField_formId_fkey" FOREIGN KEY ("formId") REFERENCES "ApplicationForm"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ApplicationFormSubmission" ADD CONSTRAINT "ApplicationFormSubmission_formId_fkey" FOREIGN KEY ("formId") REFERENCES "ApplicationForm"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "SubmissionFile" ADD CONSTRAINT "SubmissionFile_submissionId_fkey" FOREIGN KEY ("submissionId") REFERENCES "ApplicationFormSubmission"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "LiveVotingSession" ADD CONSTRAINT "LiveVotingSession_roundId_fkey" FOREIGN KEY ("roundId") REFERENCES "Round"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "LiveVote" ADD CONSTRAINT "LiveVote_sessionId_fkey" FOREIGN KEY ("sessionId") REFERENCES "LiveVotingSession"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "LiveVote" ADD CONSTRAINT "LiveVote_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "TeamMember" ADD CONSTRAINT "TeamMember_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "TeamMember" ADD CONSTRAINT "TeamMember_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "MentorAssignment" ADD CONSTRAINT "MentorAssignment_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "MentorAssignment" ADD CONSTRAINT "MentorAssignment_mentorId_fkey" FOREIGN KEY ("mentorId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +