@revealui/services 0.0.3 → 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.
- package/LICENSE +22 -0
- package/LICENSE.commercial +112 -0
- package/README.md +177 -0
- package/dist/api/create-checkout-session/index.d.ts +2 -0
- package/dist/api/create-checkout-session/index.d.ts.map +1 -0
- package/dist/api/create-checkout-session/index.js +61 -0
- package/dist/api/create-checkout-session/index.js.map +1 -0
- package/dist/api/create-portal-link/index.d.ts +2 -0
- package/dist/api/create-portal-link/index.d.ts.map +1 -0
- package/dist/api/create-portal-link/index.js +37 -0
- package/dist/api/create-portal-link/index.js.map +1 -0
- package/dist/api/handlers/customer-handlers.d.ts +27 -0
- package/dist/api/handlers/customer-handlers.d.ts.map +1 -0
- package/dist/api/handlers/customer-handlers.js +86 -0
- package/dist/api/handlers/customer-handlers.js.map +1 -0
- package/dist/api/handlers/index.d.ts +18 -0
- package/dist/api/handlers/index.d.ts.map +1 -0
- package/dist/api/handlers/index.js +18 -0
- package/dist/api/handlers/index.js.map +1 -0
- package/dist/api/handlers/invoice-handlers.d.ts +9 -0
- package/dist/api/handlers/invoice-handlers.d.ts.map +1 -0
- package/dist/api/handlers/invoice-handlers.js +52 -0
- package/dist/api/handlers/invoice-handlers.js.map +1 -0
- package/dist/api/handlers/payment-handlers.d.ts +13 -0
- package/dist/api/handlers/payment-handlers.d.ts.map +1 -0
- package/dist/api/handlers/payment-handlers.js +133 -0
- package/dist/api/handlers/payment-handlers.js.map +1 -0
- package/dist/api/handlers/payment-intent.d.ts +21 -0
- package/dist/api/handlers/payment-intent.d.ts.map +1 -0
- package/dist/api/handlers/payment-intent.js +87 -0
- package/dist/api/handlers/payment-intent.js.map +1 -0
- package/dist/api/handlers/product-handlers.d.ts +11 -0
- package/dist/api/handlers/product-handlers.d.ts.map +1 -0
- package/dist/api/handlers/product-handlers.js +43 -0
- package/dist/api/handlers/product-handlers.js.map +1 -0
- package/dist/api/handlers/subscription-handlers.d.ts +13 -0
- package/dist/api/handlers/subscription-handlers.d.ts.map +1 -0
- package/dist/api/handlers/subscription-handlers.js +115 -0
- package/dist/api/handlers/subscription-handlers.js.map +1 -0
- package/dist/api/index.d.ts +8 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +8 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/types/stripe.d.ts +42 -0
- package/dist/api/types/stripe.d.ts.map +1 -0
- package/dist/api/types/stripe.js +72 -0
- package/dist/api/types/stripe.js.map +1 -0
- package/dist/api/update-price/index.d.ts +42 -0
- package/dist/api/update-price/index.d.ts.map +1 -0
- package/dist/api/update-price/index.js +78 -0
- package/dist/api/update-price/index.js.map +1 -0
- package/dist/api/update-product/index.d.ts +44 -0
- package/dist/api/update-product/index.d.ts.map +1 -0
- package/dist/api/update-product/index.js +85 -0
- package/dist/api/update-product/index.js.map +1 -0
- package/dist/api/utils.d.ts +34 -0
- package/dist/api/utils.d.ts.map +1 -0
- package/dist/api/utils.js +66 -0
- package/dist/api/utils.js.map +1 -0
- package/dist/api/webhooks/index.d.ts +2 -0
- package/dist/api/webhooks/index.d.ts.map +1 -0
- package/dist/api/webhooks/index.js +270 -0
- package/dist/api/webhooks/index.js.map +1 -0
- package/dist/client/index.d.ts +11 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +12 -0
- package/dist/client/index.js.map +1 -0
- package/dist/index.d.ts +32 -24
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -41
- package/dist/index.js.map +1 -0
- package/dist/stripe/db-circuit-breaker.d.ts +47 -0
- package/dist/stripe/db-circuit-breaker.d.ts.map +1 -0
- package/dist/stripe/db-circuit-breaker.js +223 -0
- package/dist/stripe/db-circuit-breaker.js.map +1 -0
- package/dist/stripe/index.d.ts +2 -0
- package/dist/stripe/index.d.ts.map +1 -0
- package/dist/stripe/index.js +2 -0
- package/dist/stripe/index.js.map +1 -0
- package/dist/stripe/stripeClient.d.ts +126 -0
- package/dist/stripe/stripeClient.d.ts.map +1 -0
- package/dist/stripe/stripeClient.js +226 -0
- package/dist/stripe/stripeClient.js.map +1 -0
- package/dist/supabase/index.d.ts +6 -0
- package/dist/supabase/index.d.ts.map +1 -0
- package/dist/supabase/index.js +5 -0
- package/dist/supabase/index.js.map +1 -0
- package/dist/supabase/resilience.d.ts +50 -0
- package/dist/supabase/resilience.d.ts.map +1 -0
- package/dist/supabase/resilience.js +166 -0
- package/dist/supabase/resilience.js.map +1 -0
- package/dist/supabase/types.d.ts +206 -0
- package/dist/supabase/types.d.ts.map +1 -0
- package/dist/supabase/types.js +19 -0
- package/dist/supabase/types.js.map +1 -0
- package/dist/supabase/utils/client.d.ts +4 -0
- package/dist/supabase/utils/client.d.ts.map +1 -0
- package/dist/supabase/utils/client.js +12 -0
- package/dist/supabase/utils/client.js.map +1 -0
- package/dist/supabase/utils/server.d.ts +10 -0
- package/dist/supabase/utils/server.d.ts.map +1 -0
- package/dist/supabase/utils/server.js +49 -0
- package/dist/supabase/utils/server.js.map +1 -0
- package/dist/supabase/utils/web.d.ts +4 -0
- package/dist/supabase/utils/web.d.ts.map +1 -0
- package/dist/supabase/utils/web.js +37 -0
- package/dist/supabase/utils/web.js.map +1 -0
- package/package.json +73 -16
|
@@ -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":"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"}
|
|
@@ -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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subscription event 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 manageSubscriptionStatusChange = async (subscriptionId, customerId, createAction = false, supabase) => {
|
|
8
|
+
const { data: customerData, error: noCustomerError } = await supabase
|
|
9
|
+
.from('users')
|
|
10
|
+
.select('id')
|
|
11
|
+
.eq('stripe_customer_id', String(customerId))
|
|
12
|
+
.single();
|
|
13
|
+
if (noCustomerError)
|
|
14
|
+
throw noCustomerError;
|
|
15
|
+
const { id: uuid } = customerData;
|
|
16
|
+
const subscription = await protectedStripe.subscriptions.retrieve(subscriptionId);
|
|
17
|
+
const typedSubscription = subscription;
|
|
18
|
+
const subscriptionData = {
|
|
19
|
+
id: typedSubscription.id,
|
|
20
|
+
user_id: uuid,
|
|
21
|
+
metadata: typedSubscription.metadata,
|
|
22
|
+
status: typedSubscription.status,
|
|
23
|
+
price_id: typedSubscription.items.data[0]?.price?.id || null,
|
|
24
|
+
stripe_subscription_id: typedSubscription.id,
|
|
25
|
+
};
|
|
26
|
+
const { error } = await supabase.from('subscriptions').upsert([subscriptionData]);
|
|
27
|
+
if (error)
|
|
28
|
+
throw error;
|
|
29
|
+
logger.info('Inserted/updated subscription', {
|
|
30
|
+
subscriptionId: typedSubscription.id,
|
|
31
|
+
userId: uuid,
|
|
32
|
+
});
|
|
33
|
+
if (createAction && typedSubscription.default_payment_method && uuid) {
|
|
34
|
+
// Payment method update logic would go here
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
export const handleCheckoutSessionCompleted = async (event, supabase) => {
|
|
38
|
+
const checkoutSession = event.data.object;
|
|
39
|
+
const subscriptionId = typeof checkoutSession.subscription === 'string'
|
|
40
|
+
? checkoutSession.subscription
|
|
41
|
+
: checkoutSession.subscription?.id;
|
|
42
|
+
const customerId = extractCustomerId(checkoutSession.customer);
|
|
43
|
+
if (!(subscriptionId && customerId)) {
|
|
44
|
+
throw new Error('Checkout session missing subscription or customer');
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
await manageSubscriptionStatusChange(subscriptionId, customerId, true, supabase);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
if (error instanceof Error) {
|
|
51
|
+
handleSupabaseError(error);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
handleSupabaseError(new Error(String(error)));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
export const handleCustomerSubscriptionDeleted = async (event, supabase) => {
|
|
59
|
+
const subscription = event.data.object;
|
|
60
|
+
const customerId = extractCustomerId(subscription.customer);
|
|
61
|
+
if (!customerId) {
|
|
62
|
+
throw new Error('Subscription missing customer');
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
await manageSubscriptionStatusChange(subscription.id, customerId, false, supabase);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
if (error instanceof Error) {
|
|
69
|
+
handleSupabaseError(error);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
handleSupabaseError(new Error(String(error)));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
export const handleCustomerSubscriptionCreated = async (event, supabase) => {
|
|
77
|
+
const subscription = event.data.object;
|
|
78
|
+
const customerId = extractCustomerId(subscription.customer);
|
|
79
|
+
if (!customerId) {
|
|
80
|
+
throw new Error('Subscription missing customer');
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
await manageSubscriptionStatusChange(subscription.id, customerId, true, supabase);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
if (error instanceof Error) {
|
|
87
|
+
handleSupabaseError(error);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
handleSupabaseError(new Error(String(error)));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
export const handleCustomerSubscriptionUpdated = async (event, supabase) => {
|
|
95
|
+
const subscription = event.data.object;
|
|
96
|
+
const customerId = extractCustomerId(subscription.customer);
|
|
97
|
+
if (!customerId) {
|
|
98
|
+
throw new Error('Subscription missing customer');
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
await manageSubscriptionStatusChange(subscription.id, customerId, false, supabase);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
if (error instanceof Error) {
|
|
105
|
+
handleSupabaseError(error);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
handleSupabaseError(new Error(String(error)));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
export const handleSupabaseError = (error) => {
|
|
113
|
+
logger.error('Supabase error', { error });
|
|
114
|
+
};
|
|
115
|
+
//# sourceMappingURL=subscription-handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscription-handlers.js","sourceRoot":"","sources":["../../../src/api/handlers/subscription-handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { POST as createCheckoutSession } from './create-checkout-session/index.js';
|
|
2
|
+
import { POST as createPortalLink } from './create-portal-link/index.js';
|
|
3
|
+
import { POST as updatePrice } from './update-price/index.js';
|
|
4
|
+
import { POST as updateProduct } from './update-product/index.js';
|
|
5
|
+
import { createPaymentIntent } from './utils.js';
|
|
6
|
+
import { POST as webhooks } from './webhooks/index.js';
|
|
7
|
+
export { createCheckoutSession, createPortalLink, updatePrice, updateProduct, webhooks, createPaymentIntent, };
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,qBAAqB,EAAE,MAAM,oCAAoC,CAAA;AAClF,OAAO,EAAE,IAAI,IAAI,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AACxE,OAAO,EAAE,IAAI,IAAI,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,EAAE,IAAI,IAAI,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAEtD,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,QAAQ,EACR,mBAAmB,GACpB,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { POST as createCheckoutSession } from './create-checkout-session/index.js';
|
|
2
|
+
import { POST as createPortalLink } from './create-portal-link/index.js';
|
|
3
|
+
import { POST as updatePrice } from './update-price/index.js';
|
|
4
|
+
import { POST as updateProduct } from './update-product/index.js';
|
|
5
|
+
import { createPaymentIntent } from './utils.js';
|
|
6
|
+
import { POST as webhooks } from './webhooks/index.js';
|
|
7
|
+
export { createCheckoutSession, createPortalLink, updatePrice, updateProduct, webhooks, createPaymentIntent, };
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,qBAAqB,EAAE,MAAM,oCAAoC,CAAA;AAClF,OAAO,EAAE,IAAI,IAAI,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AACxE,OAAO,EAAE,IAAI,IAAI,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,EAAE,IAAI,IAAI,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAEtD,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,QAAQ,EACR,mBAAmB,GACpB,CAAA"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { Stripe } from 'stripe';
|
|
2
|
+
/**
|
|
3
|
+
* Typed Stripe webhook event helper
|
|
4
|
+
* Ensures type safety when accessing event.data.object
|
|
5
|
+
*/
|
|
6
|
+
export type StripeWebhookEvent<T extends Stripe.Event.Type> = Stripe.Event & {
|
|
7
|
+
type: T;
|
|
8
|
+
data: {
|
|
9
|
+
object: T extends keyof Stripe.Event.Data.Object ? Stripe.Event.Data.Object[T] : unknown;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Extended webhook event type for events not in standard Stripe.Event.Type
|
|
14
|
+
* Used for payment_method and setup_intent events
|
|
15
|
+
*/
|
|
16
|
+
export type ExtendedStripeWebhookEvent<T extends string> = Omit<Stripe.Event, 'type' | 'data'> & {
|
|
17
|
+
type: T;
|
|
18
|
+
data: {
|
|
19
|
+
object: unknown;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Type guard to check if an object is a Stripe Customer
|
|
24
|
+
*/
|
|
25
|
+
export declare function isStripeCustomer(obj: unknown): obj is Stripe.Customer;
|
|
26
|
+
/**
|
|
27
|
+
* Type guard to check if an object is a Stripe PaymentMethod
|
|
28
|
+
*/
|
|
29
|
+
export declare function isStripePaymentMethod(obj: unknown): obj is Stripe.PaymentMethod;
|
|
30
|
+
/**
|
|
31
|
+
* Type guard to check if an object is a Stripe Subscription
|
|
32
|
+
*/
|
|
33
|
+
export declare function isStripeSubscription(obj: unknown): obj is Stripe.Subscription;
|
|
34
|
+
/**
|
|
35
|
+
* Type guard to check if an object is a Stripe CheckoutSession
|
|
36
|
+
*/
|
|
37
|
+
export declare function isStripeCheckoutSession(obj: unknown): obj is Stripe.Checkout.Session;
|
|
38
|
+
/**
|
|
39
|
+
* Helper to safely extract customer ID from various Stripe objects
|
|
40
|
+
*/
|
|
41
|
+
export declare function extractCustomerId(obj: Stripe.Customer | Stripe.DeletedCustomer | Stripe.PaymentMethod | Stripe.Subscription | Stripe.Checkout.Session | string | null | undefined): string | null;
|
|
42
|
+
//# sourceMappingURL=stripe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stripe.d.ts","sourceRoot":"","sources":["../../../src/api/types/stripe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEpC;;;GAGG;AACH,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,GAAG;IAC3E,IAAI,EAAE,CAAC,CAAA;IACP,IAAI,EAAE;QACJ,MAAM,EAAE,CAAC,SAAS,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAA;KACzF,CAAA;CACF,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,0BAA0B,CAAC,CAAC,SAAS,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG;IAC/F,IAAI,EAAE,CAAC,CAAA;IACP,IAAI,EAAE;QACJ,MAAM,EAAE,OAAO,CAAA;KAChB,CAAA;CACF,CAAA;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,CAAC,QAAQ,CAQrE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,CAAC,aAAa,CAQ/E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,CAAC,YAAY,CAQ7E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAQpF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EACC,MAAM,CAAC,QAAQ,GACf,MAAM,CAAC,eAAe,GACtB,MAAM,CAAC,aAAa,GACpB,MAAM,CAAC,YAAY,GACnB,MAAM,CAAC,QAAQ,CAAC,OAAO,GACvB,MAAM,GACN,IAAI,GACJ,SAAS,GACZ,MAAM,GAAG,IAAI,CA2Bf"}
|