@bash-app/bash-common 30.225.0 → 30.227.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/agePolicy.test.d.ts +2 -0
- package/dist/__tests__/agePolicy.test.d.ts.map +1 -0
- package/dist/__tests__/agePolicy.test.js +203 -0
- package/dist/__tests__/agePolicy.test.js.map +1 -0
- package/dist/__tests__/getDisplayGender.test.d.ts +2 -0
- package/dist/__tests__/getDisplayGender.test.d.ts.map +1 -0
- package/dist/__tests__/getDisplayGender.test.js +34 -0
- package/dist/__tests__/getDisplayGender.test.js.map +1 -0
- package/dist/__tests__/statusEnums.test.d.ts +2 -0
- package/dist/__tests__/statusEnums.test.d.ts.map +1 -0
- package/dist/__tests__/statusEnums.test.js +24 -0
- package/dist/__tests__/statusEnums.test.js.map +1 -0
- package/dist/aiApproval.d.ts +89 -0
- package/dist/aiApproval.d.ts.map +1 -0
- package/dist/aiApproval.js +82 -0
- package/dist/aiApproval.js.map +1 -0
- package/dist/definitions.d.ts +44 -2
- package/dist/definitions.d.ts.map +1 -1
- package/dist/definitions.js +106 -2
- package/dist/definitions.js.map +1 -1
- package/dist/extendedSchemas.d.ts +280 -105
- package/dist/extendedSchemas.d.ts.map +1 -1
- package/dist/extendedSchemas.js +34 -2
- package/dist/extendedSchemas.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/legalTemplates.d.ts +1 -1
- package/dist/legalTemplates.js +1 -1
- package/dist/utils/__tests__/badgeUtils.test.d.ts +2 -0
- package/dist/utils/__tests__/badgeUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/badgeUtils.test.js +157 -0
- package/dist/utils/__tests__/badgeUtils.test.js.map +1 -0
- package/dist/utils/__tests__/bashPointsPaymentUtils.test.d.ts +2 -0
- package/dist/utils/__tests__/bashPointsPaymentUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/bashPointsPaymentUtils.test.js +114 -0
- package/dist/utils/__tests__/bashPointsPaymentUtils.test.js.map +1 -0
- package/dist/utils/__tests__/contentFilterUtils.test.d.ts +2 -0
- package/dist/utils/__tests__/contentFilterUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/contentFilterUtils.test.js +443 -0
- package/dist/utils/__tests__/contentFilterUtils.test.js.map +1 -0
- package/dist/utils/__tests__/displayDateUtils.test.d.ts +2 -0
- package/dist/utils/__tests__/displayDateUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/displayDateUtils.test.js +105 -0
- package/dist/utils/__tests__/displayDateUtils.test.js.map +1 -0
- package/dist/utils/__tests__/flyerUtils.test.d.ts +2 -0
- package/dist/utils/__tests__/flyerUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/flyerUtils.test.js +49 -0
- package/dist/utils/__tests__/flyerUtils.test.js.map +1 -0
- package/dist/utils/__tests__/getBackendHost.test.d.ts +2 -0
- package/dist/utils/__tests__/getBackendHost.test.d.ts.map +1 -0
- package/dist/utils/__tests__/getBackendHost.test.js +104 -0
- package/dist/utils/__tests__/getBackendHost.test.js.map +1 -0
- package/dist/utils/__tests__/getFrontendHost.test.d.ts +2 -0
- package/dist/utils/__tests__/getFrontendHost.test.d.ts.map +1 -0
- package/dist/utils/__tests__/getFrontendHost.test.js +207 -0
- package/dist/utils/__tests__/getFrontendHost.test.js.map +1 -0
- package/dist/utils/__tests__/promoCodesUtils.test.d.ts +2 -0
- package/dist/utils/__tests__/promoCodesUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/promoCodesUtils.test.js +183 -0
- package/dist/utils/__tests__/promoCodesUtils.test.js.map +1 -0
- package/dist/utils/__tests__/qrCodeUtils.test.d.ts +2 -0
- package/dist/utils/__tests__/qrCodeUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/qrCodeUtils.test.js +99 -0
- package/dist/utils/__tests__/qrCodeUtils.test.js.map +1 -0
- package/dist/utils/__tests__/stripeAccountUtils.test.d.ts +2 -0
- package/dist/utils/__tests__/stripeAccountUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/stripeAccountUtils.test.js +75 -0
- package/dist/utils/__tests__/stripeAccountUtils.test.js.map +1 -0
- package/dist/utils/blog/__tests__/getRelatedBlogPosts.test.d.ts +2 -0
- package/dist/utils/blog/__tests__/getRelatedBlogPosts.test.d.ts.map +1 -0
- package/dist/utils/blog/__tests__/getRelatedBlogPosts.test.js +233 -0
- package/dist/utils/blog/__tests__/getRelatedBlogPosts.test.js.map +1 -0
- package/dist/utils/blog/blogCommentDbUtils.d.ts +161 -0
- package/dist/utils/blog/blogCommentDbUtils.d.ts.map +1 -0
- package/dist/utils/blog/blogCommentDbUtils.js +111 -0
- package/dist/utils/blog/blogCommentDbUtils.js.map +1 -0
- package/dist/utils/blog/blogDbUtils.d.ts +10 -0
- package/dist/utils/blog/blogDbUtils.d.ts.map +1 -1
- package/dist/utils/blog/blogDbUtils.js +71 -0
- package/dist/utils/blog/blogDbUtils.js.map +1 -1
- package/dist/utils/flyerUtils.d.ts +42 -0
- package/dist/utils/flyerUtils.d.ts.map +1 -0
- package/dist/utils/flyerUtils.js +104 -0
- package/dist/utils/flyerUtils.js.map +1 -0
- package/dist/utils/urlUtils.d.ts +10 -0
- package/dist/utils/urlUtils.d.ts.map +1 -1
- package/dist/utils/urlUtils.js +24 -5
- package/dist/utils/urlUtils.js.map +1 -1
- package/dist/utils/userUtils.d.ts +32 -0
- package/dist/utils/userUtils.d.ts.map +1 -1
- package/dist/utils/userUtils.js +27 -0
- package/dist/utils/userUtils.js.map +1 -1
- package/package.json +1 -1
- package/prisma/schema.prisma +1196 -845
- package/src/__tests__/agePolicy.test.ts +257 -0
- package/src/__tests__/getDisplayGender.test.ts +50 -0
- package/src/__tests__/statusEnums.test.ts +36 -0
- package/src/aiApproval.ts +118 -0
- package/src/definitions.ts +138 -1
- package/src/extendedSchemas.ts +86 -3
- package/src/index.ts +15 -0
- package/src/legalTemplates.ts +1 -1
- package/src/utils/__tests__/badgeUtils.test.ts +191 -0
- package/src/utils/__tests__/bashPointsPaymentUtils.test.ts +153 -0
- package/src/utils/__tests__/contentFilterUtils.test.ts +547 -0
- package/src/utils/__tests__/displayDateUtils.test.ts +113 -0
- package/src/utils/__tests__/flyerUtils.test.ts +70 -0
- package/src/utils/__tests__/getBackendHost.test.ts +128 -0
- package/src/utils/__tests__/getFrontendHost.test.ts +232 -0
- package/src/utils/__tests__/promoCodesUtils.test.ts +237 -0
- package/src/utils/__tests__/qrCodeUtils.test.ts +143 -0
- package/src/utils/__tests__/stripeAccountUtils.test.ts +93 -0
- package/src/utils/blog/__tests__/getRelatedBlogPosts.test.ts +271 -0
- package/src/utils/blog/blogCommentDbUtils.ts +161 -0
- package/src/utils/blog/blogDbUtils.ts +95 -1
- package/src/utils/flyerUtils.ts +137 -0
- package/src/utils/urlUtils.ts +27 -5
- package/src/utils/userUtils.ts +40 -0
- package/dist/utils/__tests__/cancellationPolicyRefundResolver.test.d.ts +0 -6
- package/dist/utils/__tests__/cancellationPolicyRefundResolver.test.d.ts.map +0 -1
- package/dist/utils/__tests__/cancellationPolicyRefundResolver.test.js +0 -104
- package/dist/utils/__tests__/cancellationPolicyRefundResolver.test.js.map +0 -1
- package/dist/utils/service/serviceRateDBUtils.d.ts +0 -1
- package/dist/utils/service/serviceRateDBUtils.d.ts.map +0 -1
- package/dist/utils/service/serviceRateDBUtils.js +0 -159
- package/dist/utils/service/serviceRateDBUtils.js.map +0 -1
- package/prisma/migrations/add_bash_availability.sql +0 -53
- package/prisma/migrations/add_bashcash_pricing_to_ticket_tier.sql +0 -15
- package/prisma/migrations/add_bashpoints_purchase_tracking.sql +0 -33
- package/prisma/migrations/add_event_group_allow_auto_join.sql +0 -17
- package/prisma/migrations/add_group_member_status_not_going_maybe.sql +0 -5
- package/prisma/migrations/add_groups_and_momentum.sql +0 -135
- package/prisma/migrations/add_groups_momentum_phase0_4.sql +0 -200
- package/prisma/migrations/add_new_feature_tables.sql +0 -140
- package/prisma/migrations/add_pricing_type_enum.sql +0 -88
- package/prisma/migrations/add_tier_privacy_and_fee_handling.sql +0 -29
- package/prisma/migrations/diagnostic_bashcash_columns.sql +0 -157
- package/prisma/migrations/fix_bashcash_referral_code_schema_mismatch.sql +0 -81
- package/prisma/migrations/rename_bashcash_to_bashpoints.sql +0 -183
- package/prisma/migrations/rename_bashcredits_to_bashpoints.sql +0 -96
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
-- Migration: Add BashCash pricing support to TicketTier
|
|
2
|
-
-- Date: 2026-01-25
|
|
3
|
-
-- Description: Adds pricingType and priceBashCash fields to support peer-to-peer BashCash ticket economy
|
|
4
|
-
|
|
5
|
-
-- Add pricingType field (default to 'USD' for existing tickets)
|
|
6
|
-
ALTER TABLE "TicketTier"
|
|
7
|
-
ADD COLUMN IF NOT EXISTS "pricingType" TEXT NOT NULL DEFAULT 'USD';
|
|
8
|
-
|
|
9
|
-
-- Add priceBashCash field (nullable, only used when pricingType='BASHCASH')
|
|
10
|
-
ALTER TABLE "TicketTier"
|
|
11
|
-
ADD COLUMN IF NOT EXISTS "priceBashCash" INTEGER;
|
|
12
|
-
|
|
13
|
-
-- Add comment for documentation
|
|
14
|
-
COMMENT ON COLUMN "TicketTier"."pricingType" IS 'Ticket pricing type: USD (paid with dollars) or BASHCASH (paid with credits)';
|
|
15
|
-
COMMENT ON COLUMN "TicketTier"."priceBashCash" IS 'Price in BashCash credits (only used when pricingType=BASHCASH, peer-to-peer transfer)';
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
-- Add BashPoints purchase tracking to Ticket model
|
|
2
|
-
-- This allows tickets to be purchased with either USD (Stripe) or BashPoints (peer-to-peer)
|
|
3
|
-
|
|
4
|
-
DO $$ BEGIN
|
|
5
|
-
-- Add purchaseType column if it doesn't exist
|
|
6
|
-
IF NOT EXISTS (
|
|
7
|
-
SELECT 1 FROM information_schema.columns
|
|
8
|
-
WHERE table_name = 'Ticket' AND column_name = 'purchaseType'
|
|
9
|
-
) THEN
|
|
10
|
-
ALTER TABLE "Ticket" ADD COLUMN "purchaseType" TEXT;
|
|
11
|
-
COMMENT ON COLUMN "Ticket"."purchaseType" IS 'How ticket was purchased: USD, BashPoints, Free, Comp';
|
|
12
|
-
END IF;
|
|
13
|
-
|
|
14
|
-
-- Add pointsPaid column if it doesn't exist
|
|
15
|
-
IF NOT EXISTS (
|
|
16
|
-
SELECT 1 FROM information_schema.columns
|
|
17
|
-
WHERE table_name = 'Ticket' AND column_name = 'pointsPaid'
|
|
18
|
-
) THEN
|
|
19
|
-
ALTER TABLE "Ticket" ADD COLUMN "pointsPaid" INTEGER;
|
|
20
|
-
COMMENT ON COLUMN "Ticket"."pointsPaid" IS 'BashPoints amount paid (if purchaseType=BashPoints)';
|
|
21
|
-
END IF;
|
|
22
|
-
|
|
23
|
-
-- Add stripePurchaseId column if it doesn't exist
|
|
24
|
-
IF NOT EXISTS (
|
|
25
|
-
SELECT 1 FROM information_schema.columns
|
|
26
|
-
WHERE table_name = 'Ticket' AND column_name = 'stripePurchaseId'
|
|
27
|
-
) THEN
|
|
28
|
-
ALTER TABLE "Ticket" ADD COLUMN "stripePurchaseId" TEXT;
|
|
29
|
-
COMMENT ON COLUMN "Ticket"."stripePurchaseId" IS 'Stripe payment ID (if purchaseType=USD)';
|
|
30
|
-
END IF;
|
|
31
|
-
|
|
32
|
-
RAISE NOTICE 'BashPoints purchase tracking columns added to Ticket table';
|
|
33
|
-
END $$;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
-- Add allowAutoJoin to EventGroup: when true, anyone can join instantly; when false (default), join requests require owner approval.
|
|
2
|
-
-- Idempotent — safe to run multiple times.
|
|
3
|
-
|
|
4
|
-
DO $$ BEGIN
|
|
5
|
-
|
|
6
|
-
IF NOT EXISTS (
|
|
7
|
-
SELECT 1 FROM information_schema.columns
|
|
8
|
-
WHERE table_name = 'EventGroup' AND column_name = 'allowAutoJoin'
|
|
9
|
-
) THEN
|
|
10
|
-
ALTER TABLE "EventGroup"
|
|
11
|
-
ADD COLUMN "allowAutoJoin" BOOLEAN NOT NULL DEFAULT false;
|
|
12
|
-
RAISE NOTICE 'Added EventGroup.allowAutoJoin';
|
|
13
|
-
ELSE
|
|
14
|
-
RAISE NOTICE 'EventGroup.allowAutoJoin already exists — skipping';
|
|
15
|
-
END IF;
|
|
16
|
-
|
|
17
|
-
END $$;
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
-- Add NotGoing and Maybe to GroupMemberStatus enum (aligns with Invitation RSVP: rejectedDate, maybeDate).
|
|
2
|
-
-- Run once. If values already exist, this will error — safe to ignore on re-run.
|
|
3
|
-
|
|
4
|
-
ALTER TYPE "GroupMemberStatus" ADD VALUE IF NOT EXISTS 'NotGoing';
|
|
5
|
-
ALTER TYPE "GroupMemberStatus" ADD VALUE IF NOT EXISTS 'Maybe';
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
-- Migration: Groups, Momentum Dashboard, Promoter Leaderboard fields
|
|
2
|
-
-- Idempotent — safe to run multiple times.
|
|
3
|
-
-- Covers: BashEventPageView, EventGroup, GroupMember, GroupUnlockOffer, GroupUnlock,
|
|
4
|
-
-- BashEvent.topPromoterPrize, BashEvent.promoterLeaderboardIsPublic
|
|
5
|
-
-- GroupVisibility enum, GroupMemberStatus enum
|
|
6
|
-
|
|
7
|
-
DO $$ BEGIN
|
|
8
|
-
|
|
9
|
-
-- ─── GroupVisibility enum ──────────────────────────────────────────────────
|
|
10
|
-
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'GroupVisibility') THEN
|
|
11
|
-
CREATE TYPE "GroupVisibility" AS ENUM ('Private', 'OpenLink');
|
|
12
|
-
RAISE NOTICE 'Created GroupVisibility enum';
|
|
13
|
-
ELSE
|
|
14
|
-
RAISE NOTICE 'GroupVisibility enum already exists — skipping';
|
|
15
|
-
END IF;
|
|
16
|
-
|
|
17
|
-
-- ─── GroupMemberStatus enum ────────────────────────────────────────────────
|
|
18
|
-
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'GroupMemberStatus') THEN
|
|
19
|
-
CREATE TYPE "GroupMemberStatus" AS ENUM ('Going', 'WantsToGo', 'Invited');
|
|
20
|
-
RAISE NOTICE 'Created GroupMemberStatus enum';
|
|
21
|
-
ELSE
|
|
22
|
-
RAISE NOTICE 'GroupMemberStatus enum already exists — skipping';
|
|
23
|
-
END IF;
|
|
24
|
-
|
|
25
|
-
END $$;
|
|
26
|
-
|
|
27
|
-
-- ─── BashEventPageView ────────────────────────────────────────────────────────
|
|
28
|
-
CREATE TABLE IF NOT EXISTS "BashEventPageView" (
|
|
29
|
-
"id" TEXT NOT NULL PRIMARY KEY,
|
|
30
|
-
"bashEventId" TEXT NOT NULL,
|
|
31
|
-
"sessionHash" TEXT NOT NULL,
|
|
32
|
-
"viewedAt" TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
33
|
-
CONSTRAINT "BashEventPageView_bashEventId_fkey"
|
|
34
|
-
FOREIGN KEY ("bashEventId") REFERENCES "BashEvent"("id") ON DELETE CASCADE
|
|
35
|
-
);
|
|
36
|
-
|
|
37
|
-
CREATE INDEX IF NOT EXISTS "BashEventPageView_bashEventId_viewedAt_idx"
|
|
38
|
-
ON "BashEventPageView"("bashEventId", "viewedAt");
|
|
39
|
-
|
|
40
|
-
-- ─── BashEvent: promoter leaderboard fields ────────────────────────────────
|
|
41
|
-
DO $$ BEGIN
|
|
42
|
-
IF NOT EXISTS (
|
|
43
|
-
SELECT 1 FROM information_schema.columns
|
|
44
|
-
WHERE table_name = 'BashEvent' AND column_name = 'topPromoterPrize'
|
|
45
|
-
) THEN
|
|
46
|
-
ALTER TABLE "BashEvent" ADD COLUMN "topPromoterPrize" TEXT;
|
|
47
|
-
RAISE NOTICE 'Added BashEvent.topPromoterPrize';
|
|
48
|
-
ELSE
|
|
49
|
-
RAISE NOTICE 'BashEvent.topPromoterPrize already exists — skipping';
|
|
50
|
-
END IF;
|
|
51
|
-
|
|
52
|
-
IF NOT EXISTS (
|
|
53
|
-
SELECT 1 FROM information_schema.columns
|
|
54
|
-
WHERE table_name = 'BashEvent' AND column_name = 'promoterLeaderboardIsPublic'
|
|
55
|
-
) THEN
|
|
56
|
-
ALTER TABLE "BashEvent" ADD COLUMN "promoterLeaderboardIsPublic" BOOLEAN NOT NULL DEFAULT false;
|
|
57
|
-
RAISE NOTICE 'Added BashEvent.promoterLeaderboardIsPublic';
|
|
58
|
-
ELSE
|
|
59
|
-
RAISE NOTICE 'BashEvent.promoterLeaderboardIsPublic already exists — skipping';
|
|
60
|
-
END IF;
|
|
61
|
-
END $$;
|
|
62
|
-
|
|
63
|
-
-- ─── EventGroup ──────────────────────────────────────────────────────────────
|
|
64
|
-
CREATE TABLE IF NOT EXISTS "EventGroup" (
|
|
65
|
-
"id" TEXT NOT NULL PRIMARY KEY,
|
|
66
|
-
"bashEventId" TEXT NOT NULL,
|
|
67
|
-
"ownerId" TEXT NOT NULL,
|
|
68
|
-
"name" TEXT,
|
|
69
|
-
"maxMembers" INTEGER,
|
|
70
|
-
"visibility" "GroupVisibility" NOT NULL DEFAULT 'Private',
|
|
71
|
-
"promoterId" TEXT,
|
|
72
|
-
"createdAt" TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
73
|
-
"updatedAt" TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
74
|
-
CONSTRAINT "EventGroup_bashEventId_fkey"
|
|
75
|
-
FOREIGN KEY ("bashEventId") REFERENCES "BashEvent"("id") ON DELETE CASCADE,
|
|
76
|
-
CONSTRAINT "EventGroup_ownerId_fkey"
|
|
77
|
-
FOREIGN KEY ("ownerId") REFERENCES "User"("id") ON DELETE CASCADE,
|
|
78
|
-
CONSTRAINT "EventGroup_bashEventId_ownerId_key" UNIQUE ("bashEventId", "ownerId")
|
|
79
|
-
);
|
|
80
|
-
|
|
81
|
-
CREATE INDEX IF NOT EXISTS "EventGroup_bashEventId_idx" ON "EventGroup"("bashEventId");
|
|
82
|
-
CREATE INDEX IF NOT EXISTS "EventGroup_ownerId_idx" ON "EventGroup"("ownerId");
|
|
83
|
-
|
|
84
|
-
-- ─── GroupMember ─────────────────────────────────────────────────────────────
|
|
85
|
-
CREATE TABLE IF NOT EXISTS "GroupMember" (
|
|
86
|
-
"id" TEXT NOT NULL PRIMARY KEY,
|
|
87
|
-
"groupId" TEXT NOT NULL,
|
|
88
|
-
"userId" TEXT NOT NULL,
|
|
89
|
-
"status" "GroupMemberStatus" NOT NULL DEFAULT 'Invited',
|
|
90
|
-
"ticketId" TEXT,
|
|
91
|
-
"joinedAt" TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
92
|
-
CONSTRAINT "GroupMember_groupId_fkey"
|
|
93
|
-
FOREIGN KEY ("groupId") REFERENCES "EventGroup"("id") ON DELETE CASCADE,
|
|
94
|
-
CONSTRAINT "GroupMember_userId_fkey"
|
|
95
|
-
FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE,
|
|
96
|
-
CONSTRAINT "GroupMember_groupId_userId_key" UNIQUE ("groupId", "userId")
|
|
97
|
-
);
|
|
98
|
-
|
|
99
|
-
CREATE INDEX IF NOT EXISTS "GroupMember_groupId_idx" ON "GroupMember"("groupId");
|
|
100
|
-
CREATE INDEX IF NOT EXISTS "GroupMember_userId_idx" ON "GroupMember"("userId");
|
|
101
|
-
|
|
102
|
-
-- ─── GroupUnlockOffer ────────────────────────────────────────────────────────
|
|
103
|
-
CREATE TABLE IF NOT EXISTS "GroupUnlockOffer" (
|
|
104
|
-
"id" TEXT NOT NULL PRIMARY KEY,
|
|
105
|
-
"bashEventId" TEXT NOT NULL,
|
|
106
|
-
"ticketTierId" TEXT,
|
|
107
|
-
"minGroupSize" INTEGER NOT NULL,
|
|
108
|
-
"rewardLabel" TEXT NOT NULL,
|
|
109
|
-
"rewardType" TEXT NOT NULL,
|
|
110
|
-
"expiresAt" TIMESTAMPTZ NOT NULL,
|
|
111
|
-
"maxGroups" INTEGER,
|
|
112
|
-
"createdAt" TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
113
|
-
CONSTRAINT "GroupUnlockOffer_bashEventId_fkey"
|
|
114
|
-
FOREIGN KEY ("bashEventId") REFERENCES "BashEvent"("id") ON DELETE CASCADE,
|
|
115
|
-
CONSTRAINT "GroupUnlockOffer_ticketTierId_fkey"
|
|
116
|
-
FOREIGN KEY ("ticketTierId") REFERENCES "TicketTier"("id") ON DELETE SET NULL
|
|
117
|
-
);
|
|
118
|
-
|
|
119
|
-
CREATE INDEX IF NOT EXISTS "GroupUnlockOffer_bashEventId_idx" ON "GroupUnlockOffer"("bashEventId");
|
|
120
|
-
CREATE INDEX IF NOT EXISTS "GroupUnlockOffer_expiresAt_idx" ON "GroupUnlockOffer"("expiresAt");
|
|
121
|
-
|
|
122
|
-
-- ─── GroupUnlock ─────────────────────────────────────────────────────────────
|
|
123
|
-
CREATE TABLE IF NOT EXISTS "GroupUnlock" (
|
|
124
|
-
"id" TEXT NOT NULL PRIMARY KEY,
|
|
125
|
-
"offerId" TEXT NOT NULL,
|
|
126
|
-
"groupId" TEXT NOT NULL,
|
|
127
|
-
"unlockedAt" TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
128
|
-
CONSTRAINT "GroupUnlock_offerId_fkey"
|
|
129
|
-
FOREIGN KEY ("offerId") REFERENCES "GroupUnlockOffer"("id") ON DELETE CASCADE,
|
|
130
|
-
CONSTRAINT "GroupUnlock_groupId_fkey"
|
|
131
|
-
FOREIGN KEY ("groupId") REFERENCES "EventGroup"("id") ON DELETE CASCADE,
|
|
132
|
-
CONSTRAINT "GroupUnlock_offerId_groupId_key" UNIQUE ("offerId", "groupId")
|
|
133
|
-
);
|
|
134
|
-
|
|
135
|
-
CREATE INDEX IF NOT EXISTS "GroupUnlock_groupId_idx" ON "GroupUnlock"("groupId");
|
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
-- Migration: Groups, Momentum Dashboard, and Promoter Leaderboard fields
|
|
2
|
-
-- Covers: Phase 0 (BashEventPageView), Phase 1 (EventGroup, GroupMember),
|
|
3
|
-
-- Phase 1.5 (topPromoterPrize, promoterLeaderboardIsPublic),
|
|
4
|
-
-- Phase 4 (GroupUnlockOffer, GroupUnlock)
|
|
5
|
-
-- Idempotent — safe to run multiple times.
|
|
6
|
-
|
|
7
|
-
DO $$ BEGIN
|
|
8
|
-
|
|
9
|
-
-- ─── Phase 0: Momentum Dashboard ──────────────────────────────────────────
|
|
10
|
-
|
|
11
|
-
-- BashEventPageView table
|
|
12
|
-
IF NOT EXISTS (
|
|
13
|
-
SELECT 1 FROM information_schema.tables
|
|
14
|
-
WHERE table_name = 'BashEventPageView'
|
|
15
|
-
) THEN
|
|
16
|
-
CREATE TABLE "BashEventPageView" (
|
|
17
|
-
"id" TEXT NOT NULL DEFAULT gen_random_uuid()::text,
|
|
18
|
-
"bashEventId" TEXT NOT NULL,
|
|
19
|
-
"sessionHash" TEXT NOT NULL,
|
|
20
|
-
"viewedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
21
|
-
CONSTRAINT "BashEventPageView_pkey" PRIMARY KEY ("id"),
|
|
22
|
-
CONSTRAINT "BashEventPageView_bashEventId_fkey"
|
|
23
|
-
FOREIGN KEY ("bashEventId") REFERENCES "BashEvent"("id") ON DELETE CASCADE
|
|
24
|
-
);
|
|
25
|
-
CREATE INDEX "BashEventPageView_bashEventId_viewedAt_idx"
|
|
26
|
-
ON "BashEventPageView"("bashEventId", "viewedAt");
|
|
27
|
-
RAISE NOTICE 'Created BashEventPageView table';
|
|
28
|
-
ELSE
|
|
29
|
-
RAISE NOTICE 'Table BashEventPageView already exists — skipping';
|
|
30
|
-
END IF;
|
|
31
|
-
|
|
32
|
-
-- ─── Phase 1: Bash Groups ─────────────────────────────────────────────────
|
|
33
|
-
|
|
34
|
-
-- GroupVisibility enum
|
|
35
|
-
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'GroupVisibility') THEN
|
|
36
|
-
CREATE TYPE "GroupVisibility" AS ENUM ('Private', 'OpenLink');
|
|
37
|
-
RAISE NOTICE 'Created GroupVisibility enum';
|
|
38
|
-
ELSE
|
|
39
|
-
RAISE NOTICE 'Enum GroupVisibility already exists — skipping';
|
|
40
|
-
END IF;
|
|
41
|
-
|
|
42
|
-
-- GroupMemberStatus enum
|
|
43
|
-
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'GroupMemberStatus') THEN
|
|
44
|
-
CREATE TYPE "GroupMemberStatus" AS ENUM ('Going', 'WantsToGo', 'Invited');
|
|
45
|
-
RAISE NOTICE 'Created GroupMemberStatus enum';
|
|
46
|
-
ELSE
|
|
47
|
-
RAISE NOTICE 'Enum GroupMemberStatus already exists — skipping';
|
|
48
|
-
END IF;
|
|
49
|
-
|
|
50
|
-
-- EventGroup table
|
|
51
|
-
IF NOT EXISTS (
|
|
52
|
-
SELECT 1 FROM information_schema.tables WHERE table_name = 'EventGroup'
|
|
53
|
-
) THEN
|
|
54
|
-
CREATE TABLE "EventGroup" (
|
|
55
|
-
"id" TEXT NOT NULL DEFAULT gen_random_uuid()::text,
|
|
56
|
-
"bashEventId" TEXT NOT NULL,
|
|
57
|
-
"ownerId" TEXT NOT NULL,
|
|
58
|
-
"name" TEXT,
|
|
59
|
-
"maxMembers" INTEGER,
|
|
60
|
-
"visibility" "GroupVisibility" NOT NULL DEFAULT 'Private',
|
|
61
|
-
"promoterId" TEXT,
|
|
62
|
-
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
63
|
-
"updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
64
|
-
CONSTRAINT "EventGroup_pkey" PRIMARY KEY ("id"),
|
|
65
|
-
CONSTRAINT "EventGroup_bashEventId_ownerId_key" UNIQUE ("bashEventId", "ownerId"),
|
|
66
|
-
CONSTRAINT "EventGroup_bashEventId_fkey"
|
|
67
|
-
FOREIGN KEY ("bashEventId") REFERENCES "BashEvent"("id") ON DELETE CASCADE,
|
|
68
|
-
CONSTRAINT "EventGroup_ownerId_fkey"
|
|
69
|
-
FOREIGN KEY ("ownerId") REFERENCES "User"("id") ON DELETE CASCADE
|
|
70
|
-
);
|
|
71
|
-
CREATE INDEX "EventGroup_bashEventId_idx" ON "EventGroup"("bashEventId");
|
|
72
|
-
CREATE INDEX "EventGroup_ownerId_idx" ON "EventGroup"("ownerId");
|
|
73
|
-
RAISE NOTICE 'Created EventGroup table';
|
|
74
|
-
ELSE
|
|
75
|
-
RAISE NOTICE 'Table EventGroup already exists — skipping';
|
|
76
|
-
END IF;
|
|
77
|
-
|
|
78
|
-
-- GroupMember table
|
|
79
|
-
IF NOT EXISTS (
|
|
80
|
-
SELECT 1 FROM information_schema.tables WHERE table_name = 'GroupMember'
|
|
81
|
-
) THEN
|
|
82
|
-
CREATE TABLE "GroupMember" (
|
|
83
|
-
"id" TEXT NOT NULL DEFAULT gen_random_uuid()::text,
|
|
84
|
-
"groupId" TEXT NOT NULL,
|
|
85
|
-
"userId" TEXT NOT NULL,
|
|
86
|
-
"status" "GroupMemberStatus" NOT NULL DEFAULT 'Invited',
|
|
87
|
-
"ticketId" TEXT,
|
|
88
|
-
"joinedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
89
|
-
CONSTRAINT "GroupMember_pkey" PRIMARY KEY ("id"),
|
|
90
|
-
CONSTRAINT "GroupMember_groupId_userId_key" UNIQUE ("groupId", "userId"),
|
|
91
|
-
CONSTRAINT "GroupMember_groupId_fkey"
|
|
92
|
-
FOREIGN KEY ("groupId") REFERENCES "EventGroup"("id") ON DELETE CASCADE,
|
|
93
|
-
CONSTRAINT "GroupMember_userId_fkey"
|
|
94
|
-
FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE
|
|
95
|
-
);
|
|
96
|
-
CREATE INDEX "GroupMember_groupId_idx" ON "GroupMember"("groupId");
|
|
97
|
-
CREATE INDEX "GroupMember_userId_idx" ON "GroupMember"("userId");
|
|
98
|
-
RAISE NOTICE 'Created GroupMember table';
|
|
99
|
-
ELSE
|
|
100
|
-
RAISE NOTICE 'Table GroupMember already exists — skipping';
|
|
101
|
-
END IF;
|
|
102
|
-
|
|
103
|
-
-- ─── Phase 1.5: Promoter Leaderboard fields ───────────────────────────────
|
|
104
|
-
|
|
105
|
-
IF NOT EXISTS (
|
|
106
|
-
SELECT 1 FROM information_schema.columns
|
|
107
|
-
WHERE table_name = 'BashEvent' AND column_name = 'topPromoterPrize'
|
|
108
|
-
) THEN
|
|
109
|
-
ALTER TABLE "BashEvent" ADD COLUMN "topPromoterPrize" TEXT;
|
|
110
|
-
RAISE NOTICE 'Added topPromoterPrize to BashEvent';
|
|
111
|
-
ELSE
|
|
112
|
-
RAISE NOTICE 'Column BashEvent.topPromoterPrize already exists — skipping';
|
|
113
|
-
END IF;
|
|
114
|
-
|
|
115
|
-
IF NOT EXISTS (
|
|
116
|
-
SELECT 1 FROM information_schema.columns
|
|
117
|
-
WHERE table_name = 'BashEvent' AND column_name = 'promoterLeaderboardIsPublic'
|
|
118
|
-
) THEN
|
|
119
|
-
ALTER TABLE "BashEvent"
|
|
120
|
-
ADD COLUMN "promoterLeaderboardIsPublic" BOOLEAN NOT NULL DEFAULT false;
|
|
121
|
-
RAISE NOTICE 'Added promoterLeaderboardIsPublic to BashEvent';
|
|
122
|
-
ELSE
|
|
123
|
-
RAISE NOTICE 'Column BashEvent.promoterLeaderboardIsPublic already exists — skipping';
|
|
124
|
-
END IF;
|
|
125
|
-
|
|
126
|
-
-- ─── Phase 3: New notification types ─────────────────────────────────────
|
|
127
|
-
|
|
128
|
-
-- Add new values to NotificationType enum if they don't exist
|
|
129
|
-
DO $inner$
|
|
130
|
-
DECLARE
|
|
131
|
-
new_types TEXT[] := ARRAY[
|
|
132
|
-
'GroupMemberPurchased', 'GroupEveryoneConfirmed', 'GroupEveryonePurchased',
|
|
133
|
-
'GroupMemberJoined', 'FriendsAttending', 'GroupRewardProgress',
|
|
134
|
-
'GroupUnlockOfferReceived', 'HostSalesAccelerating', 'HostTopPromoter',
|
|
135
|
-
'HostSalesSlowing'
|
|
136
|
-
];
|
|
137
|
-
t TEXT;
|
|
138
|
-
BEGIN
|
|
139
|
-
FOREACH t IN ARRAY new_types LOOP
|
|
140
|
-
IF NOT EXISTS (
|
|
141
|
-
SELECT 1 FROM pg_enum
|
|
142
|
-
WHERE enumlabel = t
|
|
143
|
-
AND enumtypid = (SELECT oid FROM pg_type WHERE typname = 'NotificationType')
|
|
144
|
-
) THEN
|
|
145
|
-
EXECUTE format('ALTER TYPE "NotificationType" ADD VALUE %L', t);
|
|
146
|
-
RAISE NOTICE 'Added NotificationType value: %', t;
|
|
147
|
-
END IF;
|
|
148
|
-
END LOOP;
|
|
149
|
-
END $inner$;
|
|
150
|
-
|
|
151
|
-
-- ─── Phase 4: Group Unlock Offers ─────────────────────────────────────────
|
|
152
|
-
|
|
153
|
-
-- GroupUnlockOffer table
|
|
154
|
-
IF NOT EXISTS (
|
|
155
|
-
SELECT 1 FROM information_schema.tables WHERE table_name = 'GroupUnlockOffer'
|
|
156
|
-
) THEN
|
|
157
|
-
CREATE TABLE "GroupUnlockOffer" (
|
|
158
|
-
"id" TEXT NOT NULL DEFAULT gen_random_uuid()::text,
|
|
159
|
-
"bashEventId" TEXT NOT NULL,
|
|
160
|
-
"ticketTierId" TEXT,
|
|
161
|
-
"minGroupSize" INTEGER NOT NULL,
|
|
162
|
-
"rewardLabel" TEXT NOT NULL,
|
|
163
|
-
"rewardType" TEXT NOT NULL,
|
|
164
|
-
"expiresAt" TIMESTAMP(3) NOT NULL,
|
|
165
|
-
"maxGroups" INTEGER,
|
|
166
|
-
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
167
|
-
CONSTRAINT "GroupUnlockOffer_pkey" PRIMARY KEY ("id"),
|
|
168
|
-
CONSTRAINT "GroupUnlockOffer_bashEventId_fkey"
|
|
169
|
-
FOREIGN KEY ("bashEventId") REFERENCES "BashEvent"("id") ON DELETE CASCADE
|
|
170
|
-
);
|
|
171
|
-
CREATE INDEX "GroupUnlockOffer_bashEventId_idx" ON "GroupUnlockOffer"("bashEventId");
|
|
172
|
-
CREATE INDEX "GroupUnlockOffer_expiresAt_idx" ON "GroupUnlockOffer"("expiresAt");
|
|
173
|
-
RAISE NOTICE 'Created GroupUnlockOffer table';
|
|
174
|
-
ELSE
|
|
175
|
-
RAISE NOTICE 'Table GroupUnlockOffer already exists — skipping';
|
|
176
|
-
END IF;
|
|
177
|
-
|
|
178
|
-
-- GroupUnlock table
|
|
179
|
-
IF NOT EXISTS (
|
|
180
|
-
SELECT 1 FROM information_schema.tables WHERE table_name = 'GroupUnlock'
|
|
181
|
-
) THEN
|
|
182
|
-
CREATE TABLE "GroupUnlock" (
|
|
183
|
-
"id" TEXT NOT NULL DEFAULT gen_random_uuid()::text,
|
|
184
|
-
"offerId" TEXT NOT NULL,
|
|
185
|
-
"groupId" TEXT NOT NULL,
|
|
186
|
-
"unlockedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
187
|
-
CONSTRAINT "GroupUnlock_pkey" PRIMARY KEY ("id"),
|
|
188
|
-
CONSTRAINT "GroupUnlock_offerId_groupId_key" UNIQUE ("offerId", "groupId"),
|
|
189
|
-
CONSTRAINT "GroupUnlock_offerId_fkey"
|
|
190
|
-
FOREIGN KEY ("offerId") REFERENCES "GroupUnlockOffer"("id") ON DELETE CASCADE,
|
|
191
|
-
CONSTRAINT "GroupUnlock_groupId_fkey"
|
|
192
|
-
FOREIGN KEY ("groupId") REFERENCES "EventGroup"("id") ON DELETE CASCADE
|
|
193
|
-
);
|
|
194
|
-
CREATE INDEX "GroupUnlock_groupId_idx" ON "GroupUnlock"("groupId");
|
|
195
|
-
RAISE NOTICE 'Created GroupUnlock table';
|
|
196
|
-
ELSE
|
|
197
|
-
RAISE NOTICE 'Table GroupUnlock already exists — skipping';
|
|
198
|
-
END IF;
|
|
199
|
-
|
|
200
|
-
END $$;
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
-- Migration: Add all new feature tables missing from production/QA
|
|
2
|
-
-- Tables: EventReferralReward, EventReferral, BashList, UserItinerary, UserItineraryItem
|
|
3
|
-
-- All blocks are idempotent (IF NOT EXISTS) so safe to run multiple times.
|
|
4
|
-
|
|
5
|
-
DO $$ BEGIN
|
|
6
|
-
|
|
7
|
-
-- ── 1. EventReferralReward ───────────────────────────────────────────────────
|
|
8
|
-
IF NOT EXISTS (
|
|
9
|
-
SELECT 1 FROM information_schema.tables WHERE table_name = 'EventReferralReward'
|
|
10
|
-
) THEN
|
|
11
|
-
CREATE TABLE "EventReferralReward" (
|
|
12
|
-
"id" TEXT NOT NULL,
|
|
13
|
-
"bashEventId" TEXT NOT NULL,
|
|
14
|
-
"referralCount" INTEGER NOT NULL,
|
|
15
|
-
"rewardType" TEXT NOT NULL,
|
|
16
|
-
"rewardLabel" TEXT NOT NULL,
|
|
17
|
-
"bashPointsAmount" INTEGER,
|
|
18
|
-
"sortOrder" INTEGER NOT NULL DEFAULT 0,
|
|
19
|
-
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT NOW(),
|
|
20
|
-
"updatedAt" TIMESTAMP(3) NOT NULL DEFAULT NOW(),
|
|
21
|
-
|
|
22
|
-
CONSTRAINT "EventReferralReward_pkey" PRIMARY KEY ("id"),
|
|
23
|
-
CONSTRAINT "EventReferralReward_bashEventId_fkey"
|
|
24
|
-
FOREIGN KEY ("bashEventId") REFERENCES "BashEvent"("id") ON DELETE CASCADE
|
|
25
|
-
);
|
|
26
|
-
CREATE INDEX "EventReferralReward_bashEventId_idx"
|
|
27
|
-
ON "EventReferralReward" ("bashEventId");
|
|
28
|
-
RAISE NOTICE 'Created table EventReferralReward';
|
|
29
|
-
ELSE
|
|
30
|
-
RAISE NOTICE 'Table EventReferralReward already exists — skipping';
|
|
31
|
-
END IF;
|
|
32
|
-
|
|
33
|
-
-- ── 2. EventReferral ────────────────────────────────────────────────────────
|
|
34
|
-
IF NOT EXISTS (
|
|
35
|
-
SELECT 1 FROM information_schema.tables WHERE table_name = 'EventReferral'
|
|
36
|
-
) THEN
|
|
37
|
-
CREATE TABLE "EventReferral" (
|
|
38
|
-
"id" TEXT NOT NULL,
|
|
39
|
-
"bashEventId" TEXT NOT NULL,
|
|
40
|
-
"referrerId" TEXT NOT NULL,
|
|
41
|
-
"referredUserId" TEXT NOT NULL,
|
|
42
|
-
"ticketId" TEXT,
|
|
43
|
-
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT NOW(),
|
|
44
|
-
|
|
45
|
-
CONSTRAINT "EventReferral_pkey" PRIMARY KEY ("id"),
|
|
46
|
-
CONSTRAINT "EventReferral_ticketId_key" UNIQUE ("ticketId"),
|
|
47
|
-
CONSTRAINT "EventReferral_unique_triplet" UNIQUE ("bashEventId", "referrerId", "referredUserId"),
|
|
48
|
-
CONSTRAINT "EventReferral_bashEventId_fkey"
|
|
49
|
-
FOREIGN KEY ("bashEventId") REFERENCES "BashEvent"("id") ON DELETE CASCADE,
|
|
50
|
-
CONSTRAINT "EventReferral_referrerId_fkey"
|
|
51
|
-
FOREIGN KEY ("referrerId") REFERENCES "User"("id") ON DELETE CASCADE,
|
|
52
|
-
CONSTRAINT "EventReferral_referredUserId_fkey"
|
|
53
|
-
FOREIGN KEY ("referredUserId") REFERENCES "User"("id") ON DELETE CASCADE,
|
|
54
|
-
CONSTRAINT "EventReferral_ticketId_fkey"
|
|
55
|
-
FOREIGN KEY ("ticketId") REFERENCES "Ticket"("id") ON DELETE SET NULL
|
|
56
|
-
);
|
|
57
|
-
CREATE INDEX "EventReferral_bashEventId_idx" ON "EventReferral" ("bashEventId");
|
|
58
|
-
CREATE INDEX "EventReferral_referrerId_idx" ON "EventReferral" ("referrerId");
|
|
59
|
-
RAISE NOTICE 'Created table EventReferral';
|
|
60
|
-
ELSE
|
|
61
|
-
RAISE NOTICE 'Table EventReferral already exists — skipping';
|
|
62
|
-
END IF;
|
|
63
|
-
|
|
64
|
-
-- ── 3. BashList ─────────────────────────────────────────────────────────────
|
|
65
|
-
IF NOT EXISTS (
|
|
66
|
-
SELECT 1 FROM information_schema.tables WHERE table_name = 'BashList'
|
|
67
|
-
) THEN
|
|
68
|
-
CREATE TABLE "BashList" (
|
|
69
|
-
"id" TEXT NOT NULL,
|
|
70
|
-
"title" TEXT NOT NULL,
|
|
71
|
-
"slug" TEXT NOT NULL,
|
|
72
|
-
"description" TEXT,
|
|
73
|
-
"filterConfig" JSONB NOT NULL,
|
|
74
|
-
"isFeatured" BOOLEAN NOT NULL DEFAULT FALSE,
|
|
75
|
-
"sortOrder" INTEGER NOT NULL DEFAULT 0,
|
|
76
|
-
"createdById" TEXT NOT NULL,
|
|
77
|
-
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT NOW(),
|
|
78
|
-
"updatedAt" TIMESTAMP(3) NOT NULL DEFAULT NOW(),
|
|
79
|
-
|
|
80
|
-
CONSTRAINT "BashList_pkey" PRIMARY KEY ("id"),
|
|
81
|
-
CONSTRAINT "BashList_slug_key" UNIQUE ("slug"),
|
|
82
|
-
CONSTRAINT "BashList_createdById_fkey"
|
|
83
|
-
FOREIGN KEY ("createdById") REFERENCES "User"("id") ON DELETE CASCADE
|
|
84
|
-
);
|
|
85
|
-
CREATE INDEX "BashList_isFeatured_sortOrder_idx" ON "BashList" ("isFeatured", "sortOrder");
|
|
86
|
-
CREATE INDEX "BashList_slug_idx" ON "BashList" ("slug");
|
|
87
|
-
RAISE NOTICE 'Created table BashList';
|
|
88
|
-
ELSE
|
|
89
|
-
RAISE NOTICE 'Table BashList already exists — skipping';
|
|
90
|
-
END IF;
|
|
91
|
-
|
|
92
|
-
-- ── 4. UserItinerary ────────────────────────────────────────────────────────
|
|
93
|
-
IF NOT EXISTS (
|
|
94
|
-
SELECT 1 FROM information_schema.tables WHERE table_name = 'UserItinerary'
|
|
95
|
-
) THEN
|
|
96
|
-
CREATE TABLE "UserItinerary" (
|
|
97
|
-
"id" TEXT NOT NULL,
|
|
98
|
-
"userId" TEXT NOT NULL,
|
|
99
|
-
"date" DATE NOT NULL,
|
|
100
|
-
"title" TEXT,
|
|
101
|
-
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT NOW(),
|
|
102
|
-
"updatedAt" TIMESTAMP(3) NOT NULL DEFAULT NOW(),
|
|
103
|
-
|
|
104
|
-
CONSTRAINT "UserItinerary_pkey" PRIMARY KEY ("id"),
|
|
105
|
-
CONSTRAINT "UserItinerary_userId_date_key" UNIQUE ("userId", "date"),
|
|
106
|
-
CONSTRAINT "UserItinerary_userId_fkey"
|
|
107
|
-
FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE
|
|
108
|
-
);
|
|
109
|
-
CREATE INDEX "UserItinerary_userId_idx" ON "UserItinerary" ("userId");
|
|
110
|
-
RAISE NOTICE 'Created table UserItinerary';
|
|
111
|
-
ELSE
|
|
112
|
-
RAISE NOTICE 'Table UserItinerary already exists — skipping';
|
|
113
|
-
END IF;
|
|
114
|
-
|
|
115
|
-
-- ── 5. UserItineraryItem ────────────────────────────────────────────────────
|
|
116
|
-
IF NOT EXISTS (
|
|
117
|
-
SELECT 1 FROM information_schema.tables WHERE table_name = 'UserItineraryItem'
|
|
118
|
-
) THEN
|
|
119
|
-
CREATE TABLE "UserItineraryItem" (
|
|
120
|
-
"id" TEXT NOT NULL,
|
|
121
|
-
"userItineraryId" TEXT NOT NULL,
|
|
122
|
-
"bashEventId" TEXT NOT NULL,
|
|
123
|
-
"sortOrder" INTEGER NOT NULL DEFAULT 0,
|
|
124
|
-
"notes" TEXT,
|
|
125
|
-
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT NOW(),
|
|
126
|
-
|
|
127
|
-
CONSTRAINT "UserItineraryItem_pkey" PRIMARY KEY ("id"),
|
|
128
|
-
CONSTRAINT "UserItineraryItem_itinerary_event_key" UNIQUE ("userItineraryId", "bashEventId"),
|
|
129
|
-
CONSTRAINT "UserItineraryItem_userItineraryId_fkey"
|
|
130
|
-
FOREIGN KEY ("userItineraryId") REFERENCES "UserItinerary"("id") ON DELETE CASCADE,
|
|
131
|
-
CONSTRAINT "UserItineraryItem_bashEventId_fkey"
|
|
132
|
-
FOREIGN KEY ("bashEventId") REFERENCES "BashEvent"("id") ON DELETE CASCADE
|
|
133
|
-
);
|
|
134
|
-
CREATE INDEX "UserItineraryItem_userItineraryId_idx" ON "UserItineraryItem" ("userItineraryId");
|
|
135
|
-
RAISE NOTICE 'Created table UserItineraryItem';
|
|
136
|
-
ELSE
|
|
137
|
-
RAISE NOTICE 'Table UserItineraryItem already exists — skipping';
|
|
138
|
-
END IF;
|
|
139
|
-
|
|
140
|
-
END $$;
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
-- Add PricingType enum for TicketTier
|
|
2
|
-
-- This enum determines whether a ticket tier is priced in USD or BashPoints
|
|
3
|
-
|
|
4
|
-
-- Step 1: Create the enum type
|
|
5
|
-
DO $$
|
|
6
|
-
BEGIN
|
|
7
|
-
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'PricingType') THEN
|
|
8
|
-
CREATE TYPE "PricingType" AS ENUM ('USD', 'BASHPOINTS');
|
|
9
|
-
RAISE NOTICE '✅ Created PricingType enum';
|
|
10
|
-
ELSE
|
|
11
|
-
RAISE NOTICE 'ℹ️ PricingType enum already exists';
|
|
12
|
-
END IF;
|
|
13
|
-
END $$;
|
|
14
|
-
|
|
15
|
-
-- Step 2: Check if column exists as String
|
|
16
|
-
DO $$
|
|
17
|
-
BEGIN
|
|
18
|
-
IF EXISTS (
|
|
19
|
-
SELECT 1 FROM information_schema.columns
|
|
20
|
-
WHERE table_name = 'TicketTier'
|
|
21
|
-
AND column_name = 'pricingType'
|
|
22
|
-
AND data_type = 'text'
|
|
23
|
-
) THEN
|
|
24
|
-
-- Column exists as text, convert to enum
|
|
25
|
-
|
|
26
|
-
-- First, update any invalid values to 'USD'
|
|
27
|
-
UPDATE "TicketTier"
|
|
28
|
-
SET "pricingType" = 'USD'
|
|
29
|
-
WHERE "pricingType" NOT IN ('USD', 'BASHPOINTS');
|
|
30
|
-
|
|
31
|
-
-- Drop the default constraint if it exists
|
|
32
|
-
ALTER TABLE "TicketTier"
|
|
33
|
-
ALTER COLUMN "pricingType" DROP DEFAULT;
|
|
34
|
-
|
|
35
|
-
-- Convert the column to enum type
|
|
36
|
-
ALTER TABLE "TicketTier"
|
|
37
|
-
ALTER COLUMN "pricingType" TYPE "PricingType"
|
|
38
|
-
USING "pricingType"::"PricingType";
|
|
39
|
-
|
|
40
|
-
-- Re-add the default
|
|
41
|
-
ALTER TABLE "TicketTier"
|
|
42
|
-
ALTER COLUMN "pricingType" SET DEFAULT 'USD'::"PricingType";
|
|
43
|
-
|
|
44
|
-
RAISE NOTICE '✅ Converted TicketTier.pricingType from text to PricingType enum';
|
|
45
|
-
ELSIF EXISTS (
|
|
46
|
-
SELECT 1 FROM information_schema.columns
|
|
47
|
-
WHERE table_name = 'TicketTier'
|
|
48
|
-
AND column_name = 'pricingType'
|
|
49
|
-
) THEN
|
|
50
|
-
RAISE NOTICE 'ℹ️ TicketTier.pricingType already exists (might already be enum)';
|
|
51
|
-
ELSE
|
|
52
|
-
-- Column doesn't exist, create it as enum
|
|
53
|
-
ALTER TABLE "TicketTier"
|
|
54
|
-
ADD COLUMN "pricingType" "PricingType" NOT NULL DEFAULT 'USD'::"PricingType";
|
|
55
|
-
|
|
56
|
-
RAISE NOTICE '✅ Added TicketTier.pricingType column as PricingType enum';
|
|
57
|
-
END IF;
|
|
58
|
-
END $$;
|
|
59
|
-
|
|
60
|
-
-- Step 3: Verify priceBashPoints column exists
|
|
61
|
-
DO $$
|
|
62
|
-
BEGIN
|
|
63
|
-
IF NOT EXISTS (
|
|
64
|
-
SELECT 1 FROM information_schema.columns
|
|
65
|
-
WHERE table_name = 'TicketTier' AND column_name = 'priceBashPoints'
|
|
66
|
-
) THEN
|
|
67
|
-
ALTER TABLE "TicketTier" ADD COLUMN "priceBashPoints" INTEGER;
|
|
68
|
-
RAISE NOTICE '✅ Added TicketTier.priceBashPoints column';
|
|
69
|
-
ELSE
|
|
70
|
-
RAISE NOTICE 'ℹ️ TicketTier.priceBashPoints column already exists';
|
|
71
|
-
END IF;
|
|
72
|
-
END $$;
|
|
73
|
-
|
|
74
|
-
-- Step 4: Add helpful comment
|
|
75
|
-
COMMENT ON COLUMN "TicketTier"."pricingType" IS 'Determines payment method: USD (credit card) or BASHPOINTS (peer-to-peer loyalty points)';
|
|
76
|
-
COMMENT ON COLUMN "TicketTier"."priceBashPoints" IS 'Price in BashPoints when pricingType=BASHPOINTS (floating market value set by host)';
|
|
77
|
-
|
|
78
|
-
-- Verification
|
|
79
|
-
SELECT
|
|
80
|
-
column_name,
|
|
81
|
-
data_type,
|
|
82
|
-
udt_name,
|
|
83
|
-
column_default,
|
|
84
|
-
is_nullable
|
|
85
|
-
FROM information_schema.columns
|
|
86
|
-
WHERE table_name = 'TicketTier'
|
|
87
|
-
AND column_name IN ('pricingType', 'priceBashPoints')
|
|
88
|
-
ORDER BY column_name;
|