@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.
Files changed (142) hide show
  1. package/dist/__tests__/agePolicy.test.d.ts +2 -0
  2. package/dist/__tests__/agePolicy.test.d.ts.map +1 -0
  3. package/dist/__tests__/agePolicy.test.js +203 -0
  4. package/dist/__tests__/agePolicy.test.js.map +1 -0
  5. package/dist/__tests__/getDisplayGender.test.d.ts +2 -0
  6. package/dist/__tests__/getDisplayGender.test.d.ts.map +1 -0
  7. package/dist/__tests__/getDisplayGender.test.js +34 -0
  8. package/dist/__tests__/getDisplayGender.test.js.map +1 -0
  9. package/dist/__tests__/statusEnums.test.d.ts +2 -0
  10. package/dist/__tests__/statusEnums.test.d.ts.map +1 -0
  11. package/dist/__tests__/statusEnums.test.js +24 -0
  12. package/dist/__tests__/statusEnums.test.js.map +1 -0
  13. package/dist/aiApproval.d.ts +89 -0
  14. package/dist/aiApproval.d.ts.map +1 -0
  15. package/dist/aiApproval.js +82 -0
  16. package/dist/aiApproval.js.map +1 -0
  17. package/dist/definitions.d.ts +44 -2
  18. package/dist/definitions.d.ts.map +1 -1
  19. package/dist/definitions.js +106 -2
  20. package/dist/definitions.js.map +1 -1
  21. package/dist/extendedSchemas.d.ts +280 -105
  22. package/dist/extendedSchemas.d.ts.map +1 -1
  23. package/dist/extendedSchemas.js +34 -2
  24. package/dist/extendedSchemas.js.map +1 -1
  25. package/dist/index.d.ts +5 -2
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +4 -1
  28. package/dist/index.js.map +1 -1
  29. package/dist/legalTemplates.d.ts +1 -1
  30. package/dist/legalTemplates.js +1 -1
  31. package/dist/utils/__tests__/badgeUtils.test.d.ts +2 -0
  32. package/dist/utils/__tests__/badgeUtils.test.d.ts.map +1 -0
  33. package/dist/utils/__tests__/badgeUtils.test.js +157 -0
  34. package/dist/utils/__tests__/badgeUtils.test.js.map +1 -0
  35. package/dist/utils/__tests__/bashPointsPaymentUtils.test.d.ts +2 -0
  36. package/dist/utils/__tests__/bashPointsPaymentUtils.test.d.ts.map +1 -0
  37. package/dist/utils/__tests__/bashPointsPaymentUtils.test.js +114 -0
  38. package/dist/utils/__tests__/bashPointsPaymentUtils.test.js.map +1 -0
  39. package/dist/utils/__tests__/contentFilterUtils.test.d.ts +2 -0
  40. package/dist/utils/__tests__/contentFilterUtils.test.d.ts.map +1 -0
  41. package/dist/utils/__tests__/contentFilterUtils.test.js +443 -0
  42. package/dist/utils/__tests__/contentFilterUtils.test.js.map +1 -0
  43. package/dist/utils/__tests__/displayDateUtils.test.d.ts +2 -0
  44. package/dist/utils/__tests__/displayDateUtils.test.d.ts.map +1 -0
  45. package/dist/utils/__tests__/displayDateUtils.test.js +105 -0
  46. package/dist/utils/__tests__/displayDateUtils.test.js.map +1 -0
  47. package/dist/utils/__tests__/flyerUtils.test.d.ts +2 -0
  48. package/dist/utils/__tests__/flyerUtils.test.d.ts.map +1 -0
  49. package/dist/utils/__tests__/flyerUtils.test.js +49 -0
  50. package/dist/utils/__tests__/flyerUtils.test.js.map +1 -0
  51. package/dist/utils/__tests__/getBackendHost.test.d.ts +2 -0
  52. package/dist/utils/__tests__/getBackendHost.test.d.ts.map +1 -0
  53. package/dist/utils/__tests__/getBackendHost.test.js +104 -0
  54. package/dist/utils/__tests__/getBackendHost.test.js.map +1 -0
  55. package/dist/utils/__tests__/getFrontendHost.test.d.ts +2 -0
  56. package/dist/utils/__tests__/getFrontendHost.test.d.ts.map +1 -0
  57. package/dist/utils/__tests__/getFrontendHost.test.js +207 -0
  58. package/dist/utils/__tests__/getFrontendHost.test.js.map +1 -0
  59. package/dist/utils/__tests__/promoCodesUtils.test.d.ts +2 -0
  60. package/dist/utils/__tests__/promoCodesUtils.test.d.ts.map +1 -0
  61. package/dist/utils/__tests__/promoCodesUtils.test.js +183 -0
  62. package/dist/utils/__tests__/promoCodesUtils.test.js.map +1 -0
  63. package/dist/utils/__tests__/qrCodeUtils.test.d.ts +2 -0
  64. package/dist/utils/__tests__/qrCodeUtils.test.d.ts.map +1 -0
  65. package/dist/utils/__tests__/qrCodeUtils.test.js +99 -0
  66. package/dist/utils/__tests__/qrCodeUtils.test.js.map +1 -0
  67. package/dist/utils/__tests__/stripeAccountUtils.test.d.ts +2 -0
  68. package/dist/utils/__tests__/stripeAccountUtils.test.d.ts.map +1 -0
  69. package/dist/utils/__tests__/stripeAccountUtils.test.js +75 -0
  70. package/dist/utils/__tests__/stripeAccountUtils.test.js.map +1 -0
  71. package/dist/utils/blog/__tests__/getRelatedBlogPosts.test.d.ts +2 -0
  72. package/dist/utils/blog/__tests__/getRelatedBlogPosts.test.d.ts.map +1 -0
  73. package/dist/utils/blog/__tests__/getRelatedBlogPosts.test.js +233 -0
  74. package/dist/utils/blog/__tests__/getRelatedBlogPosts.test.js.map +1 -0
  75. package/dist/utils/blog/blogCommentDbUtils.d.ts +161 -0
  76. package/dist/utils/blog/blogCommentDbUtils.d.ts.map +1 -0
  77. package/dist/utils/blog/blogCommentDbUtils.js +111 -0
  78. package/dist/utils/blog/blogCommentDbUtils.js.map +1 -0
  79. package/dist/utils/blog/blogDbUtils.d.ts +10 -0
  80. package/dist/utils/blog/blogDbUtils.d.ts.map +1 -1
  81. package/dist/utils/blog/blogDbUtils.js +71 -0
  82. package/dist/utils/blog/blogDbUtils.js.map +1 -1
  83. package/dist/utils/flyerUtils.d.ts +42 -0
  84. package/dist/utils/flyerUtils.d.ts.map +1 -0
  85. package/dist/utils/flyerUtils.js +104 -0
  86. package/dist/utils/flyerUtils.js.map +1 -0
  87. package/dist/utils/urlUtils.d.ts +10 -0
  88. package/dist/utils/urlUtils.d.ts.map +1 -1
  89. package/dist/utils/urlUtils.js +24 -5
  90. package/dist/utils/urlUtils.js.map +1 -1
  91. package/dist/utils/userUtils.d.ts +32 -0
  92. package/dist/utils/userUtils.d.ts.map +1 -1
  93. package/dist/utils/userUtils.js +27 -0
  94. package/dist/utils/userUtils.js.map +1 -1
  95. package/package.json +1 -1
  96. package/prisma/schema.prisma +1196 -845
  97. package/src/__tests__/agePolicy.test.ts +257 -0
  98. package/src/__tests__/getDisplayGender.test.ts +50 -0
  99. package/src/__tests__/statusEnums.test.ts +36 -0
  100. package/src/aiApproval.ts +118 -0
  101. package/src/definitions.ts +138 -1
  102. package/src/extendedSchemas.ts +86 -3
  103. package/src/index.ts +15 -0
  104. package/src/legalTemplates.ts +1 -1
  105. package/src/utils/__tests__/badgeUtils.test.ts +191 -0
  106. package/src/utils/__tests__/bashPointsPaymentUtils.test.ts +153 -0
  107. package/src/utils/__tests__/contentFilterUtils.test.ts +547 -0
  108. package/src/utils/__tests__/displayDateUtils.test.ts +113 -0
  109. package/src/utils/__tests__/flyerUtils.test.ts +70 -0
  110. package/src/utils/__tests__/getBackendHost.test.ts +128 -0
  111. package/src/utils/__tests__/getFrontendHost.test.ts +232 -0
  112. package/src/utils/__tests__/promoCodesUtils.test.ts +237 -0
  113. package/src/utils/__tests__/qrCodeUtils.test.ts +143 -0
  114. package/src/utils/__tests__/stripeAccountUtils.test.ts +93 -0
  115. package/src/utils/blog/__tests__/getRelatedBlogPosts.test.ts +271 -0
  116. package/src/utils/blog/blogCommentDbUtils.ts +161 -0
  117. package/src/utils/blog/blogDbUtils.ts +95 -1
  118. package/src/utils/flyerUtils.ts +137 -0
  119. package/src/utils/urlUtils.ts +27 -5
  120. package/src/utils/userUtils.ts +40 -0
  121. package/dist/utils/__tests__/cancellationPolicyRefundResolver.test.d.ts +0 -6
  122. package/dist/utils/__tests__/cancellationPolicyRefundResolver.test.d.ts.map +0 -1
  123. package/dist/utils/__tests__/cancellationPolicyRefundResolver.test.js +0 -104
  124. package/dist/utils/__tests__/cancellationPolicyRefundResolver.test.js.map +0 -1
  125. package/dist/utils/service/serviceRateDBUtils.d.ts +0 -1
  126. package/dist/utils/service/serviceRateDBUtils.d.ts.map +0 -1
  127. package/dist/utils/service/serviceRateDBUtils.js +0 -159
  128. package/dist/utils/service/serviceRateDBUtils.js.map +0 -1
  129. package/prisma/migrations/add_bash_availability.sql +0 -53
  130. package/prisma/migrations/add_bashcash_pricing_to_ticket_tier.sql +0 -15
  131. package/prisma/migrations/add_bashpoints_purchase_tracking.sql +0 -33
  132. package/prisma/migrations/add_event_group_allow_auto_join.sql +0 -17
  133. package/prisma/migrations/add_group_member_status_not_going_maybe.sql +0 -5
  134. package/prisma/migrations/add_groups_and_momentum.sql +0 -135
  135. package/prisma/migrations/add_groups_momentum_phase0_4.sql +0 -200
  136. package/prisma/migrations/add_new_feature_tables.sql +0 -140
  137. package/prisma/migrations/add_pricing_type_enum.sql +0 -88
  138. package/prisma/migrations/add_tier_privacy_and_fee_handling.sql +0 -29
  139. package/prisma/migrations/diagnostic_bashcash_columns.sql +0 -157
  140. package/prisma/migrations/fix_bashcash_referral_code_schema_mismatch.sql +0 -81
  141. package/prisma/migrations/rename_bashcash_to_bashpoints.sql +0 -183
  142. 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;