@bash-app/bash-common 30.118.1 → 30.120.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 (39) hide show
  1. package/dist/definitions.d.ts +3 -0
  2. package/dist/definitions.d.ts.map +1 -1
  3. package/dist/definitions.js.map +1 -1
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +1 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/membershipDefinitions.d.ts +9 -5
  9. package/dist/membershipDefinitions.d.ts.map +1 -1
  10. package/dist/membershipDefinitions.js +28 -24
  11. package/dist/membershipDefinitions.js.map +1 -1
  12. package/dist/utils/bashPointsPaymentUtils.d.ts +55 -0
  13. package/dist/utils/bashPointsPaymentUtils.d.ts.map +1 -0
  14. package/dist/utils/bashPointsPaymentUtils.js +79 -0
  15. package/dist/utils/bashPointsPaymentUtils.js.map +1 -0
  16. package/dist/utils/index.d.ts +1 -1
  17. package/dist/utils/index.d.ts.map +1 -1
  18. package/dist/utils/index.js +1 -1
  19. package/dist/utils/index.js.map +1 -1
  20. package/dist/utils/ticketListUtils.d.ts +2 -1
  21. package/dist/utils/ticketListUtils.d.ts.map +1 -1
  22. package/dist/utils/ticketListUtils.js +61 -11
  23. package/dist/utils/ticketListUtils.js.map +1 -1
  24. package/package.json +1 -1
  25. package/prisma/migrations/add_bashcash_pricing_to_ticket_tier.sql +15 -0
  26. package/prisma/migrations/add_bashpoints_purchase_tracking.sql +33 -0
  27. package/prisma/migrations/add_pricing_type_enum.sql +88 -0
  28. package/prisma/migrations/diagnostic_bashcash_columns.sql +157 -0
  29. package/prisma/migrations/fix_bashcash_referral_code_schema_mismatch.sql +81 -0
  30. package/prisma/migrations/rename_bashcash_to_bashpoints.sql +183 -0
  31. package/prisma/migrations/rename_bashcredits_to_bashpoints.sql +96 -0
  32. package/prisma/schema.prisma +64 -48
  33. package/src/definitions.ts +3 -0
  34. package/src/index.ts +1 -1
  35. package/src/membershipDefinitions.ts +29 -25
  36. package/src/utils/bashPointsPaymentUtils.ts +107 -0
  37. package/src/utils/index.ts +1 -1
  38. package/src/utils/ticketListUtils.ts +64 -10
  39. package/src/utils/bashCashPaymentUtils.ts +0 -146
@@ -3,7 +3,7 @@ export * from './apiUtils';
3
3
  export * from './arrayUtils';
4
4
  export * from './awsS3Utils';
5
5
  export * from './badgeUtils';
6
- export * from './bashCashPaymentUtils';
6
+ export * from './bashPointsPaymentUtils';
7
7
  export * from './blog/blogDbUtils';
8
8
  export * from './blogUtils';
9
9
  export * from './contentFilterUtils';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,qCAAqC,CAAC;AACpD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uCAAuC,CAAC;AACtD,cAAc,sBAAsB,CAAC;AACrC,cAAc,qCAAqC,CAAC;AACpD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,6EAA6E;AAC7E,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,qCAAqC,CAAC;AACpD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uCAAuC,CAAC;AACtD,cAAc,sBAAsB,CAAC;AACrC,cAAc,qCAAqC,CAAC;AACpD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,6EAA6E;AAC7E,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC"}
@@ -1,12 +1,13 @@
1
1
  import { NumberOfTicketsForDate } from "../definitions";
2
2
  /**
3
3
  * Returns A string structured like: [ticketTierId]__[numberOfTickets];;[date]~~[numberOfTickets];;[date]~~,...
4
+ * The returned string is Base64 URL-safe encoded to prevent routing issues
4
5
  * @param ticketList A map where the key is the ticketTierId
5
6
  */
6
7
  export declare function ticketListToString(ticketList: Map<string, NumberOfTicketsForDate[]>): string;
7
8
  /**
8
9
  * Returns map where the key is the ticketTierId
9
- * @param ticketListStr A string structured like: [ticketTierId]__[numberOfTickets];;[date]~~[numberOfTickets];;[date]~~...,...
10
+ * @param ticketListStr A Base64 URL-safe encoded string that decodes to: [ticketTierId]__[numberOfTickets];;[date]~~[numberOfTickets];;[date]~~...,...
10
11
  */
11
12
  export declare function ticketListStrToTicketList(ticketListStr: string): Map<string, NumberOfTicketsForDate[]>;
12
13
  //# sourceMappingURL=ticketListUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ticketListUtils.d.ts","sourceRoot":"","sources":["../../src/utils/ticketListUtils.ts"],"names":[],"mappings":"AACA,OAAO,EACL,sBAAsB,EAKvB,MAAM,gBAAgB,CAAC;AAQxB;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,EAAE,CAAC,GAChD,MAAM,CAoCR;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,aAAa,EAAE,MAAM,GACpB,GAAG,CAAC,MAAM,EAAE,sBAAsB,EAAE,CAAC,CA2CvC"}
1
+ {"version":3,"file":"ticketListUtils.d.ts","sourceRoot":"","sources":["../../src/utils/ticketListUtils.ts"],"names":[],"mappings":"AACA,OAAO,EACL,sBAAsB,EAKvB,MAAM,gBAAgB,CAAC;AAiDxB;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,EAAE,CAAC,GAChD,MAAM,CAsCR;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,aAAa,EAAE,MAAM,GACpB,GAAG,CAAC,MAAM,EAAE,sBAAsB,EAAE,CAAC,CAqDvC"}
@@ -1,49 +1,99 @@
1
1
  import { DateTime } from "luxon";
2
2
  import { URL_PARAMS_NUMBER_OF_TICKETS_TICKETS_DATE_DELIM, URL_PARAMS_TICKET_LIST_DELIM, URL_PARAMS_TICKET_TIER_ID_NUMBER_OF_TICKETS_DATE_DELIM, URL_PARAMS_TICKETS_DATE_DELIM, } from "../definitions";
3
3
  import { dateTimeFormat, dateTimeFromDate, } from "./luxonUtils";
4
+ /**
5
+ * Encodes a string to Base64 URL-safe format
6
+ * Replaces + with -, / with _, and removes = padding
7
+ */
8
+ function encodeBase64UrlSafe(str) {
9
+ if (typeof window !== "undefined") {
10
+ // Browser environment
11
+ return btoa(str)
12
+ .replace(/\+/g, "-")
13
+ .replace(/\//g, "_")
14
+ .replace(/=/g, "");
15
+ }
16
+ else {
17
+ // Node environment
18
+ return Buffer.from(str)
19
+ .toString("base64")
20
+ .replace(/\+/g, "-")
21
+ .replace(/\//g, "_")
22
+ .replace(/=/g, "");
23
+ }
24
+ }
25
+ /**
26
+ * Decodes a Base64 URL-safe string
27
+ * Replaces - with +, _ with /, and adds back = padding
28
+ */
29
+ function decodeBase64UrlSafe(str) {
30
+ // Add back padding
31
+ let base64 = str.replace(/-/g, "+").replace(/_/g, "/");
32
+ while (base64.length % 4) {
33
+ base64 += "=";
34
+ }
35
+ if (typeof window !== "undefined") {
36
+ // Browser environment
37
+ return atob(base64);
38
+ }
39
+ else {
40
+ // Node environment
41
+ return Buffer.from(base64, "base64").toString();
42
+ }
43
+ }
4
44
  /**
5
45
  * Returns A string structured like: [ticketTierId]__[numberOfTickets];;[date]~~[numberOfTickets];;[date]~~,...
46
+ * The returned string is Base64 URL-safe encoded to prevent routing issues
6
47
  * @param ticketList A map where the key is the ticketTierId
7
48
  */
8
49
  export function ticketListToString(ticketList) {
9
50
  const ticketListArr = [];
10
51
  for (const [ticketTierId, ticketListArgs] of ticketList.entries()) {
11
- let ticketsExist = true;
12
52
  const ticketArgs = [
13
53
  `${ticketTierId}${URL_PARAMS_TICKET_TIER_ID_NUMBER_OF_TICKETS_DATE_DELIM}`,
14
54
  ];
55
+ let hasAnyTickets = false; // Track if we added ANY valid tickets for this tier
15
56
  for (const ticketNumAndDates of ticketListArgs) {
16
57
  if (ticketNumAndDates.numberOfTickets > 0) {
17
- ticketsExist = true;
18
- // Ensure ticketDateTime is in ISO format
58
+ hasAnyTickets = true;
59
+ // Ensure ticketDateTime is in ISO format (URL-safe)
19
60
  let dateTimeStr = ticketNumAndDates.ticketDateTime;
20
61
  if (dateTimeStr) {
21
62
  // If it's already a string, try to parse it as DateTime and convert to ISO
22
63
  const dateTime = dateTimeFromDate(dateTimeStr);
23
64
  if (dateTime.isValid) {
24
- dateTimeStr = dateTimeFormat(dateTime) || dateTimeStr;
65
+ dateTimeStr = dateTime.toISO() || dateTimeStr;
25
66
  }
26
67
  }
27
68
  ticketArgs.push(`${ticketNumAndDates.numberOfTickets}${URL_PARAMS_TICKETS_DATE_DELIM}${dateTimeStr}`);
28
69
  }
29
- else {
30
- ticketsExist = false;
31
- }
32
70
  }
33
- if (ticketsExist) {
71
+ // Only include this tier if we found at least one ticket > 0
72
+ if (hasAnyTickets) {
34
73
  ticketListArr.push(ticketArgs.join(URL_PARAMS_NUMBER_OF_TICKETS_TICKETS_DATE_DELIM));
35
74
  }
36
75
  }
37
- return ticketListArr.join(URL_PARAMS_TICKET_LIST_DELIM);
76
+ const plainString = ticketListArr.join(URL_PARAMS_TICKET_LIST_DELIM);
77
+ return encodeBase64UrlSafe(plainString);
38
78
  }
39
79
  /**
40
80
  * Returns map where the key is the ticketTierId
41
- * @param ticketListStr A string structured like: [ticketTierId]__[numberOfTickets];;[date]~~[numberOfTickets];;[date]~~...,...
81
+ * @param ticketListStr A Base64 URL-safe encoded string that decodes to: [ticketTierId]__[numberOfTickets];;[date]~~[numberOfTickets];;[date]~~...,...
42
82
  */
43
83
  export function ticketListStrToTicketList(ticketListStr) {
44
84
  const ticketList = new Map();
85
+ // Decode the Base64 URL-safe string first
86
+ let decodedStr;
87
+ try {
88
+ decodedStr = decodeBase64UrlSafe(ticketListStr);
89
+ }
90
+ catch (error) {
91
+ console.error("Failed to decode ticketListStr:", error);
92
+ // If decoding fails, try using the string as-is (for backward compatibility)
93
+ decodedStr = ticketListStr;
94
+ }
45
95
  // [ticketTierId]__~~[numberOfTickets];;[date]~~[numberOfTickets];;[date]~~...,...
46
- const ticketListArgs = ticketListStr.split(URL_PARAMS_TICKET_LIST_DELIM);
96
+ const ticketListArgs = decodedStr.split(URL_PARAMS_TICKET_LIST_DELIM);
47
97
  ticketListArgs.forEach((tierIdAndTicketNumbersAndDates) => {
48
98
  const ticketNumAndDatesArr = [];
49
99
  // [ticketTierId]__~~[numberOfTickets];;[date]~~[numberOfTickets];;[date]~~...
@@ -1 +1 @@
1
- {"version":3,"file":"ticketListUtils.js","sourceRoot":"","sources":["../../src/utils/ticketListUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAEL,+CAA+C,EAC/C,4BAA4B,EAC5B,sDAAsD,EACtD,6BAA6B,GAC9B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,cAAc,EACd,gBAAgB,GAGjB,MAAM,cAAc,CAAC;AAEtB;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,UAAiD;IAEjD,MAAM,aAAa,GAAa,EAAE,CAAC;IAEnC,KAAK,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;QAClE,IAAI,YAAY,GAAG,IAAI,CAAC;QACxB,MAAM,UAAU,GAAa;YAC3B,GAAG,YAAY,GAAG,sDAAsD,EAAE;SAC3E,CAAC;QACF,KAAK,MAAM,iBAAiB,IAAI,cAAc,EAAE,CAAC;YAC/C,IAAI,iBAAiB,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;gBAC1C,YAAY,GAAG,IAAI,CAAC;gBAEpB,yCAAyC;gBACzC,IAAI,WAAW,GAAG,iBAAiB,CAAC,cAAc,CAAC;gBACnD,IAAI,WAAW,EAAE,CAAC;oBAChB,2EAA2E;oBAC3E,MAAM,QAAQ,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;oBAC/C,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;wBACrB,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC;oBACxD,CAAC;gBACH,CAAC;gBAED,UAAU,CAAC,IAAI,CACb,GAAG,iBAAiB,CAAC,eAAe,GAAG,6BAA6B,GAAG,WAAW,EAAE,CACrF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,YAAY,GAAG,KAAK,CAAC;YACvB,CAAC;QACH,CAAC;QACD,IAAI,YAAY,EAAE,CAAC;YACjB,aAAa,CAAC,IAAI,CAChB,UAAU,CAAC,IAAI,CAAC,+CAA+C,CAAC,CACjE,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,aAAa,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;AAC1D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,aAAqB;IAErB,MAAM,UAAU,GAA0C,IAAI,GAAG,EAAE,CAAC;IAEpE,kFAAkF;IAClF,MAAM,cAAc,GAAG,aAAa,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAEzE,cAAc,CAAC,OAAO,CAAC,CAAC,8BAAsC,EAAQ,EAAE;QACtE,MAAM,oBAAoB,GAA6B,EAAE,CAAC;QAC1D,8EAA8E;QAC9E,MAAM,CAAC,YAAY,EAAE,oBAAoB,CAAC,GACxC,8BAA8B,CAAC,KAAK,CAClC,sDAAsD,CACvD,CAAC;QACJ,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,4DAA4D,CAC7D,CAAC;QACJ,CAAC;QACD,8DAA8D;QAC9D,MAAM,iBAAiB,GAAG,oBAAoB;aAC3C,KAAK,CAAC,+CAA+C,CAAC;aACtD,MAAM,CAAC,CAAC,mBAAmB,EAAW,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;QAEnE,KAAK,MAAM,mBAAmB,IAAI,iBAAiB,EAAE,CAAC;YACpD,4BAA4B;YAC5B,MAAM,CAAC,eAAe,EAAE,iBAAiB,CAAC,GAAG,mBAAmB,CAAC,KAAK,CACpE,6BAA6B,CAC9B,CAAC;YACF,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;YAC3D,IAAI,0BAA0B,GAAuB,SAAS,CAAC;YAE/D,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;gBAC3B,0BAA0B,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;YAC9D,CAAC;YAED,oBAAoB,CAAC,IAAI,CAAC;gBACxB,eAAe,EAAE,QAAQ,CAAC,eAAe,CAAC;gBAC1C,cAAc,EAAE,0BAA0B;aAC3C,CAAC,CAAC;QACL,CAAC;QACD,UAAU,CAAC,GAAG,CAAC,YAAY,EAAE,oBAAoB,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IACH,OAAO,UAAU,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"ticketListUtils.js","sourceRoot":"","sources":["../../src/utils/ticketListUtils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bash-app/bash-common",
3
- "version": "30.118.1",
3
+ "version": "30.120.0",
4
4
  "description": "Common data and scripts to use on the frontend and backend",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -0,0 +1,15 @@
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)';
@@ -0,0 +1,33 @@
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 $$;
@@ -0,0 +1,88 @@
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;
@@ -0,0 +1,157 @@
1
+ -- Diagnostic Script: Check Current BashCash/BashPoints Column Names
2
+ -- Run this first to see what exists in your database
3
+
4
+ -- =====================================================================
5
+ -- CHECK FOR BASHCASH COLUMNS
6
+ -- =====================================================================
7
+
8
+ SELECT
9
+ '🔍 Columns containing "bashcash" (old naming)' AS check_type;
10
+
11
+ SELECT
12
+ table_name,
13
+ column_name,
14
+ data_type,
15
+ is_nullable
16
+ FROM information_schema.columns
17
+ WHERE column_name ILIKE '%bashcash%'
18
+ ORDER BY table_name, column_name;
19
+
20
+ -- =====================================================================
21
+ -- CHECK FOR BASHPOINTS COLUMNS
22
+ -- =====================================================================
23
+
24
+ SELECT
25
+ '✅ Columns containing "bashpoints" (new naming)' AS check_type;
26
+
27
+ SELECT
28
+ table_name,
29
+ column_name,
30
+ data_type,
31
+ is_nullable
32
+ FROM information_schema.columns
33
+ WHERE column_name ILIKE '%bashpoints%'
34
+ ORDER BY table_name, column_name;
35
+
36
+ -- =====================================================================
37
+ -- CHECK TICKET TIER COLUMNS
38
+ -- =====================================================================
39
+
40
+ SELECT
41
+ 'đŸŽĢ TicketTier columns' AS check_type;
42
+
43
+ SELECT
44
+ column_name,
45
+ data_type,
46
+ is_nullable
47
+ FROM information_schema.columns
48
+ WHERE table_name = 'TicketTier'
49
+ ORDER BY ordinal_position;
50
+
51
+ -- =====================================================================
52
+ -- CHECK USER COLUMNS
53
+ -- =====================================================================
54
+
55
+ SELECT
56
+ '👤 User columns (bash-related)' AS check_type;
57
+
58
+ SELECT
59
+ column_name,
60
+ data_type,
61
+ is_nullable
62
+ FROM information_schema.columns
63
+ WHERE table_name = 'User' AND column_name ILIKE '%bash%'
64
+ ORDER BY ordinal_position;
65
+
66
+ -- =====================================================================
67
+ -- CHECK SERVICE COLUMNS
68
+ -- =====================================================================
69
+
70
+ SELECT
71
+ 'đŸ›Žī¸ Service columns (bash-related)' AS check_type;
72
+
73
+ SELECT
74
+ column_name,
75
+ data_type,
76
+ is_nullable
77
+ FROM information_schema.columns
78
+ WHERE table_name = 'Service' AND column_name ILIKE '%bash%'
79
+ ORDER BY ordinal_position;
80
+
81
+ -- =====================================================================
82
+ -- CHECK SERVICEBOOKING COLUMNS
83
+ -- =====================================================================
84
+
85
+ SELECT
86
+ '📅 ServiceBooking columns (bash-related)' AS check_type;
87
+
88
+ SELECT
89
+ column_name,
90
+ data_type,
91
+ is_nullable
92
+ FROM information_schema.columns
93
+ WHERE table_name = 'ServiceBooking' AND column_name ILIKE '%bash%'
94
+ ORDER BY ordinal_position;
95
+
96
+ -- =====================================================================
97
+ -- CHECK NOTIFICATION COLUMNS
98
+ -- =====================================================================
99
+
100
+ SELECT
101
+ '🔔 Notification columns (bash-related)' AS check_type;
102
+
103
+ SELECT
104
+ column_name,
105
+ data_type,
106
+ is_nullable
107
+ FROM information_schema.columns
108
+ WHERE table_name = 'Notification' AND column_name ILIKE '%bash%'
109
+ ORDER BY ordinal_position;
110
+
111
+ -- =====================================================================
112
+ -- CHECK PRIZEPAYMENT COLUMNS
113
+ -- =====================================================================
114
+
115
+ SELECT
116
+ '🏆 PrizePayment columns (bash-related)' AS check_type;
117
+
118
+ SELECT
119
+ column_name,
120
+ data_type,
121
+ is_nullable
122
+ FROM information_schema.columns
123
+ WHERE table_name = 'PrizePayment' AND column_name ILIKE '%bash%'
124
+ ORDER BY ordinal_position;
125
+
126
+ -- =====================================================================
127
+ -- CHECK ENUM VALUES
128
+ -- =====================================================================
129
+
130
+ SELECT
131
+ '📋 Enum values containing "bash"' AS check_type;
132
+
133
+ SELECT
134
+ t.typname AS enum_type,
135
+ e.enumlabel AS enum_value,
136
+ e.enumsortorder AS sort_order
137
+ FROM pg_enum e
138
+ JOIN pg_type t ON e.enumtypid = t.oid
139
+ WHERE e.enumlabel ILIKE '%bash%'
140
+ ORDER BY t.typname, e.enumsortorder;
141
+
142
+ -- =====================================================================
143
+ -- SUMMARY
144
+ -- =====================================================================
145
+
146
+ SELECT
147
+ '📊 SUMMARY' AS info;
148
+
149
+ SELECT
150
+ COUNT(*) AS bashcash_columns_count
151
+ FROM information_schema.columns
152
+ WHERE column_name ILIKE '%bashcash%';
153
+
154
+ SELECT
155
+ COUNT(*) AS bashpoints_columns_count
156
+ FROM information_schema.columns
157
+ WHERE column_name ILIKE '%bashpoints%';
@@ -0,0 +1,81 @@
1
+ -- Migration: Fix BashCash Referral Code Schema Mismatch
2
+ -- Date: 2026-02-01
3
+ -- Description: This script verifies that the database column was properly renamed
4
+ -- from bashCashReferralCode to bashPointsReferralCode.
5
+ -- After running this, you MUST update the Prisma schema to match.
6
+
7
+ -- =====================================================================
8
+ -- DIAGNOSTIC: Check current state
9
+ -- =====================================================================
10
+
11
+ -- Check if old column name still exists
12
+ SELECT
13
+ CASE
14
+ WHEN EXISTS (
15
+ SELECT 1 FROM information_schema.columns
16
+ WHERE table_name = 'User' AND column_name = 'bashCashReferralCode'
17
+ ) THEN '❌ OLD COLUMN STILL EXISTS: User.bashCashReferralCode'
18
+ ELSE '✅ Old column does not exist (good!)'
19
+ END AS old_column_status;
20
+
21
+ -- Check if new column name exists
22
+ SELECT
23
+ CASE
24
+ WHEN EXISTS (
25
+ SELECT 1 FROM information_schema.columns
26
+ WHERE table_name = 'User' AND column_name = 'bashPointsReferralCode'
27
+ ) THEN '✅ NEW COLUMN EXISTS: User.bashPointsReferralCode'
28
+ ELSE '❌ New column does not exist (needs migration!)'
29
+ END AS new_column_status;
30
+
31
+ -- =====================================================================
32
+ -- FIX: Rename column if it hasn't been renamed yet
33
+ -- =====================================================================
34
+
35
+ DO $$
36
+ BEGIN
37
+ -- If the old column still exists, rename it
38
+ IF EXISTS (
39
+ SELECT 1 FROM information_schema.columns
40
+ WHERE table_name = 'User' AND column_name = 'bashCashReferralCode'
41
+ ) THEN
42
+ -- Rename the column
43
+ ALTER TABLE "User" RENAME COLUMN "bashCashReferralCode" TO "bashPointsReferralCode";
44
+ RAISE NOTICE '✅ Renamed User.bashCashReferralCode → bashPointsReferralCode';
45
+
46
+ -- Check if there's a unique constraint with the old name and rename it
47
+ IF EXISTS (
48
+ SELECT 1 FROM pg_constraint
49
+ WHERE conname = 'User_bashCashReferralCode_key'
50
+ ) THEN
51
+ ALTER TABLE "User" RENAME CONSTRAINT "User_bashCashReferralCode_key" TO "User_bashPointsReferralCode_key";
52
+ RAISE NOTICE '✅ Renamed constraint User_bashCashReferralCode_key → User_bashPointsReferralCode_key';
53
+ END IF;
54
+ ELSE
55
+ RAISE NOTICE 'â„šī¸ Column User.bashCashReferralCode already renamed to bashPointsReferralCode';
56
+ END IF;
57
+ END $$;
58
+
59
+ -- =====================================================================
60
+ -- VERIFICATION: Show final state
61
+ -- =====================================================================
62
+
63
+ SELECT
64
+ table_name,
65
+ column_name,
66
+ data_type,
67
+ is_nullable,
68
+ column_default
69
+ FROM information_schema.columns
70
+ WHERE table_name = 'User'
71
+ AND (column_name LIKE '%referral%' OR column_name LIKE '%bashpoints%' OR column_name LIKE '%bashcash%')
72
+ ORDER BY column_name;
73
+
74
+ -- Show constraints
75
+ SELECT
76
+ conname AS constraint_name,
77
+ contype AS constraint_type
78
+ FROM pg_constraint
79
+ WHERE conrelid = 'User'::regclass
80
+ AND conname LIKE '%referral%'
81
+ ORDER BY conname;