From 3f8c06464985b9f341cc637278e858d2fecb8f4c Mon Sep 17 00:00:00 2001 From: bunker-admin Date: Thu, 16 Apr 2026 17:34:07 -0600 Subject: [PATCH] chore(prisma): squash 50 migrations into single init MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces all 50 prior migrations with one fresh init.sql generated via `prisma migrate diff --from-empty --to-schema-datamodel`. Schema is unchanged; this is purely a consolidation of migration history. Result: - 50 → 1 migration (50 dirs deleted, 1 new init created) - 6304 → 6075 lines of migration SQL (-229; redundant ALTERs collapsed) - Fresh installs apply one transaction instead of 50 chained - 192 tables / 103 enums / 516 indexes — verified against current schema Verified locally: - prisma migrate reset → applied cleanly, seed succeeded - 193 tables in public schema (192 models + _prisma_migrations) - /api/health → database+redis ok - Login as admin@bnkops.ca → SUPER_ADMIN role returned - Authenticated GET /api/settings + /api/users → working Existing deployments need `prisma migrate reset` (acceptable: no production data of consequence currently). --- .../20260209192843_init/migration.sql | 509 ---- .../migration.sql | 5 - .../migration.sql | 8 - .../migration.sql | 8 - .../migration.sql | 25 - .../migration.sql | 92 - .../migration.sql | 59 - .../migration.sql | 8 - .../migration.sql | 4 - .../migration.sql | 2 - .../migration.sql | 2 - .../migration.sql | 2 - .../migration.sql | 2 - .../migration.sql | 2 - .../migration.sql | 14 - .../migration.sql | 5 - .../migration.sql | 2 - .../migration.sql | 3 - .../migration.sql | 38 - .../migration.sql | 2 - .../migration.sql | 25 - .../migration.sql | 20 - .../migration.sql | 5 - .../migration.sql | 127 - .../migration.sql | 249 -- .../migration.sql | 176 -- .../migration.sql | 12 - .../migration.sql | 258 -- .../migration.sql | 11 - .../migration.sql | 2 - .../migration.sql | 5 - .../migration.sql | 7 - .../migration.sql | 16 - .../migration.sql | 16 - .../migration.sql | 12 - .../migration.sql | 160 -- .../migration.sql | 3 - .../migration.sql | 76 - .../migration.sql | 3 - .../migration.sql | 2 - .../migration.sql | 168 -- .../migration.sql | 18 - .../migration.sql | 4 - .../migration.sql | 39 - .../migration.sql | 131 - .../migration.sql | 3 - .../migration.sql | 4 - .../migration.sql | 130 - .../migration.sql | 7 - .../migration.sql | 2480 ++++++++++++++++- 50 files changed, 2366 insertions(+), 2595 deletions(-) delete mode 100644 api/prisma/migrations/20260209192843_init/migration.sql delete mode 100644 api/prisma/migrations/20260210000000_add_nar_metadata_fields/migration.sql delete mode 100644 api/prisma/migrations/20260210203200_add_editor_mode/migration.sql delete mode 100644 api/prisma/migrations/20260210210744_add_mkdocs_integration_fields/migration.sql delete mode 100644 api/prisma/migrations/20260210215400_add_site_settings/migration.sql delete mode 100644 api/prisma/migrations/20260210230007_add_canvass_system/migration.sql delete mode 100644 api/prisma/migrations/20260211002822_add_gps_tracking/migration.sql delete mode 100644 api/prisma/migrations/20260211042600_add_smtp_settings/migration.sql delete mode 100644 api/prisma/migrations/20260211120916_add_google_geocode_provider/migration.sql delete mode 100644 api/prisma/migrations/20260218000000_add_shift_cancellation_notification/migration.sql delete mode 100644 api/prisma/migrations/20260218100000_add_gancio_event_id/migration.sql delete mode 100644 api/prisma/migrations/20260218200000_add_enable_events_setting/migration.sql delete mode 100644 api/prisma/migrations/20260218300000_add_quick_join_invite_created_via/migration.sql delete mode 100644 api/prisma/migrations/20260224185504_add_ad_placements/migration.sql delete mode 100644 api/prisma/migrations/20260224185906_add_volunteer_engagement_sms_crm_linking/migration.sql delete mode 100644 api/prisma/migrations/20260224190210_add_landing_page_listed_and_homepage_tagline/migration.sql delete mode 100644 api/prisma/migrations/20260224215259_add_enable_social/migration.sql delete mode 100644 api/prisma/migrations/20260224232546_add_digest_frequency/migration.sql delete mode 100644 api/prisma/migrations/20260225000017_add_social_groups/migration.sql delete mode 100644 api/prisma/migrations/20260225010931_add_enable_meet/migration.sql delete mode 100644 api/prisma/migrations/20260225202515_add_meetings_model/migration.sql delete mode 100644 api/prisma/migrations/20260225220000_add_shift_group_meeting_relations/migration.sql delete mode 100644 api/prisma/migrations/20260227185928_add_sms_notification_settings/migration.sql delete mode 100644 api/prisma/migrations/20260301173914_add_meeting_planner/migration.sql delete mode 100644 api/prisma/migrations/20260304045540_social_stories_spotlight_referrals_challenges/migration.sql delete mode 100644 api/prisma/migrations/20260305165051_ticketed_events/migration.sql delete mode 100644 api/prisma/migrations/20260305170000_add_event_format_meeting_link/migration.sql delete mode 100644 api/prisma/migrations/20260306203326_social_calendar_layers_items/migration.sql delete mode 100644 api/prisma/migrations/20260306213132_add_shared_calendar_notification_types/migration.sql delete mode 100644 api/prisma/migrations/20260307234424_add_poll_is_private/migration.sql delete mode 100644 api/prisma/migrations/20260308124852_add_auto_upgrade_settings/migration.sql delete mode 100644 api/prisma/migrations/20260308150000_add_granular_admin_roles/migration.sql delete mode 100644 api/prisma/migrations/20260308230000_add_docs_collaboration/migration.sql delete mode 100644 api/prisma/migrations/20260309100000_add_notification_types_and_donation_campaign_attribution/migration.sql delete mode 100644 api/prisma/migrations/20260311100000_add_poll_auto_finalize/migration.sql delete mode 100644 api/prisma/migrations/20260312100000_add_organizing_pipeline/migration.sql delete mode 100644 api/prisma/migrations/20260322100000_add_registry_settings/migration.sql delete mode 100644 api/prisma/migrations/20260327100000_add_docs_access_sharing_watch/migration.sql delete mode 100644 api/prisma/migrations/20260327100000_add_ticket_tier_reserved_count/migration.sql delete mode 100644 api/prisma/migrations/20260327120000_add_gitea_setup_complete/migration.sql delete mode 100644 api/prisma/migrations/20260330100000_add_straw_polls/migration.sql delete mode 100644 api/prisma/migrations/20260330120000_payment_audit_and_disputed_status/migration.sql delete mode 100644 api/prisma/migrations/20260331100000_add_calendar_item_source_types/migration.sql delete mode 100644 api/prisma/migrations/20260402100000_add_analytics_system/migration.sql delete mode 100644 api/prisma/migrations/20260402200000_add_petitions/migration.sql delete mode 100644 api/prisma/migrations/20260404100000_disable_public_map_by_default/migration.sql delete mode 100644 api/prisma/migrations/20260407200000_add_petition_cover_video/migration.sql delete mode 100644 api/prisma/migrations/20260410200000_volunteer_dashboard_action_campaigns/migration.sql delete mode 100644 api/prisma/migrations/20260411120000_shift_event_link/migration.sql rename api/prisma/migrations/{20260224100000_baseline_catchup => 20260416000000_init}/migration.sql (59%) diff --git a/api/prisma/migrations/20260209192843_init/migration.sql b/api/prisma/migrations/20260209192843_init/migration.sql deleted file mode 100644 index 8fc8dd01..00000000 --- a/api/prisma/migrations/20260209192843_init/migration.sql +++ /dev/null @@ -1,509 +0,0 @@ --- CreateEnum -CREATE TYPE "UserRole" AS ENUM ('SUPER_ADMIN', 'INFLUENCE_ADMIN', 'MAP_ADMIN', 'USER', 'TEMP'); - --- CreateEnum -CREATE TYPE "UserStatus" AS ENUM ('ACTIVE', 'INACTIVE', 'SUSPENDED', 'EXPIRED'); - --- CreateEnum -CREATE TYPE "UserCreatedVia" AS ENUM ('ADMIN', 'PUBLIC_SHIFT_SIGNUP', 'STANDARD'); - --- CreateEnum -CREATE TYPE "CampaignStatus" AS ENUM ('DRAFT', 'ACTIVE', 'PAUSED', 'ARCHIVED'); - --- CreateEnum -CREATE TYPE "GovernmentLevel" AS ENUM ('FEDERAL', 'PROVINCIAL', 'MUNICIPAL', 'SCHOOL_BOARD'); - --- CreateEnum -CREATE TYPE "EmailMethod" AS ENUM ('SMTP', 'MAILTO'); - --- CreateEnum -CREATE TYPE "CampaignEmailStatus" AS ENUM ('SENT', 'FAILED', 'CLICKED', 'USER_INFO_CAPTURED'); - --- CreateEnum -CREATE TYPE "ResponseType" AS ENUM ('EMAIL', 'LETTER', 'PHONE_CALL', 'MEETING', 'SOCIAL_MEDIA', 'OTHER'); - --- CreateEnum -CREATE TYPE "ResponseStatus" AS ENUM ('PENDING', 'APPROVED', 'REJECTED'); - --- CreateEnum -CREATE TYPE "SupportLevel" AS ENUM ('1', '2', '3', '4'); - --- CreateEnum -CREATE TYPE "GeocodeProvider" AS ENUM ('MAPBOX', 'NOMINATIM', 'PHOTON', 'LOCATIONIQ', 'ARCGIS', 'UNKNOWN'); - --- CreateEnum -CREATE TYPE "ShiftStatus" AS ENUM ('OPEN', 'FULL', 'CANCELLED'); - --- CreateEnum -CREATE TYPE "SignupStatus" AS ENUM ('CONFIRMED', 'CANCELLED'); - --- CreateEnum -CREATE TYPE "SignupSource" AS ENUM ('AUTHENTICATED', 'PUBLIC', 'ADMIN'); - --- CreateEnum -CREATE TYPE "CutCategory" AS ENUM ('CUSTOM', 'WARD', 'NEIGHBORHOOD', 'DISTRICT'); - --- CreateTable -CREATE TABLE "users" ( - "id" TEXT NOT NULL, - "email" TEXT NOT NULL, - "password" TEXT NOT NULL, - "name" TEXT, - "phone" TEXT, - "role" "UserRole" NOT NULL DEFAULT 'USER', - "status" "UserStatus" NOT NULL DEFAULT 'ACTIVE', - "permissions" JSONB, - "createdVia" "UserCreatedVia" NOT NULL DEFAULT 'STANDARD', - "expiresAt" TIMESTAMP(3), - "expireDays" INTEGER, - "lastLoginAt" TIMESTAMP(3), - "emailVerified" BOOLEAN NOT NULL DEFAULT false, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "users_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "refresh_tokens" ( - "id" TEXT NOT NULL, - "token" TEXT NOT NULL, - "userId" TEXT NOT NULL, - "expiresAt" TIMESTAMP(3) NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "refresh_tokens_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "campaigns" ( - "id" TEXT NOT NULL, - "slug" TEXT NOT NULL, - "title" TEXT NOT NULL, - "description" TEXT, - "emailSubject" TEXT NOT NULL, - "emailBody" TEXT NOT NULL, - "callToAction" TEXT, - "coverPhoto" TEXT, - "status" "CampaignStatus" NOT NULL DEFAULT 'DRAFT', - "allowSmtpEmail" BOOLEAN NOT NULL DEFAULT true, - "allowMailtoLink" BOOLEAN NOT NULL DEFAULT true, - "collectUserInfo" BOOLEAN NOT NULL DEFAULT true, - "showEmailCount" BOOLEAN NOT NULL DEFAULT true, - "showCallCount" BOOLEAN NOT NULL DEFAULT true, - "allowEmailEditing" BOOLEAN NOT NULL DEFAULT false, - "allowCustomRecipients" BOOLEAN NOT NULL DEFAULT false, - "showResponseWall" BOOLEAN NOT NULL DEFAULT false, - "highlightCampaign" BOOLEAN NOT NULL DEFAULT false, - "targetGovernmentLevels" "GovernmentLevel"[], - "createdByUserId" TEXT, - "createdByUserEmail" TEXT, - "createdByUserName" TEXT, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "campaigns_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "representatives" ( - "id" TEXT NOT NULL, - "postalCode" TEXT NOT NULL, - "name" TEXT, - "email" TEXT, - "districtName" TEXT, - "electedOffice" TEXT, - "partyName" TEXT, - "representativeSetName" TEXT, - "url" TEXT, - "photoUrl" TEXT, - "offices" JSONB, - "cachedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "representatives_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "campaign_emails" ( - "id" TEXT NOT NULL, - "campaignId" TEXT NOT NULL, - "campaignSlug" TEXT NOT NULL, - "userId" TEXT, - "userEmail" TEXT, - "userName" TEXT, - "userPostalCode" TEXT, - "recipientEmail" TEXT NOT NULL, - "recipientName" TEXT, - "recipientTitle" TEXT, - "recipientLevel" "GovernmentLevel", - "emailMethod" "EmailMethod" NOT NULL, - "subject" TEXT NOT NULL, - "message" TEXT NOT NULL, - "status" "CampaignEmailStatus" NOT NULL DEFAULT 'SENT', - "senderIp" TEXT, - "sentAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "campaign_emails_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "representative_responses" ( - "id" TEXT NOT NULL, - "campaignId" TEXT NOT NULL, - "campaignSlug" TEXT NOT NULL, - "representativeName" TEXT NOT NULL, - "representativeTitle" TEXT, - "representativeLevel" "GovernmentLevel" NOT NULL, - "representativeEmail" TEXT, - "responseType" "ResponseType" NOT NULL, - "responseText" TEXT NOT NULL, - "userComment" TEXT, - "screenshotUrl" TEXT, - "submittedByUserId" TEXT, - "submittedByName" TEXT, - "submittedByEmail" TEXT, - "isAnonymous" BOOLEAN NOT NULL DEFAULT false, - "status" "ResponseStatus" NOT NULL DEFAULT 'PENDING', - "isVerified" BOOLEAN NOT NULL DEFAULT false, - "verificationToken" TEXT, - "verificationSentAt" TIMESTAMP(3), - "verifiedAt" TIMESTAMP(3), - "verifiedBy" TEXT, - "upvoteCount" INTEGER NOT NULL DEFAULT 0, - "submittedIp" TEXT, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "representative_responses_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "response_upvotes" ( - "id" TEXT NOT NULL, - "responseId" TEXT NOT NULL, - "userId" TEXT, - "userEmail" TEXT, - "upvotedIp" TEXT, - - CONSTRAINT "response_upvotes_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "custom_recipients" ( - "id" TEXT NOT NULL, - "campaignId" TEXT NOT NULL, - "campaignSlug" TEXT NOT NULL, - "recipientName" TEXT NOT NULL, - "recipientEmail" TEXT NOT NULL, - "recipientTitle" TEXT, - "recipientOrganization" TEXT, - "notes" TEXT, - "isActive" BOOLEAN NOT NULL DEFAULT true, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "custom_recipients_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "postal_code_cache" ( - "id" TEXT NOT NULL, - "postalCode" TEXT NOT NULL, - "city" TEXT, - "province" TEXT, - "centroidLat" DECIMAL(10,8), - "centroidLng" DECIMAL(11,8), - "lastUpdated" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "postal_code_cache_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "email_logs" ( - "id" TEXT NOT NULL, - "recipientEmail" TEXT NOT NULL, - "senderName" TEXT NOT NULL, - "senderEmail" TEXT NOT NULL, - "subject" TEXT, - "message" TEXT, - "postalCode" TEXT, - "status" TEXT NOT NULL DEFAULT 'sent', - "senderIp" TEXT, - "sentAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "email_logs_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "email_verifications" ( - "id" TEXT NOT NULL, - "token" TEXT NOT NULL, - "email" TEXT NOT NULL, - "tempCampaignData" TEXT, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "expiresAt" TIMESTAMP(3) NOT NULL, - "used" BOOLEAN NOT NULL DEFAULT false, - - CONSTRAINT "email_verifications_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "calls" ( - "id" TEXT NOT NULL, - "representativeName" TEXT NOT NULL, - "representativeTitle" TEXT, - "phoneNumber" TEXT NOT NULL, - "officeType" TEXT, - "callerName" TEXT, - "callerEmail" TEXT, - "postalCode" TEXT, - "campaignId" TEXT, - "campaignSlug" TEXT, - "callerIp" TEXT, - "calledAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "calls_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "locations" ( - "id" TEXT NOT NULL, - "latitude" DECIMAL(10,8), - "longitude" DECIMAL(11,8), - "firstName" TEXT, - "lastName" TEXT, - "email" TEXT, - "phone" TEXT, - "unitNumber" TEXT, - "supportLevel" "SupportLevel", - "address" TEXT, - "sign" BOOLEAN NOT NULL DEFAULT false, - "signSize" TEXT, - "notes" TEXT, - "geocodeConfidence" INTEGER, - "geocodeProvider" "GeocodeProvider", - "createdByUserId" TEXT, - "updatedByUserId" TEXT, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "locations_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "shifts" ( - "id" TEXT NOT NULL, - "title" TEXT NOT NULL, - "description" TEXT, - "date" DATE NOT NULL, - "startTime" TEXT NOT NULL, - "endTime" TEXT NOT NULL, - "location" TEXT, - "maxVolunteers" INTEGER NOT NULL, - "currentVolunteers" INTEGER NOT NULL DEFAULT 0, - "status" "ShiftStatus" NOT NULL DEFAULT 'OPEN', - "isPublic" BOOLEAN NOT NULL DEFAULT false, - "createdBy" TEXT, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "shifts_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "shift_signups" ( - "id" TEXT NOT NULL, - "shiftId" TEXT NOT NULL, - "shiftTitle" TEXT, - "userId" TEXT, - "userEmail" TEXT NOT NULL, - "userName" TEXT, - "userPhone" TEXT, - "signupDate" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "status" "SignupStatus" NOT NULL DEFAULT 'CONFIRMED', - "signupSource" "SignupSource" NOT NULL DEFAULT 'AUTHENTICATED', - - CONSTRAINT "shift_signups_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "cuts" ( - "id" TEXT NOT NULL, - "name" TEXT NOT NULL, - "description" TEXT, - "color" TEXT NOT NULL DEFAULT '#3388ff', - "opacity" DECIMAL(3,2) NOT NULL DEFAULT 0.3, - "category" "CutCategory", - "isPublic" BOOLEAN NOT NULL DEFAULT false, - "isOfficial" BOOLEAN NOT NULL DEFAULT false, - "geojson" TEXT NOT NULL, - "bounds" TEXT, - "showLocations" BOOLEAN NOT NULL DEFAULT true, - "exportEnabled" BOOLEAN NOT NULL DEFAULT true, - "assignedTo" TEXT, - "filterSettings" JSONB, - "lastCanvassed" TIMESTAMP(3), - "completionPercentage" INTEGER NOT NULL DEFAULT 0, - "createdByUserId" TEXT, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "cuts_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "map_settings" ( - "id" TEXT NOT NULL, - "latitude" DECIMAL(10,8), - "longitude" DECIMAL(11,8), - "zoom" INTEGER, - "walkSheetTitle" TEXT, - "walkSheetSubtitle" TEXT, - "walkSheetFooter" TEXT, - "qrCode1Url" TEXT, - "qrCode1Label" TEXT, - "qrCode2Url" TEXT, - "qrCode2Label" TEXT, - "qrCode3Url" TEXT, - "qrCode3Label" TEXT, - "createdBy" TEXT, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "map_settings_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "landing_pages" ( - "id" TEXT NOT NULL, - "slug" TEXT NOT NULL, - "title" TEXT NOT NULL, - "description" TEXT, - "blocks" JSONB NOT NULL, - "htmlOutput" TEXT, - "cssOutput" TEXT, - "mkdocsPath" TEXT, - "published" BOOLEAN NOT NULL DEFAULT false, - "seoTitle" TEXT, - "seoDescription" TEXT, - "seoImage" TEXT, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "landing_pages_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "page_blocks" ( - "id" TEXT NOT NULL, - "type" TEXT NOT NULL, - "label" TEXT NOT NULL, - "schema" JSONB NOT NULL, - "defaults" JSONB NOT NULL, - "thumbnail" TEXT, - "category" TEXT, - "sortOrder" INTEGER NOT NULL DEFAULT 0, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "page_blocks_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "users_email_key" ON "users"("email"); - --- CreateIndex -CREATE UNIQUE INDEX "refresh_tokens_token_key" ON "refresh_tokens"("token"); - --- CreateIndex -CREATE INDEX "refresh_tokens_userId_idx" ON "refresh_tokens"("userId"); - --- CreateIndex -CREATE UNIQUE INDEX "campaigns_slug_key" ON "campaigns"("slug"); - --- CreateIndex -CREATE INDEX "representatives_postalCode_idx" ON "representatives"("postalCode"); - --- CreateIndex -CREATE INDEX "campaign_emails_campaignId_idx" ON "campaign_emails"("campaignId"); - --- CreateIndex -CREATE INDEX "campaign_emails_campaignSlug_idx" ON "campaign_emails"("campaignSlug"); - --- CreateIndex -CREATE INDEX "representative_responses_campaignId_idx" ON "representative_responses"("campaignId"); - --- CreateIndex -CREATE INDEX "representative_responses_campaignSlug_idx" ON "representative_responses"("campaignSlug"); - --- CreateIndex -CREATE UNIQUE INDEX "response_upvotes_responseId_userId_key" ON "response_upvotes"("responseId", "userId"); - --- CreateIndex -CREATE UNIQUE INDEX "response_upvotes_responseId_upvotedIp_key" ON "response_upvotes"("responseId", "upvotedIp"); - --- CreateIndex -CREATE INDEX "custom_recipients_campaignId_idx" ON "custom_recipients"("campaignId"); - --- CreateIndex -CREATE UNIQUE INDEX "postal_code_cache_postalCode_key" ON "postal_code_cache"("postalCode"); - --- CreateIndex -CREATE UNIQUE INDEX "email_verifications_token_key" ON "email_verifications"("token"); - --- CreateIndex -CREATE INDEX "calls_campaignId_idx" ON "calls"("campaignId"); - --- CreateIndex -CREATE INDEX "shift_signups_shiftId_idx" ON "shift_signups"("shiftId"); - --- CreateIndex -CREATE UNIQUE INDEX "shift_signups_shiftId_userEmail_key" ON "shift_signups"("shiftId", "userEmail"); - --- CreateIndex -CREATE UNIQUE INDEX "landing_pages_slug_key" ON "landing_pages"("slug"); - --- AddForeignKey -ALTER TABLE "refresh_tokens" ADD CONSTRAINT "refresh_tokens_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "campaigns" ADD CONSTRAINT "campaigns_createdByUserId_fkey" FOREIGN KEY ("createdByUserId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "campaign_emails" ADD CONSTRAINT "campaign_emails_campaignId_fkey" FOREIGN KEY ("campaignId") REFERENCES "campaigns"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "campaign_emails" ADD CONSTRAINT "campaign_emails_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "representative_responses" ADD CONSTRAINT "representative_responses_campaignId_fkey" FOREIGN KEY ("campaignId") REFERENCES "campaigns"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "representative_responses" ADD CONSTRAINT "representative_responses_submittedByUserId_fkey" FOREIGN KEY ("submittedByUserId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "response_upvotes" ADD CONSTRAINT "response_upvotes_responseId_fkey" FOREIGN KEY ("responseId") REFERENCES "representative_responses"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "response_upvotes" ADD CONSTRAINT "response_upvotes_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "custom_recipients" ADD CONSTRAINT "custom_recipients_campaignId_fkey" FOREIGN KEY ("campaignId") REFERENCES "campaigns"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "calls" ADD CONSTRAINT "calls_campaignId_fkey" FOREIGN KEY ("campaignId") REFERENCES "campaigns"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "locations" ADD CONSTRAINT "locations_createdByUserId_fkey" FOREIGN KEY ("createdByUserId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "locations" ADD CONSTRAINT "locations_updatedByUserId_fkey" FOREIGN KEY ("updatedByUserId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "shift_signups" ADD CONSTRAINT "shift_signups_shiftId_fkey" FOREIGN KEY ("shiftId") REFERENCES "shifts"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "shift_signups" ADD CONSTRAINT "shift_signups_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "cuts" ADD CONSTRAINT "cuts_createdByUserId_fkey" FOREIGN KEY ("createdByUserId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/api/prisma/migrations/20260210000000_add_nar_metadata_fields/migration.sql b/api/prisma/migrations/20260210000000_add_nar_metadata_fields/migration.sql deleted file mode 100644 index 4ea4553d..00000000 --- a/api/prisma/migrations/20260210000000_add_nar_metadata_fields/migration.sql +++ /dev/null @@ -1,5 +0,0 @@ --- AlterTable -ALTER TABLE "locations" ADD COLUMN "buildingUse" INTEGER, -ADD COLUMN "federalDistrict" TEXT, -ADD COLUMN "postalCode" TEXT, -ADD COLUMN "province" TEXT; diff --git a/api/prisma/migrations/20260210203200_add_editor_mode/migration.sql b/api/prisma/migrations/20260210203200_add_editor_mode/migration.sql deleted file mode 100644 index b3862ddf..00000000 --- a/api/prisma/migrations/20260210203200_add_editor_mode/migration.sql +++ /dev/null @@ -1,8 +0,0 @@ --- CreateEnum -CREATE TYPE "EditorMode" AS ENUM ('VISUAL', 'CODE'); - --- AlterEnum -ALTER TYPE "CampaignEmailStatus" ADD VALUE 'QUEUED'; - --- AlterTable -ALTER TABLE "landing_pages" ADD COLUMN "editorMode" "EditorMode" NOT NULL DEFAULT 'VISUAL'; diff --git a/api/prisma/migrations/20260210210744_add_mkdocs_integration_fields/migration.sql b/api/prisma/migrations/20260210210744_add_mkdocs_integration_fields/migration.sql deleted file mode 100644 index 0ef24da0..00000000 --- a/api/prisma/migrations/20260210210744_add_mkdocs_integration_fields/migration.sql +++ /dev/null @@ -1,8 +0,0 @@ --- CreateEnum -CREATE TYPE "MkdocsExportMode" AS ENUM ('THEMED', 'STANDALONE'); - --- AlterTable -ALTER TABLE "landing_pages" ADD COLUMN "mkdocsExportMode" "MkdocsExportMode" NOT NULL DEFAULT 'THEMED', -ADD COLUMN "mkdocsHideNav" BOOLEAN NOT NULL DEFAULT true, -ADD COLUMN "mkdocsHideToc" BOOLEAN NOT NULL DEFAULT true, -ADD COLUMN "mkdocsStubPath" TEXT; diff --git a/api/prisma/migrations/20260210215400_add_site_settings/migration.sql b/api/prisma/migrations/20260210215400_add_site_settings/migration.sql deleted file mode 100644 index cf1b5fd2..00000000 --- a/api/prisma/migrations/20260210215400_add_site_settings/migration.sql +++ /dev/null @@ -1,25 +0,0 @@ --- CreateTable -CREATE TABLE "site_settings" ( - "id" TEXT NOT NULL, - "organizationName" TEXT NOT NULL DEFAULT 'Changemaker Lite', - "organizationShortName" TEXT NOT NULL DEFAULT 'CML', - "organizationLogoUrl" TEXT, - "organizationFaviconUrl" TEXT, - "adminColorPrimary" TEXT NOT NULL DEFAULT '#9d4edd', - "adminColorBgBase" TEXT NOT NULL DEFAULT '#1a1025', - "publicColorPrimary" TEXT NOT NULL DEFAULT '#3498db', - "publicColorBgBase" TEXT NOT NULL DEFAULT '#0d1b2a', - "publicColorBgContainer" TEXT NOT NULL DEFAULT '#1b2838', - "publicHeaderGradient" TEXT NOT NULL DEFAULT 'linear-gradient(135deg, #005a9c 0%, #007acc 100%)', - "footerText" TEXT NOT NULL DEFAULT 'Powered by Changemaker Lite', - "loginSubtitle" TEXT NOT NULL DEFAULT 'Admin', - "emailFromName" TEXT NOT NULL DEFAULT 'Changemaker Lite', - "enableInfluence" BOOLEAN NOT NULL DEFAULT true, - "enableMap" BOOLEAN NOT NULL DEFAULT true, - "enableNewsletter" BOOLEAN NOT NULL DEFAULT true, - "enableLandingPages" BOOLEAN NOT NULL DEFAULT true, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "site_settings_pkey" PRIMARY KEY ("id") -); diff --git a/api/prisma/migrations/20260210230007_add_canvass_system/migration.sql b/api/prisma/migrations/20260210230007_add_canvass_system/migration.sql deleted file mode 100644 index baef2216..00000000 --- a/api/prisma/migrations/20260210230007_add_canvass_system/migration.sql +++ /dev/null @@ -1,92 +0,0 @@ --- CreateEnum -CREATE TYPE "VisitOutcome" AS ENUM ('NOT_HOME', 'REFUSED', 'MOVED', 'ALREADY_VOTED', 'SPOKE_WITH', 'LEFT_LITERATURE', 'COME_BACK_LATER'); - --- CreateEnum -CREATE TYPE "CanvassSessionStatus" AS ENUM ('ACTIVE', 'COMPLETED', 'ABANDONED'); - --- AlterTable -ALTER TABLE "shifts" ADD COLUMN "cutId" TEXT; - --- CreateTable -CREATE TABLE "canvass_sessions" ( - "id" TEXT NOT NULL, - "userId" TEXT NOT NULL, - "cutId" TEXT NOT NULL, - "shiftId" TEXT, - "status" "CanvassSessionStatus" NOT NULL DEFAULT 'ACTIVE', - "startedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "endedAt" TIMESTAMP(3), - "startLatitude" DECIMAL(10,8), - "startLongitude" DECIMAL(11,8), - - CONSTRAINT "canvass_sessions_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "canvass_visits" ( - "id" TEXT NOT NULL, - "locationId" TEXT NOT NULL, - "userId" TEXT NOT NULL, - "shiftId" TEXT, - "sessionId" TEXT, - "outcome" "VisitOutcome" NOT NULL, - "supportLevel" "SupportLevel", - "signRequested" BOOLEAN NOT NULL DEFAULT false, - "signSize" TEXT, - "notes" TEXT, - "durationSeconds" INTEGER, - "visitedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "canvass_visits_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE INDEX "canvass_sessions_userId_idx" ON "canvass_sessions"("userId"); - --- CreateIndex -CREATE INDEX "canvass_sessions_cutId_idx" ON "canvass_sessions"("cutId"); - --- CreateIndex -CREATE INDEX "canvass_sessions_shiftId_idx" ON "canvass_sessions"("shiftId"); - --- CreateIndex -CREATE INDEX "canvass_visits_locationId_idx" ON "canvass_visits"("locationId"); - --- CreateIndex -CREATE INDEX "canvass_visits_userId_idx" ON "canvass_visits"("userId"); - --- CreateIndex -CREATE INDEX "canvass_visits_shiftId_idx" ON "canvass_visits"("shiftId"); - --- CreateIndex -CREATE INDEX "canvass_visits_sessionId_idx" ON "canvass_visits"("sessionId"); - --- CreateIndex -CREATE INDEX "canvass_visits_visitedAt_idx" ON "canvass_visits"("visitedAt"); - --- CreateIndex -CREATE INDEX "shifts_cutId_idx" ON "shifts"("cutId"); - --- AddForeignKey -ALTER TABLE "shifts" ADD CONSTRAINT "shifts_cutId_fkey" FOREIGN KEY ("cutId") REFERENCES "cuts"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "canvass_sessions" ADD CONSTRAINT "canvass_sessions_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "canvass_sessions" ADD CONSTRAINT "canvass_sessions_cutId_fkey" FOREIGN KEY ("cutId") REFERENCES "cuts"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "canvass_sessions" ADD CONSTRAINT "canvass_sessions_shiftId_fkey" FOREIGN KEY ("shiftId") REFERENCES "shifts"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "canvass_visits" ADD CONSTRAINT "canvass_visits_locationId_fkey" FOREIGN KEY ("locationId") REFERENCES "locations"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "canvass_visits" ADD CONSTRAINT "canvass_visits_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "canvass_visits" ADD CONSTRAINT "canvass_visits_shiftId_fkey" FOREIGN KEY ("shiftId") REFERENCES "shifts"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "canvass_visits" ADD CONSTRAINT "canvass_visits_sessionId_fkey" FOREIGN KEY ("sessionId") REFERENCES "canvass_sessions"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/api/prisma/migrations/20260211002822_add_gps_tracking/migration.sql b/api/prisma/migrations/20260211002822_add_gps_tracking/migration.sql deleted file mode 100644 index 566ca49a..00000000 --- a/api/prisma/migrations/20260211002822_add_gps_tracking/migration.sql +++ /dev/null @@ -1,59 +0,0 @@ --- CreateEnum -CREATE TYPE "TrackPointEvent" AS ENUM ('LOCATION_ADDED', 'VISIT_RECORDED', 'SESSION_STARTED', 'SESSION_ENDED'); - --- CreateTable -CREATE TABLE "tracking_sessions" ( - "id" TEXT NOT NULL, - "userId" TEXT NOT NULL, - "canvassSessionId" TEXT, - "startedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "endedAt" TIMESTAMP(3), - "isActive" BOOLEAN NOT NULL DEFAULT true, - "totalPoints" INTEGER NOT NULL DEFAULT 0, - "totalDistanceM" DOUBLE PRECISION NOT NULL DEFAULT 0, - "lastLatitude" DECIMAL(10,8), - "lastLongitude" DECIMAL(11,8), - "lastRecordedAt" TIMESTAMP(3), - - CONSTRAINT "tracking_sessions_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "track_points" ( - "id" TEXT NOT NULL, - "trackingSessionId" TEXT NOT NULL, - "latitude" DECIMAL(10,8) NOT NULL, - "longitude" DECIMAL(11,8) NOT NULL, - "accuracy" DOUBLE PRECISION, - "recordedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "eventType" "TrackPointEvent", - - CONSTRAINT "track_points_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "tracking_sessions_canvassSessionId_key" ON "tracking_sessions"("canvassSessionId"); - --- CreateIndex -CREATE INDEX "tracking_sessions_userId_idx" ON "tracking_sessions"("userId"); - --- CreateIndex -CREATE INDEX "tracking_sessions_isActive_idx" ON "tracking_sessions"("isActive"); - --- CreateIndex -CREATE INDEX "tracking_sessions_isActive_lastRecordedAt_idx" ON "tracking_sessions"("isActive", "lastRecordedAt"); - --- CreateIndex -CREATE INDEX "track_points_trackingSessionId_recordedAt_idx" ON "track_points"("trackingSessionId", "recordedAt"); - --- CreateIndex -CREATE INDEX "track_points_recordedAt_idx" ON "track_points"("recordedAt"); - --- AddForeignKey -ALTER TABLE "tracking_sessions" ADD CONSTRAINT "tracking_sessions_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "tracking_sessions" ADD CONSTRAINT "tracking_sessions_canvassSessionId_fkey" FOREIGN KEY ("canvassSessionId") REFERENCES "canvass_sessions"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "track_points" ADD CONSTRAINT "track_points_trackingSessionId_fkey" FOREIGN KEY ("trackingSessionId") REFERENCES "tracking_sessions"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/api/prisma/migrations/20260211042600_add_smtp_settings/migration.sql b/api/prisma/migrations/20260211042600_add_smtp_settings/migration.sql deleted file mode 100644 index 777f408b..00000000 --- a/api/prisma/migrations/20260211042600_add_smtp_settings/migration.sql +++ /dev/null @@ -1,8 +0,0 @@ --- AlterTable -ALTER TABLE "site_settings" ADD COLUMN IF NOT EXISTS "smtpHost" TEXT NOT NULL DEFAULT '', -ADD COLUMN IF NOT EXISTS "smtpPort" INTEGER NOT NULL DEFAULT 0, -ADD COLUMN IF NOT EXISTS "smtpUser" TEXT NOT NULL DEFAULT '', -ADD COLUMN IF NOT EXISTS "smtpPass" TEXT NOT NULL DEFAULT '', -ADD COLUMN IF NOT EXISTS "smtpFromAddress" TEXT NOT NULL DEFAULT '', -ADD COLUMN IF NOT EXISTS "emailTestMode" BOOLEAN NOT NULL DEFAULT true, -ADD COLUMN IF NOT EXISTS "testEmailRecipient" TEXT NOT NULL DEFAULT ''; diff --git a/api/prisma/migrations/20260211120916_add_google_geocode_provider/migration.sql b/api/prisma/migrations/20260211120916_add_google_geocode_provider/migration.sql deleted file mode 100644 index 687dab24..00000000 --- a/api/prisma/migrations/20260211120916_add_google_geocode_provider/migration.sql +++ /dev/null @@ -1,4 +0,0 @@ --- AlterEnum: Add GOOGLE to GeocodeProvider enum --- This enables Google Maps API integration for Phase 2 geocoding improvements - -ALTER TYPE "GeocodeProvider" ADD VALUE IF NOT EXISTS 'GOOGLE' BEFORE 'MAPBOX'; diff --git a/api/prisma/migrations/20260218000000_add_shift_cancellation_notification/migration.sql b/api/prisma/migrations/20260218000000_add_shift_cancellation_notification/migration.sql deleted file mode 100644 index 58e852a4..00000000 --- a/api/prisma/migrations/20260218000000_add_shift_cancellation_notification/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "site_settings" ADD COLUMN IF NOT EXISTS "notifyAdminShiftCancellation" BOOLEAN NOT NULL DEFAULT true; diff --git a/api/prisma/migrations/20260218100000_add_gancio_event_id/migration.sql b/api/prisma/migrations/20260218100000_add_gancio_event_id/migration.sql deleted file mode 100644 index 6a8d7f2d..00000000 --- a/api/prisma/migrations/20260218100000_add_gancio_event_id/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "shifts" ADD COLUMN "gancioEventId" INTEGER; diff --git a/api/prisma/migrations/20260218200000_add_enable_events_setting/migration.sql b/api/prisma/migrations/20260218200000_add_enable_events_setting/migration.sql deleted file mode 100644 index 9fcd349a..00000000 --- a/api/prisma/migrations/20260218200000_add_enable_events_setting/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "site_settings" ADD COLUMN IF NOT EXISTS "enable_events" BOOLEAN NOT NULL DEFAULT false; diff --git a/api/prisma/migrations/20260218300000_add_quick_join_invite_created_via/migration.sql b/api/prisma/migrations/20260218300000_add_quick_join_invite_created_via/migration.sql deleted file mode 100644 index 883f9e65..00000000 --- a/api/prisma/migrations/20260218300000_add_quick_join_invite_created_via/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterEnum -ALTER TYPE "UserCreatedVia" ADD VALUE IF NOT EXISTS 'QUICK_JOIN_INVITE'; diff --git a/api/prisma/migrations/20260224185504_add_ad_placements/migration.sql b/api/prisma/migrations/20260224185504_add_ad_placements/migration.sql deleted file mode 100644 index fdd9e1ca..00000000 --- a/api/prisma/migrations/20260224185504_add_ad_placements/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "ads" ADD COLUMN "placements" JSONB DEFAULT '[]'; diff --git a/api/prisma/migrations/20260224185906_add_volunteer_engagement_sms_crm_linking/migration.sql b/api/prisma/migrations/20260224185906_add_volunteer_engagement_sms_crm_linking/migration.sql deleted file mode 100644 index 05ae5666..00000000 --- a/api/prisma/migrations/20260224185906_add_volunteer_engagement_sms_crm_linking/migration.sql +++ /dev/null @@ -1,14 +0,0 @@ --- AlterTable -ALTER TABLE "site_settings" ADD COLUMN "notifyVolunteerShiftThankYou" BOOLEAN NOT NULL DEFAULT true, -ADD COLUMN "notify_volunteer_reengagement" BOOLEAN NOT NULL DEFAULT false, -ADD COLUMN "reengagement_cooldown_days" INTEGER NOT NULL DEFAULT 30, -ADD COLUMN "reengagement_inactive_days" INTEGER NOT NULL DEFAULT 30; - --- AlterTable -ALTER TABLE "sms_conversations" ADD COLUMN "contactId" TEXT; - --- CreateIndex -CREATE INDEX "sms_conversations_contactId_idx" ON "sms_conversations"("contactId"); - --- AddForeignKey -ALTER TABLE "sms_conversations" ADD CONSTRAINT "sms_conversations_contactId_fkey" FOREIGN KEY ("contactId") REFERENCES "contacts"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/api/prisma/migrations/20260224190210_add_landing_page_listed_and_homepage_tagline/migration.sql b/api/prisma/migrations/20260224190210_add_landing_page_listed_and_homepage_tagline/migration.sql deleted file mode 100644 index fea62682..00000000 --- a/api/prisma/migrations/20260224190210_add_landing_page_listed_and_homepage_tagline/migration.sql +++ /dev/null @@ -1,5 +0,0 @@ --- AlterTable -ALTER TABLE "landing_pages" ADD COLUMN "listed" BOOLEAN NOT NULL DEFAULT false; - --- AlterTable -ALTER TABLE "site_settings" ADD COLUMN "homepage_tagline" TEXT; diff --git a/api/prisma/migrations/20260224215259_add_enable_social/migration.sql b/api/prisma/migrations/20260224215259_add_enable_social/migration.sql deleted file mode 100644 index 65995861..00000000 --- a/api/prisma/migrations/20260224215259_add_enable_social/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "site_settings" ADD COLUMN "enable_social" BOOLEAN NOT NULL DEFAULT false; diff --git a/api/prisma/migrations/20260224232546_add_digest_frequency/migration.sql b/api/prisma/migrations/20260224232546_add_digest_frequency/migration.sql deleted file mode 100644 index 8fe04db0..00000000 --- a/api/prisma/migrations/20260224232546_add_digest_frequency/migration.sql +++ /dev/null @@ -1,3 +0,0 @@ --- AlterTable -ALTER TABLE "notification_preferences" ADD COLUMN "digest_frequency" TEXT NOT NULL DEFAULT 'none', -ADD COLUMN "last_digest_sent_at" TIMESTAMP(3); diff --git a/api/prisma/migrations/20260225000017_add_social_groups/migration.sql b/api/prisma/migrations/20260225000017_add_social_groups/migration.sql deleted file mode 100644 index 99c120e3..00000000 --- a/api/prisma/migrations/20260225000017_add_social_groups/migration.sql +++ /dev/null @@ -1,38 +0,0 @@ --- CreateEnum -CREATE TYPE "SocialGroupType" AS ENUM ('SHIFT_TEAM', 'CAMPAIGN_TEAM', 'CUSTOM'); - --- CreateTable -CREATE TABLE "social_groups" ( - "id" TEXT NOT NULL, - "name" TEXT NOT NULL, - "type" "SocialGroupType" NOT NULL, - "reference_id" TEXT, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "social_groups_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "social_group_members" ( - "id" TEXT NOT NULL, - "group_id" TEXT NOT NULL, - "user_id" TEXT NOT NULL, - "joined_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "social_group_members_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "idx_social_groups_type_ref" ON "social_groups"("type", "reference_id"); - --- CreateIndex -CREATE INDEX "idx_social_group_members_user" ON "social_group_members"("user_id"); - --- CreateIndex -CREATE UNIQUE INDEX "idx_social_group_members_unique" ON "social_group_members"("group_id", "user_id"); - --- AddForeignKey -ALTER TABLE "social_group_members" ADD CONSTRAINT "social_group_members_group_id_fkey" FOREIGN KEY ("group_id") REFERENCES "social_groups"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "social_group_members" ADD CONSTRAINT "social_group_members_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/api/prisma/migrations/20260225010931_add_enable_meet/migration.sql b/api/prisma/migrations/20260225010931_add_enable_meet/migration.sql deleted file mode 100644 index e57e4c0c..00000000 --- a/api/prisma/migrations/20260225010931_add_enable_meet/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "site_settings" ADD COLUMN "enable_meet" BOOLEAN NOT NULL DEFAULT false; diff --git a/api/prisma/migrations/20260225202515_add_meetings_model/migration.sql b/api/prisma/migrations/20260225202515_add_meetings_model/migration.sql deleted file mode 100644 index 14aeddfd..00000000 --- a/api/prisma/migrations/20260225202515_add_meetings_model/migration.sql +++ /dev/null @@ -1,25 +0,0 @@ --- CreateTable -CREATE TABLE "meetings" ( - "id" TEXT NOT NULL, - "slug" TEXT NOT NULL, - "title" TEXT NOT NULL, - "description" TEXT, - "jitsi_room" TEXT NOT NULL, - "is_active" BOOLEAN NOT NULL DEFAULT true, - "created_by_user_id" TEXT NOT NULL, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - "start_time" TIMESTAMP(3), - "end_time" TIMESTAMP(3), - - CONSTRAINT "meetings_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "meetings_slug_key" ON "meetings"("slug"); - --- CreateIndex -CREATE UNIQUE INDEX "meetings_jitsi_room_key" ON "meetings"("jitsi_room"); - --- AddForeignKey -ALTER TABLE "meetings" ADD CONSTRAINT "meetings_created_by_user_id_fkey" FOREIGN KEY ("created_by_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/api/prisma/migrations/20260225220000_add_shift_group_meeting_relations/migration.sql b/api/prisma/migrations/20260225220000_add_shift_group_meeting_relations/migration.sql deleted file mode 100644 index a8791372..00000000 --- a/api/prisma/migrations/20260225220000_add_shift_group_meeting_relations/migration.sql +++ /dev/null @@ -1,20 +0,0 @@ --- AlterEnum -ALTER TYPE "NotificationType" ADD VALUE 'group_call'; - --- AlterTable -ALTER TABLE "shifts" ADD COLUMN "meetingId" TEXT; - --- AlterTable -ALTER TABLE "social_groups" ADD COLUMN "meeting_id" TEXT; - --- CreateIndex -CREATE UNIQUE INDEX "shifts_meetingId_key" ON "shifts"("meetingId"); - --- CreateIndex -CREATE UNIQUE INDEX "social_groups_meeting_id_key" ON "social_groups"("meeting_id"); - --- AddForeignKey -ALTER TABLE "shifts" ADD CONSTRAINT "shifts_meetingId_fkey" FOREIGN KEY ("meetingId") REFERENCES "meetings"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "social_groups" ADD CONSTRAINT "social_groups_meeting_id_fkey" FOREIGN KEY ("meeting_id") REFERENCES "meetings"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/api/prisma/migrations/20260227185928_add_sms_notification_settings/migration.sql b/api/prisma/migrations/20260227185928_add_sms_notification_settings/migration.sql deleted file mode 100644 index 79d11fce..00000000 --- a/api/prisma/migrations/20260227185928_add_sms_notification_settings/migration.sql +++ /dev/null @@ -1,5 +0,0 @@ --- AlterTable -ALTER TABLE "site_settings" ADD COLUMN "sms_shift_reminder_hours" INTEGER NOT NULL DEFAULT 24, -ADD COLUMN "sms_shift_reminders" BOOLEAN NOT NULL DEFAULT false, -ADD COLUMN "sms_shift_signup_confirm" BOOLEAN NOT NULL DEFAULT false, -ADD COLUMN "sms_volunteer_welcome" BOOLEAN NOT NULL DEFAULT false; diff --git a/api/prisma/migrations/20260301173914_add_meeting_planner/migration.sql b/api/prisma/migrations/20260301173914_add_meeting_planner/migration.sql deleted file mode 100644 index 55c27173..00000000 --- a/api/prisma/migrations/20260301173914_add_meeting_planner/migration.sql +++ /dev/null @@ -1,127 +0,0 @@ --- CreateEnum -CREATE TYPE "SchedulingPollStatus" AS ENUM ('OPEN', 'CLOSED', 'FINALIZED', 'CANCELLED'); - --- CreateEnum -CREATE TYPE "PollVoteValue" AS ENUM ('YES', 'IF_NEED_BE', 'NO'); - --- AlterTable -ALTER TABLE "site_settings" ADD COLUMN "enable_meeting_planner" BOOLEAN NOT NULL DEFAULT false; - --- CreateTable -CREATE TABLE "scheduling_polls" ( - "id" TEXT NOT NULL, - "slug" TEXT NOT NULL, - "title" TEXT NOT NULL, - "description" TEXT, - "location" TEXT, - "status" "SchedulingPollStatus" NOT NULL DEFAULT 'OPEN', - "timezone" TEXT NOT NULL DEFAULT 'America/Edmonton', - "finalized_option_id" TEXT, - "converted_shift_id" TEXT, - "converted_gancio_event_id" INTEGER, - "voting_deadline" TIMESTAMP(3), - "allow_anonymous" BOOLEAN NOT NULL DEFAULT true, - "notify_on_vote" BOOLEAN NOT NULL DEFAULT true, - "created_by_user_id" TEXT NOT NULL, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "scheduling_polls_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "scheduling_poll_options" ( - "id" TEXT NOT NULL, - "poll_id" TEXT NOT NULL, - "date" DATE NOT NULL, - "start_time" TEXT NOT NULL, - "end_time" TEXT NOT NULL, - "sort_order" INTEGER NOT NULL DEFAULT 0, - - CONSTRAINT "scheduling_poll_options_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "scheduling_poll_votes" ( - "id" TEXT NOT NULL, - "poll_id" TEXT NOT NULL, - "option_id" TEXT NOT NULL, - "user_id" TEXT, - "voter_name" TEXT NOT NULL, - "voter_email" TEXT, - "voter_token" TEXT, - "value" "PollVoteValue" NOT NULL, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "scheduling_poll_votes_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "scheduling_poll_comments" ( - "id" TEXT NOT NULL, - "poll_id" TEXT NOT NULL, - "user_id" TEXT, - "author_name" TEXT NOT NULL, - "content" TEXT NOT NULL, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "scheduling_poll_comments_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "scheduling_polls_slug_key" ON "scheduling_polls"("slug"); - --- CreateIndex -CREATE UNIQUE INDEX "scheduling_polls_finalized_option_id_key" ON "scheduling_polls"("finalized_option_id"); - --- CreateIndex -CREATE UNIQUE INDEX "scheduling_polls_converted_shift_id_key" ON "scheduling_polls"("converted_shift_id"); - --- CreateIndex -CREATE INDEX "scheduling_polls_created_by_user_id_idx" ON "scheduling_polls"("created_by_user_id"); - --- CreateIndex -CREATE INDEX "scheduling_polls_status_idx" ON "scheduling_polls"("status"); - --- CreateIndex -CREATE INDEX "scheduling_poll_options_poll_id_idx" ON "scheduling_poll_options"("poll_id"); - --- CreateIndex -CREATE INDEX "scheduling_poll_votes_poll_id_idx" ON "scheduling_poll_votes"("poll_id"); - --- CreateIndex -CREATE UNIQUE INDEX "scheduling_poll_votes_option_id_user_id_key" ON "scheduling_poll_votes"("option_id", "user_id"); - --- CreateIndex -CREATE UNIQUE INDEX "scheduling_poll_votes_option_id_voter_token_key" ON "scheduling_poll_votes"("option_id", "voter_token"); - --- CreateIndex -CREATE INDEX "scheduling_poll_comments_poll_id_idx" ON "scheduling_poll_comments"("poll_id"); - --- AddForeignKey -ALTER TABLE "scheduling_polls" ADD CONSTRAINT "scheduling_polls_finalized_option_id_fkey" FOREIGN KEY ("finalized_option_id") REFERENCES "scheduling_poll_options"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "scheduling_polls" ADD CONSTRAINT "scheduling_polls_converted_shift_id_fkey" FOREIGN KEY ("converted_shift_id") REFERENCES "shifts"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "scheduling_polls" ADD CONSTRAINT "scheduling_polls_created_by_user_id_fkey" FOREIGN KEY ("created_by_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "scheduling_poll_options" ADD CONSTRAINT "scheduling_poll_options_poll_id_fkey" FOREIGN KEY ("poll_id") REFERENCES "scheduling_polls"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "scheduling_poll_votes" ADD CONSTRAINT "scheduling_poll_votes_poll_id_fkey" FOREIGN KEY ("poll_id") REFERENCES "scheduling_polls"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "scheduling_poll_votes" ADD CONSTRAINT "scheduling_poll_votes_option_id_fkey" FOREIGN KEY ("option_id") REFERENCES "scheduling_poll_options"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "scheduling_poll_votes" ADD CONSTRAINT "scheduling_poll_votes_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "scheduling_poll_comments" ADD CONSTRAINT "scheduling_poll_comments_poll_id_fkey" FOREIGN KEY ("poll_id") REFERENCES "scheduling_polls"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "scheduling_poll_comments" ADD CONSTRAINT "scheduling_poll_comments_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/api/prisma/migrations/20260304045540_social_stories_spotlight_referrals_challenges/migration.sql b/api/prisma/migrations/20260304045540_social_stories_spotlight_referrals_challenges/migration.sql deleted file mode 100644 index 461ccf4d..00000000 --- a/api/prisma/migrations/20260304045540_social_stories_spotlight_referrals_challenges/migration.sql +++ /dev/null @@ -1,249 +0,0 @@ --- CreateEnum -CREATE TYPE "ImpactStoryType" AS ENUM ('MILESTONE', 'VICTORY', 'RESPONSE', 'CUSTOM'); - --- CreateEnum -CREATE TYPE "ImpactStoryStatus" AS ENUM ('DRAFT', 'PUBLISHED', 'ARCHIVED'); - --- CreateEnum -CREATE TYPE "SpotlightStatus" AS ENUM ('NOMINATED', 'APPROVED', 'FEATURED', 'ARCHIVED'); - --- CreateEnum -CREATE TYPE "ChallengeStatus" AS ENUM ('DRAFT', 'UPCOMING', 'ACTIVE', 'COMPLETED', 'CANCELLED'); - --- CreateEnum -CREATE TYPE "ChallengeMetric" AS ENUM ('DOORS_KNOCKED', 'EMAILS_SENT', 'SHIFTS_ATTENDED', 'RESPONSES_SUBMITTED', 'REFERRALS_MADE'); - --- AlterEnum --- This migration adds more than one value to an enum. --- With PostgreSQL versions 11 and earlier, this is not possible --- in a single migration. This can be worked around by creating --- multiple migrations, each migration adding only one value to --- the enum. - - -ALTER TYPE "NotificationType" ADD VALUE 'impact_story'; -ALTER TYPE "NotificationType" ADD VALUE 'referral_completed'; -ALTER TYPE "NotificationType" ADD VALUE 'challenge_update'; - --- AlterTable -ALTER TABLE "privacy_settings" ADD COLUMN "show_on_leaderboard" BOOLEAN DEFAULT true; - --- CreateTable -CREATE TABLE "invite_codes" ( - "id" TEXT NOT NULL, - "code" TEXT NOT NULL, - "created_by_user_id" TEXT NOT NULL, - "max_uses" INTEGER NOT NULL DEFAULT 0, - "used_count" INTEGER NOT NULL DEFAULT 0, - "expires_at" TIMESTAMP(3), - "is_active" BOOLEAN NOT NULL DEFAULT true, - "note" TEXT, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "invite_codes_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "referrals" ( - "id" SERIAL NOT NULL, - "referrer_id" TEXT NOT NULL, - "referred_user_id" TEXT NOT NULL, - "invite_code_id" TEXT, - "referral_source" TEXT, - "completed_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "referrals_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "impact_stories" ( - "id" TEXT NOT NULL, - "campaign_id" TEXT NOT NULL, - "type" "ImpactStoryType" NOT NULL, - "status" "ImpactStoryStatus" NOT NULL DEFAULT 'DRAFT', - "title" TEXT NOT NULL, - "body" TEXT NOT NULL, - "cover_image_url" TEXT, - "milestone_value" INTEGER, - "milestone_metric" TEXT, - "created_by_user_id" TEXT, - "published_at" TIMESTAMP(3), - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "impact_stories_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "campaign_milestones" ( - "id" SERIAL NOT NULL, - "campaign_id" TEXT NOT NULL, - "metric" TEXT NOT NULL, - "threshold" INTEGER NOT NULL, - "reached_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "story_generated" BOOLEAN NOT NULL DEFAULT false, - - CONSTRAINT "campaign_milestones_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "volunteer_spotlights" ( - "id" TEXT NOT NULL, - "user_id" TEXT NOT NULL, - "status" "SpotlightStatus" NOT NULL DEFAULT 'NOMINATED', - "headline" TEXT, - "story" TEXT, - "featured_month" TEXT, - "nominated_by_user_id" TEXT, - "approved_by_user_id" TEXT, - "approved_at" TIMESTAMP(3), - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "volunteer_spotlights_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "challenges" ( - "id" TEXT NOT NULL, - "title" TEXT NOT NULL, - "description" TEXT, - "metric" "ChallengeMetric" NOT NULL, - "status" "ChallengeStatus" NOT NULL DEFAULT 'DRAFT', - "starts_at" TIMESTAMP(3) NOT NULL, - "ends_at" TIMESTAMP(3) NOT NULL, - "min_team_size" INTEGER NOT NULL DEFAULT 2, - "max_team_size" INTEGER NOT NULL DEFAULT 10, - "max_teams" INTEGER, - "created_by_user_id" TEXT NOT NULL, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "challenges_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "challenge_teams" ( - "id" TEXT NOT NULL, - "challenge_id" TEXT NOT NULL, - "name" TEXT NOT NULL, - "captain_user_id" TEXT NOT NULL, - "score" INTEGER NOT NULL DEFAULT 0, - "last_scored_at" TIMESTAMP(3), - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "challenge_teams_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "challenge_team_members" ( - "id" SERIAL NOT NULL, - "team_id" TEXT NOT NULL, - "user_id" TEXT NOT NULL, - "score" INTEGER NOT NULL DEFAULT 0, - "joined_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "challenge_team_members_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "invite_codes_code_key" ON "invite_codes"("code"); - --- CreateIndex -CREATE INDEX "idx_invite_codes_code" ON "invite_codes"("code"); - --- CreateIndex -CREATE INDEX "idx_invite_codes_created_by" ON "invite_codes"("created_by_user_id"); - --- CreateIndex -CREATE UNIQUE INDEX "referrals_referred_user_id_key" ON "referrals"("referred_user_id"); - --- CreateIndex -CREATE INDEX "idx_referrals_referrer" ON "referrals"("referrer_id"); - --- CreateIndex -CREATE INDEX "idx_impact_stories_campaign" ON "impact_stories"("campaign_id"); - --- CreateIndex -CREATE INDEX "idx_impact_stories_status" ON "impact_stories"("status"); - --- CreateIndex -CREATE INDEX "idx_impact_stories_type" ON "impact_stories"("type"); - --- CreateIndex -CREATE UNIQUE INDEX "campaign_milestones_campaign_id_metric_threshold_key" ON "campaign_milestones"("campaign_id", "metric", "threshold"); - --- CreateIndex -CREATE INDEX "idx_volunteer_spotlights_user" ON "volunteer_spotlights"("user_id"); - --- CreateIndex -CREATE INDEX "idx_volunteer_spotlights_status" ON "volunteer_spotlights"("status"); - --- CreateIndex -CREATE INDEX "idx_volunteer_spotlights_month" ON "volunteer_spotlights"("featured_month"); - --- CreateIndex -CREATE INDEX "idx_challenges_status" ON "challenges"("status"); - --- CreateIndex -CREATE INDEX "idx_challenges_starts_at" ON "challenges"("starts_at"); - --- CreateIndex -CREATE INDEX "idx_challenge_teams_challenge" ON "challenge_teams"("challenge_id"); - --- CreateIndex -CREATE INDEX "idx_challenge_teams_score" ON "challenge_teams"("score"); - --- CreateIndex -CREATE UNIQUE INDEX "challenge_teams_challenge_id_name_key" ON "challenge_teams"("challenge_id", "name"); - --- CreateIndex -CREATE INDEX "idx_challenge_team_members_user" ON "challenge_team_members"("user_id"); - --- CreateIndex -CREATE UNIQUE INDEX "challenge_team_members_team_id_user_id_key" ON "challenge_team_members"("team_id", "user_id"); - --- AddForeignKey -ALTER TABLE "invite_codes" ADD CONSTRAINT "invite_codes_created_by_user_id_fkey" FOREIGN KEY ("created_by_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "referrals" ADD CONSTRAINT "referrals_referrer_id_fkey" FOREIGN KEY ("referrer_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "referrals" ADD CONSTRAINT "referrals_referred_user_id_fkey" FOREIGN KEY ("referred_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "referrals" ADD CONSTRAINT "referrals_invite_code_id_fkey" FOREIGN KEY ("invite_code_id") REFERENCES "invite_codes"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "impact_stories" ADD CONSTRAINT "impact_stories_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "campaigns"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "impact_stories" ADD CONSTRAINT "impact_stories_created_by_user_id_fkey" FOREIGN KEY ("created_by_user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "campaign_milestones" ADD CONSTRAINT "campaign_milestones_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "campaigns"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "volunteer_spotlights" ADD CONSTRAINT "volunteer_spotlights_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "volunteer_spotlights" ADD CONSTRAINT "volunteer_spotlights_nominated_by_user_id_fkey" FOREIGN KEY ("nominated_by_user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "volunteer_spotlights" ADD CONSTRAINT "volunteer_spotlights_approved_by_user_id_fkey" FOREIGN KEY ("approved_by_user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "challenges" ADD CONSTRAINT "challenges_created_by_user_id_fkey" FOREIGN KEY ("created_by_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "challenge_teams" ADD CONSTRAINT "challenge_teams_challenge_id_fkey" FOREIGN KEY ("challenge_id") REFERENCES "challenges"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "challenge_teams" ADD CONSTRAINT "challenge_teams_captain_user_id_fkey" FOREIGN KEY ("captain_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "challenge_team_members" ADD CONSTRAINT "challenge_team_members_team_id_fkey" FOREIGN KEY ("team_id") REFERENCES "challenge_teams"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "challenge_team_members" ADD CONSTRAINT "challenge_team_members_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/api/prisma/migrations/20260305165051_ticketed_events/migration.sql b/api/prisma/migrations/20260305165051_ticketed_events/migration.sql deleted file mode 100644 index 89ee2e10..00000000 --- a/api/prisma/migrations/20260305165051_ticketed_events/migration.sql +++ /dev/null @@ -1,176 +0,0 @@ --- CreateEnum -CREATE TYPE "TicketedEventStatus" AS ENUM ('DRAFT', 'PENDING_APPROVAL', 'PUBLISHED', 'CANCELLED', 'COMPLETED'); - --- CreateEnum -CREATE TYPE "TicketedEventVisibility" AS ENUM ('PUBLIC', 'UNLISTED', 'PRIVATE'); - --- CreateEnum -CREATE TYPE "TicketTierType" AS ENUM ('PAID', 'FREE', 'DONATION'); - --- CreateEnum -CREATE TYPE "TicketStatus" AS ENUM ('VALID', 'CHECKED_IN', 'CANCELLED', 'REFUNDED'); - --- AlterTable -ALTER TABLE "site_settings" ADD COLUMN "enable_ticketed_events" BOOLEAN NOT NULL DEFAULT false, -ADD COLUMN "require_event_approval" BOOLEAN NOT NULL DEFAULT true; - --- CreateTable -CREATE TABLE "ticketed_events" ( - "id" TEXT NOT NULL, - "slug" TEXT NOT NULL, - "title" TEXT NOT NULL, - "description" TEXT, - "rich_description" TEXT, - "date" DATE NOT NULL, - "start_time" TEXT NOT NULL, - "end_time" TEXT NOT NULL, - "doors_open_time" TEXT, - "venue_name" TEXT, - "venue_address" TEXT, - "latitude" DECIMAL(10,7), - "longitude" DECIMAL(10,7), - "status" "TicketedEventStatus" NOT NULL DEFAULT 'DRAFT', - "visibility" "TicketedEventVisibility" NOT NULL DEFAULT 'PUBLIC', - "invite_code" TEXT, - "cover_image_url" TEXT, - "max_attendees" INTEGER, - "current_attendees" INTEGER NOT NULL DEFAULT 0, - "gancio_event_id" INTEGER, - "created_by_user_id" TEXT NOT NULL, - "organizer_name" TEXT, - "organizer_email" TEXT, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "ticketed_events_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "ticket_tiers" ( - "id" TEXT NOT NULL, - "event_id" TEXT NOT NULL, - "name" TEXT NOT NULL, - "description" TEXT, - "tier_type" "TicketTierType" NOT NULL, - "price_cad" INTEGER NOT NULL DEFAULT 0, - "min_donation_cad" INTEGER, - "max_quantity" INTEGER, - "sold_count" INTEGER NOT NULL DEFAULT 0, - "max_per_order" INTEGER NOT NULL DEFAULT 10, - "sales_start_at" TIMESTAMP(3), - "sales_end_at" TIMESTAMP(3), - "sort_order" INTEGER NOT NULL DEFAULT 0, - "is_active" BOOLEAN NOT NULL DEFAULT true, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "ticket_tiers_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "tickets" ( - "id" TEXT NOT NULL, - "ticket_code" TEXT NOT NULL, - "token_hash" TEXT NOT NULL, - "event_id" TEXT NOT NULL, - "tier_id" TEXT NOT NULL, - "order_id" TEXT, - "holder_email" TEXT NOT NULL, - "holder_name" TEXT, - "user_id" TEXT, - "status" "TicketStatus" NOT NULL DEFAULT 'VALID', - "checked_in_at" TIMESTAMP(3), - "checked_in_by_user_id" TEXT, - "issued_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "tickets_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "check_ins" ( - "id" TEXT NOT NULL, - "ticket_id" TEXT NOT NULL, - "event_id" TEXT NOT NULL, - "checked_in_by_user_id" TEXT, - "method" TEXT NOT NULL, - "checked_in_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "notes" TEXT, - - CONSTRAINT "check_ins_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "ticketed_events_slug_key" ON "ticketed_events"("slug"); - --- CreateIndex -CREATE UNIQUE INDEX "ticketed_events_invite_code_key" ON "ticketed_events"("invite_code"); - --- CreateIndex -CREATE INDEX "idx_ticketed_events_status" ON "ticketed_events"("status"); - --- CreateIndex -CREATE INDEX "idx_ticketed_events_date" ON "ticketed_events"("date"); - --- CreateIndex -CREATE INDEX "idx_ticketed_events_visibility" ON "ticketed_events"("visibility"); - --- CreateIndex -CREATE INDEX "idx_ticketed_events_creator" ON "ticketed_events"("created_by_user_id"); - --- CreateIndex -CREATE INDEX "idx_ticket_tiers_event" ON "ticket_tiers"("event_id"); - --- CreateIndex -CREATE UNIQUE INDEX "tickets_ticket_code_key" ON "tickets"("ticket_code"); - --- CreateIndex -CREATE UNIQUE INDEX "tickets_token_hash_key" ON "tickets"("token_hash"); - --- CreateIndex -CREATE INDEX "idx_tickets_event" ON "tickets"("event_id"); - --- CreateIndex -CREATE INDEX "idx_tickets_tier" ON "tickets"("tier_id"); - --- CreateIndex -CREATE INDEX "idx_tickets_order" ON "tickets"("order_id"); - --- CreateIndex -CREATE INDEX "idx_tickets_holder_email" ON "tickets"("holder_email"); - --- CreateIndex -CREATE INDEX "idx_tickets_status" ON "tickets"("status"); - --- CreateIndex -CREATE INDEX "idx_checkins_event" ON "check_ins"("event_id"); - --- CreateIndex -CREATE INDEX "idx_checkins_ticket" ON "check_ins"("ticket_id"); - --- AddForeignKey -ALTER TABLE "ticketed_events" ADD CONSTRAINT "ticketed_events_created_by_user_id_fkey" FOREIGN KEY ("created_by_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "ticket_tiers" ADD CONSTRAINT "ticket_tiers_event_id_fkey" FOREIGN KEY ("event_id") REFERENCES "ticketed_events"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "tickets" ADD CONSTRAINT "tickets_event_id_fkey" FOREIGN KEY ("event_id") REFERENCES "ticketed_events"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "tickets" ADD CONSTRAINT "tickets_tier_id_fkey" FOREIGN KEY ("tier_id") REFERENCES "ticket_tiers"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "tickets" ADD CONSTRAINT "tickets_order_id_fkey" FOREIGN KEY ("order_id") REFERENCES "orders"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "tickets" ADD CONSTRAINT "tickets_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "check_ins" ADD CONSTRAINT "check_ins_ticket_id_fkey" FOREIGN KEY ("ticket_id") REFERENCES "tickets"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "check_ins" ADD CONSTRAINT "check_ins_event_id_fkey" FOREIGN KEY ("event_id") REFERENCES "ticketed_events"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "check_ins" ADD CONSTRAINT "check_ins_checked_in_by_user_id_fkey" FOREIGN KEY ("checked_in_by_user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/api/prisma/migrations/20260305170000_add_event_format_meeting_link/migration.sql b/api/prisma/migrations/20260305170000_add_event_format_meeting_link/migration.sql deleted file mode 100644 index 13b3f5c2..00000000 --- a/api/prisma/migrations/20260305170000_add_event_format_meeting_link/migration.sql +++ /dev/null @@ -1,12 +0,0 @@ --- CreateEnum -CREATE TYPE "EventFormat" AS ENUM ('IN_PERSON', 'ONLINE', 'HYBRID'); - --- AlterTable -ALTER TABLE "ticketed_events" ADD COLUMN "event_format" "EventFormat" NOT NULL DEFAULT 'IN_PERSON', -ADD COLUMN "meeting_id" TEXT; - --- CreateIndex -CREATE UNIQUE INDEX "ticketed_events_meeting_id_key" ON "ticketed_events"("meeting_id"); - --- AddForeignKey -ALTER TABLE "ticketed_events" ADD CONSTRAINT "ticketed_events_meeting_id_fkey" FOREIGN KEY ("meeting_id") REFERENCES "meetings"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/api/prisma/migrations/20260306203326_social_calendar_layers_items/migration.sql b/api/prisma/migrations/20260306203326_social_calendar_layers_items/migration.sql deleted file mode 100644 index 08ab2211..00000000 --- a/api/prisma/migrations/20260306203326_social_calendar_layers_items/migration.sql +++ /dev/null @@ -1,258 +0,0 @@ --- CreateEnum -CREATE TYPE "CalendarLayerType" AS ENUM ('SYSTEM', 'USER', 'EXTERNAL'); - --- CreateEnum -CREATE TYPE "CalendarSystemType" AS ENUM ('SHIFTS', 'TICKETS', 'POLLS', 'PUBLIC_EVENTS'); - --- CreateEnum -CREATE TYPE "CalendarVisibility" AS ENUM ('PRIVATE', 'FRIENDS', 'PUBLIC'); - --- CreateEnum -CREATE TYPE "CalendarItemType" AS ENUM ('EVENT', 'TIME_BLOCK', 'REMINDER'); - --- CreateEnum -CREATE TYPE "CalendarBusyStatus" AS ENUM ('BUSY', 'TENTATIVE', 'FREE'); - --- CreateEnum -CREATE TYPE "CalendarShowDetailsTo" AS ENUM ('NOBODY', 'FRIENDS', 'EVERYONE'); - --- CreateEnum -CREATE TYPE "CalendarItemSource" AS ENUM ('MANUAL', 'ICS_FEED'); - --- CreateEnum -CREATE TYPE "CalendarRecurrenceFrequency" AS ENUM ('DAILY', 'WEEKLY', 'BIWEEKLY', 'MONTHLY'); - --- CreateEnum -CREATE TYPE "CalendarFeedStatus" AS ENUM ('OK', 'ERROR', 'PENDING'); - --- CreateEnum -CREATE TYPE "CalendarFeedInterval" AS ENUM ('FIFTEEN_MIN', 'HOURLY', 'SIX_HOUR', 'DAILY'); - --- CreateEnum -CREATE TYPE "SharedViewType" AS ENUM ('MANUAL', 'ROLE_BASED'); - --- CreateEnum -CREATE TYPE "SharedViewScope" AS ENUM ('MEMBERS', 'PUBLIC'); - --- CreateEnum -CREATE TYPE "SharedViewMemberStatus" AS ENUM ('INVITED', 'ACCEPTED', 'DECLINED'); - --- AlterTable -ALTER TABLE "site_settings" ADD COLUMN "enable_social_calendar" BOOLEAN NOT NULL DEFAULT false; - --- CreateTable -CREATE TABLE "calendar_layers" ( - "id" TEXT NOT NULL, - "user_id" TEXT NOT NULL, - "name" TEXT NOT NULL, - "layer_type" "CalendarLayerType" NOT NULL, - "system_type" "CalendarSystemType", - "color" TEXT NOT NULL DEFAULT '#1890ff', - "visibility" "CalendarVisibility" NOT NULL DEFAULT 'PRIVATE', - "is_enabled" BOOLEAN NOT NULL DEFAULT true, - "sort_order" INTEGER NOT NULL DEFAULT 0, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "calendar_layers_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "calendar_items" ( - "id" TEXT NOT NULL, - "user_id" TEXT NOT NULL, - "layer_id" TEXT NOT NULL, - "title" TEXT NOT NULL, - "description" TEXT, - "date" DATE NOT NULL, - "start_time" TEXT NOT NULL, - "end_time" TEXT NOT NULL, - "is_all_day" BOOLEAN NOT NULL DEFAULT false, - "item_type" "CalendarItemType" NOT NULL DEFAULT 'EVENT', - "location" TEXT, - "color" TEXT, - "visibility" "CalendarVisibility", - "busy_status" "CalendarBusyStatus" NOT NULL DEFAULT 'BUSY', - "show_details_to" "CalendarShowDetailsTo" NOT NULL DEFAULT 'FRIENDS', - "recurrence_rule" JSONB, - "recurrence_end" TIMESTAMP(3), - "series_id" TEXT, - "is_exception" BOOLEAN NOT NULL DEFAULT false, - "source_type" "CalendarItemSource" NOT NULL DEFAULT 'MANUAL', - "source_id" TEXT, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "calendar_items_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "calendar_feeds" ( - "id" TEXT NOT NULL, - "user_id" TEXT NOT NULL, - "name" TEXT NOT NULL, - "url" TEXT NOT NULL, - "layer_id" TEXT NOT NULL, - "refresh_interval" "CalendarFeedInterval" NOT NULL DEFAULT 'HOURLY', - "last_fetched_at" TIMESTAMP(3), - "last_status" "CalendarFeedStatus" NOT NULL DEFAULT 'PENDING', - "last_error" TEXT, - "item_count" INTEGER NOT NULL DEFAULT 0, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "calendar_feeds_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "shared_calendar_views" ( - "id" TEXT NOT NULL, - "name" TEXT NOT NULL, - "description" TEXT, - "owner_id" TEXT NOT NULL, - "view_type" "SharedViewType" NOT NULL DEFAULT 'MANUAL', - "auto_include_roles" JSONB, - "included_layer_types" JSONB NOT NULL DEFAULT '[]', - "share_scope" "SharedViewScope" NOT NULL DEFAULT 'MEMBERS', - "share_token" TEXT, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "shared_calendar_views_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "shared_calendar_members" ( - "id" TEXT NOT NULL, - "view_id" TEXT NOT NULL, - "user_id" TEXT NOT NULL, - "status" "SharedViewMemberStatus" NOT NULL DEFAULT 'INVITED', - "color" TEXT NOT NULL DEFAULT '#1890ff', - "joined_at" TIMESTAMP(3), - - CONSTRAINT "shared_calendar_members_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "shared_view_comments" ( - "id" TEXT NOT NULL, - "view_id" TEXT NOT NULL, - "user_id" TEXT NOT NULL, - "item_date" TEXT NOT NULL, - "item_id" TEXT, - "content" TEXT NOT NULL, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "shared_view_comments_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "shared_view_reactions" ( - "id" TEXT NOT NULL, - "view_id" TEXT NOT NULL, - "user_id" TEXT NOT NULL, - "item_id" TEXT NOT NULL, - "emoji" TEXT NOT NULL, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "shared_view_reactions_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "calendar_export_tokens" ( - "id" TEXT NOT NULL, - "user_id" TEXT NOT NULL, - "token" TEXT NOT NULL, - "include_personal" BOOLEAN NOT NULL DEFAULT false, - "include_layers" JSONB, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "calendar_export_tokens_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE INDEX "idx_calendar_layers_user" ON "calendar_layers"("user_id"); - --- CreateIndex -CREATE UNIQUE INDEX "idx_calendar_layers_user_system" ON "calendar_layers"("user_id", "system_type"); - --- CreateIndex -CREATE INDEX "idx_calendar_items_user_date" ON "calendar_items"("user_id", "date"); - --- CreateIndex -CREATE INDEX "idx_calendar_items_layer_date" ON "calendar_items"("layer_id", "date"); - --- CreateIndex -CREATE INDEX "idx_calendar_items_series" ON "calendar_items"("series_id"); - --- CreateIndex -CREATE INDEX "idx_calendar_items_source" ON "calendar_items"("source_type", "source_id"); - --- CreateIndex -CREATE UNIQUE INDEX "calendar_feeds_layer_id_key" ON "calendar_feeds"("layer_id"); - --- CreateIndex -CREATE INDEX "idx_calendar_feeds_user" ON "calendar_feeds"("user_id"); - --- CreateIndex -CREATE UNIQUE INDEX "shared_calendar_views_share_token_key" ON "shared_calendar_views"("share_token"); - --- CreateIndex -CREATE INDEX "idx_shared_views_owner" ON "shared_calendar_views"("owner_id"); - --- CreateIndex -CREATE INDEX "idx_shared_members_user" ON "shared_calendar_members"("user_id"); - --- CreateIndex -CREATE UNIQUE INDEX "idx_shared_members_view_user" ON "shared_calendar_members"("view_id", "user_id"); - --- CreateIndex -CREATE INDEX "idx_shared_comments_view_date" ON "shared_view_comments"("view_id", "item_date"); - --- CreateIndex -CREATE UNIQUE INDEX "idx_shared_reactions_unique" ON "shared_view_reactions"("view_id", "user_id", "item_id", "emoji"); - --- CreateIndex -CREATE UNIQUE INDEX "calendar_export_tokens_token_key" ON "calendar_export_tokens"("token"); - --- CreateIndex -CREATE INDEX "idx_calendar_export_tokens_user" ON "calendar_export_tokens"("user_id"); - --- AddForeignKey -ALTER TABLE "calendar_layers" ADD CONSTRAINT "calendar_layers_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "calendar_items" ADD CONSTRAINT "calendar_items_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "calendar_items" ADD CONSTRAINT "calendar_items_layer_id_fkey" FOREIGN KEY ("layer_id") REFERENCES "calendar_layers"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "calendar_feeds" ADD CONSTRAINT "calendar_feeds_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "calendar_feeds" ADD CONSTRAINT "calendar_feeds_layer_id_fkey" FOREIGN KEY ("layer_id") REFERENCES "calendar_layers"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "shared_calendar_views" ADD CONSTRAINT "shared_calendar_views_owner_id_fkey" FOREIGN KEY ("owner_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "shared_calendar_members" ADD CONSTRAINT "shared_calendar_members_view_id_fkey" FOREIGN KEY ("view_id") REFERENCES "shared_calendar_views"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "shared_calendar_members" ADD CONSTRAINT "shared_calendar_members_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "shared_view_comments" ADD CONSTRAINT "shared_view_comments_view_id_fkey" FOREIGN KEY ("view_id") REFERENCES "shared_calendar_views"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "shared_view_comments" ADD CONSTRAINT "shared_view_comments_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "shared_view_reactions" ADD CONSTRAINT "shared_view_reactions_view_id_fkey" FOREIGN KEY ("view_id") REFERENCES "shared_calendar_views"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "shared_view_reactions" ADD CONSTRAINT "shared_view_reactions_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "calendar_export_tokens" ADD CONSTRAINT "calendar_export_tokens_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/api/prisma/migrations/20260306213132_add_shared_calendar_notification_types/migration.sql b/api/prisma/migrations/20260306213132_add_shared_calendar_notification_types/migration.sql deleted file mode 100644 index a305776c..00000000 --- a/api/prisma/migrations/20260306213132_add_shared_calendar_notification_types/migration.sql +++ /dev/null @@ -1,11 +0,0 @@ --- AlterEnum --- This migration adds more than one value to an enum. --- With PostgreSQL versions 11 and earlier, this is not possible --- in a single migration. This can be worked around by creating --- multiple migrations, each migration adding only one value to --- the enum. - - -ALTER TYPE "NotificationType" ADD VALUE 'shared_view_invite'; -ALTER TYPE "NotificationType" ADD VALUE 'shared_view_accepted'; -ALTER TYPE "NotificationType" ADD VALUE 'calendar_event_invite'; diff --git a/api/prisma/migrations/20260307234424_add_poll_is_private/migration.sql b/api/prisma/migrations/20260307234424_add_poll_is_private/migration.sql deleted file mode 100644 index 4dd9c15d..00000000 --- a/api/prisma/migrations/20260307234424_add_poll_is_private/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "scheduling_polls" ADD COLUMN "is_private" BOOLEAN NOT NULL DEFAULT false; diff --git a/api/prisma/migrations/20260308124852_add_auto_upgrade_settings/migration.sql b/api/prisma/migrations/20260308124852_add_auto_upgrade_settings/migration.sql deleted file mode 100644 index 7b8b2e73..00000000 --- a/api/prisma/migrations/20260308124852_add_auto_upgrade_settings/migration.sql +++ /dev/null @@ -1,5 +0,0 @@ --- AlterTable -ALTER TABLE "site_settings" ADD COLUMN "auto_upgrade_pull_services" BOOLEAN NOT NULL DEFAULT false, -ADD COLUMN "auto_upgrade_schedule" TEXT NOT NULL DEFAULT 'daily-3am', -ADD COLUMN "enable_auto_upgrade" BOOLEAN NOT NULL DEFAULT false, -ADD COLUMN "notify_admin_auto_upgrade" BOOLEAN NOT NULL DEFAULT true; diff --git a/api/prisma/migrations/20260308150000_add_granular_admin_roles/migration.sql b/api/prisma/migrations/20260308150000_add_granular_admin_roles/migration.sql deleted file mode 100644 index 23382c13..00000000 --- a/api/prisma/migrations/20260308150000_add_granular_admin_roles/migration.sql +++ /dev/null @@ -1,7 +0,0 @@ --- AlterEnum -ALTER TYPE "UserRole" ADD VALUE IF NOT EXISTS 'BROADCAST_ADMIN'; -ALTER TYPE "UserRole" ADD VALUE IF NOT EXISTS 'CONTENT_ADMIN'; -ALTER TYPE "UserRole" ADD VALUE IF NOT EXISTS 'MEDIA_ADMIN'; -ALTER TYPE "UserRole" ADD VALUE IF NOT EXISTS 'PAYMENTS_ADMIN'; -ALTER TYPE "UserRole" ADD VALUE IF NOT EXISTS 'EVENTS_ADMIN'; -ALTER TYPE "UserRole" ADD VALUE IF NOT EXISTS 'SOCIAL_ADMIN'; diff --git a/api/prisma/migrations/20260308230000_add_docs_collaboration/migration.sql b/api/prisma/migrations/20260308230000_add_docs_collaboration/migration.sql deleted file mode 100644 index b12a7de0..00000000 --- a/api/prisma/migrations/20260308230000_add_docs_collaboration/migration.sql +++ /dev/null @@ -1,16 +0,0 @@ --- AlterTable -ALTER TABLE "site_settings" ADD COLUMN IF NOT EXISTS "enable_docs_collaboration" BOOLEAN NOT NULL DEFAULT false; - --- CreateTable -CREATE TABLE IF NOT EXISTS "doc_collab_state" ( - "id" TEXT NOT NULL, - "document_id" TEXT NOT NULL, - "state" BYTEA NOT NULL, - "updated_at" TIMESTAMP(3) NOT NULL, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "doc_collab_state_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX IF NOT EXISTS "doc_collab_state_document_id_key" ON "doc_collab_state"("document_id"); diff --git a/api/prisma/migrations/20260309100000_add_notification_types_and_donation_campaign_attribution/migration.sql b/api/prisma/migrations/20260309100000_add_notification_types_and_donation_campaign_attribution/migration.sql deleted file mode 100644 index caa9ad09..00000000 --- a/api/prisma/migrations/20260309100000_add_notification_types_and_donation_campaign_attribution/migration.sql +++ /dev/null @@ -1,16 +0,0 @@ --- AlterEnum --- Add operational notification types for shift/canvass/reengagement notifications -ALTER TYPE "NotificationType" ADD VALUE 'shift_signup_confirmed'; -ALTER TYPE "NotificationType" ADD VALUE 'shift_reminder'; -ALTER TYPE "NotificationType" ADD VALUE 'shift_cancelled'; -ALTER TYPE "NotificationType" ADD VALUE 'canvass_session_summary'; -ALTER TYPE "NotificationType" ADD VALUE 'reengagement'; - --- AlterTable: Add campaign attribution to donation orders -ALTER TABLE "orders" ADD COLUMN "influence_campaign_id" TEXT; - --- CreateIndex -CREATE INDEX "idx_orders_influence_campaign" ON "orders"("influence_campaign_id"); - --- AddForeignKey -ALTER TABLE "orders" ADD CONSTRAINT "orders_influence_campaign_id_fkey" FOREIGN KEY ("influence_campaign_id") REFERENCES "campaigns"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/api/prisma/migrations/20260311100000_add_poll_auto_finalize/migration.sql b/api/prisma/migrations/20260311100000_add_poll_auto_finalize/migration.sql deleted file mode 100644 index 390c3130..00000000 --- a/api/prisma/migrations/20260311100000_add_poll_auto_finalize/migration.sql +++ /dev/null @@ -1,12 +0,0 @@ --- Add POLL to CalendarItemSource enum -ALTER TYPE "CalendarItemSource" ADD VALUE IF NOT EXISTS 'POLL'; - --- AlterTable -ALTER TABLE "scheduling_polls" ADD COLUMN "auto_finalize" BOOLEAN NOT NULL DEFAULT false; -ALTER TABLE "scheduling_polls" ADD COLUMN "auto_finalize_threshold" INTEGER; -ALTER TABLE "scheduling_polls" ADD COLUMN "auto_convert_to_calendar" BOOLEAN NOT NULL DEFAULT false; -ALTER TABLE "scheduling_polls" ADD COLUMN "auto_convert_to_gancio" BOOLEAN NOT NULL DEFAULT false; -ALTER TABLE "scheduling_polls" ADD COLUMN "auto_convert_to_shift" BOOLEAN NOT NULL DEFAULT false; -ALTER TABLE "scheduling_polls" ADD COLUMN "tie_breaker" TEXT NOT NULL DEFAULT 'earliest'; -ALTER TABLE "scheduling_polls" ADD COLUMN "auto_finalize_job_id" TEXT; -ALTER TABLE "scheduling_polls" ADD COLUMN "converted_calendar_item_id" TEXT; diff --git a/api/prisma/migrations/20260312100000_add_organizing_pipeline/migration.sql b/api/prisma/migrations/20260312100000_add_organizing_pipeline/migration.sql deleted file mode 100644 index 52502834..00000000 --- a/api/prisma/migrations/20260312100000_add_organizing_pipeline/migration.sql +++ /dev/null @@ -1,160 +0,0 @@ --- AlterEnum -ALTER TYPE "ContactActivityType" ADD VALUE 'POLL_VOTED'; - --- AlterEnum -ALTER TYPE "ContactSource" ADD VALUE 'POLL_VOTE'; - --- AlterEnum -ALTER TYPE "SignupSource" ADD VALUE 'POLL_CONVERSION'; - --- AlterTable -ALTER TABLE "contacts" ADD COLUMN "pronouns" TEXT; - --- AlterTable -ALTER TABLE "scheduling_poll_votes" ADD COLUMN "contact_id" TEXT; - --- AlterTable -ALTER TABLE "scheduling_polls" ADD COLUMN "auto_enroll_voters" BOOLEAN NOT NULL DEFAULT true; - --- AlterTable -ALTER TABLE "users" ADD COLUMN "pronouns" TEXT; - --- CreateTable -CREATE TABLE "participant_needs" ( - "id" TEXT NOT NULL, - "user_id" TEXT, - "contact_id" TEXT, - "needs_wheelchair" BOOLEAN NOT NULL DEFAULT false, - "needs_ground_floor" BOOLEAN NOT NULL DEFAULT false, - "needs_hearing_loop" BOOLEAN NOT NULL DEFAULT false, - "needs_sign_language" BOOLEAN NOT NULL DEFAULT false, - "other_accessibility" TEXT, - "is_vegan" BOOLEAN NOT NULL DEFAULT false, - "is_vegetarian" BOOLEAN NOT NULL DEFAULT false, - "is_gluten_free" BOOLEAN NOT NULL DEFAULT false, - "is_halal" BOOLEAN NOT NULL DEFAULT false, - "is_kosher" BOOLEAN NOT NULL DEFAULT false, - "has_nut_allergy" BOOLEAN NOT NULL DEFAULT false, - "other_dietary" TEXT, - "needs_childcare" BOOLEAN NOT NULL DEFAULT false, - "childcare_details" TEXT, - "needs_transportation" BOOLEAN NOT NULL DEFAULT false, - "transportation_notes" TEXT, - "preferred_language" TEXT DEFAULT 'en', - "needs_translation" BOOLEAN NOT NULL DEFAULT false, - "translation_language" TEXT, - "visibility_consent" TEXT NOT NULL DEFAULT 'organizer_only', - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "participant_needs_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "meeting_agendas" ( - "id" TEXT NOT NULL, - "shift_id" TEXT, - "poll_id" TEXT, - "title" TEXT NOT NULL, - "items" JSONB NOT NULL DEFAULT '[]', - "status" TEXT NOT NULL DEFAULT 'draft', - "created_by_user_id" TEXT NOT NULL, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "meeting_agendas_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "meeting_minutes" ( - "id" TEXT NOT NULL, - "agenda_id" TEXT NOT NULL, - "notes" TEXT NOT NULL, - "decisions" JSONB NOT NULL DEFAULT '[]', - "attendees" JSONB NOT NULL DEFAULT '[]', - "approved_at" TIMESTAMP(3), - "approved_by_user_id" TEXT, - "created_by_user_id" TEXT NOT NULL, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "meeting_minutes_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "action_items" ( - "id" TEXT NOT NULL, - "agenda_id" TEXT, - "title" TEXT NOT NULL, - "description" TEXT, - "assignee_user_id" TEXT, - "due_date" TIMESTAMP(3), - "status" TEXT NOT NULL DEFAULT 'open', - "priority" TEXT NOT NULL DEFAULT 'normal', - "completed_at" TIMESTAMP(3), - "created_by_user_id" TEXT NOT NULL, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "action_items_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "participant_needs_user_id_key" ON "participant_needs"("user_id"); - --- CreateIndex -CREATE UNIQUE INDEX "participant_needs_contact_id_key" ON "participant_needs"("contact_id"); - --- CreateIndex -CREATE UNIQUE INDEX "meeting_agendas_shift_id_key" ON "meeting_agendas"("shift_id"); - --- CreateIndex -CREATE UNIQUE INDEX "meeting_agendas_poll_id_key" ON "meeting_agendas"("poll_id"); - --- CreateIndex -CREATE UNIQUE INDEX "meeting_minutes_agenda_id_key" ON "meeting_minutes"("agenda_id"); - --- CreateIndex -CREATE INDEX "action_items_assignee_user_id_status_idx" ON "action_items"("assignee_user_id", "status"); - --- CreateIndex -CREATE INDEX "action_items_due_date_idx" ON "action_items"("due_date"); - --- CreateIndex -CREATE INDEX "scheduling_poll_votes_contact_id_idx" ON "scheduling_poll_votes"("contact_id"); - --- AddForeignKey -ALTER TABLE "scheduling_poll_votes" ADD CONSTRAINT "scheduling_poll_votes_contact_id_fkey" FOREIGN KEY ("contact_id") REFERENCES "contacts"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "participant_needs" ADD CONSTRAINT "participant_needs_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "participant_needs" ADD CONSTRAINT "participant_needs_contact_id_fkey" FOREIGN KEY ("contact_id") REFERENCES "contacts"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "meeting_agendas" ADD CONSTRAINT "meeting_agendas_shift_id_fkey" FOREIGN KEY ("shift_id") REFERENCES "shifts"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "meeting_agendas" ADD CONSTRAINT "meeting_agendas_poll_id_fkey" FOREIGN KEY ("poll_id") REFERENCES "scheduling_polls"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "meeting_agendas" ADD CONSTRAINT "meeting_agendas_created_by_user_id_fkey" FOREIGN KEY ("created_by_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "meeting_minutes" ADD CONSTRAINT "meeting_minutes_agenda_id_fkey" FOREIGN KEY ("agenda_id") REFERENCES "meeting_agendas"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "meeting_minutes" ADD CONSTRAINT "meeting_minutes_approved_by_user_id_fkey" FOREIGN KEY ("approved_by_user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "meeting_minutes" ADD CONSTRAINT "meeting_minutes_created_by_user_id_fkey" FOREIGN KEY ("created_by_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "action_items" ADD CONSTRAINT "action_items_agenda_id_fkey" FOREIGN KEY ("agenda_id") REFERENCES "meeting_agendas"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "action_items" ADD CONSTRAINT "action_items_assignee_user_id_fkey" FOREIGN KEY ("assignee_user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "action_items" ADD CONSTRAINT "action_items_created_by_user_id_fkey" FOREIGN KEY ("created_by_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - diff --git a/api/prisma/migrations/20260322100000_add_registry_settings/migration.sql b/api/prisma/migrations/20260322100000_add_registry_settings/migration.sql deleted file mode 100644 index 15e3cee0..00000000 --- a/api/prisma/migrations/20260322100000_add_registry_settings/migration.sql +++ /dev/null @@ -1,3 +0,0 @@ --- AlterTable -ALTER TABLE "site_settings" ADD COLUMN "gitea_registry_url" TEXT NOT NULL DEFAULT 'gitea.bnkops.com/admin', -ADD COLUMN "use_registry_for_upgrade" BOOLEAN NOT NULL DEFAULT false; diff --git a/api/prisma/migrations/20260327100000_add_docs_access_sharing_watch/migration.sql b/api/prisma/migrations/20260327100000_add_docs_access_sharing_watch/migration.sql deleted file mode 100644 index 53f86aa6..00000000 --- a/api/prisma/migrations/20260327100000_add_docs_access_sharing_watch/migration.sql +++ /dev/null @@ -1,76 +0,0 @@ --- CreateEnum -CREATE TYPE "DocShareLinkStatus" AS ENUM ('ACTIVE', 'REVOKED', 'EXPIRED'); - --- AlterEnum -ALTER TYPE "ContactActivityType" ADD VALUE IF NOT EXISTS 'POLL_VOTED'; - --- CreateTable -CREATE TABLE "doc_access_policies" ( - "id" TEXT NOT NULL, - "document_path" TEXT NOT NULL, - "is_directory" BOOLEAN NOT NULL DEFAULT false, - "allowed_editors" JSONB NOT NULL DEFAULT '[]', - "created_by_id" TEXT NOT NULL, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "doc_access_policies_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "doc_share_links" ( - "id" TEXT NOT NULL, - "document_path" TEXT NOT NULL, - "share_token" TEXT NOT NULL, - "status" "DocShareLinkStatus" NOT NULL DEFAULT 'ACTIVE', - "can_edit" BOOLEAN NOT NULL DEFAULT true, - "expires_at" TIMESTAMP(3), - "max_uses" INTEGER, - "use_count" INTEGER NOT NULL DEFAULT 0, - "guest_name" TEXT, - "created_by_id" TEXT NOT NULL, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "doc_share_links_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "doc_watches" ( - "id" TEXT NOT NULL, - "user_id" TEXT NOT NULL, - "file_path" TEXT NOT NULL, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "doc_watches_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "doc_access_policies_document_path_key" ON "doc_access_policies"("document_path"); - --- CreateIndex -CREATE INDEX "doc_access_policies_created_by_id_idx" ON "doc_access_policies"("created_by_id"); - --- CreateIndex -CREATE UNIQUE INDEX "doc_share_links_share_token_key" ON "doc_share_links"("share_token"); - --- CreateIndex -CREATE INDEX "doc_share_links_document_path_idx" ON "doc_share_links"("document_path"); - --- CreateIndex -CREATE INDEX "doc_share_links_created_by_id_idx" ON "doc_share_links"("created_by_id"); - --- CreateIndex -CREATE INDEX "doc_watches_file_path_idx" ON "doc_watches"("file_path"); - --- CreateIndex -CREATE UNIQUE INDEX "doc_watches_user_id_file_path_key" ON "doc_watches"("user_id", "file_path"); - --- AddForeignKey -ALTER TABLE "doc_access_policies" ADD CONSTRAINT "doc_access_policies_created_by_id_fkey" FOREIGN KEY ("created_by_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "doc_share_links" ADD CONSTRAINT "doc_share_links_created_by_id_fkey" FOREIGN KEY ("created_by_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "doc_watches" ADD CONSTRAINT "doc_watches_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/api/prisma/migrations/20260327100000_add_ticket_tier_reserved_count/migration.sql b/api/prisma/migrations/20260327100000_add_ticket_tier_reserved_count/migration.sql deleted file mode 100644 index 546012ba..00000000 --- a/api/prisma/migrations/20260327100000_add_ticket_tier_reserved_count/migration.sql +++ /dev/null @@ -1,3 +0,0 @@ --- AlterTable: Add reserved_count for ticket overselling prevention --- Tracks pending Stripe checkout sessions to prevent concurrent overselling -ALTER TABLE "ticket_tiers" ADD COLUMN "reserved_count" INTEGER NOT NULL DEFAULT 0; diff --git a/api/prisma/migrations/20260327120000_add_gitea_setup_complete/migration.sql b/api/prisma/migrations/20260327120000_add_gitea_setup_complete/migration.sql deleted file mode 100644 index c0733d6a..00000000 --- a/api/prisma/migrations/20260327120000_add_gitea_setup_complete/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "site_settings" ADD COLUMN "gitea_setup_complete" BOOLEAN NOT NULL DEFAULT false; diff --git a/api/prisma/migrations/20260330100000_add_straw_polls/migration.sql b/api/prisma/migrations/20260330100000_add_straw_polls/migration.sql deleted file mode 100644 index 4901b1da..00000000 --- a/api/prisma/migrations/20260330100000_add_straw_polls/migration.sql +++ /dev/null @@ -1,168 +0,0 @@ --- CreateEnum -CREATE TYPE "StrawPollType" AS ENUM ('SINGLE_CHOICE', 'YES_NO_ABSTAIN'); - --- CreateEnum -CREATE TYPE "StrawPollStatus" AS ENUM ('DRAFT', 'ACTIVE', 'CLOSED', 'ARCHIVED'); - --- CreateEnum -CREATE TYPE "StrawPollIdentityMode" AS ENUM ('ANONYMOUS', 'TOKEN_GATED', 'AUTHENTICATED', 'MIXED'); - --- CreateEnum -CREATE TYPE "StrawPollResultVisibility" AS ENUM ('LIVE', 'AFTER_VOTE', 'AFTER_CLOSE', 'CREATOR_ONLY', 'PUBLIC_ALWAYS'); - --- AlterEnum --- This migration adds more than one value to an enum. --- With PostgreSQL versions 11 and earlier, this is not possible --- in a single migration. This can be worked around by creating --- multiple migrations, each migration adding only one value to --- the enum. - - -ALTER TYPE "NotificationType" ADD VALUE 'poll_closed'; -ALTER TYPE "NotificationType" ADD VALUE 'poll_results_available'; -ALTER TYPE "NotificationType" ADD VALUE 'poll_challenge'; - --- AlterEnum -ALTER TYPE "UserRole" ADD VALUE 'POLLS_ADMIN'; - --- AlterTable -ALTER TABLE "site_settings" ADD COLUMN "enable_polls" BOOLEAN NOT NULL DEFAULT false; - --- CreateTable -CREATE TABLE "straw_polls" ( - "id" TEXT NOT NULL, - "slug" TEXT NOT NULL, - "title" VARCHAR(200) NOT NULL, - "description" TEXT, - "type" "StrawPollType" NOT NULL, - "status" "StrawPollStatus" NOT NULL DEFAULT 'DRAFT', - "identity_mode" "StrawPollIdentityMode" NOT NULL DEFAULT 'ANONYMOUS', - "result_visibility" "StrawPollResultVisibility" NOT NULL DEFAULT 'LIVE', - "allow_comments" BOOLEAN NOT NULL DEFAULT true, - "closes_at" TIMESTAMP(3), - "close_threshold" INTEGER, - "auto_close_job_id" TEXT, - "is_private" BOOLEAN NOT NULL DEFAULT false, - "created_by_user_id" TEXT NOT NULL, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "straw_polls_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "straw_poll_options" ( - "id" TEXT NOT NULL, - "poll_id" TEXT NOT NULL, - "label" VARCHAR(500) NOT NULL, - "sort_order" INTEGER NOT NULL DEFAULT 0, - - CONSTRAINT "straw_poll_options_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "straw_poll_votes" ( - "id" TEXT NOT NULL, - "poll_id" TEXT NOT NULL, - "option_id" TEXT NOT NULL, - "user_id" TEXT, - "voter_name" VARCHAR(100), - "voter_token" TEXT, - "voter_ip" TEXT, - "contact_id" TEXT, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "straw_poll_votes_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "straw_poll_comments" ( - "id" TEXT NOT NULL, - "poll_id" TEXT NOT NULL, - "user_id" TEXT, - "author_name" VARCHAR(100) NOT NULL, - "content" TEXT NOT NULL, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "straw_poll_comments_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "straw_poll_challenges" ( - "id" TEXT NOT NULL, - "poll_id" TEXT NOT NULL, - "challenger_user_id" TEXT NOT NULL, - "challenged_user_id" TEXT NOT NULL, - "completed_at" TIMESTAMP(3), - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "straw_poll_challenges_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "straw_polls_slug_key" ON "straw_polls"("slug"); - --- CreateIndex -CREATE INDEX "straw_polls_created_by_user_id_idx" ON "straw_polls"("created_by_user_id"); - --- CreateIndex -CREATE INDEX "straw_polls_status_idx" ON "straw_polls"("status"); - --- CreateIndex -CREATE INDEX "straw_poll_options_poll_id_idx" ON "straw_poll_options"("poll_id"); - --- CreateIndex -CREATE INDEX "straw_poll_votes_poll_id_idx" ON "straw_poll_votes"("poll_id"); - --- CreateIndex -CREATE INDEX "straw_poll_votes_option_id_idx" ON "straw_poll_votes"("option_id"); - --- CreateIndex -CREATE UNIQUE INDEX "straw_poll_votes_poll_id_user_id_key" ON "straw_poll_votes"("poll_id", "user_id"); - --- CreateIndex -CREATE UNIQUE INDEX "straw_poll_votes_poll_id_voter_token_key" ON "straw_poll_votes"("poll_id", "voter_token"); - --- CreateIndex -CREATE UNIQUE INDEX "straw_poll_votes_poll_id_voter_ip_key" ON "straw_poll_votes"("poll_id", "voter_ip"); - --- CreateIndex -CREATE INDEX "straw_poll_comments_poll_id_idx" ON "straw_poll_comments"("poll_id"); - --- CreateIndex -CREATE UNIQUE INDEX "straw_poll_challenges_poll_id_challenger_user_id_challenged_key" ON "straw_poll_challenges"("poll_id", "challenger_user_id", "challenged_user_id"); - --- AddForeignKey -ALTER TABLE "straw_polls" ADD CONSTRAINT "straw_polls_created_by_user_id_fkey" FOREIGN KEY ("created_by_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "straw_poll_options" ADD CONSTRAINT "straw_poll_options_poll_id_fkey" FOREIGN KEY ("poll_id") REFERENCES "straw_polls"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "straw_poll_votes" ADD CONSTRAINT "straw_poll_votes_poll_id_fkey" FOREIGN KEY ("poll_id") REFERENCES "straw_polls"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "straw_poll_votes" ADD CONSTRAINT "straw_poll_votes_option_id_fkey" FOREIGN KEY ("option_id") REFERENCES "straw_poll_options"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "straw_poll_votes" ADD CONSTRAINT "straw_poll_votes_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "straw_poll_votes" ADD CONSTRAINT "straw_poll_votes_contact_id_fkey" FOREIGN KEY ("contact_id") REFERENCES "contacts"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "straw_poll_comments" ADD CONSTRAINT "straw_poll_comments_poll_id_fkey" FOREIGN KEY ("poll_id") REFERENCES "straw_polls"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "straw_poll_comments" ADD CONSTRAINT "straw_poll_comments_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "straw_poll_challenges" ADD CONSTRAINT "straw_poll_challenges_poll_id_fkey" FOREIGN KEY ("poll_id") REFERENCES "straw_polls"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "straw_poll_challenges" ADD CONSTRAINT "straw_poll_challenges_challenger_user_id_fkey" FOREIGN KEY ("challenger_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "straw_poll_challenges" ADD CONSTRAINT "straw_poll_challenges_challenged_user_id_fkey" FOREIGN KEY ("challenged_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - diff --git a/api/prisma/migrations/20260330120000_payment_audit_and_disputed_status/migration.sql b/api/prisma/migrations/20260330120000_payment_audit_and_disputed_status/migration.sql deleted file mode 100644 index 90c7f40f..00000000 --- a/api/prisma/migrations/20260330120000_payment_audit_and_disputed_status/migration.sql +++ /dev/null @@ -1,18 +0,0 @@ --- AlterEnum: Add DISPUTED status for chargeback tracking -ALTER TYPE "OrderStatus" ADD VALUE 'DISPUTED'; - --- DropForeignKey: Make paymentId optional on audit log -ALTER TABLE "payment_audit_log" DROP CONSTRAINT "payment_audit_log_payment_id_fkey"; - --- AlterTable: Add orderId column, make paymentId nullable -ALTER TABLE "payment_audit_log" ADD COLUMN "order_id" TEXT, -ALTER COLUMN "payment_id" DROP NOT NULL; - --- CreateIndex -CREATE INDEX "idx_payment_audit_log_order" ON "payment_audit_log"("order_id"); - --- AddForeignKey (nullable) -ALTER TABLE "payment_audit_log" ADD CONSTRAINT "payment_audit_log_payment_id_fkey" FOREIGN KEY ("payment_id") REFERENCES "payments"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "payment_audit_log" ADD CONSTRAINT "payment_audit_log_order_id_fkey" FOREIGN KEY ("order_id") REFERENCES "orders"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/api/prisma/migrations/20260331100000_add_calendar_item_source_types/migration.sql b/api/prisma/migrations/20260331100000_add_calendar_item_source_types/migration.sql deleted file mode 100644 index e9151c1b..00000000 --- a/api/prisma/migrations/20260331100000_add_calendar_item_source_types/migration.sql +++ /dev/null @@ -1,4 +0,0 @@ --- Add SHIFT, MEETING, TICKETED_EVENT to CalendarItemSource enum -ALTER TYPE "CalendarItemSource" ADD VALUE IF NOT EXISTS 'SHIFT'; -ALTER TYPE "CalendarItemSource" ADD VALUE IF NOT EXISTS 'MEETING'; -ALTER TYPE "CalendarItemSource" ADD VALUE IF NOT EXISTS 'TICKETED_EVENT'; diff --git a/api/prisma/migrations/20260402100000_add_analytics_system/migration.sql b/api/prisma/migrations/20260402100000_add_analytics_system/migration.sql deleted file mode 100644 index e30c51ee..00000000 --- a/api/prisma/migrations/20260402100000_add_analytics_system/migration.sql +++ /dev/null @@ -1,39 +0,0 @@ --- AlterEnum -ALTER TYPE "UserRole" ADD VALUE 'ANALYTICS_ADMIN'; - --- AlterTable -ALTER TABLE "docs_page_views" ADD COLUMN "city" VARCHAR(100), -ADD COLUMN "country" VARCHAR(2), -ADD COLUMN "ip_address_hash" VARCHAR(64), -ADD COLUMN "latitude" DOUBLE PRECISION, -ADD COLUMN "longitude" DOUBLE PRECISION, -ADD COLUMN "region" VARCHAR(100); - --- AlterTable -ALTER TABLE "photo_views" ADD COLUMN "city" VARCHAR(100), -ADD COLUMN "country" VARCHAR(2), -ADD COLUMN "latitude" DOUBLE PRECISION, -ADD COLUMN "longitude" DOUBLE PRECISION, -ADD COLUMN "region" VARCHAR(100); - --- AlterTable -ALTER TABLE "site_settings" ADD COLUMN "analytics_geo_enabled" BOOLEAN NOT NULL DEFAULT true, -ADD COLUMN "analytics_retention_days" INTEGER NOT NULL DEFAULT 90, -ADD COLUMN "enable_analytics" BOOLEAN NOT NULL DEFAULT false, -ADD COLUMN "track_authenticated_users" BOOLEAN NOT NULL DEFAULT true; - --- AlterTable -ALTER TABLE "video_views" ADD COLUMN "city" VARCHAR(100), -ADD COLUMN "country" VARCHAR(2), -ADD COLUMN "latitude" DOUBLE PRECISION, -ADD COLUMN "longitude" DOUBLE PRECISION, -ADD COLUMN "region" VARCHAR(100); - --- CreateIndex -CREATE INDEX "docs_page_views_country_createdAt_idx" ON "docs_page_views"("country", "createdAt"); - --- CreateIndex -CREATE INDEX "idx_photo_views_country_date" ON "photo_views"("country", "viewed_at"); - --- CreateIndex -CREATE INDEX "idx_video_views_country_created" ON "video_views"("country", "created_at"); diff --git a/api/prisma/migrations/20260402200000_add_petitions/migration.sql b/api/prisma/migrations/20260402200000_add_petitions/migration.sql deleted file mode 100644 index 4a9df272..00000000 --- a/api/prisma/migrations/20260402200000_add_petitions/migration.sql +++ /dev/null @@ -1,131 +0,0 @@ --- CreateEnum -CREATE TYPE "PetitionStatus" AS ENUM ('DRAFT', 'ACTIVE', 'PAUSED', 'CLOSED', 'ARCHIVED'); - --- CreateEnum -CREATE TYPE "PetitionSignatureStatus" AS ENUM ('PENDING_VERIFICATION', 'VERIFIED', 'UNVERIFIED', 'REJECTED'); - --- AlterEnum -ALTER TYPE "ContactActivityType" ADD VALUE 'PETITION_SIGNED'; - --- AlterEnum -ALTER TYPE "ContactSource" ADD VALUE 'PETITION_SIGNER'; - --- AlterTable -ALTER TABLE "site_settings" ADD COLUMN "enable_petitions" BOOLEAN NOT NULL DEFAULT false, -ADD COLUMN "notify_admin_petition_milestone" BOOLEAN NOT NULL DEFAULT false; - --- CreateTable -CREATE TABLE "petitions" ( - "id" TEXT NOT NULL, - "slug" TEXT NOT NULL, - "title" TEXT NOT NULL, - "description" TEXT, - "signatureGoal" INTEGER, - "showProgress" BOOLEAN NOT NULL DEFAULT true, - "showSignatureCount" BOOLEAN NOT NULL DEFAULT true, - "showSignerNames" BOOLEAN NOT NULL DEFAULT true, - "signatureCountOffset" INTEGER NOT NULL DEFAULT 0, - "requireName" BOOLEAN NOT NULL DEFAULT true, - "requireEmail" BOOLEAN NOT NULL DEFAULT true, - "requirePostalCode" BOOLEAN NOT NULL DEFAULT false, - "requirePhone" BOOLEAN NOT NULL DEFAULT false, - "allowComment" BOOLEAN NOT NULL DEFAULT true, - "commentLabel" TEXT, - "requireEmailConfirmation" BOOLEAN NOT NULL DEFAULT false, - "confirmationEmailSubject" TEXT, - "confirmationEmailBody" TEXT, - "coverPhoto" TEXT, - "callToAction" TEXT, - "thankYouMessage" TEXT, - "highlightPetition" BOOLEAN NOT NULL DEFAULT false, - "linkedCampaignId" TEXT, - "status" "PetitionStatus" NOT NULL DEFAULT 'DRAFT', - "isUserGenerated" BOOLEAN NOT NULL DEFAULT false, - "moderationStatus" "CampaignModerationStatus", - "rejectionReason" TEXT, - "moderationNotes" TEXT, - "createdByUserId" TEXT, - "createdByUserEmail" TEXT, - "createdByUserName" TEXT, - "reviewedByUserId" TEXT, - "reviewedAt" TIMESTAMP(3), - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "petitions_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "petition_signatures" ( - "id" TEXT NOT NULL, - "petitionId" TEXT NOT NULL, - "signerName" TEXT, - "signerEmail" TEXT, - "signerPostalCode" TEXT, - "signerPhone" TEXT, - "signerComment" TEXT, - "isAnonymous" BOOLEAN NOT NULL DEFAULT false, - "displayName" TEXT, - "status" "PetitionSignatureStatus" NOT NULL DEFAULT 'UNVERIFIED', - "verificationToken" TEXT, - "verificationSentAt" TIMESTAMP(3), - "verifiedAt" TIMESTAMP(3), - "contactId" TEXT, - "signerIp" TEXT, - "geoCountry" TEXT, - "geoRegion" TEXT, - "geoCity" TEXT, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "petition_signatures_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "petitions_slug_key" ON "petitions"("slug"); - --- CreateIndex -CREATE INDEX "petitions_status_idx" ON "petitions"("status"); - --- CreateIndex -CREATE INDEX "petitions_isUserGenerated_idx" ON "petitions"("isUserGenerated"); - --- CreateIndex -CREATE INDEX "petitions_highlightPetition_idx" ON "petitions"("highlightPetition"); - --- CreateIndex -CREATE INDEX "petitions_linkedCampaignId_idx" ON "petitions"("linkedCampaignId"); - --- CreateIndex -CREATE UNIQUE INDEX "petition_signatures_verificationToken_key" ON "petition_signatures"("verificationToken"); - --- CreateIndex -CREATE INDEX "petition_signatures_petitionId_idx" ON "petition_signatures"("petitionId"); - --- CreateIndex -CREATE INDEX "petition_signatures_signerEmail_idx" ON "petition_signatures"("signerEmail"); - --- CreateIndex -CREATE INDEX "petition_signatures_petitionId_status_idx" ON "petition_signatures"("petitionId", "status"); - --- CreateIndex -CREATE INDEX "petition_signatures_contactId_idx" ON "petition_signatures"("contactId"); - --- CreateIndex -CREATE UNIQUE INDEX "petition_signatures_petitionId_signerEmail_key" ON "petition_signatures"("petitionId", "signerEmail"); - --- AddForeignKey -ALTER TABLE "petitions" ADD CONSTRAINT "petitions_linkedCampaignId_fkey" FOREIGN KEY ("linkedCampaignId") REFERENCES "campaigns"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "petitions" ADD CONSTRAINT "petitions_createdByUserId_fkey" FOREIGN KEY ("createdByUserId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "petitions" ADD CONSTRAINT "petitions_reviewedByUserId_fkey" FOREIGN KEY ("reviewedByUserId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "petition_signatures" ADD CONSTRAINT "petition_signatures_petitionId_fkey" FOREIGN KEY ("petitionId") REFERENCES "petitions"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "petition_signatures" ADD CONSTRAINT "petition_signatures_contactId_fkey" FOREIGN KEY ("contactId") REFERENCES "contacts"("id") ON DELETE SET NULL ON UPDATE CASCADE; - diff --git a/api/prisma/migrations/20260404100000_disable_public_map_by_default/migration.sql b/api/prisma/migrations/20260404100000_disable_public_map_by_default/migration.sql deleted file mode 100644 index e677b0d9..00000000 --- a/api/prisma/migrations/20260404100000_disable_public_map_by_default/migration.sql +++ /dev/null @@ -1,3 +0,0 @@ --- Change default for public map toggles so fresh installs start with map disabled -ALTER TABLE "map_settings" ALTER COLUMN "publicMapEnabled" SET DEFAULT false; -ALTER TABLE "site_settings" ALTER COLUMN "enableMap" SET DEFAULT false; diff --git a/api/prisma/migrations/20260407200000_add_petition_cover_video/migration.sql b/api/prisma/migrations/20260407200000_add_petition_cover_video/migration.sql deleted file mode 100644 index 14e8f260..00000000 --- a/api/prisma/migrations/20260407200000_add_petition_cover_video/migration.sql +++ /dev/null @@ -1,4 +0,0 @@ --- AlterTable: Add missing coverVideoId column to petitions table --- This column was present in the Prisma schema but omitted from the original --- 20260402200000_add_petitions migration. -ALTER TABLE "petitions" ADD COLUMN "coverVideoId" INTEGER; diff --git a/api/prisma/migrations/20260410200000_volunteer_dashboard_action_campaigns/migration.sql b/api/prisma/migrations/20260410200000_volunteer_dashboard_action_campaigns/migration.sql deleted file mode 100644 index 5c09f268..00000000 --- a/api/prisma/migrations/20260410200000_volunteer_dashboard_action_campaigns/migration.sql +++ /dev/null @@ -1,130 +0,0 @@ - --- CreateEnum -CREATE TYPE "ShiftKind" AS ENUM ('CANVASS', 'TRAINING', 'EVENT_STAFFING', 'PHONE_BANK', 'OTHER'); - --- CreateEnum -CREATE TYPE "ActionStepKind" AS ENUM ('WATCH_VIDEO', 'SUBMIT_INFLUENCE', 'SIGN_PETITION', 'RSVP_EVENT', 'SIGNUP_SHIFT', 'JOIN_CHALLENGE', 'VISIT_LINK', 'CUSTOM'); - --- CreateEnum -CREATE TYPE "ActionStepCompletionSource" AS ENUM ('AUTO', 'SELF_REPORTED'); - --- AlterTable -ALTER TABLE "shifts" ADD COLUMN "kind" "ShiftKind" NOT NULL DEFAULT 'CANVASS'; - --- AlterTable -ALTER TABLE "ticketed_events" ADD COLUMN "featured" BOOLEAN NOT NULL DEFAULT false; - --- CreateTable -CREATE TABLE "action_campaigns" ( - "id" TEXT NOT NULL, - "slug" TEXT NOT NULL, - "title" TEXT NOT NULL, - "description" TEXT, - "reward_text" TEXT, - "is_active" BOOLEAN NOT NULL DEFAULT false, - "starts_at" TIMESTAMP(3), - "ends_at" TIMESTAMP(3), - "min_steps_for_reward" INTEGER, - "created_by_user_id" TEXT, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "action_campaigns_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "action_steps" ( - "id" TEXT NOT NULL, - "campaign_id" TEXT NOT NULL, - "order" INTEGER NOT NULL, - "kind" "ActionStepKind" NOT NULL, - "label" TEXT NOT NULL, - "description" TEXT, - "target_id" TEXT, - "target_url" TEXT, - "auto_complete" BOOLEAN NOT NULL DEFAULT true, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "action_steps_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "action_step_completions" ( - "id" TEXT NOT NULL, - "user_id" TEXT NOT NULL, - "step_id" TEXT NOT NULL, - "source" "ActionStepCompletionSource" NOT NULL DEFAULT 'AUTO', - "completed_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "action_step_completions_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "documents" ( - "id" TEXT NOT NULL, - "path" TEXT NOT NULL, - "filename" TEXT NOT NULL, - "original_filename" TEXT, - "title" TEXT, - "description" TEXT, - "mime_type" TEXT NOT NULL, - "file_size" BIGINT, - "page_count" INTEGER, - "thumbnail_path" TEXT, - "category" TEXT, - "tags" JSONB, - "is_published" BOOLEAN NOT NULL DEFAULT true, - "position" INTEGER DEFAULT 0, - "uploader_id" TEXT, - "download_count" INTEGER NOT NULL DEFAULT 0, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "documents_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "action_campaigns_slug_key" ON "action_campaigns"("slug"); - --- CreateIndex -CREATE INDEX "idx_action_campaigns_active" ON "action_campaigns"("is_active"); - --- CreateIndex -CREATE INDEX "idx_action_steps_campaign" ON "action_steps"("campaign_id"); - --- CreateIndex -CREATE UNIQUE INDEX "action_steps_campaign_id_order_key" ON "action_steps"("campaign_id", "order"); - --- CreateIndex -CREATE INDEX "idx_action_step_completions_user" ON "action_step_completions"("user_id"); - --- CreateIndex -CREATE UNIQUE INDEX "action_step_completions_user_id_step_id_key" ON "action_step_completions"("user_id", "step_id"); - --- CreateIndex -CREATE UNIQUE INDEX "documents_path_key" ON "documents"("path"); - --- CreateIndex -CREATE INDEX "idx_documents_published" ON "documents"("is_published"); - --- CreateIndex -CREATE INDEX "idx_documents_category" ON "documents"("category"); - --- CreateIndex -CREATE INDEX "idx_documents_created_at" ON "documents"("created_at"); - --- AddForeignKey -ALTER TABLE "action_campaigns" ADD CONSTRAINT "action_campaigns_created_by_user_id_fkey" FOREIGN KEY ("created_by_user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "action_steps" ADD CONSTRAINT "action_steps_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "action_campaigns"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "action_step_completions" ADD CONSTRAINT "action_step_completions_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "action_step_completions" ADD CONSTRAINT "action_step_completions_step_id_fkey" FOREIGN KEY ("step_id") REFERENCES "action_steps"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "documents" ADD CONSTRAINT "documents_uploader_id_fkey" FOREIGN KEY ("uploader_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; - diff --git a/api/prisma/migrations/20260411120000_shift_event_link/migration.sql b/api/prisma/migrations/20260411120000_shift_event_link/migration.sql deleted file mode 100644 index f78eea0a..00000000 --- a/api/prisma/migrations/20260411120000_shift_event_link/migration.sql +++ /dev/null @@ -1,7 +0,0 @@ - --- AlterTable -ALTER TABLE "shifts" ADD COLUMN "ticketed_event_id" TEXT; - --- AddForeignKey -ALTER TABLE "shifts" ADD CONSTRAINT "shifts_ticketed_event_id_fkey" FOREIGN KEY ("ticketed_event_id") REFERENCES "ticketed_events"("id") ON DELETE SET NULL ON UPDATE CASCADE; - diff --git a/api/prisma/migrations/20260224100000_baseline_catchup/migration.sql b/api/prisma/migrations/20260416000000_init/migration.sql similarity index 59% rename from api/prisma/migrations/20260224100000_baseline_catchup/migration.sql rename to api/prisma/migrations/20260416000000_init/migration.sql index 75c14a48..897d8f21 100644 --- a/api/prisma/migrations/20260224100000_baseline_catchup/migration.sql +++ b/api/prisma/migrations/20260416000000_init/migration.sql @@ -1,21 +1,93 @@ +-- CreateSchema +CREATE SCHEMA IF NOT EXISTS "public"; + +-- CreateEnum +CREATE TYPE "UserRole" AS ENUM ('SUPER_ADMIN', 'INFLUENCE_ADMIN', 'MAP_ADMIN', 'BROADCAST_ADMIN', 'CONTENT_ADMIN', 'MEDIA_ADMIN', 'PAYMENTS_ADMIN', 'EVENTS_ADMIN', 'SOCIAL_ADMIN', 'POLLS_ADMIN', 'ANALYTICS_ADMIN', 'USER', 'TEMP'); + +-- CreateEnum +CREATE TYPE "UserStatus" AS ENUM ('ACTIVE', 'INACTIVE', 'SUSPENDED', 'EXPIRED', 'PENDING_VERIFICATION', 'PENDING_APPROVAL'); + +-- CreateEnum +CREATE TYPE "UserCreatedVia" AS ENUM ('ADMIN', 'PUBLIC_SHIFT_SIGNUP', 'STANDARD', 'SELF_REGISTRATION', 'QUICK_JOIN_INVITE'); + +-- CreateEnum +CREATE TYPE "CampaignStatus" AS ENUM ('DRAFT', 'ACTIVE', 'PAUSED', 'ARCHIVED'); + -- CreateEnum CREATE TYPE "CampaignModerationStatus" AS ENUM ('PENDING_REVIEW', 'APPROVED', 'REJECTED', 'CHANGES_REQUESTED'); +-- CreateEnum +CREATE TYPE "GovernmentLevel" AS ENUM ('FEDERAL', 'PROVINCIAL', 'MUNICIPAL', 'SCHOOL_BOARD'); + +-- CreateEnum +CREATE TYPE "PetitionStatus" AS ENUM ('DRAFT', 'ACTIVE', 'PAUSED', 'CLOSED', 'ARCHIVED'); + +-- CreateEnum +CREATE TYPE "PetitionSignatureStatus" AS ENUM ('PENDING_VERIFICATION', 'VERIFIED', 'UNVERIFIED', 'REJECTED'); + +-- CreateEnum +CREATE TYPE "EmailMethod" AS ENUM ('SMTP', 'MAILTO'); + +-- CreateEnum +CREATE TYPE "CampaignEmailStatus" AS ENUM ('QUEUED', 'SENT', 'FAILED', 'CLICKED', 'USER_INFO_CAPTURED'); + +-- CreateEnum +CREATE TYPE "ResponseType" AS ENUM ('EMAIL', 'LETTER', 'PHONE_CALL', 'MEETING', 'SOCIAL_MEDIA', 'OTHER'); + +-- CreateEnum +CREATE TYPE "ResponseStatus" AS ENUM ('PENDING', 'APPROVED', 'REJECTED'); + +-- CreateEnum +CREATE TYPE "SupportLevel" AS ENUM ('1', '2', '3', '4'); + +-- CreateEnum +CREATE TYPE "GeocodeProvider" AS ENUM ('GOOGLE', 'MAPBOX', 'NOMINATIM', 'PHOTON', 'LOCATIONIQ', 'ARCGIS', 'UNKNOWN'); + -- CreateEnum CREATE TYPE "BuildingType" AS ENUM ('SINGLE_FAMILY', 'MULTI_UNIT', 'MIXED_USE', 'COMMERCIAL'); -- CreateEnum CREATE TYPE "LocationHistoryAction" AS ENUM ('CREATED', 'UPDATED', 'GEOCODED', 'BULK_GEOCODED', 'MOVED_ON_MAP', 'IMPORTED_CSV', 'IMPORTED_NAR'); +-- CreateEnum +CREATE TYPE "ShiftStatus" AS ENUM ('OPEN', 'FULL', 'CANCELLED'); + -- CreateEnum CREATE TYPE "RecurrenceFrequency" AS ENUM ('DAILY', 'WEEKLY', 'MONTHLY'); +-- CreateEnum +CREATE TYPE "SignupStatus" AS ENUM ('CONFIRMED', 'CANCELLED'); + +-- CreateEnum +CREATE TYPE "SignupSource" AS ENUM ('AUTHENTICATED', 'PUBLIC', 'ADMIN', 'POLL_CONVERSION'); + +-- CreateEnum +CREATE TYPE "ShiftKind" AS ENUM ('CANVASS', 'TRAINING', 'EVENT_STAFFING', 'PHONE_BANK', 'OTHER'); + +-- CreateEnum +CREATE TYPE "CutCategory" AS ENUM ('CUSTOM', 'WARD', 'NEIGHBORHOOD', 'DISTRICT'); + -- CreateEnum CREATE TYPE "EmailTemplateCategory" AS ENUM ('INFLUENCE', 'MAP', 'SYSTEM', 'PAYMENT'); -- CreateEnum CREATE TYPE "EmailTemplateVariableType" AS ENUM ('TEXT', 'VIDEO'); +-- CreateEnum +CREATE TYPE "EditorMode" AS ENUM ('VISUAL', 'CODE'); + +-- CreateEnum +CREATE TYPE "MkdocsExportMode" AS ENUM ('THEMED', 'STANDALONE'); + +-- CreateEnum +CREATE TYPE "VisitOutcome" AS ENUM ('NOT_HOME', 'REFUSED', 'MOVED', 'ALREADY_VOTED', 'SPOKE_WITH', 'LEFT_LITERATURE', 'COME_BACK_LATER'); + +-- CreateEnum +CREATE TYPE "CanvassSessionStatus" AS ENUM ('ACTIVE', 'COMPLETED', 'ABANDONED'); + +-- CreateEnum +CREATE TYPE "TrackPointEvent" AS ENUM ('LOCATION_ADDED', 'VISIT_RECORDED', 'SESSION_STARTED', 'SESSION_ENDED'); + -- CreateEnum CREATE TYPE "DirectoryType" AS ENUM ('studios', 'gifs', 'private', 'inbox', 'curated', 'playback', 'compilations', 'videos', 'highlights'); @@ -101,10 +173,13 @@ CREATE TYPE "PaymentMethod" AS ENUM ('card', 'bank_transfer', 'crypto', 'stripe' CREATE TYPE "ProductType" AS ENUM ('DIGITAL', 'EVENT', 'DONATION'); -- CreateEnum -CREATE TYPE "OrderStatus" AS ENUM ('PENDING', 'COMPLETED', 'FAILED', 'REFUNDED'); +CREATE TYPE "OrderStatus" AS ENUM ('PENDING', 'COMPLETED', 'FAILED', 'REFUNDED', 'DISPUTED'); -- CreateEnum -CREATE TYPE "NotificationType" AS ENUM ('friend_request', 'friend_accepted', 'poke', 'comment', 'upload_approved', 'upload_rejected', 'achievement', 'system'); +CREATE TYPE "NotificationType" AS ENUM ('friend_request', 'friend_accepted', 'poke', 'comment', 'upload_approved', 'upload_rejected', 'achievement', 'system', 'group_call', 'impact_story', 'referral_completed', 'challenge_update', 'shared_view_invite', 'shared_view_accepted', 'calendar_event_invite', 'shift_signup_confirmed', 'shift_reminder', 'shift_cancelled', 'canvass_session_summary', 'reengagement', 'poll_closed', 'poll_results_available', 'poll_challenge'); + +-- CreateEnum +CREATE TYPE "SocialGroupType" AS ENUM ('SHIFT_TEAM', 'CAMPAIGN_TEAM', 'CUSTOM'); -- CreateEnum CREATE TYPE "DonationPageStatus" AS ENUM ('DRAFT', 'ACTIVE', 'PAUSED', 'ARCHIVED'); @@ -131,122 +206,432 @@ CREATE TYPE "SmsResponseType" AS ENUM ('POSITIVE', 'NEGATIVE', 'QUESTION', 'OPT_ CREATE TYPE "SmsConversationStatus" AS ENUM ('ACTIVE', 'OPTED_OUT', 'CLOSED'); -- CreateEnum -CREATE TYPE "ContactSource" AS ENUM ('USER', 'ADDRESS_OCCUPANT', 'CAMPAIGN_SENDER', 'SHIFT_SIGNUP', 'SMS_CONTACT', 'DONATION', 'MANUAL'); +CREATE TYPE "ContactSource" AS ENUM ('USER', 'ADDRESS_OCCUPANT', 'CAMPAIGN_SENDER', 'SHIFT_SIGNUP', 'SMS_CONTACT', 'DONATION', 'POLL_VOTE', 'PETITION_SIGNER', 'MANUAL'); -- CreateEnum CREATE TYPE "ConnectionType" AS ENUM ('HOUSEHOLD', 'FAMILY', 'COLLEAGUE', 'REFERRED_BY', 'CUSTOM'); -- CreateEnum -CREATE TYPE "ContactActivityType" AS ENUM ('EMAIL_SENT', 'RESPONSE_SUBMITTED', 'SHIFT_SIGNUP', 'CANVASS_VISIT', 'DONATION', 'PURCHASE', 'SMS_SENT', 'SMS_RECEIVED', 'VIDEO_VIEW', 'NOTE_ADDED', 'CONTACT_MERGED', 'PROFILE_SELF_EDIT', 'PROFILE_PHOTO_UPDATED', 'USER_LOGIN'); +CREATE TYPE "ContactActivityType" AS ENUM ('EMAIL_SENT', 'RESPONSE_SUBMITTED', 'SHIFT_SIGNUP', 'CANVASS_VISIT', 'DONATION', 'PURCHASE', 'SMS_SENT', 'SMS_RECEIVED', 'VIDEO_VIEW', 'NOTE_ADDED', 'CONTACT_MERGED', 'PROFILE_SELF_EDIT', 'PROFILE_PHOTO_UPDATED', 'USER_LOGIN', 'POLL_VOTED', 'PETITION_SIGNED'); --- AlterEnum -ALTER TYPE "UserCreatedVia" ADD VALUE 'SELF_REGISTRATION'; +-- CreateEnum +CREATE TYPE "SchedulingPollStatus" AS ENUM ('OPEN', 'CLOSED', 'FINALIZED', 'CANCELLED'); --- AlterEnum --- This migration adds more than one value to an enum. --- With PostgreSQL versions 11 and earlier, this is not possible --- in a single migration. This can be worked around by creating --- multiple migrations, each migration adding only one value to --- the enum. +-- CreateEnum +CREATE TYPE "PollVoteValue" AS ENUM ('YES', 'IF_NEED_BE', 'NO'); +-- CreateEnum +CREATE TYPE "ImpactStoryType" AS ENUM ('MILESTONE', 'VICTORY', 'RESPONSE', 'CUSTOM'); -ALTER TYPE "UserStatus" ADD VALUE 'PENDING_VERIFICATION'; -ALTER TYPE "UserStatus" ADD VALUE 'PENDING_APPROVAL'; +-- CreateEnum +CREATE TYPE "ImpactStoryStatus" AS ENUM ('DRAFT', 'PUBLISHED', 'ARCHIVED'); --- DropForeignKey -ALTER TABLE "canvass_visits" DROP CONSTRAINT "canvass_visits_locationId_fkey"; +-- CreateEnum +CREATE TYPE "SpotlightStatus" AS ENUM ('NOMINATED', 'APPROVED', 'FEATURED', 'ARCHIVED'); --- DropIndex -DROP INDEX "canvass_visits_locationId_idx"; +-- CreateEnum +CREATE TYPE "ChallengeStatus" AS ENUM ('DRAFT', 'UPCOMING', 'ACTIVE', 'COMPLETED', 'CANCELLED'); --- AlterTable -ALTER TABLE "campaigns" ADD COLUMN "coverVideoId" INTEGER, -ADD COLUMN "isUserGenerated" BOOLEAN NOT NULL DEFAULT false, -ADD COLUMN "moderationNotes" TEXT, -ADD COLUMN "moderationStatus" "CampaignModerationStatus", -ADD COLUMN "rejectionReason" TEXT, -ADD COLUMN "reviewedAt" TIMESTAMP(3), -ADD COLUMN "reviewedByUserId" TEXT; +-- CreateEnum +CREATE TYPE "ChallengeMetric" AS ENUM ('DOORS_KNOCKED', 'EMAILS_SENT', 'SHIFTS_ATTENDED', 'RESPONSES_SUBMITTED', 'REFERRALS_MADE'); --- AlterTable -ALTER TABLE "canvass_visits" DROP COLUMN "locationId", -ADD COLUMN "addressId" TEXT NOT NULL; +-- CreateEnum +CREATE TYPE "TicketedEventStatus" AS ENUM ('DRAFT', 'PENDING_APPROVAL', 'PUBLISHED', 'CANCELLED', 'COMPLETED'); --- AlterTable -ALTER TABLE "landing_pages" ADD COLUMN "mkdocsSkipExport" BOOLEAN NOT NULL DEFAULT false; +-- CreateEnum +CREATE TYPE "TicketedEventVisibility" AS ENUM ('PUBLIC', 'UNLISTED', 'PRIVATE'); --- AlterTable -ALTER TABLE "locations" DROP COLUMN "email", -DROP COLUMN "firstName", -DROP COLUMN "lastName", -DROP COLUMN "notes", -DROP COLUMN "phone", -DROP COLUMN "sign", -DROP COLUMN "signSize", -DROP COLUMN "supportLevel", -DROP COLUMN "unitNumber", -ADD COLUMN "buildingNotes" TEXT, -ADD COLUMN "buildingType" "BuildingType" NOT NULL DEFAULT 'SINGLE_FAMILY', -ADD COLUMN "locGuid" TEXT, -ADD COLUMN "totalUnits" INTEGER NOT NULL DEFAULT 1, -ALTER COLUMN "latitude" SET NOT NULL, -ALTER COLUMN "longitude" SET NOT NULL, -ALTER COLUMN "address" SET NOT NULL; +-- CreateEnum +CREATE TYPE "TicketTierType" AS ENUM ('PAID', 'FREE', 'DONATION'); --- AlterTable -ALTER TABLE "map_settings" ADD COLUMN "publicMapEnabled" BOOLEAN NOT NULL DEFAULT true, -ADD COLUMN "publicShowAddresses" BOOLEAN NOT NULL DEFAULT true, -ADD COLUMN "publicShowCuts" BOOLEAN NOT NULL DEFAULT true, -ADD COLUMN "publicShowEvents" BOOLEAN NOT NULL DEFAULT true, -ADD COLUMN "publicShowLocations" BOOLEAN NOT NULL DEFAULT true, -ADD COLUMN "publicShowSignInfo" BOOLEAN NOT NULL DEFAULT true, -ADD COLUMN "publicShowSupportLevels" BOOLEAN NOT NULL DEFAULT true; +-- CreateEnum +CREATE TYPE "TicketStatus" AS ENUM ('VALID', 'CHECKED_IN', 'CANCELLED', 'REFUNDED'); --- AlterTable -ALTER TABLE "shifts" ADD COLUMN "isException" BOOLEAN NOT NULL DEFAULT false, -ADD COLUMN "seriesId" TEXT; +-- CreateEnum +CREATE TYPE "EventFormat" AS ENUM ('IN_PERSON', 'ONLINE', 'HYBRID'); --- AlterTable -ALTER TABLE "site_settings" ADD COLUMN "autoApproveVerifiedUsers" BOOLEAN NOT NULL DEFAULT true, -ADD COLUMN "auto_sync_people_to_map" BOOLEAN NOT NULL DEFAULT false, -ADD COLUMN "enableEmailVerification" BOOLEAN NOT NULL DEFAULT true, -ADD COLUMN "enablePayments" BOOLEAN NOT NULL DEFAULT false, -ADD COLUMN "enablePublicRegistration" BOOLEAN NOT NULL DEFAULT true, -ADD COLUMN "enable_chat" BOOLEAN NOT NULL DEFAULT false, -ADD COLUMN "enable_docs_comments" BOOLEAN NOT NULL DEFAULT false, -ADD COLUMN "enable_gallery_ads" BOOLEAN NOT NULL DEFAULT false, -ADD COLUMN "enable_media_features" BOOLEAN NOT NULL DEFAULT true, -ADD COLUMN "enable_people" BOOLEAN NOT NULL DEFAULT false, -ADD COLUMN "enable_sms" BOOLEAN NOT NULL DEFAULT false, -ADD COLUMN "enable_user_provisioning" BOOLEAN NOT NULL DEFAULT false, -ADD COLUMN "giteaApiToken" TEXT NOT NULL DEFAULT '', -ADD COLUMN "giteaCommentsRepoName" TEXT NOT NULL DEFAULT 'docs-comments', -ADD COLUMN "giteaCommentsRepoOwner" TEXT NOT NULL DEFAULT '', -ADD COLUMN "giteaOauthClientId" TEXT NOT NULL DEFAULT '', -ADD COLUMN "giteaOauthClientSecret" TEXT NOT NULL DEFAULT '', -ADD COLUMN "nav_config" JSONB, -ADD COLUMN "notifyAdminResponseSubmitted" BOOLEAN NOT NULL DEFAULT true, -ADD COLUMN "notifyAdminShiftSignup" BOOLEAN NOT NULL DEFAULT true, -ADD COLUMN "notifyAdminSignRequested" BOOLEAN NOT NULL DEFAULT true, -ADD COLUMN "notifyVolunteerCancellation" BOOLEAN NOT NULL DEFAULT true, -ADD COLUMN "notifyVolunteerSessionSummary" BOOLEAN NOT NULL DEFAULT true, -ADD COLUMN "notifyVolunteerShiftReminder" BOOLEAN NOT NULL DEFAULT true, -ADD COLUMN "provision_gitea" BOOLEAN NOT NULL DEFAULT false, -ADD COLUMN "provision_gitea_timing" TEXT NOT NULL DEFAULT 'lazy', -ADD COLUMN "provision_listmonk" BOOLEAN NOT NULL DEFAULT true, -ADD COLUMN "provision_listmonk_timing" TEXT NOT NULL DEFAULT 'eager', -ADD COLUMN "provision_vaultwarden" BOOLEAN NOT NULL DEFAULT false, -ADD COLUMN "provision_vaultwarden_timing" TEXT NOT NULL DEFAULT 'lazy', -ADD COLUMN "sms_tailscale_api_key" TEXT NOT NULL DEFAULT '', -ADD COLUMN "sms_tailscale_device_id" TEXT NOT NULL DEFAULT '', -ADD COLUMN "sms_tailscale_device_name" TEXT NOT NULL DEFAULT '', -ADD COLUMN "sms_tailscale_tailnet" TEXT NOT NULL DEFAULT '', -ADD COLUMN "sms_termux_api_key" TEXT NOT NULL DEFAULT '', -ADD COLUMN "sms_termux_api_url" TEXT NOT NULL DEFAULT '', -ADD COLUMN "smtpActiveProvider" TEXT NOT NULL DEFAULT 'mailhog'; +-- CreateEnum +CREATE TYPE "CalendarLayerType" AS ENUM ('SYSTEM', 'USER', 'EXTERNAL'); --- AlterTable -ALTER TABLE "users" ADD COLUMN "roles" JSONB NOT NULL DEFAULT '[]'; +-- CreateEnum +CREATE TYPE "CalendarSystemType" AS ENUM ('SHIFTS', 'TICKETS', 'POLLS', 'PUBLIC_EVENTS'); + +-- CreateEnum +CREATE TYPE "CalendarVisibility" AS ENUM ('PRIVATE', 'FRIENDS', 'PUBLIC'); + +-- CreateEnum +CREATE TYPE "CalendarItemType" AS ENUM ('EVENT', 'TIME_BLOCK', 'REMINDER'); + +-- CreateEnum +CREATE TYPE "CalendarBusyStatus" AS ENUM ('BUSY', 'TENTATIVE', 'FREE'); + +-- CreateEnum +CREATE TYPE "CalendarShowDetailsTo" AS ENUM ('NOBODY', 'FRIENDS', 'EVERYONE'); + +-- CreateEnum +CREATE TYPE "CalendarItemSource" AS ENUM ('MANUAL', 'ICS_FEED', 'POLL', 'SHIFT', 'MEETING', 'TICKETED_EVENT'); + +-- CreateEnum +CREATE TYPE "CalendarRecurrenceFrequency" AS ENUM ('DAILY', 'WEEKLY', 'BIWEEKLY', 'MONTHLY'); + +-- CreateEnum +CREATE TYPE "CalendarFeedStatus" AS ENUM ('OK', 'ERROR', 'PENDING'); + +-- CreateEnum +CREATE TYPE "CalendarFeedInterval" AS ENUM ('FIFTEEN_MIN', 'HOURLY', 'SIX_HOUR', 'DAILY'); + +-- CreateEnum +CREATE TYPE "SharedViewType" AS ENUM ('MANUAL', 'ROLE_BASED'); + +-- CreateEnum +CREATE TYPE "SharedViewScope" AS ENUM ('MEMBERS', 'PUBLIC'); + +-- CreateEnum +CREATE TYPE "SharedViewMemberStatus" AS ENUM ('INVITED', 'ACCEPTED', 'DECLINED'); + +-- CreateEnum +CREATE TYPE "DocShareLinkStatus" AS ENUM ('ACTIVE', 'REVOKED', 'EXPIRED'); + +-- CreateEnum +CREATE TYPE "StrawPollType" AS ENUM ('SINGLE_CHOICE', 'YES_NO_ABSTAIN'); + +-- CreateEnum +CREATE TYPE "StrawPollStatus" AS ENUM ('DRAFT', 'ACTIVE', 'CLOSED', 'ARCHIVED'); + +-- CreateEnum +CREATE TYPE "StrawPollIdentityMode" AS ENUM ('ANONYMOUS', 'TOKEN_GATED', 'AUTHENTICATED', 'MIXED'); + +-- CreateEnum +CREATE TYPE "StrawPollResultVisibility" AS ENUM ('LIVE', 'AFTER_VOTE', 'AFTER_CLOSE', 'CREATOR_ONLY', 'PUBLIC_ALWAYS'); + +-- CreateEnum +CREATE TYPE "ActionStepKind" AS ENUM ('WATCH_VIDEO', 'SUBMIT_INFLUENCE', 'SIGN_PETITION', 'RSVP_EVENT', 'SIGNUP_SHIFT', 'JOIN_CHALLENGE', 'VISIT_LINK', 'CUSTOM'); + +-- CreateEnum +CREATE TYPE "ActionStepCompletionSource" AS ENUM ('AUTO', 'SELF_REPORTED'); + +-- CreateTable +CREATE TABLE "users" ( + "id" TEXT NOT NULL, + "email" TEXT NOT NULL, + "password" TEXT NOT NULL, + "name" TEXT, + "phone" TEXT, + "pronouns" TEXT, + "role" "UserRole" NOT NULL DEFAULT 'USER', + "roles" JSONB NOT NULL DEFAULT '[]', + "status" "UserStatus" NOT NULL DEFAULT 'ACTIVE', + "permissions" JSONB, + "createdVia" "UserCreatedVia" NOT NULL DEFAULT 'STANDARD', + "expiresAt" TIMESTAMP(3), + "expireDays" INTEGER, + "lastLoginAt" TIMESTAMP(3), + "emailVerified" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "users_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "refresh_tokens" ( + "id" TEXT NOT NULL, + "token" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "expiresAt" TIMESTAMP(3) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "refresh_tokens_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "campaigns" ( + "id" TEXT NOT NULL, + "slug" TEXT NOT NULL, + "title" TEXT NOT NULL, + "description" TEXT, + "emailSubject" TEXT NOT NULL, + "emailBody" TEXT NOT NULL, + "callToAction" TEXT, + "coverPhoto" TEXT, + "coverVideoId" INTEGER, + "status" "CampaignStatus" NOT NULL DEFAULT 'DRAFT', + "allowSmtpEmail" BOOLEAN NOT NULL DEFAULT true, + "allowMailtoLink" BOOLEAN NOT NULL DEFAULT true, + "collectUserInfo" BOOLEAN NOT NULL DEFAULT true, + "showEmailCount" BOOLEAN NOT NULL DEFAULT true, + "showCallCount" BOOLEAN NOT NULL DEFAULT true, + "allowEmailEditing" BOOLEAN NOT NULL DEFAULT false, + "allowCustomRecipients" BOOLEAN NOT NULL DEFAULT false, + "showResponseWall" BOOLEAN NOT NULL DEFAULT false, + "highlightCampaign" BOOLEAN NOT NULL DEFAULT false, + "targetGovernmentLevels" "GovernmentLevel"[], + "createdByUserId" TEXT, + "createdByUserEmail" TEXT, + "createdByUserName" TEXT, + "isUserGenerated" BOOLEAN NOT NULL DEFAULT false, + "moderationStatus" "CampaignModerationStatus", + "reviewedByUserId" TEXT, + "reviewedAt" TIMESTAMP(3), + "rejectionReason" TEXT, + "moderationNotes" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "campaigns_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "petitions" ( + "id" TEXT NOT NULL, + "slug" TEXT NOT NULL, + "title" TEXT NOT NULL, + "description" TEXT, + "signatureGoal" INTEGER, + "showProgress" BOOLEAN NOT NULL DEFAULT true, + "showSignatureCount" BOOLEAN NOT NULL DEFAULT true, + "showSignerNames" BOOLEAN NOT NULL DEFAULT true, + "signatureCountOffset" INTEGER NOT NULL DEFAULT 0, + "requireName" BOOLEAN NOT NULL DEFAULT true, + "requireEmail" BOOLEAN NOT NULL DEFAULT true, + "requirePostalCode" BOOLEAN NOT NULL DEFAULT false, + "requirePhone" BOOLEAN NOT NULL DEFAULT false, + "allowComment" BOOLEAN NOT NULL DEFAULT true, + "commentLabel" TEXT, + "requireEmailConfirmation" BOOLEAN NOT NULL DEFAULT false, + "confirmationEmailSubject" TEXT, + "confirmationEmailBody" TEXT, + "coverPhoto" TEXT, + "coverVideoId" INTEGER, + "callToAction" TEXT, + "thankYouMessage" TEXT, + "highlightPetition" BOOLEAN NOT NULL DEFAULT false, + "linkedCampaignId" TEXT, + "status" "PetitionStatus" NOT NULL DEFAULT 'DRAFT', + "isUserGenerated" BOOLEAN NOT NULL DEFAULT false, + "moderationStatus" "CampaignModerationStatus", + "rejectionReason" TEXT, + "moderationNotes" TEXT, + "createdByUserId" TEXT, + "createdByUserEmail" TEXT, + "createdByUserName" TEXT, + "reviewedByUserId" TEXT, + "reviewedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "petitions_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "petition_signatures" ( + "id" TEXT NOT NULL, + "petitionId" TEXT NOT NULL, + "signerName" TEXT, + "signerEmail" TEXT, + "signerPostalCode" TEXT, + "signerPhone" TEXT, + "signerComment" TEXT, + "isAnonymous" BOOLEAN NOT NULL DEFAULT false, + "displayName" TEXT, + "status" "PetitionSignatureStatus" NOT NULL DEFAULT 'UNVERIFIED', + "verificationToken" TEXT, + "verificationSentAt" TIMESTAMP(3), + "verifiedAt" TIMESTAMP(3), + "contactId" TEXT, + "signerIp" TEXT, + "geoCountry" TEXT, + "geoRegion" TEXT, + "geoCity" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "petition_signatures_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "representatives" ( + "id" TEXT NOT NULL, + "postalCode" TEXT NOT NULL, + "name" TEXT, + "email" TEXT, + "districtName" TEXT, + "electedOffice" TEXT, + "partyName" TEXT, + "representativeSetName" TEXT, + "url" TEXT, + "photoUrl" TEXT, + "offices" JSONB, + "cachedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "representatives_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "campaign_emails" ( + "id" TEXT NOT NULL, + "campaignId" TEXT NOT NULL, + "campaignSlug" TEXT NOT NULL, + "userId" TEXT, + "userEmail" TEXT, + "userName" TEXT, + "userPostalCode" TEXT, + "recipientEmail" TEXT NOT NULL, + "recipientName" TEXT, + "recipientTitle" TEXT, + "recipientLevel" "GovernmentLevel", + "emailMethod" "EmailMethod" NOT NULL, + "subject" TEXT NOT NULL, + "message" TEXT NOT NULL, + "status" "CampaignEmailStatus" NOT NULL DEFAULT 'SENT', + "senderIp" TEXT, + "sentAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "campaign_emails_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "representative_responses" ( + "id" TEXT NOT NULL, + "campaignId" TEXT NOT NULL, + "campaignSlug" TEXT NOT NULL, + "representativeName" TEXT NOT NULL, + "representativeTitle" TEXT, + "representativeLevel" "GovernmentLevel" NOT NULL, + "representativeEmail" TEXT, + "responseType" "ResponseType" NOT NULL, + "responseText" TEXT NOT NULL, + "userComment" TEXT, + "screenshotUrl" TEXT, + "submittedByUserId" TEXT, + "submittedByName" TEXT, + "submittedByEmail" TEXT, + "isAnonymous" BOOLEAN NOT NULL DEFAULT false, + "status" "ResponseStatus" NOT NULL DEFAULT 'PENDING', + "isVerified" BOOLEAN NOT NULL DEFAULT false, + "verificationToken" TEXT, + "verificationSentAt" TIMESTAMP(3), + "verifiedAt" TIMESTAMP(3), + "verifiedBy" TEXT, + "upvoteCount" INTEGER NOT NULL DEFAULT 0, + "submittedIp" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "representative_responses_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "response_upvotes" ( + "id" TEXT NOT NULL, + "responseId" TEXT NOT NULL, + "userId" TEXT, + "userEmail" TEXT, + "upvotedIp" TEXT, + + CONSTRAINT "response_upvotes_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "custom_recipients" ( + "id" TEXT NOT NULL, + "campaignId" TEXT NOT NULL, + "campaignSlug" TEXT NOT NULL, + "recipientName" TEXT NOT NULL, + "recipientEmail" TEXT NOT NULL, + "recipientTitle" TEXT, + "recipientOrganization" TEXT, + "notes" TEXT, + "isActive" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "custom_recipients_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "postal_code_cache" ( + "id" TEXT NOT NULL, + "postalCode" TEXT NOT NULL, + "city" TEXT, + "province" TEXT, + "centroidLat" DECIMAL(10,8), + "centroidLng" DECIMAL(11,8), + "lastUpdated" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "postal_code_cache_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "email_logs" ( + "id" TEXT NOT NULL, + "recipientEmail" TEXT NOT NULL, + "senderName" TEXT NOT NULL, + "senderEmail" TEXT NOT NULL, + "subject" TEXT, + "message" TEXT, + "postalCode" TEXT, + "status" TEXT NOT NULL DEFAULT 'sent', + "senderIp" TEXT, + "sentAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "email_logs_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "email_verifications" ( + "id" TEXT NOT NULL, + "token" TEXT NOT NULL, + "email" TEXT NOT NULL, + "tempCampaignData" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "expiresAt" TIMESTAMP(3) NOT NULL, + "used" BOOLEAN NOT NULL DEFAULT false, + + CONSTRAINT "email_verifications_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "calls" ( + "id" TEXT NOT NULL, + "representativeName" TEXT NOT NULL, + "representativeTitle" TEXT, + "phoneNumber" TEXT NOT NULL, + "officeType" TEXT, + "callerName" TEXT, + "callerEmail" TEXT, + "postalCode" TEXT, + "campaignId" TEXT, + "campaignSlug" TEXT, + "callerIp" TEXT, + "calledAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "calls_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "locations" ( + "id" TEXT NOT NULL, + "latitude" DECIMAL(10,8) NOT NULL, + "longitude" DECIMAL(11,8) NOT NULL, + "address" TEXT NOT NULL, + "postalCode" TEXT, + "province" TEXT, + "federalDistrict" TEXT, + "buildingUse" INTEGER, + "locGuid" TEXT, + "buildingType" "BuildingType" NOT NULL DEFAULT 'SINGLE_FAMILY', + "totalUnits" INTEGER NOT NULL DEFAULT 1, + "buildingNotes" TEXT, + "geocodeConfidence" INTEGER, + "geocodeProvider" "GeocodeProvider", + "createdByUserId" TEXT, + "updatedByUserId" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "locations_pkey" PRIMARY KEY ("id") +); -- CreateTable CREATE TABLE "addresses" ( @@ -285,6 +670,49 @@ CREATE TABLE "location_history" ( CONSTRAINT "location_history_pkey" PRIMARY KEY ("id") ); +-- CreateTable +CREATE TABLE "shifts" ( + "id" TEXT NOT NULL, + "title" TEXT NOT NULL, + "description" TEXT, + "date" DATE NOT NULL, + "startTime" TEXT NOT NULL, + "endTime" TEXT NOT NULL, + "location" TEXT, + "maxVolunteers" INTEGER NOT NULL, + "currentVolunteers" INTEGER NOT NULL DEFAULT 0, + "status" "ShiftStatus" NOT NULL DEFAULT 'OPEN', + "kind" "ShiftKind" NOT NULL DEFAULT 'CANVASS', + "isPublic" BOOLEAN NOT NULL DEFAULT false, + "cutId" TEXT, + "ticketed_event_id" TEXT, + "seriesId" TEXT, + "isException" BOOLEAN NOT NULL DEFAULT false, + "gancioEventId" INTEGER, + "meetingId" TEXT, + "createdBy" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "shifts_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "shift_signups" ( + "id" TEXT NOT NULL, + "shiftId" TEXT NOT NULL, + "shiftTitle" TEXT, + "userId" TEXT, + "userEmail" TEXT NOT NULL, + "userName" TEXT, + "userPhone" TEXT, + "signupDate" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "status" "SignupStatus" NOT NULL DEFAULT 'CONFIRMED', + "signupSource" "SignupSource" NOT NULL DEFAULT 'AUTHENTICATED', + + CONSTRAINT "shift_signups_pkey" PRIMARY KEY ("id") +); + -- CreateTable CREATE TABLE "shift_series" ( "id" TEXT NOT NULL, @@ -307,6 +735,162 @@ CREATE TABLE "shift_series" ( CONSTRAINT "shift_series_pkey" PRIMARY KEY ("id") ); +-- CreateTable +CREATE TABLE "cuts" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "description" TEXT, + "color" TEXT NOT NULL DEFAULT '#3388ff', + "opacity" DECIMAL(3,2) NOT NULL DEFAULT 0.3, + "category" "CutCategory", + "isPublic" BOOLEAN NOT NULL DEFAULT false, + "isOfficial" BOOLEAN NOT NULL DEFAULT false, + "geojson" TEXT NOT NULL, + "bounds" TEXT, + "showLocations" BOOLEAN NOT NULL DEFAULT true, + "exportEnabled" BOOLEAN NOT NULL DEFAULT true, + "assignedTo" TEXT, + "filterSettings" JSONB, + "lastCanvassed" TIMESTAMP(3), + "completionPercentage" INTEGER NOT NULL DEFAULT 0, + "createdByUserId" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "cuts_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "map_settings" ( + "id" TEXT NOT NULL, + "latitude" DECIMAL(10,8), + "longitude" DECIMAL(11,8), + "zoom" INTEGER, + "walkSheetTitle" TEXT, + "walkSheetSubtitle" TEXT, + "walkSheetFooter" TEXT, + "qrCode1Url" TEXT, + "qrCode1Label" TEXT, + "qrCode2Url" TEXT, + "qrCode2Label" TEXT, + "qrCode3Url" TEXT, + "qrCode3Label" TEXT, + "publicMapEnabled" BOOLEAN NOT NULL DEFAULT false, + "publicShowLocations" BOOLEAN NOT NULL DEFAULT true, + "publicShowSupportLevels" BOOLEAN NOT NULL DEFAULT true, + "publicShowCuts" BOOLEAN NOT NULL DEFAULT true, + "publicShowEvents" BOOLEAN NOT NULL DEFAULT true, + "publicShowAddresses" BOOLEAN NOT NULL DEFAULT true, + "publicShowSignInfo" BOOLEAN NOT NULL DEFAULT true, + "createdBy" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "map_settings_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "site_settings" ( + "id" TEXT NOT NULL, + "organizationName" TEXT NOT NULL DEFAULT 'Changemaker Lite', + "organizationShortName" TEXT NOT NULL DEFAULT 'CML', + "organizationLogoUrl" TEXT, + "organizationFaviconUrl" TEXT, + "adminColorPrimary" TEXT NOT NULL DEFAULT '#9d4edd', + "adminColorBgBase" TEXT NOT NULL DEFAULT '#1a1025', + "publicColorPrimary" TEXT NOT NULL DEFAULT '#3498db', + "publicColorBgBase" TEXT NOT NULL DEFAULT '#0d1b2a', + "publicColorBgContainer" TEXT NOT NULL DEFAULT '#1b2838', + "publicHeaderGradient" TEXT NOT NULL DEFAULT 'linear-gradient(135deg, #005a9c 0%, #007acc 100%)', + "footerText" TEXT NOT NULL DEFAULT 'Powered by Changemaker Lite', + "loginSubtitle" TEXT NOT NULL DEFAULT 'Admin', + "homepage_tagline" TEXT, + "emailFromName" TEXT NOT NULL DEFAULT 'Changemaker Lite', + "smtpHost" TEXT NOT NULL DEFAULT '', + "smtpPort" INTEGER NOT NULL DEFAULT 0, + "smtpUser" TEXT NOT NULL DEFAULT '', + "smtpPass" TEXT NOT NULL DEFAULT '', + "smtpFromAddress" TEXT NOT NULL DEFAULT '', + "smtpActiveProvider" TEXT NOT NULL DEFAULT 'mailhog', + "emailTestMode" BOOLEAN NOT NULL DEFAULT true, + "testEmailRecipient" TEXT NOT NULL DEFAULT '', + "enablePublicRegistration" BOOLEAN NOT NULL DEFAULT true, + "enableEmailVerification" BOOLEAN NOT NULL DEFAULT true, + "autoApproveVerifiedUsers" BOOLEAN NOT NULL DEFAULT true, + "enableInfluence" BOOLEAN NOT NULL DEFAULT true, + "enableMap" BOOLEAN NOT NULL DEFAULT false, + "enableNewsletter" BOOLEAN NOT NULL DEFAULT true, + "enableLandingPages" BOOLEAN NOT NULL DEFAULT true, + "enable_media_features" BOOLEAN NOT NULL DEFAULT true, + "enablePayments" BOOLEAN NOT NULL DEFAULT false, + "enable_gallery_ads" BOOLEAN NOT NULL DEFAULT false, + "enable_chat" BOOLEAN NOT NULL DEFAULT false, + "enable_events" BOOLEAN NOT NULL DEFAULT false, + "enable_docs_comments" BOOLEAN NOT NULL DEFAULT false, + "enable_sms" BOOLEAN NOT NULL DEFAULT false, + "enable_people" BOOLEAN NOT NULL DEFAULT false, + "enable_social" BOOLEAN NOT NULL DEFAULT false, + "enable_meet" BOOLEAN NOT NULL DEFAULT false, + "enable_meeting_planner" BOOLEAN NOT NULL DEFAULT false, + "enable_ticketed_events" BOOLEAN NOT NULL DEFAULT false, + "enable_social_calendar" BOOLEAN NOT NULL DEFAULT false, + "enable_polls" BOOLEAN NOT NULL DEFAULT false, + "enable_analytics" BOOLEAN NOT NULL DEFAULT false, + "analytics_retention_days" INTEGER NOT NULL DEFAULT 90, + "analytics_geo_enabled" BOOLEAN NOT NULL DEFAULT true, + "track_authenticated_users" BOOLEAN NOT NULL DEFAULT true, + "enable_petitions" BOOLEAN NOT NULL DEFAULT false, + "enable_docs_collaboration" BOOLEAN NOT NULL DEFAULT false, + "require_event_approval" BOOLEAN NOT NULL DEFAULT true, + "auto_sync_people_to_map" BOOLEAN NOT NULL DEFAULT false, + "sms_termux_api_url" TEXT NOT NULL DEFAULT '', + "sms_termux_api_key" TEXT NOT NULL DEFAULT '', + "sms_tailscale_api_key" TEXT NOT NULL DEFAULT '', + "sms_tailscale_tailnet" TEXT NOT NULL DEFAULT '', + "sms_tailscale_device_id" TEXT NOT NULL DEFAULT '', + "sms_tailscale_device_name" TEXT NOT NULL DEFAULT '', + "giteaApiToken" TEXT NOT NULL DEFAULT '', + "giteaCommentsRepoOwner" TEXT NOT NULL DEFAULT '', + "giteaCommentsRepoName" TEXT NOT NULL DEFAULT 'docs-comments', + "giteaOauthClientId" TEXT NOT NULL DEFAULT '', + "giteaOauthClientSecret" TEXT NOT NULL DEFAULT '', + "gitea_setup_complete" BOOLEAN NOT NULL DEFAULT false, + "notifyAdminShiftSignup" BOOLEAN NOT NULL DEFAULT true, + "notifyAdminResponseSubmitted" BOOLEAN NOT NULL DEFAULT true, + "notifyAdminSignRequested" BOOLEAN NOT NULL DEFAULT true, + "notify_admin_petition_milestone" BOOLEAN NOT NULL DEFAULT false, + "notifyAdminShiftCancellation" BOOLEAN NOT NULL DEFAULT true, + "notifyVolunteerSessionSummary" BOOLEAN NOT NULL DEFAULT true, + "notifyVolunteerCancellation" BOOLEAN NOT NULL DEFAULT true, + "notifyVolunteerShiftReminder" BOOLEAN NOT NULL DEFAULT true, + "notifyVolunteerShiftThankYou" BOOLEAN NOT NULL DEFAULT true, + "sms_shift_reminders" BOOLEAN NOT NULL DEFAULT false, + "sms_shift_reminder_hours" INTEGER NOT NULL DEFAULT 24, + "sms_shift_signup_confirm" BOOLEAN NOT NULL DEFAULT false, + "sms_volunteer_welcome" BOOLEAN NOT NULL DEFAULT false, + "notify_volunteer_reengagement" BOOLEAN NOT NULL DEFAULT false, + "reengagement_inactive_days" INTEGER NOT NULL DEFAULT 30, + "reengagement_cooldown_days" INTEGER NOT NULL DEFAULT 30, + "enable_auto_upgrade" BOOLEAN NOT NULL DEFAULT false, + "auto_upgrade_schedule" TEXT NOT NULL DEFAULT 'daily-3am', + "auto_upgrade_pull_services" BOOLEAN NOT NULL DEFAULT false, + "notify_admin_auto_upgrade" BOOLEAN NOT NULL DEFAULT true, + "use_registry_for_upgrade" BOOLEAN NOT NULL DEFAULT false, + "gitea_registry_url" TEXT NOT NULL DEFAULT 'gitea.bnkops.com/admin', + "nav_config" JSONB, + "enable_user_provisioning" BOOLEAN NOT NULL DEFAULT false, + "provision_gitea" BOOLEAN NOT NULL DEFAULT false, + "provision_gitea_timing" TEXT NOT NULL DEFAULT 'lazy', + "provision_vaultwarden" BOOLEAN NOT NULL DEFAULT false, + "provision_vaultwarden_timing" TEXT NOT NULL DEFAULT 'lazy', + "provision_listmonk" BOOLEAN NOT NULL DEFAULT true, + "provision_listmonk_timing" TEXT NOT NULL DEFAULT 'eager', + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "site_settings_pkey" PRIMARY KEY ("id") +); + -- CreateTable CREATE TABLE "email_templates" ( "id" TEXT NOT NULL, @@ -374,6 +958,112 @@ CREATE TABLE "email_template_test_logs" ( CONSTRAINT "email_template_test_logs_pkey" PRIMARY KEY ("id") ); +-- CreateTable +CREATE TABLE "landing_pages" ( + "id" TEXT NOT NULL, + "slug" TEXT NOT NULL, + "title" TEXT NOT NULL, + "description" TEXT, + "blocks" JSONB NOT NULL, + "htmlOutput" TEXT, + "cssOutput" TEXT, + "editorMode" "EditorMode" NOT NULL DEFAULT 'VISUAL', + "mkdocsPath" TEXT, + "mkdocsStubPath" TEXT, + "mkdocsExportMode" "MkdocsExportMode" NOT NULL DEFAULT 'THEMED', + "mkdocsHideNav" BOOLEAN NOT NULL DEFAULT true, + "mkdocsHideToc" BOOLEAN NOT NULL DEFAULT true, + "mkdocsSkipExport" BOOLEAN NOT NULL DEFAULT false, + "published" BOOLEAN NOT NULL DEFAULT false, + "listed" BOOLEAN NOT NULL DEFAULT false, + "seoTitle" TEXT, + "seoDescription" TEXT, + "seoImage" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "landing_pages_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "page_blocks" ( + "id" TEXT NOT NULL, + "type" TEXT NOT NULL, + "label" TEXT NOT NULL, + "schema" JSONB NOT NULL, + "defaults" JSONB NOT NULL, + "thumbnail" TEXT, + "category" TEXT, + "sortOrder" INTEGER NOT NULL DEFAULT 0, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "page_blocks_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "canvass_sessions" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "cutId" TEXT NOT NULL, + "shiftId" TEXT, + "status" "CanvassSessionStatus" NOT NULL DEFAULT 'ACTIVE', + "startedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "endedAt" TIMESTAMP(3), + "startLatitude" DECIMAL(10,8), + "startLongitude" DECIMAL(11,8), + + CONSTRAINT "canvass_sessions_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "canvass_visits" ( + "id" TEXT NOT NULL, + "addressId" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "shiftId" TEXT, + "sessionId" TEXT, + "outcome" "VisitOutcome" NOT NULL, + "supportLevel" "SupportLevel", + "signRequested" BOOLEAN NOT NULL DEFAULT false, + "signSize" TEXT, + "notes" TEXT, + "durationSeconds" INTEGER, + "visitedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "canvass_visits_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "tracking_sessions" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "canvassSessionId" TEXT, + "startedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "endedAt" TIMESTAMP(3), + "isActive" BOOLEAN NOT NULL DEFAULT true, + "totalPoints" INTEGER NOT NULL DEFAULT 0, + "totalDistanceM" DOUBLE PRECISION NOT NULL DEFAULT 0, + "lastLatitude" DECIMAL(10,8), + "lastLongitude" DECIMAL(11,8), + "lastRecordedAt" TIMESTAMP(3), + + CONSTRAINT "tracking_sessions_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "track_points" ( + "id" TEXT NOT NULL, + "trackingSessionId" TEXT NOT NULL, + "latitude" DECIMAL(10,8) NOT NULL, + "longitude" DECIMAL(11,8) NOT NULL, + "accuracy" DOUBLE PRECISION, + "recordedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "eventType" "TrackPointEvent", + + CONSTRAINT "track_points_pkey" PRIMARY KEY ("id") +); + -- CreateTable CREATE TABLE "videos" ( "id" SERIAL NOT NULL, @@ -809,6 +1499,7 @@ CREATE TABLE "ads" ( "click_count" INTEGER DEFAULT 0, "start_date" TIMESTAMP(3), "end_date" TIMESTAMP(3), + "placements" JSONB DEFAULT '[]', "product_id" TEXT, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMP(3), @@ -933,6 +1624,7 @@ CREATE TABLE "privacy_settings" ( "hide_public_finishes" BOOLEAN DEFAULT false, "allow_friend_requests" BOOLEAN DEFAULT true, "close_friends_only_watching" BOOLEAN DEFAULT false, + "show_on_leaderboard" BOOLEAN DEFAULT true, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMP(3), @@ -949,6 +1641,28 @@ CREATE TABLE "close_friends" ( CONSTRAINT "close_friends_pkey" PRIMARY KEY ("id") ); +-- CreateTable +CREATE TABLE "social_groups" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "type" "SocialGroupType" NOT NULL, + "reference_id" TEXT, + "meeting_id" TEXT, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "social_groups_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "social_group_members" ( + "id" TEXT NOT NULL, + "group_id" TEXT NOT NULL, + "user_id" TEXT NOT NULL, + "joined_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "social_group_members_pkey" PRIMARY KEY ("id") +); + -- CreateTable CREATE TABLE "user_uploads" ( "id" SERIAL NOT NULL, @@ -1582,7 +2296,8 @@ CREATE TABLE "payments" ( -- CreateTable CREATE TABLE "payment_audit_log" ( "id" SERIAL NOT NULL, - "payment_id" INTEGER NOT NULL, + "payment_id" INTEGER, + "order_id" TEXT, "action" TEXT NOT NULL, "old_status" TEXT, "new_status" TEXT, @@ -1637,6 +2352,7 @@ CREATE TABLE "orders" ( "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMP(3) NOT NULL, "donation_page_id" TEXT, + "influence_campaign_id" TEXT, CONSTRAINT "orders_pkey" PRIMARY KEY ("id") ); @@ -1708,6 +2424,8 @@ CREATE TABLE "notification_preferences" ( "enable_achievements" BOOLEAN NOT NULL DEFAULT true, "enable_system_updates" BOOLEAN NOT NULL DEFAULT true, "email_notifications" BOOLEAN NOT NULL DEFAULT false, + "digest_frequency" TEXT NOT NULL DEFAULT 'none', + "last_digest_sent_at" TIMESTAMP(3), "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMP(3), @@ -1759,6 +2477,11 @@ CREATE TABLE "video_views" ( "ip_address_hash" VARCHAR(64), "user_agent_hash" VARCHAR(64), "referer" TEXT, + "country" VARCHAR(2), + "region" VARCHAR(100), + "city" VARCHAR(100), + "latitude" DOUBLE PRECISION, + "longitude" DOUBLE PRECISION, "watch_time_seconds" INTEGER NOT NULL DEFAULT 0, "completed" BOOLEAN NOT NULL DEFAULT false, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, @@ -1801,6 +2524,12 @@ CREATE TABLE "docs_page_views" ( "referrer" TEXT, "sessionHash" TEXT, "userAgent" TEXT, + "ip_address_hash" VARCHAR(64), + "country" VARCHAR(2), + "region" VARCHAR(100), + "city" VARCHAR(100), + "latitude" DOUBLE PRECISION, + "longitude" DOUBLE PRECISION, "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "docs_page_views_pkey" PRIMARY KEY ("id") @@ -1912,6 +2641,11 @@ CREATE TABLE "photo_views" ( "session_id" TEXT, "user_id" TEXT, "ip_address_hash" TEXT, + "country" VARCHAR(2), + "region" VARCHAR(100), + "city" VARCHAR(100), + "latitude" DOUBLE PRECISION, + "longitude" DOUBLE PRECISION, "viewed_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "photo_views_pkey" PRIMARY KEY ("id") @@ -2031,6 +2765,7 @@ CREATE TABLE "sms_conversations" ( "phone" TEXT NOT NULL, "contactName" TEXT, "campaignId" TEXT, + "contactId" TEXT, "status" "SmsConversationStatus" NOT NULL DEFAULT 'ACTIVE', "totalMessages" INTEGER NOT NULL DEFAULT 0, "totalResponses" INTEGER NOT NULL DEFAULT 0, @@ -2082,6 +2817,7 @@ CREATE TABLE "contacts" ( "lastName" TEXT, "email" TEXT, "phone" TEXT, + "pronouns" TEXT, "tags" JSONB NOT NULL DEFAULT '[]', "notes" TEXT, "supportLevel" "SupportLevel", @@ -2183,6 +2919,814 @@ CREATE TABLE "contact_activities" ( CONSTRAINT "contact_activities_pkey" PRIMARY KEY ("id") ); +-- CreateTable +CREATE TABLE "meetings" ( + "id" TEXT NOT NULL, + "slug" TEXT NOT NULL, + "title" TEXT NOT NULL, + "description" TEXT, + "jitsi_room" TEXT NOT NULL, + "is_active" BOOLEAN NOT NULL DEFAULT true, + "created_by_user_id" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + "start_time" TIMESTAMP(3), + "end_time" TIMESTAMP(3), + + CONSTRAINT "meetings_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "scheduling_polls" ( + "id" TEXT NOT NULL, + "slug" TEXT NOT NULL, + "title" TEXT NOT NULL, + "description" TEXT, + "location" TEXT, + "status" "SchedulingPollStatus" NOT NULL DEFAULT 'OPEN', + "timezone" TEXT NOT NULL DEFAULT 'America/Edmonton', + "finalized_option_id" TEXT, + "converted_shift_id" TEXT, + "converted_gancio_event_id" INTEGER, + "converted_calendar_item_id" TEXT, + "voting_deadline" TIMESTAMP(3), + "auto_finalize" BOOLEAN NOT NULL DEFAULT false, + "auto_finalize_threshold" INTEGER, + "auto_convert_to_calendar" BOOLEAN NOT NULL DEFAULT false, + "auto_convert_to_gancio" BOOLEAN NOT NULL DEFAULT false, + "auto_convert_to_shift" BOOLEAN NOT NULL DEFAULT false, + "tie_breaker" TEXT NOT NULL DEFAULT 'earliest', + "auto_enroll_voters" BOOLEAN NOT NULL DEFAULT true, + "auto_finalize_job_id" TEXT, + "allow_anonymous" BOOLEAN NOT NULL DEFAULT true, + "is_private" BOOLEAN NOT NULL DEFAULT false, + "notify_on_vote" BOOLEAN NOT NULL DEFAULT true, + "created_by_user_id" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "scheduling_polls_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "scheduling_poll_options" ( + "id" TEXT NOT NULL, + "poll_id" TEXT NOT NULL, + "date" DATE NOT NULL, + "start_time" TEXT NOT NULL, + "end_time" TEXT NOT NULL, + "sort_order" INTEGER NOT NULL DEFAULT 0, + + CONSTRAINT "scheduling_poll_options_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "scheduling_poll_votes" ( + "id" TEXT NOT NULL, + "poll_id" TEXT NOT NULL, + "option_id" TEXT NOT NULL, + "user_id" TEXT, + "voter_name" TEXT NOT NULL, + "voter_email" TEXT, + "voter_token" TEXT, + "contact_id" TEXT, + "value" "PollVoteValue" NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "scheduling_poll_votes_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "scheduling_poll_comments" ( + "id" TEXT NOT NULL, + "poll_id" TEXT NOT NULL, + "user_id" TEXT, + "author_name" TEXT NOT NULL, + "content" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "scheduling_poll_comments_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "invite_codes" ( + "id" TEXT NOT NULL, + "code" TEXT NOT NULL, + "created_by_user_id" TEXT NOT NULL, + "max_uses" INTEGER NOT NULL DEFAULT 0, + "used_count" INTEGER NOT NULL DEFAULT 0, + "expires_at" TIMESTAMP(3), + "is_active" BOOLEAN NOT NULL DEFAULT true, + "note" TEXT, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "invite_codes_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "referrals" ( + "id" SERIAL NOT NULL, + "referrer_id" TEXT NOT NULL, + "referred_user_id" TEXT NOT NULL, + "invite_code_id" TEXT, + "referral_source" TEXT, + "completed_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "referrals_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "impact_stories" ( + "id" TEXT NOT NULL, + "campaign_id" TEXT NOT NULL, + "type" "ImpactStoryType" NOT NULL, + "status" "ImpactStoryStatus" NOT NULL DEFAULT 'DRAFT', + "title" TEXT NOT NULL, + "body" TEXT NOT NULL, + "cover_image_url" TEXT, + "milestone_value" INTEGER, + "milestone_metric" TEXT, + "created_by_user_id" TEXT, + "published_at" TIMESTAMP(3), + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "impact_stories_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "campaign_milestones" ( + "id" SERIAL NOT NULL, + "campaign_id" TEXT NOT NULL, + "metric" TEXT NOT NULL, + "threshold" INTEGER NOT NULL, + "reached_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "story_generated" BOOLEAN NOT NULL DEFAULT false, + + CONSTRAINT "campaign_milestones_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "volunteer_spotlights" ( + "id" TEXT NOT NULL, + "user_id" TEXT NOT NULL, + "status" "SpotlightStatus" NOT NULL DEFAULT 'NOMINATED', + "headline" TEXT, + "story" TEXT, + "featured_month" TEXT, + "nominated_by_user_id" TEXT, + "approved_by_user_id" TEXT, + "approved_at" TIMESTAMP(3), + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "volunteer_spotlights_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "challenges" ( + "id" TEXT NOT NULL, + "title" TEXT NOT NULL, + "description" TEXT, + "metric" "ChallengeMetric" NOT NULL, + "status" "ChallengeStatus" NOT NULL DEFAULT 'DRAFT', + "starts_at" TIMESTAMP(3) NOT NULL, + "ends_at" TIMESTAMP(3) NOT NULL, + "min_team_size" INTEGER NOT NULL DEFAULT 2, + "max_team_size" INTEGER NOT NULL DEFAULT 10, + "max_teams" INTEGER, + "created_by_user_id" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "challenges_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "challenge_teams" ( + "id" TEXT NOT NULL, + "challenge_id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "captain_user_id" TEXT NOT NULL, + "score" INTEGER NOT NULL DEFAULT 0, + "last_scored_at" TIMESTAMP(3), + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "challenge_teams_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "challenge_team_members" ( + "id" SERIAL NOT NULL, + "team_id" TEXT NOT NULL, + "user_id" TEXT NOT NULL, + "score" INTEGER NOT NULL DEFAULT 0, + "joined_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "challenge_team_members_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ticketed_events" ( + "id" TEXT NOT NULL, + "slug" TEXT NOT NULL, + "title" TEXT NOT NULL, + "description" TEXT, + "rich_description" TEXT, + "date" DATE NOT NULL, + "start_time" TEXT NOT NULL, + "end_time" TEXT NOT NULL, + "doors_open_time" TEXT, + "venue_name" TEXT, + "venue_address" TEXT, + "latitude" DECIMAL(10,7), + "longitude" DECIMAL(10,7), + "status" "TicketedEventStatus" NOT NULL DEFAULT 'DRAFT', + "visibility" "TicketedEventVisibility" NOT NULL DEFAULT 'PUBLIC', + "invite_code" TEXT, + "featured" BOOLEAN NOT NULL DEFAULT false, + "cover_image_url" TEXT, + "max_attendees" INTEGER, + "current_attendees" INTEGER NOT NULL DEFAULT 0, + "gancio_event_id" INTEGER, + "event_format" "EventFormat" NOT NULL DEFAULT 'IN_PERSON', + "meeting_id" TEXT, + "created_by_user_id" TEXT NOT NULL, + "organizer_name" TEXT, + "organizer_email" TEXT, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "ticketed_events_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ticket_tiers" ( + "id" TEXT NOT NULL, + "event_id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "description" TEXT, + "tier_type" "TicketTierType" NOT NULL, + "price_cad" INTEGER NOT NULL DEFAULT 0, + "min_donation_cad" INTEGER, + "max_quantity" INTEGER, + "sold_count" INTEGER NOT NULL DEFAULT 0, + "reserved_count" INTEGER NOT NULL DEFAULT 0, + "max_per_order" INTEGER NOT NULL DEFAULT 10, + "sales_start_at" TIMESTAMP(3), + "sales_end_at" TIMESTAMP(3), + "sort_order" INTEGER NOT NULL DEFAULT 0, + "is_active" BOOLEAN NOT NULL DEFAULT true, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "ticket_tiers_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "tickets" ( + "id" TEXT NOT NULL, + "ticket_code" TEXT NOT NULL, + "token_hash" TEXT NOT NULL, + "event_id" TEXT NOT NULL, + "tier_id" TEXT NOT NULL, + "order_id" TEXT, + "holder_email" TEXT NOT NULL, + "holder_name" TEXT, + "user_id" TEXT, + "status" "TicketStatus" NOT NULL DEFAULT 'VALID', + "checked_in_at" TIMESTAMP(3), + "checked_in_by_user_id" TEXT, + "issued_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "tickets_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "check_ins" ( + "id" TEXT NOT NULL, + "ticket_id" TEXT NOT NULL, + "event_id" TEXT NOT NULL, + "checked_in_by_user_id" TEXT, + "method" TEXT NOT NULL, + "checked_in_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "notes" TEXT, + + CONSTRAINT "check_ins_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "calendar_layers" ( + "id" TEXT NOT NULL, + "user_id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "layer_type" "CalendarLayerType" NOT NULL, + "system_type" "CalendarSystemType", + "color" TEXT NOT NULL DEFAULT '#1890ff', + "visibility" "CalendarVisibility" NOT NULL DEFAULT 'PRIVATE', + "is_enabled" BOOLEAN NOT NULL DEFAULT true, + "sort_order" INTEGER NOT NULL DEFAULT 0, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "calendar_layers_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "calendar_items" ( + "id" TEXT NOT NULL, + "user_id" TEXT NOT NULL, + "layer_id" TEXT NOT NULL, + "title" TEXT NOT NULL, + "description" TEXT, + "date" DATE NOT NULL, + "start_time" TEXT NOT NULL, + "end_time" TEXT NOT NULL, + "is_all_day" BOOLEAN NOT NULL DEFAULT false, + "item_type" "CalendarItemType" NOT NULL DEFAULT 'EVENT', + "location" TEXT, + "color" TEXT, + "visibility" "CalendarVisibility", + "busy_status" "CalendarBusyStatus" NOT NULL DEFAULT 'BUSY', + "show_details_to" "CalendarShowDetailsTo" NOT NULL DEFAULT 'FRIENDS', + "recurrence_rule" JSONB, + "recurrence_end" TIMESTAMP(3), + "series_id" TEXT, + "is_exception" BOOLEAN NOT NULL DEFAULT false, + "source_type" "CalendarItemSource" NOT NULL DEFAULT 'MANUAL', + "source_id" TEXT, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "calendar_items_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "calendar_feeds" ( + "id" TEXT NOT NULL, + "user_id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "url" TEXT NOT NULL, + "layer_id" TEXT NOT NULL, + "refresh_interval" "CalendarFeedInterval" NOT NULL DEFAULT 'HOURLY', + "last_fetched_at" TIMESTAMP(3), + "last_status" "CalendarFeedStatus" NOT NULL DEFAULT 'PENDING', + "last_error" TEXT, + "item_count" INTEGER NOT NULL DEFAULT 0, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "calendar_feeds_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "shared_calendar_views" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "description" TEXT, + "owner_id" TEXT NOT NULL, + "view_type" "SharedViewType" NOT NULL DEFAULT 'MANUAL', + "auto_include_roles" JSONB, + "included_layer_types" JSONB NOT NULL DEFAULT '[]', + "share_scope" "SharedViewScope" NOT NULL DEFAULT 'MEMBERS', + "share_token" TEXT, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "shared_calendar_views_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "shared_calendar_members" ( + "id" TEXT NOT NULL, + "view_id" TEXT NOT NULL, + "user_id" TEXT NOT NULL, + "status" "SharedViewMemberStatus" NOT NULL DEFAULT 'INVITED', + "color" TEXT NOT NULL DEFAULT '#1890ff', + "joined_at" TIMESTAMP(3), + + CONSTRAINT "shared_calendar_members_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "shared_view_comments" ( + "id" TEXT NOT NULL, + "view_id" TEXT NOT NULL, + "user_id" TEXT NOT NULL, + "item_date" TEXT NOT NULL, + "item_id" TEXT, + "content" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "shared_view_comments_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "shared_view_reactions" ( + "id" TEXT NOT NULL, + "view_id" TEXT NOT NULL, + "user_id" TEXT NOT NULL, + "item_id" TEXT NOT NULL, + "emoji" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "shared_view_reactions_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "calendar_export_tokens" ( + "id" TEXT NOT NULL, + "user_id" TEXT NOT NULL, + "token" TEXT NOT NULL, + "include_personal" BOOLEAN NOT NULL DEFAULT false, + "include_layers" JSONB, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "calendar_export_tokens_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "doc_collab_state" ( + "id" TEXT NOT NULL, + "document_id" TEXT NOT NULL, + "state" BYTEA NOT NULL, + "updated_at" TIMESTAMP(3) NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "doc_collab_state_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "doc_access_policies" ( + "id" TEXT NOT NULL, + "document_path" TEXT NOT NULL, + "is_directory" BOOLEAN NOT NULL DEFAULT false, + "allowed_editors" JSONB NOT NULL DEFAULT '[]', + "created_by_id" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "doc_access_policies_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "doc_share_links" ( + "id" TEXT NOT NULL, + "document_path" TEXT NOT NULL, + "share_token" TEXT NOT NULL, + "status" "DocShareLinkStatus" NOT NULL DEFAULT 'ACTIVE', + "can_edit" BOOLEAN NOT NULL DEFAULT true, + "expires_at" TIMESTAMP(3), + "max_uses" INTEGER, + "use_count" INTEGER NOT NULL DEFAULT 0, + "guest_name" TEXT, + "created_by_id" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "doc_share_links_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "doc_watches" ( + "id" TEXT NOT NULL, + "user_id" TEXT NOT NULL, + "file_path" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "doc_watches_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "participant_needs" ( + "id" TEXT NOT NULL, + "user_id" TEXT, + "contact_id" TEXT, + "needs_wheelchair" BOOLEAN NOT NULL DEFAULT false, + "needs_ground_floor" BOOLEAN NOT NULL DEFAULT false, + "needs_hearing_loop" BOOLEAN NOT NULL DEFAULT false, + "needs_sign_language" BOOLEAN NOT NULL DEFAULT false, + "other_accessibility" TEXT, + "is_vegan" BOOLEAN NOT NULL DEFAULT false, + "is_vegetarian" BOOLEAN NOT NULL DEFAULT false, + "is_gluten_free" BOOLEAN NOT NULL DEFAULT false, + "is_halal" BOOLEAN NOT NULL DEFAULT false, + "is_kosher" BOOLEAN NOT NULL DEFAULT false, + "has_nut_allergy" BOOLEAN NOT NULL DEFAULT false, + "other_dietary" TEXT, + "needs_childcare" BOOLEAN NOT NULL DEFAULT false, + "childcare_details" TEXT, + "needs_transportation" BOOLEAN NOT NULL DEFAULT false, + "transportation_notes" TEXT, + "preferred_language" TEXT DEFAULT 'en', + "needs_translation" BOOLEAN NOT NULL DEFAULT false, + "translation_language" TEXT, + "visibility_consent" TEXT NOT NULL DEFAULT 'organizer_only', + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "participant_needs_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "meeting_agendas" ( + "id" TEXT NOT NULL, + "shift_id" TEXT, + "poll_id" TEXT, + "title" TEXT NOT NULL, + "items" JSONB NOT NULL DEFAULT '[]', + "status" TEXT NOT NULL DEFAULT 'draft', + "created_by_user_id" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "meeting_agendas_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "meeting_minutes" ( + "id" TEXT NOT NULL, + "agenda_id" TEXT NOT NULL, + "notes" TEXT NOT NULL, + "decisions" JSONB NOT NULL DEFAULT '[]', + "attendees" JSONB NOT NULL DEFAULT '[]', + "approved_at" TIMESTAMP(3), + "approved_by_user_id" TEXT, + "created_by_user_id" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "meeting_minutes_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "action_items" ( + "id" TEXT NOT NULL, + "agenda_id" TEXT, + "title" TEXT NOT NULL, + "description" TEXT, + "assignee_user_id" TEXT, + "due_date" TIMESTAMP(3), + "status" TEXT NOT NULL DEFAULT 'open', + "priority" TEXT NOT NULL DEFAULT 'normal', + "completed_at" TIMESTAMP(3), + "created_by_user_id" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "action_items_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "straw_polls" ( + "id" TEXT NOT NULL, + "slug" TEXT NOT NULL, + "title" VARCHAR(200) NOT NULL, + "description" TEXT, + "type" "StrawPollType" NOT NULL, + "status" "StrawPollStatus" NOT NULL DEFAULT 'DRAFT', + "identity_mode" "StrawPollIdentityMode" NOT NULL DEFAULT 'ANONYMOUS', + "result_visibility" "StrawPollResultVisibility" NOT NULL DEFAULT 'LIVE', + "allow_comments" BOOLEAN NOT NULL DEFAULT true, + "closes_at" TIMESTAMP(3), + "close_threshold" INTEGER, + "auto_close_job_id" TEXT, + "is_private" BOOLEAN NOT NULL DEFAULT false, + "created_by_user_id" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "straw_polls_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "straw_poll_options" ( + "id" TEXT NOT NULL, + "poll_id" TEXT NOT NULL, + "label" VARCHAR(500) NOT NULL, + "sort_order" INTEGER NOT NULL DEFAULT 0, + + CONSTRAINT "straw_poll_options_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "straw_poll_votes" ( + "id" TEXT NOT NULL, + "poll_id" TEXT NOT NULL, + "option_id" TEXT NOT NULL, + "user_id" TEXT, + "voter_name" VARCHAR(100), + "voter_token" TEXT, + "voter_ip" TEXT, + "contact_id" TEXT, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "straw_poll_votes_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "straw_poll_comments" ( + "id" TEXT NOT NULL, + "poll_id" TEXT NOT NULL, + "user_id" TEXT, + "author_name" VARCHAR(100) NOT NULL, + "content" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "straw_poll_comments_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "straw_poll_challenges" ( + "id" TEXT NOT NULL, + "poll_id" TEXT NOT NULL, + "challenger_user_id" TEXT NOT NULL, + "challenged_user_id" TEXT NOT NULL, + "completed_at" TIMESTAMP(3), + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "straw_poll_challenges_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "action_campaigns" ( + "id" TEXT NOT NULL, + "slug" TEXT NOT NULL, + "title" TEXT NOT NULL, + "description" TEXT, + "reward_text" TEXT, + "is_active" BOOLEAN NOT NULL DEFAULT false, + "starts_at" TIMESTAMP(3), + "ends_at" TIMESTAMP(3), + "min_steps_for_reward" INTEGER, + "created_by_user_id" TEXT, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "action_campaigns_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "action_steps" ( + "id" TEXT NOT NULL, + "campaign_id" TEXT NOT NULL, + "order" INTEGER NOT NULL, + "kind" "ActionStepKind" NOT NULL, + "label" TEXT NOT NULL, + "description" TEXT, + "target_id" TEXT, + "target_url" TEXT, + "auto_complete" BOOLEAN NOT NULL DEFAULT true, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "action_steps_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "action_step_completions" ( + "id" TEXT NOT NULL, + "user_id" TEXT NOT NULL, + "step_id" TEXT NOT NULL, + "source" "ActionStepCompletionSource" NOT NULL DEFAULT 'AUTO', + "completed_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "action_step_completions_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "documents" ( + "id" TEXT NOT NULL, + "path" TEXT NOT NULL, + "filename" TEXT NOT NULL, + "original_filename" TEXT, + "title" TEXT, + "description" TEXT, + "mime_type" TEXT NOT NULL, + "file_size" BIGINT, + "page_count" INTEGER, + "thumbnail_path" TEXT, + "category" TEXT, + "tags" JSONB, + "is_published" BOOLEAN NOT NULL DEFAULT true, + "position" INTEGER DEFAULT 0, + "uploader_id" TEXT, + "download_count" INTEGER NOT NULL DEFAULT 0, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "documents_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "users_email_key" ON "users"("email"); + +-- CreateIndex +CREATE UNIQUE INDEX "refresh_tokens_token_key" ON "refresh_tokens"("token"); + +-- CreateIndex +CREATE INDEX "refresh_tokens_userId_idx" ON "refresh_tokens"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "campaigns_slug_key" ON "campaigns"("slug"); + +-- CreateIndex +CREATE INDEX "campaigns_moderationStatus_idx" ON "campaigns"("moderationStatus"); + +-- CreateIndex +CREATE INDEX "campaigns_isUserGenerated_idx" ON "campaigns"("isUserGenerated"); + +-- CreateIndex +CREATE UNIQUE INDEX "petitions_slug_key" ON "petitions"("slug"); + +-- CreateIndex +CREATE INDEX "petitions_status_idx" ON "petitions"("status"); + +-- CreateIndex +CREATE INDEX "petitions_isUserGenerated_idx" ON "petitions"("isUserGenerated"); + +-- CreateIndex +CREATE INDEX "petitions_highlightPetition_idx" ON "petitions"("highlightPetition"); + +-- CreateIndex +CREATE INDEX "petitions_linkedCampaignId_idx" ON "petitions"("linkedCampaignId"); + +-- CreateIndex +CREATE UNIQUE INDEX "petition_signatures_verificationToken_key" ON "petition_signatures"("verificationToken"); + +-- CreateIndex +CREATE INDEX "petition_signatures_petitionId_idx" ON "petition_signatures"("petitionId"); + +-- CreateIndex +CREATE INDEX "petition_signatures_signerEmail_idx" ON "petition_signatures"("signerEmail"); + +-- CreateIndex +CREATE INDEX "petition_signatures_petitionId_status_idx" ON "petition_signatures"("petitionId", "status"); + +-- CreateIndex +CREATE INDEX "petition_signatures_contactId_idx" ON "petition_signatures"("contactId"); + +-- CreateIndex +CREATE UNIQUE INDEX "petition_signatures_petitionId_signerEmail_key" ON "petition_signatures"("petitionId", "signerEmail"); + +-- CreateIndex +CREATE INDEX "representatives_postalCode_idx" ON "representatives"("postalCode"); + +-- CreateIndex +CREATE INDEX "campaign_emails_campaignId_idx" ON "campaign_emails"("campaignId"); + +-- CreateIndex +CREATE INDEX "campaign_emails_campaignSlug_idx" ON "campaign_emails"("campaignSlug"); + +-- CreateIndex +CREATE INDEX "campaign_emails_userPostalCode_idx" ON "campaign_emails"("userPostalCode"); + +-- CreateIndex +CREATE INDEX "campaign_emails_sentAt_idx" ON "campaign_emails"("sentAt"); + +-- CreateIndex +CREATE INDEX "representative_responses_campaignId_idx" ON "representative_responses"("campaignId"); + +-- CreateIndex +CREATE INDEX "representative_responses_campaignSlug_idx" ON "representative_responses"("campaignSlug"); + +-- CreateIndex +CREATE INDEX "representative_responses_representativeName_idx" ON "representative_responses"("representativeName"); + +-- CreateIndex +CREATE UNIQUE INDEX "response_upvotes_responseId_userId_key" ON "response_upvotes"("responseId", "userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "response_upvotes_responseId_upvotedIp_key" ON "response_upvotes"("responseId", "upvotedIp"); + +-- CreateIndex +CREATE INDEX "custom_recipients_campaignId_idx" ON "custom_recipients"("campaignId"); + +-- CreateIndex +CREATE UNIQUE INDEX "postal_code_cache_postalCode_key" ON "postal_code_cache"("postalCode"); + +-- CreateIndex +CREATE UNIQUE INDEX "email_verifications_token_key" ON "email_verifications"("token"); + +-- CreateIndex +CREATE INDEX "calls_campaignId_idx" ON "calls"("campaignId"); + +-- CreateIndex +CREATE UNIQUE INDEX "locations_locGuid_key" ON "locations"("locGuid"); + +-- CreateIndex +CREATE INDEX "locations_latitude_longitude_idx" ON "locations"("latitude", "longitude"); + +-- CreateIndex +CREATE INDEX "locations_latitude_idx" ON "locations"("latitude"); + +-- CreateIndex +CREATE INDEX "locations_longitude_idx" ON "locations"("longitude"); + +-- CreateIndex +CREATE INDEX "locations_postalCode_idx" ON "locations"("postalCode"); + -- CreateIndex CREATE UNIQUE INDEX "addresses_addrGuid_key" ON "addresses"("addrGuid"); @@ -2204,6 +3748,21 @@ CREATE INDEX "location_history_userId_idx" ON "location_history"("userId"); -- CreateIndex CREATE INDEX "location_history_createdAt_idx" ON "location_history"("createdAt"); +-- CreateIndex +CREATE UNIQUE INDEX "shifts_meetingId_key" ON "shifts"("meetingId"); + +-- CreateIndex +CREATE INDEX "shifts_cutId_idx" ON "shifts"("cutId"); + +-- CreateIndex +CREATE INDEX "shifts_seriesId_idx" ON "shifts"("seriesId"); + +-- CreateIndex +CREATE INDEX "shift_signups_shiftId_idx" ON "shift_signups"("shiftId"); + +-- CreateIndex +CREATE UNIQUE INDEX "shift_signups_shiftId_userEmail_key" ON "shift_signups"("shiftId", "userEmail"); + -- CreateIndex CREATE INDEX "shift_series_cutId_idx" ON "shift_series"("cutId"); @@ -2234,6 +3793,54 @@ CREATE UNIQUE INDEX "email_template_versions_templateId_versionNumber_key" ON "e -- CreateIndex CREATE INDEX "email_template_test_logs_templateId_sentAt_idx" ON "email_template_test_logs"("templateId", "sentAt" DESC); +-- CreateIndex +CREATE UNIQUE INDEX "landing_pages_slug_key" ON "landing_pages"("slug"); + +-- CreateIndex +CREATE INDEX "canvass_sessions_userId_idx" ON "canvass_sessions"("userId"); + +-- CreateIndex +CREATE INDEX "canvass_sessions_cutId_idx" ON "canvass_sessions"("cutId"); + +-- CreateIndex +CREATE INDEX "canvass_sessions_shiftId_idx" ON "canvass_sessions"("shiftId"); + +-- CreateIndex +CREATE INDEX "canvass_visits_addressId_idx" ON "canvass_visits"("addressId"); + +-- CreateIndex +CREATE INDEX "canvass_visits_addressId_visitedAt_idx" ON "canvass_visits"("addressId", "visitedAt" DESC); + +-- CreateIndex +CREATE INDEX "canvass_visits_userId_idx" ON "canvass_visits"("userId"); + +-- CreateIndex +CREATE INDEX "canvass_visits_shiftId_idx" ON "canvass_visits"("shiftId"); + +-- CreateIndex +CREATE INDEX "canvass_visits_sessionId_idx" ON "canvass_visits"("sessionId"); + +-- CreateIndex +CREATE INDEX "canvass_visits_visitedAt_idx" ON "canvass_visits"("visitedAt"); + +-- CreateIndex +CREATE UNIQUE INDEX "tracking_sessions_canvassSessionId_key" ON "tracking_sessions"("canvassSessionId"); + +-- CreateIndex +CREATE INDEX "tracking_sessions_userId_idx" ON "tracking_sessions"("userId"); + +-- CreateIndex +CREATE INDEX "tracking_sessions_isActive_idx" ON "tracking_sessions"("isActive"); + +-- CreateIndex +CREATE INDEX "tracking_sessions_isActive_lastRecordedAt_idx" ON "tracking_sessions"("isActive", "lastRecordedAt"); + +-- CreateIndex +CREATE INDEX "track_points_trackingSessionId_recordedAt_idx" ON "track_points"("trackingSessionId", "recordedAt"); + +-- CreateIndex +CREATE INDEX "track_points_recordedAt_idx" ON "track_points"("recordedAt"); + -- CreateIndex CREATE UNIQUE INDEX "videos_path_key" ON "videos"("path"); @@ -2555,6 +4162,18 @@ CREATE INDEX "idx_close_friends_user" ON "close_friends"("user_id"); -- CreateIndex CREATE UNIQUE INDEX "idx_close_friends_unique" ON "close_friends"("user_id", "close_friend_id"); +-- CreateIndex +CREATE UNIQUE INDEX "social_groups_meeting_id_key" ON "social_groups"("meeting_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "idx_social_groups_type_ref" ON "social_groups"("type", "reference_id"); + +-- CreateIndex +CREATE INDEX "idx_social_group_members_user" ON "social_group_members"("user_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "idx_social_group_members_unique" ON "social_group_members"("group_id", "user_id"); + -- CreateIndex CREATE INDEX "idx_user_uploads_user" ON "user_uploads"("user_id"); @@ -2939,6 +4558,9 @@ CREATE INDEX "idx_payments_status" ON "payments"("status"); -- CreateIndex CREATE INDEX "idx_payment_audit_log_payment" ON "payment_audit_log"("payment_id"); +-- CreateIndex +CREATE INDEX "idx_payment_audit_log_order" ON "payment_audit_log"("order_id"); + -- CreateIndex CREATE INDEX "idx_payment_audit_log_action" ON "payment_audit_log"("action"); @@ -2972,6 +4594,9 @@ CREATE INDEX "idx_orders_type" ON "orders"("order_type"); -- CreateIndex CREATE INDEX "idx_orders_donation_page" ON "orders"("donation_page_id"); +-- CreateIndex +CREATE INDEX "idx_orders_influence_campaign" ON "orders"("influence_campaign_id"); + -- CreateIndex CREATE UNIQUE INDEX "donation_pages_slug_key" ON "donation_pages"("slug"); @@ -3023,6 +4648,9 @@ CREATE INDEX "idx_video_views_created" ON "video_views"("created_at"); -- CreateIndex CREATE INDEX "idx_video_views_video_created" ON "video_views"("video_id", "created_at"); +-- CreateIndex +CREATE INDEX "idx_video_views_country_created" ON "video_views"("country", "created_at"); + -- CreateIndex CREATE INDEX "idx_video_events_video" ON "video_events"("video_id"); @@ -3053,6 +4681,9 @@ CREATE INDEX "docs_page_views_createdAt_idx" ON "docs_page_views"("createdAt"); -- CreateIndex CREATE INDEX "docs_page_views_path_createdAt_idx" ON "docs_page_views"("path", "createdAt"); +-- CreateIndex +CREATE INDEX "docs_page_views_country_createdAt_idx" ON "docs_page_views"("country", "createdAt"); + -- CreateIndex CREATE UNIQUE INDEX "photos_path_key" ON "photos"("path"); @@ -3104,6 +4735,9 @@ CREATE INDEX "idx_photo_views_photo_date" ON "photo_views"("photo_id", "viewed_a -- CreateIndex CREATE INDEX "idx_photo_views_session" ON "photo_views"("session_id"); +-- CreateIndex +CREATE INDEX "idx_photo_views_country_date" ON "photo_views"("country", "viewed_at"); + -- CreateIndex CREATE INDEX "idx_photo_reactions_photo" ON "photo_reactions"("photo_id"); @@ -3161,6 +4795,9 @@ CREATE INDEX "sms_conversations_status_idx" ON "sms_conversations"("status"); -- CreateIndex CREATE INDEX "sms_conversations_lastMessageAt_idx" ON "sms_conversations"("lastMessageAt"); +-- CreateIndex +CREATE INDEX "sms_conversations_contactId_idx" ON "sms_conversations"("contactId"); + -- CreateIndex CREATE UNIQUE INDEX "sms_conversations_phone_campaignId_key" ON "sms_conversations"("phone", "campaignId"); @@ -3228,47 +4865,362 @@ CREATE UNIQUE INDEX "contact_connections_fromContactId_toContactId_type_key" ON CREATE INDEX "contact_activities_contactId_occurredAt_idx" ON "contact_activities"("contactId", "occurredAt" DESC); -- CreateIndex -CREATE INDEX "campaign_emails_userPostalCode_idx" ON "campaign_emails"("userPostalCode"); +CREATE UNIQUE INDEX "meetings_slug_key" ON "meetings"("slug"); -- CreateIndex -CREATE INDEX "campaign_emails_sentAt_idx" ON "campaign_emails"("sentAt"); +CREATE UNIQUE INDEX "meetings_jitsi_room_key" ON "meetings"("jitsi_room"); -- CreateIndex -CREATE INDEX "campaigns_moderationStatus_idx" ON "campaigns"("moderationStatus"); +CREATE UNIQUE INDEX "scheduling_polls_slug_key" ON "scheduling_polls"("slug"); -- CreateIndex -CREATE INDEX "campaigns_isUserGenerated_idx" ON "campaigns"("isUserGenerated"); +CREATE UNIQUE INDEX "scheduling_polls_finalized_option_id_key" ON "scheduling_polls"("finalized_option_id"); -- CreateIndex -CREATE INDEX "canvass_visits_addressId_idx" ON "canvass_visits"("addressId"); +CREATE UNIQUE INDEX "scheduling_polls_converted_shift_id_key" ON "scheduling_polls"("converted_shift_id"); -- CreateIndex -CREATE INDEX "canvass_visits_addressId_visitedAt_idx" ON "canvass_visits"("addressId", "visitedAt" DESC); +CREATE INDEX "scheduling_polls_created_by_user_id_idx" ON "scheduling_polls"("created_by_user_id"); -- CreateIndex -CREATE UNIQUE INDEX "locations_locGuid_key" ON "locations"("locGuid"); +CREATE INDEX "scheduling_polls_status_idx" ON "scheduling_polls"("status"); -- CreateIndex -CREATE INDEX "locations_latitude_longitude_idx" ON "locations"("latitude", "longitude"); +CREATE INDEX "scheduling_poll_options_poll_id_idx" ON "scheduling_poll_options"("poll_id"); -- CreateIndex -CREATE INDEX "locations_latitude_idx" ON "locations"("latitude"); +CREATE INDEX "scheduling_poll_votes_poll_id_idx" ON "scheduling_poll_votes"("poll_id"); -- CreateIndex -CREATE INDEX "locations_longitude_idx" ON "locations"("longitude"); +CREATE INDEX "scheduling_poll_votes_contact_id_idx" ON "scheduling_poll_votes"("contact_id"); -- CreateIndex -CREATE INDEX "locations_postalCode_idx" ON "locations"("postalCode"); +CREATE UNIQUE INDEX "scheduling_poll_votes_option_id_user_id_key" ON "scheduling_poll_votes"("option_id", "user_id"); -- CreateIndex -CREATE INDEX "representative_responses_representativeName_idx" ON "representative_responses"("representativeName"); +CREATE UNIQUE INDEX "scheduling_poll_votes_option_id_voter_token_key" ON "scheduling_poll_votes"("option_id", "voter_token"); -- CreateIndex -CREATE INDEX "shifts_seriesId_idx" ON "shifts"("seriesId"); +CREATE INDEX "scheduling_poll_comments_poll_id_idx" ON "scheduling_poll_comments"("poll_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "invite_codes_code_key" ON "invite_codes"("code"); + +-- CreateIndex +CREATE INDEX "idx_invite_codes_code" ON "invite_codes"("code"); + +-- CreateIndex +CREATE INDEX "idx_invite_codes_created_by" ON "invite_codes"("created_by_user_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "referrals_referred_user_id_key" ON "referrals"("referred_user_id"); + +-- CreateIndex +CREATE INDEX "idx_referrals_referrer" ON "referrals"("referrer_id"); + +-- CreateIndex +CREATE INDEX "idx_impact_stories_campaign" ON "impact_stories"("campaign_id"); + +-- CreateIndex +CREATE INDEX "idx_impact_stories_status" ON "impact_stories"("status"); + +-- CreateIndex +CREATE INDEX "idx_impact_stories_type" ON "impact_stories"("type"); + +-- CreateIndex +CREATE UNIQUE INDEX "campaign_milestones_campaign_id_metric_threshold_key" ON "campaign_milestones"("campaign_id", "metric", "threshold"); + +-- CreateIndex +CREATE INDEX "idx_volunteer_spotlights_user" ON "volunteer_spotlights"("user_id"); + +-- CreateIndex +CREATE INDEX "idx_volunteer_spotlights_status" ON "volunteer_spotlights"("status"); + +-- CreateIndex +CREATE INDEX "idx_volunteer_spotlights_month" ON "volunteer_spotlights"("featured_month"); + +-- CreateIndex +CREATE INDEX "idx_challenges_status" ON "challenges"("status"); + +-- CreateIndex +CREATE INDEX "idx_challenges_starts_at" ON "challenges"("starts_at"); + +-- CreateIndex +CREATE INDEX "idx_challenge_teams_challenge" ON "challenge_teams"("challenge_id"); + +-- CreateIndex +CREATE INDEX "idx_challenge_teams_score" ON "challenge_teams"("score"); + +-- CreateIndex +CREATE UNIQUE INDEX "challenge_teams_challenge_id_name_key" ON "challenge_teams"("challenge_id", "name"); + +-- CreateIndex +CREATE INDEX "idx_challenge_team_members_user" ON "challenge_team_members"("user_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "challenge_team_members_team_id_user_id_key" ON "challenge_team_members"("team_id", "user_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "ticketed_events_slug_key" ON "ticketed_events"("slug"); + +-- CreateIndex +CREATE UNIQUE INDEX "ticketed_events_invite_code_key" ON "ticketed_events"("invite_code"); + +-- CreateIndex +CREATE UNIQUE INDEX "ticketed_events_meeting_id_key" ON "ticketed_events"("meeting_id"); + +-- CreateIndex +CREATE INDEX "idx_ticketed_events_status" ON "ticketed_events"("status"); + +-- CreateIndex +CREATE INDEX "idx_ticketed_events_date" ON "ticketed_events"("date"); + +-- CreateIndex +CREATE INDEX "idx_ticketed_events_visibility" ON "ticketed_events"("visibility"); + +-- CreateIndex +CREATE INDEX "idx_ticketed_events_creator" ON "ticketed_events"("created_by_user_id"); + +-- CreateIndex +CREATE INDEX "idx_ticket_tiers_event" ON "ticket_tiers"("event_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "tickets_ticket_code_key" ON "tickets"("ticket_code"); + +-- CreateIndex +CREATE UNIQUE INDEX "tickets_token_hash_key" ON "tickets"("token_hash"); + +-- CreateIndex +CREATE INDEX "idx_tickets_event" ON "tickets"("event_id"); + +-- CreateIndex +CREATE INDEX "idx_tickets_tier" ON "tickets"("tier_id"); + +-- CreateIndex +CREATE INDEX "idx_tickets_order" ON "tickets"("order_id"); + +-- CreateIndex +CREATE INDEX "idx_tickets_holder_email" ON "tickets"("holder_email"); + +-- CreateIndex +CREATE INDEX "idx_tickets_status" ON "tickets"("status"); + +-- CreateIndex +CREATE INDEX "idx_checkins_event" ON "check_ins"("event_id"); + +-- CreateIndex +CREATE INDEX "idx_checkins_ticket" ON "check_ins"("ticket_id"); + +-- CreateIndex +CREATE INDEX "idx_calendar_layers_user" ON "calendar_layers"("user_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "idx_calendar_layers_user_system" ON "calendar_layers"("user_id", "system_type"); + +-- CreateIndex +CREATE INDEX "idx_calendar_items_user_date" ON "calendar_items"("user_id", "date"); + +-- CreateIndex +CREATE INDEX "idx_calendar_items_layer_date" ON "calendar_items"("layer_id", "date"); + +-- CreateIndex +CREATE INDEX "idx_calendar_items_series" ON "calendar_items"("series_id"); + +-- CreateIndex +CREATE INDEX "idx_calendar_items_source" ON "calendar_items"("source_type", "source_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "calendar_feeds_layer_id_key" ON "calendar_feeds"("layer_id"); + +-- CreateIndex +CREATE INDEX "idx_calendar_feeds_user" ON "calendar_feeds"("user_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "shared_calendar_views_share_token_key" ON "shared_calendar_views"("share_token"); + +-- CreateIndex +CREATE INDEX "idx_shared_views_owner" ON "shared_calendar_views"("owner_id"); + +-- CreateIndex +CREATE INDEX "idx_shared_members_user" ON "shared_calendar_members"("user_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "idx_shared_members_view_user" ON "shared_calendar_members"("view_id", "user_id"); + +-- CreateIndex +CREATE INDEX "idx_shared_comments_view_date" ON "shared_view_comments"("view_id", "item_date"); + +-- CreateIndex +CREATE UNIQUE INDEX "idx_shared_reactions_unique" ON "shared_view_reactions"("view_id", "user_id", "item_id", "emoji"); + +-- CreateIndex +CREATE UNIQUE INDEX "calendar_export_tokens_token_key" ON "calendar_export_tokens"("token"); + +-- CreateIndex +CREATE INDEX "idx_calendar_export_tokens_user" ON "calendar_export_tokens"("user_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "doc_collab_state_document_id_key" ON "doc_collab_state"("document_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "doc_access_policies_document_path_key" ON "doc_access_policies"("document_path"); + +-- CreateIndex +CREATE INDEX "doc_access_policies_created_by_id_idx" ON "doc_access_policies"("created_by_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "doc_share_links_share_token_key" ON "doc_share_links"("share_token"); + +-- CreateIndex +CREATE INDEX "doc_share_links_document_path_idx" ON "doc_share_links"("document_path"); + +-- CreateIndex +CREATE INDEX "doc_share_links_created_by_id_idx" ON "doc_share_links"("created_by_id"); + +-- CreateIndex +CREATE INDEX "doc_watches_file_path_idx" ON "doc_watches"("file_path"); + +-- CreateIndex +CREATE UNIQUE INDEX "doc_watches_user_id_file_path_key" ON "doc_watches"("user_id", "file_path"); + +-- CreateIndex +CREATE UNIQUE INDEX "participant_needs_user_id_key" ON "participant_needs"("user_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "participant_needs_contact_id_key" ON "participant_needs"("contact_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "meeting_agendas_shift_id_key" ON "meeting_agendas"("shift_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "meeting_agendas_poll_id_key" ON "meeting_agendas"("poll_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "meeting_minutes_agenda_id_key" ON "meeting_minutes"("agenda_id"); + +-- CreateIndex +CREATE INDEX "action_items_assignee_user_id_status_idx" ON "action_items"("assignee_user_id", "status"); + +-- CreateIndex +CREATE INDEX "action_items_due_date_idx" ON "action_items"("due_date"); + +-- CreateIndex +CREATE UNIQUE INDEX "straw_polls_slug_key" ON "straw_polls"("slug"); + +-- CreateIndex +CREATE INDEX "straw_polls_created_by_user_id_idx" ON "straw_polls"("created_by_user_id"); + +-- CreateIndex +CREATE INDEX "straw_polls_status_idx" ON "straw_polls"("status"); + +-- CreateIndex +CREATE INDEX "straw_poll_options_poll_id_idx" ON "straw_poll_options"("poll_id"); + +-- CreateIndex +CREATE INDEX "straw_poll_votes_poll_id_idx" ON "straw_poll_votes"("poll_id"); + +-- CreateIndex +CREATE INDEX "straw_poll_votes_option_id_idx" ON "straw_poll_votes"("option_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "straw_poll_votes_poll_id_user_id_key" ON "straw_poll_votes"("poll_id", "user_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "straw_poll_votes_poll_id_voter_token_key" ON "straw_poll_votes"("poll_id", "voter_token"); + +-- CreateIndex +CREATE UNIQUE INDEX "straw_poll_votes_poll_id_voter_ip_key" ON "straw_poll_votes"("poll_id", "voter_ip"); + +-- CreateIndex +CREATE INDEX "straw_poll_comments_poll_id_idx" ON "straw_poll_comments"("poll_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "straw_poll_challenges_poll_id_challenger_user_id_challenged_key" ON "straw_poll_challenges"("poll_id", "challenger_user_id", "challenged_user_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "action_campaigns_slug_key" ON "action_campaigns"("slug"); + +-- CreateIndex +CREATE INDEX "idx_action_campaigns_active" ON "action_campaigns"("is_active"); + +-- CreateIndex +CREATE INDEX "idx_action_steps_campaign" ON "action_steps"("campaign_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "action_steps_campaign_id_order_key" ON "action_steps"("campaign_id", "order"); + +-- CreateIndex +CREATE INDEX "idx_action_step_completions_user" ON "action_step_completions"("user_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "action_step_completions_user_id_step_id_key" ON "action_step_completions"("user_id", "step_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "documents_path_key" ON "documents"("path"); + +-- CreateIndex +CREATE INDEX "idx_documents_published" ON "documents"("is_published"); + +-- CreateIndex +CREATE INDEX "idx_documents_category" ON "documents"("category"); + +-- CreateIndex +CREATE INDEX "idx_documents_created_at" ON "documents"("created_at"); + +-- AddForeignKey +ALTER TABLE "refresh_tokens" ADD CONSTRAINT "refresh_tokens_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "campaigns" ADD CONSTRAINT "campaigns_createdByUserId_fkey" FOREIGN KEY ("createdByUserId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "campaigns" ADD CONSTRAINT "campaigns_reviewedByUserId_fkey" FOREIGN KEY ("reviewedByUserId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; +-- AddForeignKey +ALTER TABLE "petitions" ADD CONSTRAINT "petitions_linkedCampaignId_fkey" FOREIGN KEY ("linkedCampaignId") REFERENCES "campaigns"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "petitions" ADD CONSTRAINT "petitions_createdByUserId_fkey" FOREIGN KEY ("createdByUserId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "petitions" ADD CONSTRAINT "petitions_reviewedByUserId_fkey" FOREIGN KEY ("reviewedByUserId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "petition_signatures" ADD CONSTRAINT "petition_signatures_petitionId_fkey" FOREIGN KEY ("petitionId") REFERENCES "petitions"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "petition_signatures" ADD CONSTRAINT "petition_signatures_contactId_fkey" FOREIGN KEY ("contactId") REFERENCES "contacts"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "campaign_emails" ADD CONSTRAINT "campaign_emails_campaignId_fkey" FOREIGN KEY ("campaignId") REFERENCES "campaigns"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "campaign_emails" ADD CONSTRAINT "campaign_emails_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "representative_responses" ADD CONSTRAINT "representative_responses_campaignId_fkey" FOREIGN KEY ("campaignId") REFERENCES "campaigns"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "representative_responses" ADD CONSTRAINT "representative_responses_submittedByUserId_fkey" FOREIGN KEY ("submittedByUserId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "response_upvotes" ADD CONSTRAINT "response_upvotes_responseId_fkey" FOREIGN KEY ("responseId") REFERENCES "representative_responses"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "response_upvotes" ADD CONSTRAINT "response_upvotes_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "custom_recipients" ADD CONSTRAINT "custom_recipients_campaignId_fkey" FOREIGN KEY ("campaignId") REFERENCES "campaigns"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "calls" ADD CONSTRAINT "calls_campaignId_fkey" FOREIGN KEY ("campaignId") REFERENCES "campaigns"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "locations" ADD CONSTRAINT "locations_createdByUserId_fkey" FOREIGN KEY ("createdByUserId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "locations" ADD CONSTRAINT "locations_updatedByUserId_fkey" FOREIGN KEY ("updatedByUserId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + -- AddForeignKey ALTER TABLE "addresses" ADD CONSTRAINT "addresses_locationId_fkey" FOREIGN KEY ("locationId") REFERENCES "locations"("id") ON DELETE CASCADE ON UPDATE CASCADE; @@ -3284,12 +5236,30 @@ ALTER TABLE "location_history" ADD CONSTRAINT "location_history_locationId_fkey" -- AddForeignKey ALTER TABLE "location_history" ADD CONSTRAINT "location_history_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; +-- AddForeignKey +ALTER TABLE "shifts" ADD CONSTRAINT "shifts_cutId_fkey" FOREIGN KEY ("cutId") REFERENCES "cuts"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "shifts" ADD CONSTRAINT "shifts_ticketed_event_id_fkey" FOREIGN KEY ("ticketed_event_id") REFERENCES "ticketed_events"("id") ON DELETE SET NULL ON UPDATE CASCADE; + -- AddForeignKey ALTER TABLE "shifts" ADD CONSTRAINT "shifts_seriesId_fkey" FOREIGN KEY ("seriesId") REFERENCES "shift_series"("id") ON DELETE SET NULL ON UPDATE CASCADE; +-- AddForeignKey +ALTER TABLE "shifts" ADD CONSTRAINT "shifts_meetingId_fkey" FOREIGN KEY ("meetingId") REFERENCES "meetings"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "shift_signups" ADD CONSTRAINT "shift_signups_shiftId_fkey" FOREIGN KEY ("shiftId") REFERENCES "shifts"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "shift_signups" ADD CONSTRAINT "shift_signups_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + -- AddForeignKey ALTER TABLE "shift_series" ADD CONSTRAINT "shift_series_cutId_fkey" FOREIGN KEY ("cutId") REFERENCES "cuts"("id") ON DELETE SET NULL ON UPDATE CASCADE; +-- AddForeignKey +ALTER TABLE "cuts" ADD CONSTRAINT "cuts_createdByUserId_fkey" FOREIGN KEY ("createdByUserId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + -- AddForeignKey ALTER TABLE "email_templates" ADD CONSTRAINT "email_templates_createdByUserId_fkey" FOREIGN KEY ("createdByUserId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; @@ -3311,9 +5281,36 @@ ALTER TABLE "email_template_test_logs" ADD CONSTRAINT "email_template_test_logs_ -- AddForeignKey ALTER TABLE "email_template_test_logs" ADD CONSTRAINT "email_template_test_logs_sentByUserId_fkey" FOREIGN KEY ("sentByUserId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +-- AddForeignKey +ALTER TABLE "canvass_sessions" ADD CONSTRAINT "canvass_sessions_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "canvass_sessions" ADD CONSTRAINT "canvass_sessions_cutId_fkey" FOREIGN KEY ("cutId") REFERENCES "cuts"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "canvass_sessions" ADD CONSTRAINT "canvass_sessions_shiftId_fkey" FOREIGN KEY ("shiftId") REFERENCES "shifts"("id") ON DELETE SET NULL ON UPDATE CASCADE; + -- AddForeignKey ALTER TABLE "canvass_visits" ADD CONSTRAINT "canvass_visits_addressId_fkey" FOREIGN KEY ("addressId") REFERENCES "addresses"("id") ON DELETE CASCADE ON UPDATE CASCADE; +-- AddForeignKey +ALTER TABLE "canvass_visits" ADD CONSTRAINT "canvass_visits_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "canvass_visits" ADD CONSTRAINT "canvass_visits_shiftId_fkey" FOREIGN KEY ("shiftId") REFERENCES "shifts"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "canvass_visits" ADD CONSTRAINT "canvass_visits_sessionId_fkey" FOREIGN KEY ("sessionId") REFERENCES "canvass_sessions"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "tracking_sessions" ADD CONSTRAINT "tracking_sessions_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "tracking_sessions" ADD CONSTRAINT "tracking_sessions_canvassSessionId_fkey" FOREIGN KEY ("canvassSessionId") REFERENCES "canvass_sessions"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "track_points" ADD CONSTRAINT "track_points_trackingSessionId_fkey" FOREIGN KEY ("trackingSessionId") REFERENCES "tracking_sessions"("id") ON DELETE CASCADE ON UPDATE CASCADE; + -- AddForeignKey ALTER TABLE "videos" ADD CONSTRAINT "videos_uploader_id_fkey" FOREIGN KEY ("uploader_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; @@ -3506,6 +5503,15 @@ ALTER TABLE "close_friends" ADD CONSTRAINT "close_friends_user_id_fkey" FOREIGN -- AddForeignKey ALTER TABLE "close_friends" ADD CONSTRAINT "close_friends_close_friend_id_fkey" FOREIGN KEY ("close_friend_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; +-- AddForeignKey +ALTER TABLE "social_groups" ADD CONSTRAINT "social_groups_meeting_id_fkey" FOREIGN KEY ("meeting_id") REFERENCES "meetings"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "social_group_members" ADD CONSTRAINT "social_group_members_group_id_fkey" FOREIGN KEY ("group_id") REFERENCES "social_groups"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "social_group_members" ADD CONSTRAINT "social_group_members_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + -- AddForeignKey ALTER TABLE "user_uploads" ADD CONSTRAINT "user_uploads_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; @@ -3687,7 +5693,10 @@ ALTER TABLE "payments" ADD CONSTRAINT "payments_invoice_id_fkey" FOREIGN KEY ("i ALTER TABLE "payments" ADD CONSTRAINT "payments_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey -ALTER TABLE "payment_audit_log" ADD CONSTRAINT "payment_audit_log_payment_id_fkey" FOREIGN KEY ("payment_id") REFERENCES "payments"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +ALTER TABLE "payment_audit_log" ADD CONSTRAINT "payment_audit_log_payment_id_fkey" FOREIGN KEY ("payment_id") REFERENCES "payments"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "payment_audit_log" ADD CONSTRAINT "payment_audit_log_order_id_fkey" FOREIGN KEY ("order_id") REFERENCES "orders"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "payment_audit_log" ADD CONSTRAINT "payment_audit_log_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; @@ -3701,6 +5710,9 @@ ALTER TABLE "orders" ADD CONSTRAINT "orders_product_id_fkey" FOREIGN KEY ("produ -- AddForeignKey ALTER TABLE "orders" ADD CONSTRAINT "orders_donation_page_id_fkey" FOREIGN KEY ("donation_page_id") REFERENCES "donation_pages"("id") ON DELETE SET NULL ON UPDATE CASCADE; +-- AddForeignKey +ALTER TABLE "orders" ADD CONSTRAINT "orders_influence_campaign_id_fkey" FOREIGN KEY ("influence_campaign_id") REFERENCES "campaigns"("id") ON DELETE SET NULL ON UPDATE CASCADE; + -- AddForeignKey ALTER TABLE "donation_pages" ADD CONSTRAINT "donation_pages_created_by_user_id_fkey" FOREIGN KEY ("created_by_user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; @@ -3791,6 +5803,9 @@ ALTER TABLE "sms_messages" ADD CONSTRAINT "sms_messages_conversationId_fkey" FOR -- AddForeignKey ALTER TABLE "sms_conversations" ADD CONSTRAINT "sms_conversations_campaignId_fkey" FOREIGN KEY ("campaignId") REFERENCES "sms_campaigns"("id") ON DELETE SET NULL ON UPDATE CASCADE; +-- AddForeignKey +ALTER TABLE "sms_conversations" ADD CONSTRAINT "sms_conversations_contactId_fkey" FOREIGN KEY ("contactId") REFERENCES "contacts"("id") ON DELETE SET NULL ON UPDATE CASCADE; + -- AddForeignKey ALTER TABLE "sms_message_templates" ADD CONSTRAINT "sms_message_templates_createdByUserId_fkey" FOREIGN KEY ("createdByUserId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; @@ -3821,3 +5836,240 @@ ALTER TABLE "contact_connections" ADD CONSTRAINT "contact_connections_toContactI -- AddForeignKey ALTER TABLE "contact_activities" ADD CONSTRAINT "contact_activities_contactId_fkey" FOREIGN KEY ("contactId") REFERENCES "contacts"("id") ON DELETE CASCADE ON UPDATE CASCADE; +-- AddForeignKey +ALTER TABLE "meetings" ADD CONSTRAINT "meetings_created_by_user_id_fkey" FOREIGN KEY ("created_by_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "scheduling_polls" ADD CONSTRAINT "scheduling_polls_finalized_option_id_fkey" FOREIGN KEY ("finalized_option_id") REFERENCES "scheduling_poll_options"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "scheduling_polls" ADD CONSTRAINT "scheduling_polls_converted_shift_id_fkey" FOREIGN KEY ("converted_shift_id") REFERENCES "shifts"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "scheduling_polls" ADD CONSTRAINT "scheduling_polls_created_by_user_id_fkey" FOREIGN KEY ("created_by_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "scheduling_poll_options" ADD CONSTRAINT "scheduling_poll_options_poll_id_fkey" FOREIGN KEY ("poll_id") REFERENCES "scheduling_polls"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "scheduling_poll_votes" ADD CONSTRAINT "scheduling_poll_votes_poll_id_fkey" FOREIGN KEY ("poll_id") REFERENCES "scheduling_polls"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "scheduling_poll_votes" ADD CONSTRAINT "scheduling_poll_votes_option_id_fkey" FOREIGN KEY ("option_id") REFERENCES "scheduling_poll_options"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "scheduling_poll_votes" ADD CONSTRAINT "scheduling_poll_votes_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "scheduling_poll_votes" ADD CONSTRAINT "scheduling_poll_votes_contact_id_fkey" FOREIGN KEY ("contact_id") REFERENCES "contacts"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "scheduling_poll_comments" ADD CONSTRAINT "scheduling_poll_comments_poll_id_fkey" FOREIGN KEY ("poll_id") REFERENCES "scheduling_polls"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "scheduling_poll_comments" ADD CONSTRAINT "scheduling_poll_comments_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "invite_codes" ADD CONSTRAINT "invite_codes_created_by_user_id_fkey" FOREIGN KEY ("created_by_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "referrals" ADD CONSTRAINT "referrals_referrer_id_fkey" FOREIGN KEY ("referrer_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "referrals" ADD CONSTRAINT "referrals_referred_user_id_fkey" FOREIGN KEY ("referred_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "referrals" ADD CONSTRAINT "referrals_invite_code_id_fkey" FOREIGN KEY ("invite_code_id") REFERENCES "invite_codes"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "impact_stories" ADD CONSTRAINT "impact_stories_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "campaigns"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "impact_stories" ADD CONSTRAINT "impact_stories_created_by_user_id_fkey" FOREIGN KEY ("created_by_user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "campaign_milestones" ADD CONSTRAINT "campaign_milestones_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "campaigns"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "volunteer_spotlights" ADD CONSTRAINT "volunteer_spotlights_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "volunteer_spotlights" ADD CONSTRAINT "volunteer_spotlights_nominated_by_user_id_fkey" FOREIGN KEY ("nominated_by_user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "volunteer_spotlights" ADD CONSTRAINT "volunteer_spotlights_approved_by_user_id_fkey" FOREIGN KEY ("approved_by_user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "challenges" ADD CONSTRAINT "challenges_created_by_user_id_fkey" FOREIGN KEY ("created_by_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "challenge_teams" ADD CONSTRAINT "challenge_teams_challenge_id_fkey" FOREIGN KEY ("challenge_id") REFERENCES "challenges"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "challenge_teams" ADD CONSTRAINT "challenge_teams_captain_user_id_fkey" FOREIGN KEY ("captain_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "challenge_team_members" ADD CONSTRAINT "challenge_team_members_team_id_fkey" FOREIGN KEY ("team_id") REFERENCES "challenge_teams"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "challenge_team_members" ADD CONSTRAINT "challenge_team_members_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ticketed_events" ADD CONSTRAINT "ticketed_events_created_by_user_id_fkey" FOREIGN KEY ("created_by_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ticketed_events" ADD CONSTRAINT "ticketed_events_meeting_id_fkey" FOREIGN KEY ("meeting_id") REFERENCES "meetings"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ticket_tiers" ADD CONSTRAINT "ticket_tiers_event_id_fkey" FOREIGN KEY ("event_id") REFERENCES "ticketed_events"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "tickets" ADD CONSTRAINT "tickets_event_id_fkey" FOREIGN KEY ("event_id") REFERENCES "ticketed_events"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "tickets" ADD CONSTRAINT "tickets_tier_id_fkey" FOREIGN KEY ("tier_id") REFERENCES "ticket_tiers"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "tickets" ADD CONSTRAINT "tickets_order_id_fkey" FOREIGN KEY ("order_id") REFERENCES "orders"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "tickets" ADD CONSTRAINT "tickets_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "check_ins" ADD CONSTRAINT "check_ins_ticket_id_fkey" FOREIGN KEY ("ticket_id") REFERENCES "tickets"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "check_ins" ADD CONSTRAINT "check_ins_event_id_fkey" FOREIGN KEY ("event_id") REFERENCES "ticketed_events"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "check_ins" ADD CONSTRAINT "check_ins_checked_in_by_user_id_fkey" FOREIGN KEY ("checked_in_by_user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "calendar_layers" ADD CONSTRAINT "calendar_layers_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "calendar_items" ADD CONSTRAINT "calendar_items_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "calendar_items" ADD CONSTRAINT "calendar_items_layer_id_fkey" FOREIGN KEY ("layer_id") REFERENCES "calendar_layers"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "calendar_feeds" ADD CONSTRAINT "calendar_feeds_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "calendar_feeds" ADD CONSTRAINT "calendar_feeds_layer_id_fkey" FOREIGN KEY ("layer_id") REFERENCES "calendar_layers"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "shared_calendar_views" ADD CONSTRAINT "shared_calendar_views_owner_id_fkey" FOREIGN KEY ("owner_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "shared_calendar_members" ADD CONSTRAINT "shared_calendar_members_view_id_fkey" FOREIGN KEY ("view_id") REFERENCES "shared_calendar_views"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "shared_calendar_members" ADD CONSTRAINT "shared_calendar_members_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "shared_view_comments" ADD CONSTRAINT "shared_view_comments_view_id_fkey" FOREIGN KEY ("view_id") REFERENCES "shared_calendar_views"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "shared_view_comments" ADD CONSTRAINT "shared_view_comments_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "shared_view_reactions" ADD CONSTRAINT "shared_view_reactions_view_id_fkey" FOREIGN KEY ("view_id") REFERENCES "shared_calendar_views"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "shared_view_reactions" ADD CONSTRAINT "shared_view_reactions_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "calendar_export_tokens" ADD CONSTRAINT "calendar_export_tokens_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "doc_access_policies" ADD CONSTRAINT "doc_access_policies_created_by_id_fkey" FOREIGN KEY ("created_by_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "doc_share_links" ADD CONSTRAINT "doc_share_links_created_by_id_fkey" FOREIGN KEY ("created_by_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "doc_watches" ADD CONSTRAINT "doc_watches_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "participant_needs" ADD CONSTRAINT "participant_needs_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "participant_needs" ADD CONSTRAINT "participant_needs_contact_id_fkey" FOREIGN KEY ("contact_id") REFERENCES "contacts"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "meeting_agendas" ADD CONSTRAINT "meeting_agendas_shift_id_fkey" FOREIGN KEY ("shift_id") REFERENCES "shifts"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "meeting_agendas" ADD CONSTRAINT "meeting_agendas_poll_id_fkey" FOREIGN KEY ("poll_id") REFERENCES "scheduling_polls"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "meeting_agendas" ADD CONSTRAINT "meeting_agendas_created_by_user_id_fkey" FOREIGN KEY ("created_by_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "meeting_minutes" ADD CONSTRAINT "meeting_minutes_agenda_id_fkey" FOREIGN KEY ("agenda_id") REFERENCES "meeting_agendas"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "meeting_minutes" ADD CONSTRAINT "meeting_minutes_approved_by_user_id_fkey" FOREIGN KEY ("approved_by_user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "meeting_minutes" ADD CONSTRAINT "meeting_minutes_created_by_user_id_fkey" FOREIGN KEY ("created_by_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "action_items" ADD CONSTRAINT "action_items_agenda_id_fkey" FOREIGN KEY ("agenda_id") REFERENCES "meeting_agendas"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "action_items" ADD CONSTRAINT "action_items_assignee_user_id_fkey" FOREIGN KEY ("assignee_user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "action_items" ADD CONSTRAINT "action_items_created_by_user_id_fkey" FOREIGN KEY ("created_by_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "straw_polls" ADD CONSTRAINT "straw_polls_created_by_user_id_fkey" FOREIGN KEY ("created_by_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "straw_poll_options" ADD CONSTRAINT "straw_poll_options_poll_id_fkey" FOREIGN KEY ("poll_id") REFERENCES "straw_polls"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "straw_poll_votes" ADD CONSTRAINT "straw_poll_votes_poll_id_fkey" FOREIGN KEY ("poll_id") REFERENCES "straw_polls"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "straw_poll_votes" ADD CONSTRAINT "straw_poll_votes_option_id_fkey" FOREIGN KEY ("option_id") REFERENCES "straw_poll_options"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "straw_poll_votes" ADD CONSTRAINT "straw_poll_votes_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "straw_poll_votes" ADD CONSTRAINT "straw_poll_votes_contact_id_fkey" FOREIGN KEY ("contact_id") REFERENCES "contacts"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "straw_poll_comments" ADD CONSTRAINT "straw_poll_comments_poll_id_fkey" FOREIGN KEY ("poll_id") REFERENCES "straw_polls"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "straw_poll_comments" ADD CONSTRAINT "straw_poll_comments_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "straw_poll_challenges" ADD CONSTRAINT "straw_poll_challenges_poll_id_fkey" FOREIGN KEY ("poll_id") REFERENCES "straw_polls"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "straw_poll_challenges" ADD CONSTRAINT "straw_poll_challenges_challenger_user_id_fkey" FOREIGN KEY ("challenger_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "straw_poll_challenges" ADD CONSTRAINT "straw_poll_challenges_challenged_user_id_fkey" FOREIGN KEY ("challenged_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "action_campaigns" ADD CONSTRAINT "action_campaigns_created_by_user_id_fkey" FOREIGN KEY ("created_by_user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "action_steps" ADD CONSTRAINT "action_steps_campaign_id_fkey" FOREIGN KEY ("campaign_id") REFERENCES "action_campaigns"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "action_step_completions" ADD CONSTRAINT "action_step_completions_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "action_step_completions" ADD CONSTRAINT "action_step_completions_step_id_fkey" FOREIGN KEY ("step_id") REFERENCES "action_steps"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "documents" ADD CONSTRAINT "documents_uploader_id_fkey" FOREIGN KEY ("uploader_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; +