@bash-app/bash-common 30.155.0 → 30.158.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/definitions.d.ts +19 -8
- package/dist/definitions.d.ts.map +1 -1
- package/dist/definitions.js +2 -20
- package/dist/definitions.js.map +1 -1
- package/dist/extendedSchemas.d.ts +2 -2
- package/dist/extendedSchemas.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/membershipDefinitions.d.ts +7 -12
- package/dist/membershipDefinitions.d.ts.map +1 -1
- package/dist/membershipDefinitions.js.map +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +0 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/luxonUtils.d.ts.map +1 -1
- package/dist/utils/luxonUtils.js +1 -73
- package/dist/utils/luxonUtils.js.map +1 -1
- package/dist/utils/service/serviceDBUtils.d.ts +2 -0
- package/dist/utils/service/serviceDBUtils.d.ts.map +1 -1
- package/dist/utils/service/serviceDBUtils.js +2 -41
- package/dist/utils/service/serviceDBUtils.js.map +1 -1
- package/package.json +1 -1
- package/prisma/migrations/add_bash_availability.sql +53 -0
- package/prisma/migrations/add_event_group_allow_auto_join.sql +17 -0
- package/prisma/migrations/add_group_member_status_not_going_maybe.sql +5 -0
- package/prisma/migrations/add_groups_and_momentum.sql +135 -0
- package/prisma/migrations/add_groups_momentum_phase0_4.sql +200 -0
- package/prisma/migrations/add_new_feature_tables.sql +140 -0
- package/prisma/migrations/add_tier_privacy_and_fee_handling.sql +29 -0
- package/prisma/schema.prisma +241 -0
- package/src/definitions.ts +25 -73
- package/src/extendedSchemas.ts +2 -2
- package/src/index.ts +0 -1
- package/src/membershipDefinitions.ts +8 -14
- package/src/utils/index.ts +0 -1
- package/src/utils/luxonUtils.ts +1 -111
- package/src/utils/service/serviceDBUtils.ts +2 -41
- package/src/utils/service/serviceRateDBUtils.ts +0 -179
|
@@ -0,0 +1,200 @@
|
|
|
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 $$;
|
|
@@ -0,0 +1,140 @@
|
|
|
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 $$;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
-- Migration: Add tierPrivacy to TicketTier, feeHandling to BashEvent
|
|
2
|
+
-- Required for invite-only tiers and fee handling options.
|
|
3
|
+
-- Idempotent — safe to run multiple times.
|
|
4
|
+
|
|
5
|
+
DO $$ BEGIN
|
|
6
|
+
|
|
7
|
+
-- 1. Add tierPrivacy to TicketTier
|
|
8
|
+
IF NOT EXISTS (
|
|
9
|
+
SELECT 1 FROM information_schema.columns
|
|
10
|
+
WHERE table_name = 'TicketTier' AND column_name = 'tierPrivacy'
|
|
11
|
+
) THEN
|
|
12
|
+
ALTER TABLE "TicketTier" ADD COLUMN "tierPrivacy" TEXT NOT NULL DEFAULT 'Public';
|
|
13
|
+
RAISE NOTICE 'Added tierPrivacy to TicketTier';
|
|
14
|
+
ELSE
|
|
15
|
+
RAISE NOTICE 'Column TicketTier.tierPrivacy already exists — skipping';
|
|
16
|
+
END IF;
|
|
17
|
+
|
|
18
|
+
-- 2. Add feeHandling to BashEvent
|
|
19
|
+
IF NOT EXISTS (
|
|
20
|
+
SELECT 1 FROM information_schema.columns
|
|
21
|
+
WHERE table_name = 'BashEvent' AND column_name = 'feeHandling'
|
|
22
|
+
) THEN
|
|
23
|
+
ALTER TABLE "BashEvent" ADD COLUMN "feeHandling" TEXT NOT NULL DEFAULT 'GuestPays';
|
|
24
|
+
RAISE NOTICE 'Added feeHandling to BashEvent';
|
|
25
|
+
ELSE
|
|
26
|
+
RAISE NOTICE 'Column BashEvent.feeHandling already exists — skipping';
|
|
27
|
+
END IF;
|
|
28
|
+
|
|
29
|
+
END $$;
|