@revealui/services 0.0.2 → 0.1.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 (112) hide show
  1. package/LICENSE +22 -202
  2. package/LICENSE.commercial +112 -0
  3. package/README.md +177 -0
  4. package/dist/api/create-checkout-session/index.d.ts +2 -0
  5. package/dist/api/create-checkout-session/index.d.ts.map +1 -0
  6. package/dist/api/create-checkout-session/index.js +61 -0
  7. package/dist/api/create-checkout-session/index.js.map +1 -0
  8. package/dist/api/create-portal-link/index.d.ts +2 -0
  9. package/dist/api/create-portal-link/index.d.ts.map +1 -0
  10. package/dist/api/create-portal-link/index.js +37 -0
  11. package/dist/api/create-portal-link/index.js.map +1 -0
  12. package/dist/api/handlers/customer-handlers.d.ts +27 -0
  13. package/dist/api/handlers/customer-handlers.d.ts.map +1 -0
  14. package/dist/api/handlers/customer-handlers.js +86 -0
  15. package/dist/api/handlers/customer-handlers.js.map +1 -0
  16. package/dist/api/handlers/index.d.ts +18 -0
  17. package/dist/api/handlers/index.d.ts.map +1 -0
  18. package/dist/api/handlers/index.js +18 -0
  19. package/dist/api/handlers/index.js.map +1 -0
  20. package/dist/api/handlers/invoice-handlers.d.ts +9 -0
  21. package/dist/api/handlers/invoice-handlers.d.ts.map +1 -0
  22. package/dist/api/handlers/invoice-handlers.js +52 -0
  23. package/dist/api/handlers/invoice-handlers.js.map +1 -0
  24. package/dist/api/handlers/payment-handlers.d.ts +13 -0
  25. package/dist/api/handlers/payment-handlers.d.ts.map +1 -0
  26. package/dist/api/handlers/payment-handlers.js +133 -0
  27. package/dist/api/handlers/payment-handlers.js.map +1 -0
  28. package/dist/api/handlers/payment-intent.d.ts +21 -0
  29. package/dist/api/handlers/payment-intent.d.ts.map +1 -0
  30. package/dist/api/handlers/payment-intent.js +87 -0
  31. package/dist/api/handlers/payment-intent.js.map +1 -0
  32. package/dist/api/handlers/product-handlers.d.ts +11 -0
  33. package/dist/api/handlers/product-handlers.d.ts.map +1 -0
  34. package/dist/api/handlers/product-handlers.js +43 -0
  35. package/dist/api/handlers/product-handlers.js.map +1 -0
  36. package/dist/api/handlers/subscription-handlers.d.ts +13 -0
  37. package/dist/api/handlers/subscription-handlers.d.ts.map +1 -0
  38. package/dist/api/handlers/subscription-handlers.js +115 -0
  39. package/dist/api/handlers/subscription-handlers.js.map +1 -0
  40. package/dist/api/index.d.ts +8 -0
  41. package/dist/api/index.d.ts.map +1 -0
  42. package/dist/api/index.js +8 -0
  43. package/dist/api/index.js.map +1 -0
  44. package/dist/api/types/stripe.d.ts +42 -0
  45. package/dist/api/types/stripe.d.ts.map +1 -0
  46. package/dist/api/types/stripe.js +72 -0
  47. package/dist/api/types/stripe.js.map +1 -0
  48. package/dist/api/update-price/index.d.ts +42 -0
  49. package/dist/api/update-price/index.d.ts.map +1 -0
  50. package/dist/api/update-price/index.js +78 -0
  51. package/dist/api/update-price/index.js.map +1 -0
  52. package/dist/api/update-product/index.d.ts +44 -0
  53. package/dist/api/update-product/index.d.ts.map +1 -0
  54. package/dist/api/update-product/index.js +85 -0
  55. package/dist/api/update-product/index.js.map +1 -0
  56. package/dist/api/utils.d.ts +34 -0
  57. package/dist/api/utils.d.ts.map +1 -0
  58. package/dist/api/utils.js +66 -0
  59. package/dist/api/utils.js.map +1 -0
  60. package/dist/api/webhooks/index.d.ts +2 -0
  61. package/dist/api/webhooks/index.d.ts.map +1 -0
  62. package/dist/api/webhooks/index.js +270 -0
  63. package/dist/api/webhooks/index.js.map +1 -0
  64. package/dist/client/index.d.ts +11 -0
  65. package/dist/client/index.d.ts.map +1 -0
  66. package/dist/client/index.js +12 -0
  67. package/dist/client/index.js.map +1 -0
  68. package/dist/index.d.ts +35 -0
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +46 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/stripe/db-circuit-breaker.d.ts +47 -0
  73. package/dist/stripe/db-circuit-breaker.d.ts.map +1 -0
  74. package/dist/stripe/db-circuit-breaker.js +223 -0
  75. package/dist/stripe/db-circuit-breaker.js.map +1 -0
  76. package/dist/stripe/index.d.ts +2 -0
  77. package/dist/stripe/index.d.ts.map +1 -0
  78. package/dist/stripe/index.js +2 -0
  79. package/dist/stripe/index.js.map +1 -0
  80. package/dist/stripe/stripeClient.d.ts +126 -0
  81. package/dist/stripe/stripeClient.d.ts.map +1 -0
  82. package/dist/stripe/stripeClient.js +226 -0
  83. package/dist/stripe/stripeClient.js.map +1 -0
  84. package/dist/supabase/index.d.ts +6 -0
  85. package/dist/supabase/index.d.ts.map +1 -0
  86. package/dist/supabase/index.js +5 -0
  87. package/dist/supabase/index.js.map +1 -0
  88. package/dist/supabase/resilience.d.ts +50 -0
  89. package/dist/supabase/resilience.d.ts.map +1 -0
  90. package/dist/supabase/resilience.js +166 -0
  91. package/dist/supabase/resilience.js.map +1 -0
  92. package/dist/supabase/types.d.ts +206 -0
  93. package/dist/supabase/types.d.ts.map +1 -0
  94. package/dist/supabase/types.js +19 -0
  95. package/dist/supabase/types.js.map +1 -0
  96. package/dist/supabase/utils/client.d.ts +4 -0
  97. package/dist/supabase/utils/client.d.ts.map +1 -0
  98. package/dist/supabase/utils/client.js +12 -0
  99. package/dist/supabase/utils/client.js.map +1 -0
  100. package/dist/supabase/utils/server.d.ts +10 -0
  101. package/dist/supabase/utils/server.d.ts.map +1 -0
  102. package/dist/supabase/utils/server.js +49 -0
  103. package/dist/supabase/utils/server.js.map +1 -0
  104. package/dist/supabase/utils/web.d.ts +4 -0
  105. package/dist/supabase/utils/web.d.ts.map +1 -0
  106. package/dist/supabase/utils/web.js +37 -0
  107. package/dist/supabase/utils/web.js.map +1 -0
  108. package/package.json +70 -54
  109. package/dist/.vite/ssr-manifest.json +0 -209
  110. package/dist/assets/index-Bai9hEWd.js +0 -16
  111. package/dist/assets/index-Bai9hEWd.js.map +0 -1
  112. package/dist/index.html +0 -23
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customer-handlers.d.ts","sourceRoot":"","sources":["../../../src/api/handlers/customer-handlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAA;AAEhC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,yBAAyB,CAAA;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAG5D,eAAO,MAAM,wBAAwB,GAAU,4BAI5C;IACD,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IACrB,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAA;CACnC,KAAG,OAAO,CAAC,MAAM,GAAG;IAAE,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAyBzD,CAAA;AAED,eAAO,MAAM,4BAA4B,GACvC,MAAM,MAAM,GAAG,MAAM,EACrB,eAAe,MAAM,CAAC,aAAa,EACnC,UAAU,cAAc,CAAC,QAAQ,CAAC,KACjC,OAAO,CAAC,IAAI,CA6Bd,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,OAAO,kBAAkB,CAAC,kBAAkB,CAAC,KAAG,IAMrF,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAAI,OAAO,kBAAkB,CAAC,kBAAkB,CAAC,KAAG,IAMrF,CAAA"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Customer and billing handlers for Stripe webhooks
3
+ */
4
+ import { logger } from '@revealui/core/utils/logger';
5
+ import { protectedStripe } from '../../stripe/stripeClient.js';
6
+ import { extractCustomerId } from '../types/stripe.js';
7
+ export const createOrRetrieveCustomer = async ({ email, uuid, supabase, }) => {
8
+ const { data, error } = await supabase
9
+ .from('users')
10
+ .select('stripe_customer_id')
11
+ .eq('id', String(uuid))
12
+ .single();
13
+ if (error || !data) {
14
+ const customerData = {
15
+ metadata: {
16
+ supabaseUUID: String(uuid),
17
+ ...(email ? { email } : {}),
18
+ },
19
+ };
20
+ const customer = await protectedStripe.customers.create(customerData);
21
+ const { error: supabaseError } = await supabase.from('users').insert([
22
+ {
23
+ email: email,
24
+ stripe_customer_id: customer.id,
25
+ },
26
+ ]);
27
+ if (supabaseError)
28
+ throw supabaseError;
29
+ logger.info('New customer created and inserted', { uuid });
30
+ return customer.id;
31
+ }
32
+ return data;
33
+ };
34
+ export const copyBillingDetailsToCustomer = async (uuid, paymentMethod, supabase) => {
35
+ const customerId = extractCustomerId(paymentMethod.customer);
36
+ if (!customerId) {
37
+ throw new Error('Payment method does not have a valid customer ID');
38
+ }
39
+ const { name, phone, address } = paymentMethod.billing_details;
40
+ if (!(name && phone && address))
41
+ return;
42
+ const updateParams = {
43
+ ...(name ? { name } : {}),
44
+ ...(phone ? { phone } : {}),
45
+ ...(address
46
+ ? {
47
+ address: {
48
+ city: address.city ?? undefined,
49
+ country: address.country ?? undefined,
50
+ line1: address.line1 ?? undefined,
51
+ line2: address.line2 ?? undefined,
52
+ postal_code: address.postal_code ?? undefined,
53
+ state: address.state ?? undefined,
54
+ },
55
+ }
56
+ : {}),
57
+ };
58
+ await protectedStripe.customers.update(customerId, updateParams);
59
+ const { error } = await supabase.from('users').update({}).eq('id', String(uuid));
60
+ if (error)
61
+ throw error;
62
+ };
63
+ /**
64
+ * Log customer creation events. The RevealUI user record is created during
65
+ * checkout via createOrRetrieveCustomer; this handler covers customers created
66
+ * outside that flow (e.g., from the Stripe dashboard or another integration).
67
+ */
68
+ export const handleCustomerCreated = (event) => {
69
+ const customer = event.data.object;
70
+ logger.info('Stripe customer created', {
71
+ customerId: customer.id,
72
+ email: customer.email ?? '(no email)',
73
+ });
74
+ };
75
+ /**
76
+ * Log customer update events. Billing detail syncing is handled by
77
+ * handlePaymentMethodAttached; no additional action is required here.
78
+ */
79
+ export const handleCustomerUpdated = (event) => {
80
+ const customer = event.data.object;
81
+ logger.info('Stripe customer updated', {
82
+ customerId: customer.id,
83
+ email: customer.email ?? '(no email)',
84
+ });
85
+ };
86
+ //# sourceMappingURL=customer-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customer-handlers.js","sourceRoot":"","sources":["../../../src/api/handlers/customer-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Stripe webhook and API handlers
3
+ *
4
+ * Split from the monolithic api/utils.ts into focused modules:
5
+ * - subscription-handlers: Subscription lifecycle management
6
+ * - invoice-handlers: Invoice payment events
7
+ * - product-handlers: Product and price record management
8
+ * - customer-handlers: Customer and billing management
9
+ * - payment-handlers: Payment method and setup intent events
10
+ * - payment-intent: Payment intent creation
11
+ */
12
+ export { copyBillingDetailsToCustomer, createOrRetrieveCustomer, handleCustomerCreated, handleCustomerUpdated, } from './customer-handlers.js';
13
+ export { handleInvoicePaymentFailed, handleInvoicePaymentSucceeded } from './invoice-handlers.js';
14
+ export { handlePaymentMethodAttached, handlePaymentMethodCreated, handlePaymentMethodDetached, handlePaymentMethodUpdated, handleSetupIntentFailed, handleSetupIntentSucceeded, } from './payment-handlers.js';
15
+ export { createPaymentIntent } from './payment-intent.js';
16
+ export { toDateTime, upsertPriceRecord, upsertProductRecord, upsertRecord, } from './product-handlers.js';
17
+ export { handleCheckoutSessionCompleted, handleCustomerSubscriptionCreated, handleCustomerSubscriptionDeleted, handleCustomerSubscriptionUpdated, handleSupabaseError, manageSubscriptionStatusChange, } from './subscription-handlers.js';
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/handlers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,4BAA4B,EAC5B,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,0BAA0B,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAA;AACjG,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,2BAA2B,EAC3B,0BAA0B,EAC1B,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,GACb,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,8BAA8B,EAC9B,iCAAiC,EACjC,iCAAiC,EACjC,iCAAiC,EACjC,mBAAmB,EACnB,8BAA8B,GAC/B,MAAM,4BAA4B,CAAA"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Stripe webhook and API handlers
3
+ *
4
+ * Split from the monolithic api/utils.ts into focused modules:
5
+ * - subscription-handlers: Subscription lifecycle management
6
+ * - invoice-handlers: Invoice payment events
7
+ * - product-handlers: Product and price record management
8
+ * - customer-handlers: Customer and billing management
9
+ * - payment-handlers: Payment method and setup intent events
10
+ * - payment-intent: Payment intent creation
11
+ */
12
+ export { copyBillingDetailsToCustomer, createOrRetrieveCustomer, handleCustomerCreated, handleCustomerUpdated, } from './customer-handlers.js';
13
+ export { handleInvoicePaymentFailed, handleInvoicePaymentSucceeded } from './invoice-handlers.js';
14
+ export { handlePaymentMethodAttached, handlePaymentMethodCreated, handlePaymentMethodDetached, handlePaymentMethodUpdated, handleSetupIntentFailed, handleSetupIntentSucceeded, } from './payment-handlers.js';
15
+ export { createPaymentIntent } from './payment-intent.js';
16
+ export { toDateTime, upsertPriceRecord, upsertProductRecord, upsertRecord, } from './product-handlers.js';
17
+ export { handleCheckoutSessionCompleted, handleCustomerSubscriptionCreated, handleCustomerSubscriptionDeleted, handleCustomerSubscriptionUpdated, handleSupabaseError, manageSubscriptionStatusChange, } from './subscription-handlers.js';
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/handlers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,4BAA4B,EAC5B,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,0BAA0B,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAA;AACjG,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,2BAA2B,EAC3B,0BAA0B,EAC1B,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,GACb,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,8BAA8B,EAC9B,iCAAiC,EACjC,iCAAiC,EACjC,iCAAiC,EACjC,mBAAmB,EACnB,8BAA8B,GAC/B,MAAM,4BAA4B,CAAA"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Invoice event handlers for Stripe webhooks
3
+ */
4
+ import type { SupabaseClient } from '../../supabase/index.js';
5
+ import type { Database } from '../../supabase/types.js';
6
+ import type { StripeWebhookEvent } from '../types/stripe.js';
7
+ export declare const handleInvoicePaymentSucceeded: (event: StripeWebhookEvent<"invoice.payment_succeeded">, supabase: SupabaseClient<Database>) => Promise<void>;
8
+ export declare function handleInvoicePaymentFailed(event: StripeWebhookEvent<'invoice.payment_failed'>, supabase: SupabaseClient<Database>): Promise<void>;
9
+ //# sourceMappingURL=invoice-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoice-handlers.d.ts","sourceRoot":"","sources":["../../../src/api/handlers/invoice-handlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAI5D,eAAO,MAAM,6BAA6B,GACxC,OAAO,kBAAkB,CAAC,2BAA2B,CAAC,EACtD,UAAU,cAAc,CAAC,QAAQ,CAAC,KACjC,OAAO,CAAC,IAAI,CAwBd,CAAA;AAED,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,kBAAkB,CAAC,wBAAwB,CAAC,EACnD,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC,CAwBf"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Invoice event handlers for Stripe webhooks
3
+ */
4
+ import { extractCustomerId } from '../types/stripe.js';
5
+ import { handleSupabaseError, manageSubscriptionStatusChange } from './subscription-handlers.js';
6
+ export const handleInvoicePaymentSucceeded = async (event, supabase) => {
7
+ const invoice = event.data.object;
8
+ const subscriptionId = invoice.subscription
9
+ ? typeof invoice.subscription === 'string'
10
+ ? invoice.subscription
11
+ : (invoice.subscription?.id ?? null)
12
+ : null;
13
+ const customerId = extractCustomerId(invoice.customer);
14
+ if (!(subscriptionId && customerId)) {
15
+ throw new Error('Invoice missing subscription or customer');
16
+ }
17
+ try {
18
+ await manageSubscriptionStatusChange(subscriptionId, customerId, false, supabase);
19
+ }
20
+ catch (error) {
21
+ if (error instanceof Error) {
22
+ handleSupabaseError(error);
23
+ }
24
+ else {
25
+ handleSupabaseError(new Error(String(error)));
26
+ }
27
+ }
28
+ };
29
+ export async function handleInvoicePaymentFailed(event, supabase) {
30
+ const invoice = event.data.object;
31
+ const subscriptionId = invoice.subscription
32
+ ? typeof invoice.subscription === 'string'
33
+ ? invoice.subscription
34
+ : (invoice.subscription?.id ?? null)
35
+ : null;
36
+ const customerId = extractCustomerId(invoice.customer);
37
+ if (!(subscriptionId && customerId)) {
38
+ throw new Error('Invoice missing subscription or customer');
39
+ }
40
+ try {
41
+ await manageSubscriptionStatusChange(subscriptionId, customerId, false, supabase);
42
+ }
43
+ catch (error) {
44
+ if (error instanceof Error) {
45
+ handleSupabaseError(error);
46
+ }
47
+ else {
48
+ handleSupabaseError(new Error(String(error)));
49
+ }
50
+ }
51
+ }
52
+ //# sourceMappingURL=invoice-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoice-handlers.js","sourceRoot":"","sources":["../../../src/api/handlers/invoice-handlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAA;AAEhG,MAAM,CAAC,MAAM,6BAA6B,GAAG,KAAK,EAChD,KAAsD,EACtD,QAAkC,EACnB,EAAE;IACjB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAE1B,CAAA;IACD,MAAM,cAAc,GAAG,OAAO,CAAC,YAAY;QACzC,CAAC,CAAC,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ;YACxC,CAAC,CAAC,OAAO,CAAC,YAAY;YACtB,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,IAAI,IAAI,CAAC;QACtC,CAAC,CAAC,IAAI,CAAA;IACR,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAEtD,IAAI,CAAC,CAAC,cAAc,IAAI,UAAU,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;IAC7D,CAAC;IAED,IAAI,CAAC;QACH,MAAM,8BAA8B,CAAC,cAAc,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;IACnF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,mBAAmB,CAAC,KAAK,CAAC,CAAA;QAC5B,CAAC;aAAM,CAAC;YACN,mBAAmB,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAC/C,CAAC;IACH,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,KAAmD,EACnD,QAAkC;IAElC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAE1B,CAAA;IACD,MAAM,cAAc,GAAG,OAAO,CAAC,YAAY;QACzC,CAAC,CAAC,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ;YACxC,CAAC,CAAC,OAAO,CAAC,YAAY;YACtB,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,IAAI,IAAI,CAAC;QACtC,CAAC,CAAC,IAAI,CAAA;IACR,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAEtD,IAAI,CAAC,CAAC,cAAc,IAAI,UAAU,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;IAC7D,CAAC;IAED,IAAI,CAAC;QACH,MAAM,8BAA8B,CAAC,cAAc,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;IACnF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,mBAAmB,CAAC,KAAK,CAAC,CAAA;QAC5B,CAAC;aAAM,CAAC;YACN,mBAAmB,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAC/C,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Payment method and setup intent handlers for Stripe webhooks
3
+ */
4
+ import type { SupabaseClient } from '../../supabase/index.js';
5
+ import type { Database } from '../../supabase/types.js';
6
+ import type { ExtendedStripeWebhookEvent, StripeWebhookEvent } from '../types/stripe.js';
7
+ export declare const handlePaymentMethodAttached: (event: StripeWebhookEvent<"payment_method.attached">, supabase: SupabaseClient<Database>) => Promise<void>;
8
+ export declare const handlePaymentMethodDetached: (event: StripeWebhookEvent<"payment_method.detached">, supabase: SupabaseClient<Database>) => Promise<void>;
9
+ export declare const handlePaymentMethodCreated: (event: ExtendedStripeWebhookEvent<"payment_method.created">, supabase: SupabaseClient<Database>) => Promise<void>;
10
+ export declare const handlePaymentMethodUpdated: (event: StripeWebhookEvent<"payment_method.updated">, supabase: SupabaseClient<Database>) => Promise<void>;
11
+ export declare const handleSetupIntentSucceeded: (event: ExtendedStripeWebhookEvent<"setup_intent.succeeded">, _supabase: SupabaseClient<Database>) => void;
12
+ export declare const handleSetupIntentFailed: (event: ExtendedStripeWebhookEvent<"setup_intent.failed">, _supabase: SupabaseClient<Database>) => void;
13
+ //# sourceMappingURL=payment-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-handlers.d.ts","sourceRoot":"","sources":["../../../src/api/handlers/payment-handlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,KAAK,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AA2BxF,eAAO,MAAM,2BAA2B,GACtC,OAAO,kBAAkB,CAAC,yBAAyB,CAAC,EACpD,UAAU,cAAc,CAAC,QAAQ,CAAC,KACjC,OAAO,CAAC,IAAI,CAsBd,CAAA;AAED,eAAO,MAAM,2BAA2B,GACtC,OAAO,kBAAkB,CAAC,yBAAyB,CAAC,EACpD,UAAU,cAAc,CAAC,QAAQ,CAAC,KACjC,OAAO,CAAC,IAAI,CAsBd,CAAA;AAED,eAAO,MAAM,0BAA0B,GACrC,OAAO,0BAA0B,CAAC,wBAAwB,CAAC,EAC3D,UAAU,cAAc,CAAC,QAAQ,CAAC,KACjC,OAAO,CAAC,IAAI,CAsBd,CAAA;AAED,eAAO,MAAM,0BAA0B,GACrC,OAAO,kBAAkB,CAAC,wBAAwB,CAAC,EACnD,UAAU,cAAc,CAAC,QAAQ,CAAC,KACjC,OAAO,CAAC,IAAI,CAsBd,CAAA;AAED,eAAO,MAAM,0BAA0B,GACrC,OAAO,0BAA0B,CAAC,wBAAwB,CAAC,EAC3D,WAAW,cAAc,CAAC,QAAQ,CAAC,KAClC,IAgBF,CAAA;AAED,eAAO,MAAM,uBAAuB,GAClC,OAAO,0BAA0B,CAAC,qBAAqB,CAAC,EACxD,WAAW,cAAc,CAAC,QAAQ,CAAC,KAClC,IAOF,CAAA"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Payment method and setup intent handlers for Stripe webhooks
3
+ */
4
+ import { logger } from '@revealui/core/utils/logger';
5
+ import { extractCustomerId, isStripePaymentMethod } from '../types/stripe.js';
6
+ import { copyBillingDetailsToCustomer } from './customer-handlers.js';
7
+ import { handleSupabaseError } from './subscription-handlers.js';
8
+ async function lookupUserByCustomerId(supabase, customerId) {
9
+ const { data: userData } = await supabase
10
+ .from('users')
11
+ .select('id')
12
+ .eq('stripe_customer_id', customerId)
13
+ .single();
14
+ if (!userData) {
15
+ throw new Error('User not found for customer');
16
+ }
17
+ const userId = userData.id;
18
+ if (!userId) {
19
+ throw new Error('User missing id');
20
+ }
21
+ return userId;
22
+ }
23
+ export const handlePaymentMethodAttached = async (event, supabase) => {
24
+ const paymentMethod = event.data.object;
25
+ if (!isStripePaymentMethod(paymentMethod)) {
26
+ throw new Error('Invalid payment method in event');
27
+ }
28
+ const customerId = extractCustomerId(paymentMethod.customer);
29
+ if (!customerId) {
30
+ throw new Error('Payment method missing customer');
31
+ }
32
+ const userId = await lookupUserByCustomerId(supabase, customerId);
33
+ try {
34
+ await copyBillingDetailsToCustomer(userId, paymentMethod, supabase);
35
+ }
36
+ catch (error) {
37
+ if (error instanceof Error) {
38
+ handleSupabaseError(error);
39
+ }
40
+ else {
41
+ handleSupabaseError(new Error(String(error)));
42
+ }
43
+ }
44
+ };
45
+ export const handlePaymentMethodDetached = async (event, supabase) => {
46
+ const paymentMethod = event.data.object;
47
+ if (!isStripePaymentMethod(paymentMethod)) {
48
+ throw new Error('Invalid payment method in event');
49
+ }
50
+ const customerId = extractCustomerId(paymentMethod.customer);
51
+ if (!customerId) {
52
+ throw new Error('Payment method missing customer');
53
+ }
54
+ const userId = await lookupUserByCustomerId(supabase, customerId);
55
+ try {
56
+ await copyBillingDetailsToCustomer(userId, paymentMethod, supabase);
57
+ }
58
+ catch (error) {
59
+ if (error instanceof Error) {
60
+ handleSupabaseError(error);
61
+ }
62
+ else {
63
+ handleSupabaseError(new Error(String(error)));
64
+ }
65
+ }
66
+ };
67
+ export const handlePaymentMethodCreated = async (event, supabase) => {
68
+ const paymentMethod = event.data.object;
69
+ if (!isStripePaymentMethod(paymentMethod)) {
70
+ throw new Error('Invalid payment method in event');
71
+ }
72
+ const customerId = extractCustomerId(paymentMethod.customer);
73
+ if (!customerId) {
74
+ throw new Error('Payment method missing customer');
75
+ }
76
+ const userId = await lookupUserByCustomerId(supabase, customerId);
77
+ try {
78
+ await copyBillingDetailsToCustomer(userId, paymentMethod, supabase);
79
+ }
80
+ catch (error) {
81
+ if (error instanceof Error) {
82
+ handleSupabaseError(error);
83
+ }
84
+ else {
85
+ handleSupabaseError(new Error(String(error)));
86
+ }
87
+ }
88
+ };
89
+ export const handlePaymentMethodUpdated = async (event, supabase) => {
90
+ const paymentMethod = event.data.object;
91
+ if (!isStripePaymentMethod(paymentMethod)) {
92
+ throw new Error('Invalid payment method in event');
93
+ }
94
+ const customerId = extractCustomerId(paymentMethod.customer);
95
+ if (!customerId) {
96
+ throw new Error('Payment method missing customer');
97
+ }
98
+ const userId = await lookupUserByCustomerId(supabase, customerId);
99
+ try {
100
+ await copyBillingDetailsToCustomer(userId, paymentMethod, supabase);
101
+ }
102
+ catch (error) {
103
+ if (error instanceof Error) {
104
+ handleSupabaseError(error);
105
+ }
106
+ else {
107
+ handleSupabaseError(new Error(String(error)));
108
+ }
109
+ }
110
+ };
111
+ export const handleSetupIntentSucceeded = (event, _supabase) => {
112
+ void _supabase;
113
+ const setupIntent = event.data.object;
114
+ const paymentMethodId = typeof setupIntent.payment_method === 'string'
115
+ ? setupIntent.payment_method
116
+ : setupIntent.payment_method?.id;
117
+ if (!paymentMethodId) {
118
+ throw new Error('Setup intent missing payment method');
119
+ }
120
+ logger.info('Setup intent succeeded', {
121
+ setupIntentId: setupIntent.id,
122
+ paymentMethodId,
123
+ });
124
+ };
125
+ export const handleSetupIntentFailed = (event, _supabase) => {
126
+ void _supabase;
127
+ const setupIntent = event.data.object;
128
+ logger.error('Setup intent failed', {
129
+ setupIntentId: setupIntent.id,
130
+ error: setupIntent.last_setup_error,
131
+ });
132
+ };
133
+ //# sourceMappingURL=payment-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-handlers.js","sourceRoot":"","sources":["../../../src/api/handlers/payment-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Payment intent creation handler
3
+ */
4
+ import type { RevealRequest, RevealUIInstance } from '@revealui/core';
5
+ interface CreatePaymentIntentArgs {
6
+ req: RevealRequest;
7
+ res?: Response;
8
+ next?: () => void;
9
+ revealui?: RevealUIInstance;
10
+ }
11
+ export declare const createPaymentIntent: (args: CreatePaymentIntentArgs) => Promise<Response | {
12
+ status: number;
13
+ json?: {
14
+ error: string;
15
+ };
16
+ send?: {
17
+ client_secret: string | null;
18
+ };
19
+ }>;
20
+ export {};
21
+ //# sourceMappingURL=payment-intent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-intent.d.ts","sourceRoot":"","sources":["../../../src/api/handlers/payment-intent.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAmBrE,UAAU,uBAAuB;IAC/B,GAAG,EAAE,aAAa,CAAA;IAClB,GAAG,CAAC,EAAE,QAAQ,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,IAAI,CAAA;IACjB,QAAQ,CAAC,EAAE,gBAAgB,CAAA;CAC5B;AAED,eAAO,MAAM,mBAAmB,GAC9B,MAAM,uBAAuB,KAC5B,OAAO,CACN,QAAQ,GACR;IACE,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IACxB,IAAI,CAAC,EAAE;QAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CACxC,CAyGJ,CAAA"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Payment intent creation handler
3
+ */
4
+ import { protectedStripe } from '../../stripe/stripeClient.js';
5
+ export const createPaymentIntent = async (args) => {
6
+ const { req } = args;
7
+ const { user, revealui } = req;
8
+ if (!user || typeof user.email !== 'string') {
9
+ return { status: 401, json: { error: 'Unauthorized' } };
10
+ }
11
+ if (!revealui) {
12
+ return { status: 500, json: { error: 'RevealUI instance not available' } };
13
+ }
14
+ const fullUser = await revealui.findByID({
15
+ collection: 'users',
16
+ id: user.id,
17
+ });
18
+ if (!fullUser || typeof fullUser !== 'object') {
19
+ return { status: 404, json: { error: 'User not found' } };
20
+ }
21
+ const typedUser = fullUser;
22
+ try {
23
+ let stripeCustomerID = typedUser.stripeCustomerID;
24
+ if (!stripeCustomerID) {
25
+ const customerParams = {
26
+ email: user.email,
27
+ name: typeof typedUser.name === 'string' ? typedUser.name : undefined,
28
+ };
29
+ const customer = await protectedStripe.customers.create(customerParams);
30
+ stripeCustomerID = customer.id;
31
+ await revealui.update({
32
+ collection: 'users',
33
+ id: user.id,
34
+ data: {
35
+ stripeCustomerID,
36
+ },
37
+ });
38
+ }
39
+ let total = 0;
40
+ const cart = typedUser.cart;
41
+ if (!(cart && Array.isArray(cart.items)) || cart.items.length === 0) {
42
+ return { status: 400, json: { error: 'No items in cart' } };
43
+ }
44
+ await Promise.allSettled(cart.items.map(async (item) => {
45
+ const { product, quantity } = item;
46
+ if (!quantity ||
47
+ typeof product !== 'object' ||
48
+ typeof product.stripeProductID !== 'string') {
49
+ throw new Error('Invalid product or quantity');
50
+ }
51
+ const prices = await protectedStripe.prices.list({
52
+ product: product.stripeProductID,
53
+ limit: 100,
54
+ });
55
+ if (prices.data.length === 0) {
56
+ throw new Error('No prices found for product');
57
+ }
58
+ const price = prices.data[0];
59
+ if (price && price.unit_amount !== null && typeof price.unit_amount === 'number') {
60
+ total += price.unit_amount * quantity;
61
+ }
62
+ }));
63
+ if (total === 0) {
64
+ throw new Error('There is nothing to pay for, add some items to your cart and try again.');
65
+ }
66
+ const paymentIntentParams = {
67
+ customer: stripeCustomerID,
68
+ amount: total,
69
+ currency: 'usd',
70
+ payment_method_types: ['card'],
71
+ };
72
+ const paymentIntent = await protectedStripe.paymentIntents.create(paymentIntentParams);
73
+ return {
74
+ status: 200,
75
+ send: { client_secret: paymentIntent.client_secret },
76
+ };
77
+ }
78
+ catch (err) {
79
+ const message = err instanceof Error ? err.message : 'Unknown error';
80
+ const revealuiInstance = revealui;
81
+ if (revealuiInstance?.logger) {
82
+ revealuiInstance.logger.error(message);
83
+ }
84
+ return { status: 500, json: { error: message } };
85
+ }
86
+ };
87
+ //# sourceMappingURL=payment-intent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-intent.js","sourceRoot":"","sources":["../../../src/api/handlers/payment-intent.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAwB9D,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EACtC,IAA6B,EAQ7B,EAAE;IACF,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;IACpB,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAA;IAE9B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,CAAA;IACzD,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,iCAAiC,EAAE,EAAE,CAAA;IAC5E,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC;QACvC,UAAU,EAAE,OAAO;QACnB,EAAE,EAAE,IAAI,CAAC,EAAE;KACZ,CAAC,CAAA;IAEF,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC9C,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,CAAA;IAC3D,CAAC;IAED,MAAM,SAAS,GAAG,QAAwB,CAAA;IAE1C,IAAI,CAAC;QACH,IAAI,gBAAgB,GAAuB,SAAS,CAAC,gBAAgB,CAAA;QAErE,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,MAAM,cAAc,GAAgC;gBAClD,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,IAAI,EAAE,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;aACtE,CAAA;YAED,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;YACvE,gBAAgB,GAAG,QAAQ,CAAC,EAAE,CAAA;YAE9B,MAAM,QAAQ,CAAC,MAAM,CAAC;gBACpB,UAAU,EAAE,OAAO;gBACnB,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE;oBACJ,gBAAgB;iBACjB;aACF,CAAC,CAAA;QACJ,CAAC;QAED,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAA;QAE3B,IAAI,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE,CAAA;QAC7D,CAAC;QAED,MAAM,OAAO,CAAC,UAAU,CACtB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAc,EAAiB,EAAE;YACrD,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;YAElC,IACE,CAAC,QAAQ;gBACT,OAAO,OAAO,KAAK,QAAQ;gBAC3B,OAAO,OAAO,CAAC,eAAe,KAAK,QAAQ,EAC3C,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;YAChD,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC/C,OAAO,EAAE,OAAO,CAAC,eAAe;gBAChC,KAAK,EAAE,GAAG;aACX,CAAC,CAAA;YAEF,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;YAChD,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC5B,IAAI,KAAK,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI,IAAI,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;gBACjF,KAAK,IAAI,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAA;YACvC,CAAC;QACH,CAAC,CAAC,CACH,CAAA;QAED,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAA;QAC5F,CAAC;QAED,MAAM,mBAAmB,GAAqC;YAC5D,QAAQ,EAAE,gBAAgB;YAC1B,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,KAAK;YACf,oBAAoB,EAAE,CAAC,MAAM,CAAC;SAC/B,CAAA;QAED,MAAM,aAAa,GAAG,MAAM,eAAe,CAAC,cAAc,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAA;QAEtF,OAAO;YACL,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,EAAE,aAAa,EAAE,aAAa,CAAC,aAAa,EAAE;SACrD,CAAA;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAA;QACpE,MAAM,gBAAgB,GAAG,QAAQ,CAAA;QACjC,IAAI,gBAAgB,EAAE,MAAM,EAAE,CAAC;YAC7B,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACxC,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAA;IAClD,CAAC;AACH,CAAC,CAAA"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Product and price record handlers for Stripe webhooks
3
+ */
4
+ import type Stripe from 'stripe';
5
+ import type { SupabaseClient } from '../../supabase/index.js';
6
+ import type { Database } from '../../supabase/types.js';
7
+ export declare const upsertRecord: <TTable extends keyof Database["public"]["Tables"]>(supabase: SupabaseClient<Database>, table: TTable, record: Database["public"]["Tables"][TTable]["Insert"]) => Promise<void>;
8
+ export declare const upsertProductRecord: (supabase: SupabaseClient<Database>, product: Stripe.Product) => Promise<void>;
9
+ export declare const upsertPriceRecord: (supabase: SupabaseClient<Database>, price: Stripe.Price) => Promise<void>;
10
+ export declare const toDateTime: (secs: number) => Date;
11
+ //# sourceMappingURL=product-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-handlers.d.ts","sourceRoot":"","sources":["../../../src/api/handlers/product-handlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAA;AAChC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,yBAAyB,CAAA;AAErE,eAAO,MAAM,YAAY,GAAU,MAAM,SAAS,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,EAClF,UAAU,cAAc,CAAC,QAAQ,CAAC,EAClC,OAAO,MAAM,EACb,QAAQ,QAAQ,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,KACrD,OAAO,CAAC,IAAI,CAQd,CAAA;AAED,eAAO,MAAM,mBAAmB,GAC9B,UAAU,cAAc,CAAC,QAAQ,CAAC,EAClC,SAAS,MAAM,CAAC,OAAO,KACtB,OAAO,CAAC,IAAI,CAkBd,CAAA;AAED,eAAO,MAAM,iBAAiB,GAC5B,UAAU,cAAc,CAAC,QAAQ,CAAC,EAClC,OAAO,MAAM,CAAC,KAAK,KAClB,OAAO,CAAC,IAAI,CAMd,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,IAIzC,CAAA"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Product and price record handlers for Stripe webhooks
3
+ */
4
+ import { logger } from '@revealui/core/utils/logger';
5
+ export const upsertRecord = async (supabase, table, record) => {
6
+ // biome-ignore lint/suspicious/noExplicitAny: Supabase upsert type doesn't perfectly match our generated types, but is runtime-compatible
7
+ const { error } = await supabase.from(table).upsert([record]); // eslint-disable-line @typescript-eslint/no-explicit-any
8
+ if (error) {
9
+ logger.error('Error upserting record', { table: String(table), error });
10
+ throw error;
11
+ }
12
+ logger.info('Record upserted', { table: String(table), record });
13
+ };
14
+ export const upsertProductRecord = async (supabase, product) => {
15
+ const productData = {
16
+ stripe_product_i_d: product.id,
17
+ title: typeof product.name === 'string' ? product.name : product.name,
18
+ created_at: new Date(product.created * 1000).toISOString(),
19
+ updated_at: new Date(product.updated * 1000).toISOString(),
20
+ price_j_s_o_n: product.default_price
21
+ ? typeof product.default_price === 'string'
22
+ ? product.default_price
23
+ : typeof product.default_price === 'object' &&
24
+ product.default_price !== null &&
25
+ 'id' in product.default_price
26
+ ? String(product.default_price.id)
27
+ : String(product.default_price)
28
+ : null,
29
+ };
30
+ await upsertRecord(supabase, 'products', productData);
31
+ };
32
+ export const upsertPriceRecord = async (supabase, price) => {
33
+ const priceData = {
34
+ price_j_s_o_n: price.id.toString(),
35
+ };
36
+ await upsertRecord(supabase, 'prices', priceData);
37
+ };
38
+ export const toDateTime = (secs) => {
39
+ const t = new Date(1970, 0, 1);
40
+ t.setSeconds(secs);
41
+ return t;
42
+ };
43
+ //# sourceMappingURL=product-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-handlers.js","sourceRoot":"","sources":["../../../src/api/handlers/product-handlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAA;AAKpD,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,QAAkC,EAClC,KAAa,EACb,MAAsD,EACvC,EAAE;IACjB,0IAA0I;IAC1I,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAQ,CAAC,CAAA,CAAC,yDAAyD;IAC9H,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;QACvE,MAAM,KAAK,CAAA;IACb,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;AAClE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EACtC,QAAkC,EAClC,OAAuB,EACR,EAAE;IACjB,MAAM,WAAW,GAA6B;QAC5C,kBAAkB,EAAE,OAAO,CAAC,EAAE;QAC9B,KAAK,EAAE,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,OAAO,CAAC,IAAe;QACjF,UAAU,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;QAC1D,UAAU,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;QAC1D,aAAa,EAAE,OAAO,CAAC,aAAa;YAClC,CAAC,CAAC,OAAO,OAAO,CAAC,aAAa,KAAK,QAAQ;gBACzC,CAAC,CAAC,OAAO,CAAC,aAAa;gBACvB,CAAC,CAAC,OAAO,OAAO,CAAC,aAAa,KAAK,QAAQ;oBACvC,OAAO,CAAC,aAAa,KAAK,IAAI;oBAC9B,IAAI,IAAI,OAAO,CAAC,aAAa;oBAC/B,CAAC,CAAC,MAAM,CAAE,OAAO,CAAC,aAAgC,CAAC,EAAE,CAAC;oBACtD,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC;YACnC,CAAC,CAAC,IAAI;KACT,CAAA;IAED,MAAM,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAA;AACvD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,QAAkC,EAClC,KAAmB,EACJ,EAAE;IACjB,MAAM,SAAS,GAA2B;QACxC,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE;KACnC,CAAA;IAED,MAAM,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAA;AACnD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAQ,EAAE;IAC/C,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC9B,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IAClB,OAAO,CAAC,CAAA;AACV,CAAC,CAAA"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Subscription event handlers for Stripe webhooks
3
+ */
4
+ import type { SupabaseClient } from '../../supabase/index.js';
5
+ import type { Database } from '../../supabase/types.js';
6
+ import type { StripeWebhookEvent } from '../types/stripe.js';
7
+ export declare const manageSubscriptionStatusChange: (subscriptionId: string, customerId: string | number, createAction: boolean | undefined, supabase: SupabaseClient<Database>) => Promise<void>;
8
+ export declare const handleCheckoutSessionCompleted: (event: StripeWebhookEvent<"checkout.session.completed">, supabase: SupabaseClient<Database>) => Promise<void>;
9
+ export declare const handleCustomerSubscriptionDeleted: (event: StripeWebhookEvent<"customer.subscription.deleted">, supabase: SupabaseClient<Database>) => Promise<void>;
10
+ export declare const handleCustomerSubscriptionCreated: (event: StripeWebhookEvent<"customer.subscription.created">, supabase: SupabaseClient<Database>) => Promise<void>;
11
+ export declare const handleCustomerSubscriptionUpdated: (event: StripeWebhookEvent<"customer.subscription.updated">, supabase: SupabaseClient<Database>) => Promise<void>;
12
+ export declare const handleSupabaseError: (error: Error) => void;
13
+ //# sourceMappingURL=subscription-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription-handlers.d.ts","sourceRoot":"","sources":["../../../src/api/handlers/subscription-handlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAG5D,eAAO,MAAM,8BAA8B,GACzC,gBAAgB,MAAM,EACtB,YAAY,MAAM,GAAG,MAAM,EAC3B,iCAAoB,EACpB,UAAU,cAAc,CAAC,QAAQ,CAAC,KACjC,OAAO,CAAC,IAAI,CAkCd,CAAA;AAED,eAAO,MAAM,8BAA8B,GACzC,OAAO,kBAAkB,CAAC,4BAA4B,CAAC,EACvD,UAAU,cAAc,CAAC,QAAQ,CAAC,KACjC,OAAO,CAAC,IAAI,CAqBd,CAAA;AAED,eAAO,MAAM,iCAAiC,GAC5C,OAAO,kBAAkB,CAAC,+BAA+B,CAAC,EAC1D,UAAU,cAAc,CAAC,QAAQ,CAAC,KACjC,OAAO,CAAC,IAAI,CAiBd,CAAA;AAED,eAAO,MAAM,iCAAiC,GAC5C,OAAO,kBAAkB,CAAC,+BAA+B,CAAC,EAC1D,UAAU,cAAc,CAAC,QAAQ,CAAC,KACjC,OAAO,CAAC,IAAI,CAiBd,CAAA;AAED,eAAO,MAAM,iCAAiC,GAC5C,OAAO,kBAAkB,CAAC,+BAA+B,CAAC,EAC1D,UAAU,cAAc,CAAC,QAAQ,CAAC,KACjC,OAAO,CAAC,IAAI,CAiBd,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,OAAO,KAAK,KAAG,IAElD,CAAA"}