Merge branch 'chore/squash-prisma-migrations'
This commit is contained in:
commit
6d562da4b2
@ -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;
|
||||
@ -1,5 +0,0 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE "locations" ADD COLUMN "buildingUse" INTEGER,
|
||||
ADD COLUMN "federalDistrict" TEXT,
|
||||
ADD COLUMN "postalCode" TEXT,
|
||||
ADD COLUMN "province" TEXT;
|
||||
@ -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';
|
||||
@ -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;
|
||||
@ -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")
|
||||
);
|
||||
@ -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;
|
||||
@ -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;
|
||||
@ -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 '';
|
||||
@ -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';
|
||||
@ -1,2 +0,0 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE "site_settings" ADD COLUMN IF NOT EXISTS "notifyAdminShiftCancellation" BOOLEAN NOT NULL DEFAULT true;
|
||||
@ -1,2 +0,0 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE "shifts" ADD COLUMN "gancioEventId" INTEGER;
|
||||
@ -1,2 +0,0 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE "site_settings" ADD COLUMN IF NOT EXISTS "enable_events" BOOLEAN NOT NULL DEFAULT false;
|
||||
@ -1,2 +0,0 @@
|
||||
-- AlterEnum
|
||||
ALTER TYPE "UserCreatedVia" ADD VALUE IF NOT EXISTS 'QUICK_JOIN_INVITE';
|
||||
@ -1,2 +0,0 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE "ads" ADD COLUMN "placements" JSONB DEFAULT '[]';
|
||||
@ -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;
|
||||
@ -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;
|
||||
@ -1,2 +0,0 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE "site_settings" ADD COLUMN "enable_social" BOOLEAN NOT NULL DEFAULT false;
|
||||
@ -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);
|
||||
@ -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;
|
||||
@ -1,2 +0,0 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE "site_settings" ADD COLUMN "enable_meet" BOOLEAN NOT NULL DEFAULT false;
|
||||
@ -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;
|
||||
@ -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;
|
||||
@ -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;
|
||||
@ -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;
|
||||
@ -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;
|
||||
@ -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;
|
||||
@ -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;
|
||||
@ -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;
|
||||
@ -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';
|
||||
@ -1,2 +0,0 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE "scheduling_polls" ADD COLUMN "is_private" BOOLEAN NOT NULL DEFAULT false;
|
||||
@ -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;
|
||||
@ -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';
|
||||
@ -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");
|
||||
@ -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;
|
||||
@ -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;
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
@ -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;
|
||||
@ -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;
|
||||
@ -1,2 +0,0 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE "site_settings" ADD COLUMN "gitea_setup_complete" BOOLEAN NOT NULL DEFAULT false;
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
@ -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';
|
||||
@ -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");
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
@ -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;
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user