- Ticketed events: full CRUD, ticket tiers (free/paid/donation), Stripe checkout, QR-based check-in scanner, public event pages, ticket confirmation emails - Event formats: IN_PERSON/ONLINE/HYBRID with auto Jitsi meeting room lifecycle, ticket-gated meeting access, moderator JWT tokens, feature-flag guarded - Social engagement: challenges with scoring/leaderboards, referral tracking, volunteer spotlight, impact stories, campaign celebrations, wall of fame - Social calendar: personal calendar layers, shared calendar items with recurrence, scheduling polls, mobile day view - MCP server: events tool pack with full admin CRUD + meeting token generation - Unified calendar: eventFormat-aware tags, online event indicators - Updated docs site, pangolin configs, and various admin UI improvements Bunker Admin
177 lines
6.0 KiB
SQL
177 lines
6.0 KiB
SQL
-- 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;
|