-- 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;