bunker-admin 08d8066157 Add ticketed events, Jitsi meeting integration, social features, and calendar system
- 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
2026-03-06 14:33:33 -07:00

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;