@chaicodes-com/stripe-helpers 1.0.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 (46) hide show
  1. package/README.md +162 -0
  2. package/dist/checkout/createCheckoutSession.d.ts +26 -0
  3. package/dist/checkout/createCheckoutSession.d.ts.map +1 -0
  4. package/dist/checkout/createCheckoutSession.js +55 -0
  5. package/dist/checkout/createCheckoutSession.js.map +1 -0
  6. package/dist/checkout/handlePriceSwitching.d.ts +20 -0
  7. package/dist/checkout/handlePriceSwitching.d.ts.map +1 -0
  8. package/dist/checkout/handlePriceSwitching.js +59 -0
  9. package/dist/checkout/handlePriceSwitching.js.map +1 -0
  10. package/dist/config/defaultConfig.d.ts +45 -0
  11. package/dist/config/defaultConfig.d.ts.map +1 -0
  12. package/dist/config/defaultConfig.js +71 -0
  13. package/dist/config/defaultConfig.js.map +1 -0
  14. package/dist/database/databaseUtilities.d.ts +45 -0
  15. package/dist/database/databaseUtilities.d.ts.map +1 -0
  16. package/dist/database/databaseUtilities.js +224 -0
  17. package/dist/database/databaseUtilities.js.map +1 -0
  18. package/dist/email/emailTemplates.d.ts +18 -0
  19. package/dist/email/emailTemplates.d.ts.map +1 -0
  20. package/dist/email/emailTemplates.js +130 -0
  21. package/dist/email/emailTemplates.js.map +1 -0
  22. package/dist/email/sendAccessCodeEmail.d.ts +30 -0
  23. package/dist/email/sendAccessCodeEmail.d.ts.map +1 -0
  24. package/dist/email/sendAccessCodeEmail.js +61 -0
  25. package/dist/email/sendAccessCodeEmail.js.map +1 -0
  26. package/dist/index.d.ts +15 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +50 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/utils/utilityFunctions.d.ts +20 -0
  31. package/dist/utils/utilityFunctions.d.ts.map +1 -0
  32. package/dist/utils/utilityFunctions.js +68 -0
  33. package/dist/utils/utilityFunctions.js.map +1 -0
  34. package/dist/webhooks/handleCheckoutCompleted.d.ts +26 -0
  35. package/dist/webhooks/handleCheckoutCompleted.d.ts.map +1 -0
  36. package/dist/webhooks/handleCheckoutCompleted.js +75 -0
  37. package/dist/webhooks/handleCheckoutCompleted.js.map +1 -0
  38. package/dist/webhooks/handleStripeWebhook.d.ts +21 -0
  39. package/dist/webhooks/handleStripeWebhook.d.ts.map +1 -0
  40. package/dist/webhooks/handleStripeWebhook.js +68 -0
  41. package/dist/webhooks/handleStripeWebhook.js.map +1 -0
  42. package/dist/webhooks/subscriptionHandlers.d.ts +25 -0
  43. package/dist/webhooks/subscriptionHandlers.d.ts.map +1 -0
  44. package/dist/webhooks/subscriptionHandlers.js +72 -0
  45. package/dist/webhooks/subscriptionHandlers.js.map +1 -0
  46. package/package.json +35 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utilityFunctions.js","sourceRoot":"","sources":["../../src/utils/utilityFunctions.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAEH,gDAcC;AAED,kDAaC;AAED,4CAWC;AAED,kCAEC;AAED,sCAGC;AAED,gDAGC;AAxDD,SAAgB,kBAAkB,CAAC,KAAa,EAAE,SAAiB,KAAK;IACtE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,4BAA4B;IAC5B,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAE3D,yBAAyB;IACzB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAE5E,6BAA6B;IAC7B,OAAO,GAAG,MAAM,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;AAC/C,CAAC;AAED,SAAgB,mBAAmB,CAAC,gBAAwB,QAAQ;IAClE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,IAAI,SAAe,CAAC;IAEpB,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IACjE,CAAC;SAAM,IAAI,aAAa,KAAK,QAAQ,EAAE,CAAC;QACtC,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAClE,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,SAAS,CAAC,WAAW,EAAE,CAAC;AACjC,CAAC;AAED,SAAgB,gBAAgB,CAAC,SAAwB;IACvD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAE3D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC/B,CAAC;AAED,SAAgB,WAAW,CAAC,KAAa;IACvC,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,SAAgB,aAAa,CAAC,KAAa;IACzC,MAAM,UAAU,GAAG,4BAA4B,CAAC;IAChD,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,SAAgB,kBAAkB,CAAC,IAAY;IAC7C,uDAAuD;IACvD,OAAO,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnD,CAAC;AAED,kBAAe;IACb,kBAAkB;IAClB,mBAAmB;IACnB,gBAAgB;IAChB,WAAW;IACX,aAAa;IACb,kBAAkB;CACnB,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * handleCheckoutCompleted.ts
3
+ * Handles checkout.session.completed webhook event
4
+ */
5
+ interface CheckoutConfig {
6
+ accessCodePrefix?: string;
7
+ appName?: string;
8
+ emailTemplate?: string | null;
9
+ smtpConfig?: any;
10
+ [key: string]: any;
11
+ }
12
+ interface CheckoutCompletedParams {
13
+ event: any;
14
+ supabaseClient: any;
15
+ config?: CheckoutConfig;
16
+ }
17
+ interface CheckoutCompletedResponse {
18
+ success: boolean;
19
+ statusCode: number;
20
+ accessCode?: string;
21
+ email?: string;
22
+ error?: string;
23
+ }
24
+ export declare function handleCheckoutCompleted({ event, supabaseClient, config, }: CheckoutCompletedParams): Promise<CheckoutCompletedResponse>;
25
+ export default handleCheckoutCompleted;
26
+ //# sourceMappingURL=handleCheckoutCompleted.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handleCheckoutCompleted.d.ts","sourceRoot":"","sources":["../../src/webhooks/handleCheckoutCompleted.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,UAAU,cAAc;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,UAAU,uBAAuB;IAC/B,KAAK,EAAE,GAAG,CAAC;IACX,cAAc,EAAE,GAAG,CAAC;IACpB,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAED,UAAU,yBAAyB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,uBAAuB,CAAC,EAC5C,KAAK,EACL,cAAc,EACd,MAAW,GACZ,EAAE,uBAAuB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CA8D9D;AAYD,eAAe,uBAAuB,CAAC"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ /**
3
+ * handleCheckoutCompleted.ts
4
+ * Handles checkout.session.completed webhook event
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.handleCheckoutCompleted = handleCheckoutCompleted;
8
+ const databaseUtilities_js_1 = require("../database/databaseUtilities.js");
9
+ const sendAccessCodeEmail_js_1 = require("../email/sendAccessCodeEmail.js");
10
+ async function handleCheckoutCompleted({ event, supabaseClient, config = {}, }) {
11
+ const session = event.data.object;
12
+ if (!session.customer_email) {
13
+ console.error('No customer email found in session');
14
+ return { success: false, statusCode: 400 };
15
+ }
16
+ try {
17
+ const email = session.customer_email;
18
+ const subscriptionId = session.subscription;
19
+ // Generate access code
20
+ const codePrefix = config.accessCodePrefix || 'SUB';
21
+ const accessCode = `${codePrefix}-${Date.now()}-${Math.random().toString(36).substring(2, 8).toUpperCase()}`;
22
+ // Create access code in database
23
+ const codeData = {
24
+ code: accessCode,
25
+ email: email,
26
+ max_uses: 999999, // Unlimited for subscriptions
27
+ current_uses: 0,
28
+ is_active: true,
29
+ is_subscription: true,
30
+ subscription_id: subscriptionId,
31
+ expires_at: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toISOString(),
32
+ };
33
+ const accessCodeResult = await (0, databaseUtilities_js_1.createAccessCode)(supabaseClient, codeData);
34
+ if (!accessCodeResult.success) {
35
+ throw new Error('Failed to create access code');
36
+ }
37
+ // Send welcome email
38
+ const emailTemplate = config.emailTemplate || getDefaultEmailTemplate(config);
39
+ await (0, sendAccessCodeEmail_js_1.sendAccessCodeEmail)({
40
+ email: email,
41
+ accessCode: accessCode,
42
+ appName: config.appName || 'ChAICodes App',
43
+ emailTemplate: emailTemplate,
44
+ smtpConfig: config.smtpConfig,
45
+ expiresAt: codeData.expires_at,
46
+ });
47
+ console.log(`Access code created for ${email}: ${accessCode}`);
48
+ return {
49
+ success: true,
50
+ statusCode: 200,
51
+ accessCode: accessCode,
52
+ email: email,
53
+ };
54
+ }
55
+ catch (error) {
56
+ const message = error instanceof Error ? error.message : String(error);
57
+ console.error('Error handling checkout completion:', error);
58
+ return {
59
+ success: false,
60
+ error: message,
61
+ statusCode: 500,
62
+ };
63
+ }
64
+ }
65
+ function getDefaultEmailTemplate(config) {
66
+ return `
67
+ <h2>Welcome to ${config.appName || 'ChAICodes'}!</h2>
68
+ <p>Thank you for your subscription. Your access code is:</p>
69
+ <p><strong>${'{accessCode}'}</strong></p>
70
+ <p>Use this code to log in to your account.</p>
71
+ <p>Questions? Contact support@chaicodes.com</p>
72
+ `;
73
+ }
74
+ exports.default = handleCheckoutCompleted;
75
+ //# sourceMappingURL=handleCheckoutCompleted.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handleCheckoutCompleted.js","sourceRoot":"","sources":["../../src/webhooks/handleCheckoutCompleted.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * handleStripeWebhook.ts
3
+ * Main webhook handler that routes to appropriate handlers
4
+ */
5
+ interface WebhookParams {
6
+ body: string;
7
+ signature: string;
8
+ stripeSecretKey: string;
9
+ supabaseClient: any;
10
+ config?: Record<string, any>;
11
+ }
12
+ interface WebhookResponse {
13
+ success: boolean;
14
+ error?: string;
15
+ statusCode: number;
16
+ subscription?: string;
17
+ message?: string;
18
+ }
19
+ export declare function handleStripeWebhook({ body, signature, stripeSecretKey, supabaseClient, config, }: WebhookParams): Promise<WebhookResponse>;
20
+ export default handleStripeWebhook;
21
+ //# sourceMappingURL=handleStripeWebhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handleStripeWebhook.d.ts","sourceRoot":"","sources":["../../src/webhooks/handleStripeWebhook.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,GAAG,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,mBAAmB,CAAC,EACxC,IAAI,EACJ,SAAS,EACT,eAAe,EACf,cAAc,EACd,MAAW,GACZ,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CA8D1C;AAED,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ /**
3
+ * handleStripeWebhook.ts
4
+ * Main webhook handler that routes to appropriate handlers
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.handleStripeWebhook = handleStripeWebhook;
8
+ const handleCheckoutCompleted_js_1 = require("./handleCheckoutCompleted.js");
9
+ const subscriptionHandlers_js_1 = require("./subscriptionHandlers.js");
10
+ async function handleStripeWebhook({ body, signature, stripeSecretKey, supabaseClient, config = {}, }) {
11
+ const stripe = require('stripe')(stripeSecretKey);
12
+ let event;
13
+ try {
14
+ event = stripe.webhooks.constructEvent(body, signature, process.env.STRIPE_WEBHOOK_SECRET);
15
+ }
16
+ catch (err) {
17
+ const message = err instanceof Error ? err.message : String(err);
18
+ console.error('Webhook signature verification failed:', message);
19
+ return {
20
+ success: false,
21
+ error: 'Invalid signature',
22
+ statusCode: 400,
23
+ };
24
+ }
25
+ try {
26
+ // Route to appropriate handler based on event type
27
+ switch (event.type) {
28
+ case 'checkout.session.completed':
29
+ return await (0, handleCheckoutCompleted_js_1.handleCheckoutCompleted)({
30
+ event,
31
+ supabaseClient,
32
+ config,
33
+ });
34
+ case 'customer.subscription.updated':
35
+ return await (0, subscriptionHandlers_js_1.handleSubscriptionUpdated)({
36
+ event,
37
+ supabaseClient,
38
+ config,
39
+ });
40
+ case 'customer.subscription.deleted':
41
+ return await (0, subscriptionHandlers_js_1.handleSubscriptionDeleted)({
42
+ event,
43
+ supabaseClient,
44
+ config,
45
+ });
46
+ case 'payment_intent.succeeded':
47
+ console.log('Payment succeeded:', event.data.object.id);
48
+ return { success: true, statusCode: 200 };
49
+ case 'payment_intent.payment_failed':
50
+ console.error('Payment failed:', event.data.object.id);
51
+ return { success: true, statusCode: 200 };
52
+ default:
53
+ console.log('Unhandled event type:', event.type);
54
+ return { success: true, statusCode: 200 };
55
+ }
56
+ }
57
+ catch (error) {
58
+ const message = error instanceof Error ? error.message : String(error);
59
+ console.error('Error handling webhook:', error);
60
+ return {
61
+ success: false,
62
+ error: message,
63
+ statusCode: 500,
64
+ };
65
+ }
66
+ }
67
+ exports.default = handleStripeWebhook;
68
+ //# sourceMappingURL=handleStripeWebhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handleStripeWebhook.js","sourceRoot":"","sources":["../../src/webhooks/handleStripeWebhook.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAqBH,kDAoEC;AAvFD,6EAAuE;AACvE,uEAAiG;AAkB1F,KAAK,UAAU,mBAAmB,CAAC,EACxC,IAAI,EACJ,SAAS,EACT,eAAe,EACf,cAAc,EACd,MAAM,GAAG,EAAE,GACG;IACd,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,CAAC;IAElD,IAAI,KAAU,CAAC;IAEf,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAC7F,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,OAAO,CAAC,CAAC;QACjE,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,mBAAmB;YAC1B,UAAU,EAAE,GAAG;SAChB,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,mDAAmD;QACnD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,4BAA4B;gBAC/B,OAAO,MAAM,IAAA,oDAAuB,EAAC;oBACnC,KAAK;oBACL,cAAc;oBACd,MAAM;iBACP,CAAC,CAAC;YAEL,KAAK,+BAA+B;gBAClC,OAAO,MAAM,IAAA,mDAAyB,EAAC;oBACrC,KAAK;oBACL,cAAc;oBACd,MAAM;iBACP,CAAC,CAAC;YAEL,KAAK,+BAA+B;gBAClC,OAAO,MAAM,IAAA,mDAAyB,EAAC;oBACrC,KAAK;oBACL,cAAc;oBACd,MAAM;iBACP,CAAC,CAAC;YAEL,KAAK,0BAA0B;gBAC7B,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;YAE5C,KAAK,+BAA+B;gBAClC,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACvD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;YAE5C;gBACE,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;QAC9C,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,OAAO;YACd,UAAU,EAAE,GAAG;SAChB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,kBAAe,mBAAmB,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * subscriptionHandlers.ts
3
+ * Handles subscription.updated and subscription.deleted webhook events
4
+ */
5
+ interface SubscriptionHandlerParams {
6
+ event: any;
7
+ supabaseClient: any;
8
+ config?: Record<string, any>;
9
+ }
10
+ interface SubscriptionHandlerResponse {
11
+ success: boolean;
12
+ statusCode: number;
13
+ subscription?: string;
14
+ status?: string;
15
+ error?: string;
16
+ message?: string;
17
+ }
18
+ export declare function handleSubscriptionUpdated({ event, supabaseClient, }: SubscriptionHandlerParams): Promise<SubscriptionHandlerResponse>;
19
+ export declare function handleSubscriptionDeleted({ event, supabaseClient, }: SubscriptionHandlerParams): Promise<SubscriptionHandlerResponse>;
20
+ declare const _default: {
21
+ handleSubscriptionUpdated: typeof handleSubscriptionUpdated;
22
+ handleSubscriptionDeleted: typeof handleSubscriptionDeleted;
23
+ };
24
+ export default _default;
25
+ //# sourceMappingURL=subscriptionHandlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscriptionHandlers.d.ts","sourceRoot":"","sources":["../../src/webhooks/subscriptionHandlers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,UAAU,yBAAyB;IACjC,KAAK,EAAE,GAAG,CAAC;IACX,cAAc,EAAE,GAAG,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED,UAAU,2BAA2B;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,yBAAyB,CAAC,EAC9C,KAAK,EACL,cAAc,GACf,EAAE,yBAAyB,GAAG,OAAO,CAAC,2BAA2B,CAAC,CA+BlE;AAED,wBAAsB,yBAAyB,CAAC,EAC9C,KAAK,EACL,cAAc,GACf,EAAE,yBAAyB,GAAG,OAAO,CAAC,2BAA2B,CAAC,CA2BlE;;;;;AAED,wBAGE"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ /**
3
+ * subscriptionHandlers.ts
4
+ * Handles subscription.updated and subscription.deleted webhook events
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.handleSubscriptionUpdated = handleSubscriptionUpdated;
8
+ exports.handleSubscriptionDeleted = handleSubscriptionDeleted;
9
+ const databaseUtilities_js_1 = require("../database/databaseUtilities.js");
10
+ async function handleSubscriptionUpdated({ event, supabaseClient, }) {
11
+ const subscription = event.data.object;
12
+ try {
13
+ if (subscription.status === 'active') {
14
+ console.log(`Subscription ${subscription.id} is active`);
15
+ // Update access code to active
16
+ await (0, databaseUtilities_js_1.updateAccessCodeStatus)(supabaseClient, {
17
+ subscription_id: subscription.id,
18
+ is_active: true,
19
+ });
20
+ }
21
+ else if (subscription.status === 'past_due') {
22
+ console.log(`Subscription ${subscription.id} is past due`);
23
+ // Could send reminder email here
24
+ }
25
+ return {
26
+ success: true,
27
+ statusCode: 200,
28
+ subscription: subscription.id,
29
+ status: subscription.status,
30
+ };
31
+ }
32
+ catch (error) {
33
+ const message = error instanceof Error ? error.message : String(error);
34
+ console.error('Error handling subscription update:', error);
35
+ return {
36
+ success: false,
37
+ error: message,
38
+ statusCode: 500,
39
+ };
40
+ }
41
+ }
42
+ async function handleSubscriptionDeleted({ event, supabaseClient, }) {
43
+ const subscription = event.data.object;
44
+ try {
45
+ // Deactivate access code when subscription is deleted
46
+ await (0, databaseUtilities_js_1.updateAccessCodeStatus)(supabaseClient, {
47
+ subscription_id: subscription.id,
48
+ is_active: false,
49
+ });
50
+ console.log(`Subscription ${subscription.id} deleted, access code deactivated`);
51
+ return {
52
+ success: true,
53
+ statusCode: 200,
54
+ subscription: subscription.id,
55
+ message: 'Subscription cancelled and access revoked',
56
+ };
57
+ }
58
+ catch (error) {
59
+ const message = error instanceof Error ? error.message : String(error);
60
+ console.error('Error handling subscription deletion:', error);
61
+ return {
62
+ success: false,
63
+ error: message,
64
+ statusCode: 500,
65
+ };
66
+ }
67
+ }
68
+ exports.default = {
69
+ handleSubscriptionUpdated,
70
+ handleSubscriptionDeleted,
71
+ };
72
+ //# sourceMappingURL=subscriptionHandlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscriptionHandlers.js","sourceRoot":"","sources":["../../src/webhooks/subscriptionHandlers.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAmBH,8DAkCC;AAED,8DA8BC;AAnFD,2EAA0E;AAiBnE,KAAK,UAAU,yBAAyB,CAAC,EAC9C,KAAK,EACL,cAAc,GACY;IAC1B,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;IAEvC,IAAI,CAAC;QACH,IAAI,YAAY,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,gBAAgB,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC;YACzD,+BAA+B;YAC/B,MAAM,IAAA,6CAAsB,EAAC,cAAc,EAAE;gBAC3C,eAAe,EAAE,YAAY,CAAC,EAAE;gBAChC,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,YAAY,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,gBAAgB,YAAY,CAAC,EAAE,cAAc,CAAC,CAAC;YAC3D,iCAAiC;QACnC,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,GAAG;YACf,YAAY,EAAE,YAAY,CAAC,EAAE;YAC7B,MAAM,EAAE,YAAY,CAAC,MAAM;SAC5B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;QAC5D,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,OAAO;YACd,UAAU,EAAE,GAAG;SAChB,CAAC;IACJ,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,yBAAyB,CAAC,EAC9C,KAAK,EACL,cAAc,GACY;IAC1B,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;IAEvC,IAAI,CAAC;QACH,sDAAsD;QACtD,MAAM,IAAA,6CAAsB,EAAC,cAAc,EAAE;YAC3C,eAAe,EAAE,YAAY,CAAC,EAAE;YAChC,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,gBAAgB,YAAY,CAAC,EAAE,mCAAmC,CAAC,CAAC;QAEhF,OAAO;YACL,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,GAAG;YACf,YAAY,EAAE,YAAY,CAAC,EAAE;YAC7B,OAAO,EAAE,2CAA2C;SACrD,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;QAC9D,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,OAAO;YACd,UAAU,EAAE,GAAG;SAChB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,kBAAe;IACb,yBAAyB;IACzB,yBAAyB;CAC1B,CAAC"}
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@chaicodes-com/stripe-helpers",
3
+ "version": "1.0.0",
4
+ "description": "Stripe payment helpers for Chaicodes apps",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "import": "./dist/index.js",
10
+ "require": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "dev": "tsc --watch",
20
+ "clean": "rm -rf dist"
21
+ },
22
+ "keywords": [
23
+ "stripe",
24
+ "payments",
25
+ "subscriptions",
26
+ "checkout",
27
+ "webhooks"
28
+ ],
29
+ "author": "ChAI Wang",
30
+ "license": "MIT",
31
+ "devDependencies": {
32
+ "@types/node": "^25.9.1",
33
+ "typescript": "^5.0.0"
34
+ }
35
+ }