@darraghor/nest-backend-libs 5.7.4 → 6.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 (142) hide show
  1. package/README.md +87 -36
  2. package/dist/cli/commands/WriteApiClientCommand.js +1 -2
  3. package/dist/cli/commands/WriteApiClientCommand.js.map +1 -1
  4. package/dist/database-sqlite/SqliteTypeOrmConfigurationProvider.js +5 -4
  5. package/dist/database-sqlite/SqliteTypeOrmConfigurationProvider.js.map +1 -1
  6. package/dist/exports/authorization.d.ts +14 -0
  7. package/dist/exports/authorization.js +12 -0
  8. package/dist/exports/authorization.js.map +1 -0
  9. package/dist/exports/core.d.ts +11 -0
  10. package/dist/exports/core.js +10 -0
  11. package/dist/exports/core.js.map +1 -0
  12. package/dist/exports/database.d.ts +5 -0
  13. package/dist/exports/database.js +6 -0
  14. package/dist/exports/database.js.map +1 -0
  15. package/dist/exports/email.d.ts +4 -0
  16. package/dist/exports/email.js +4 -0
  17. package/dist/exports/email.js.map +1 -0
  18. package/dist/exports/invitations.d.ts +6 -0
  19. package/dist/exports/invitations.js +6 -0
  20. package/dist/exports/invitations.js.map +1 -0
  21. package/dist/exports/organisations.d.ts +11 -0
  22. package/dist/exports/organisations.js +12 -0
  23. package/dist/exports/organisations.js.map +1 -0
  24. package/dist/exports/stripe-legacy.d.ts +6 -0
  25. package/dist/exports/stripe-legacy.js +7 -0
  26. package/dist/exports/stripe-legacy.js.map +1 -0
  27. package/dist/exports/stripe.d.ts +11 -0
  28. package/dist/exports/stripe.js +9 -0
  29. package/dist/exports/stripe.js.map +1 -0
  30. package/dist/exports/twitter.d.ts +5 -0
  31. package/dist/exports/twitter.js +5 -0
  32. package/dist/exports/twitter.js.map +1 -0
  33. package/dist/exports/users.d.ts +10 -0
  34. package/dist/exports/users.js +11 -0
  35. package/dist/exports/users.js.map +1 -0
  36. package/dist/index.d.ts +11 -0
  37. package/dist/index.js +11 -0
  38. package/dist/index.js.map +1 -1
  39. package/dist/organisation-subscriptions/entities/organisation-subscription.entity.js +2 -1
  40. package/dist/organisation-subscriptions/entities/organisation-subscription.entity.js.map +1 -1
  41. package/dist/stripe-client/StripeClientConfigurationService.js +1 -0
  42. package/dist/stripe-client/StripeClientConfigurationService.js.map +1 -1
  43. package/dist/stripe-client/StripeClientProvider.js +1 -1
  44. package/dist/stripe-client/StripeClientProvider.js.map +1 -1
  45. package/dist/stripe-client/controllers/stripe-checkout-controller.d.ts +1 -0
  46. package/dist/stripe-client/controllers/stripe-checkout-controller.js +1 -0
  47. package/dist/stripe-client/controllers/stripe-checkout-controller.js.map +1 -1
  48. package/dist/stripe-client/controllers/stripe-events-controller.js +1 -0
  49. package/dist/stripe-client/controllers/stripe-events-controller.js.map +1 -1
  50. package/dist/stripe-client/controllers/stripe-unauthenticated-checkout-controller.js +1 -0
  51. package/dist/stripe-client/controllers/stripe-unauthenticated-checkout-controller.js.map +1 -1
  52. package/dist/stripe-client/controllers/stripe-webhook-controller.js +1 -4
  53. package/dist/stripe-client/controllers/stripe-webhook-controller.js.map +1 -1
  54. package/dist/stripe-client/services/auth-stripe-checkout.service.js +1 -0
  55. package/dist/stripe-client/services/auth-stripe-checkout.service.js.map +1 -1
  56. package/dist/stripe-client/services/queued-payment-event.handler.d.ts +1 -0
  57. package/dist/stripe-client/services/queued-payment-event.handler.js +2 -0
  58. package/dist/stripe-client/services/queued-payment-event.handler.js.map +1 -1
  59. package/dist/stripe-client/services/stripe-checkout.service.d.ts +1 -0
  60. package/dist/stripe-client/services/stripe-checkout.service.js +2 -0
  61. package/dist/stripe-client/services/stripe-checkout.service.js.map +1 -1
  62. package/dist/stripe-client/stripe-account.module.d.ts +1 -0
  63. package/dist/stripe-client/stripe-account.module.js +2 -0
  64. package/dist/stripe-client/stripe-account.module.js.map +1 -1
  65. package/dist/stripe-client/stripe-account.options.d.ts +2 -0
  66. package/dist/stripe-client/stripe-account.options.js.map +1 -1
  67. package/dist/stripe-payments/controllers/secure-stripe-checkout.controller.d.ts +10 -0
  68. package/dist/stripe-payments/controllers/secure-stripe-checkout.controller.js +65 -0
  69. package/dist/stripe-payments/controllers/secure-stripe-checkout.controller.js.map +1 -0
  70. package/dist/stripe-payments/controllers/secure-stripe-events.controller.d.ts +9 -0
  71. package/dist/stripe-payments/controllers/secure-stripe-events.controller.js +65 -0
  72. package/dist/stripe-payments/controllers/secure-stripe-events.controller.js.map +1 -0
  73. package/dist/stripe-payments/controllers/secure-stripe-webhook.controller.d.ts +14 -0
  74. package/dist/stripe-payments/controllers/secure-stripe-webhook.controller.js +112 -0
  75. package/dist/stripe-payments/controllers/secure-stripe-webhook.controller.js.map +1 -0
  76. package/dist/stripe-payments/entities/stripe-checkout-attempt.entity.d.ts +15 -0
  77. package/dist/stripe-payments/entities/stripe-checkout-attempt.entity.js +88 -0
  78. package/dist/stripe-payments/entities/stripe-checkout-attempt.entity.js.map +1 -0
  79. package/dist/stripe-payments/entities/stripe-payment-event.entity.d.ts +16 -0
  80. package/dist/stripe-payments/entities/stripe-payment-event.entity.js +101 -0
  81. package/dist/stripe-payments/entities/stripe-payment-event.entity.js.map +1 -0
  82. package/dist/stripe-payments/entities/stripe-payment-state.entity.d.ts +9 -0
  83. package/dist/stripe-payments/entities/stripe-payment-state.entity.js +53 -0
  84. package/dist/stripe-payments/entities/stripe-payment-state.entity.js.map +1 -0
  85. package/dist/stripe-payments/models/secure-checkout.dto.d.ts +14 -0
  86. package/dist/stripe-payments/models/secure-checkout.dto.js +105 -0
  87. package/dist/stripe-payments/models/secure-checkout.dto.js.map +1 -0
  88. package/dist/stripe-payments/models/secure-payment-response.dto.d.ts +7 -0
  89. package/dist/stripe-payments/models/secure-payment-response.dto.js +30 -0
  90. package/dist/stripe-payments/models/secure-payment-response.dto.js.map +1 -0
  91. package/dist/stripe-payments/services/default-stripe-payments-entitlement-store.d.ts +12 -0
  92. package/dist/stripe-payments/services/default-stripe-payments-entitlement-store.js +49 -0
  93. package/dist/stripe-payments/services/default-stripe-payments-entitlement-store.js.map +1 -0
  94. package/dist/stripe-payments/services/secure-stripe-checkout.service.d.ts +24 -0
  95. package/dist/stripe-payments/services/secure-stripe-checkout.service.js +213 -0
  96. package/dist/stripe-payments/services/secure-stripe-checkout.service.js.map +1 -0
  97. package/dist/stripe-payments/services/secure-stripe-client.provider.d.ts +2 -0
  98. package/dist/stripe-payments/services/secure-stripe-client.provider.js +15 -0
  99. package/dist/stripe-payments/services/secure-stripe-client.provider.js.map +1 -0
  100. package/dist/stripe-payments/services/secure-stripe-product.service.d.ts +9 -0
  101. package/dist/stripe-payments/services/secure-stripe-product.service.js +54 -0
  102. package/dist/stripe-payments/services/secure-stripe-product.service.js.map +1 -0
  103. package/dist/stripe-payments/services/secure-stripe-webhook.service.d.ts +14 -0
  104. package/dist/stripe-payments/services/secure-stripe-webhook.service.js +58 -0
  105. package/dist/stripe-payments/services/secure-stripe-webhook.service.js.map +1 -0
  106. package/dist/stripe-payments/services/secure-subscription.service.d.ts +18 -0
  107. package/dist/stripe-payments/services/secure-subscription.service.js +217 -0
  108. package/dist/stripe-payments/services/secure-subscription.service.js.map +1 -0
  109. package/dist/stripe-payments/services/stripe-payment-event.processor.d.ts +15 -0
  110. package/dist/stripe-payments/services/stripe-payment-event.processor.js +78 -0
  111. package/dist/stripe-payments/services/stripe-payment-event.processor.js.map +1 -0
  112. package/dist/stripe-payments/services/stripe-payment-event.service.d.ts +20 -0
  113. package/dist/stripe-payments/services/stripe-payment-event.service.js +178 -0
  114. package/dist/stripe-payments/services/stripe-payment-event.service.js.map +1 -0
  115. package/dist/stripe-payments/services/stripe-payment-fulfillment.service.d.ts +31 -0
  116. package/dist/stripe-payments/services/stripe-payment-fulfillment.service.js +331 -0
  117. package/dist/stripe-payments/services/stripe-payment-fulfillment.service.js.map +1 -0
  118. package/dist/stripe-payments/services/stripe-payments-operations.service.d.ts +25 -0
  119. package/dist/stripe-payments/services/stripe-payments-operations.service.js +59 -0
  120. package/dist/stripe-payments/services/stripe-payments-operations.service.js.map +1 -0
  121. package/dist/stripe-payments/services/stripe-payments-telemetry.service.d.ts +7 -0
  122. package/dist/stripe-payments/services/stripe-payments-telemetry.service.js +40 -0
  123. package/dist/stripe-payments/services/stripe-payments-telemetry.service.js.map +1 -0
  124. package/dist/stripe-payments/stripe-payment.config.d.ts +19 -0
  125. package/dist/stripe-payments/stripe-payment.config.js +98 -0
  126. package/dist/stripe-payments/stripe-payment.config.js.map +1 -0
  127. package/dist/stripe-payments/stripe-payment.config.test.d.ts +1 -0
  128. package/dist/stripe-payments/stripe-payment.config.test.js +59 -0
  129. package/dist/stripe-payments/stripe-payment.config.test.js.map +1 -0
  130. package/dist/stripe-payments/stripe-payments.extensions.d.ts +69 -0
  131. package/dist/stripe-payments/stripe-payments.extensions.js +30 -0
  132. package/dist/stripe-payments/stripe-payments.extensions.js.map +1 -0
  133. package/dist/stripe-payments/stripe-payments.module.d.ts +12 -0
  134. package/dist/stripe-payments/stripe-payments.module.js +118 -0
  135. package/dist/stripe-payments/stripe-payments.module.js.map +1 -0
  136. package/dist/stripe-payments/stripe-payments.options.d.ts +21 -0
  137. package/dist/stripe-payments/stripe-payments.options.js +2 -0
  138. package/dist/stripe-payments/stripe-payments.options.js.map +1 -0
  139. package/dist/typeorm/entities.d.ts +15 -0
  140. package/dist/typeorm/entities.js +32 -0
  141. package/dist/typeorm/entities.js.map +1 -0
  142. package/package.json +85 -38
@@ -0,0 +1,331 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ var StripePaymentFulfillmentService_1;
14
+ import { Inject, Injectable, Logger } from "@nestjs/common";
15
+ import Stripe from "stripe";
16
+ import { InjectRepository } from "@nestjs/typeorm";
17
+ import { Repository } from "typeorm";
18
+ import { StripeCheckoutAttempt } from "../entities/stripe-checkout-attempt.entity.js";
19
+ import { PaymentSessionService } from "../../payment-sessions/payment-session.service.js";
20
+ import { SecureStripeProductService } from "./secure-stripe-product.service.js";
21
+ import { STRIPE_PAYMENTS_ENTITLEMENT_STORE, } from "../stripe-payments.extensions.js";
22
+ function getMetadata(value) {
23
+ return value.metadata ?? {};
24
+ }
25
+ function getCustomer(customer) {
26
+ if (typeof customer === "string") {
27
+ return { id: customer, email: "unknown" };
28
+ }
29
+ if (!customer || "deleted" in customer) {
30
+ return { id: customer?.id ?? "unknown", email: "unknown" };
31
+ }
32
+ return {
33
+ id: customer.id,
34
+ email: customer.email ?? "unknown",
35
+ };
36
+ }
37
+ function addGracePeriod(date) {
38
+ return new Date(date.getTime() + 2 * 24 * 60 * 60 * 1000);
39
+ }
40
+ function getLifetimeDate() {
41
+ const lifetime = new Date();
42
+ lifetime.setFullYear(lifetime.getFullYear() + 500);
43
+ return lifetime;
44
+ }
45
+ let StripePaymentFulfillmentService = StripePaymentFulfillmentService_1 = class StripePaymentFulfillmentService {
46
+ stripe;
47
+ attemptRepository;
48
+ paymentSessionService;
49
+ productService;
50
+ entitlementStore;
51
+ logger = new Logger(StripePaymentFulfillmentService_1.name);
52
+ constructor(stripe, attemptRepository, paymentSessionService, productService, entitlementStore) {
53
+ this.stripe = stripe;
54
+ this.attemptRepository = attemptRepository;
55
+ this.paymentSessionService = paymentSessionService;
56
+ this.productService = productService;
57
+ this.entitlementStore = entitlementStore;
58
+ }
59
+ async process(event) {
60
+ switch (event.type) {
61
+ case "checkout.session.completed":
62
+ await this.processCheckoutSession(event, false);
63
+ return;
64
+ case "checkout.session.async_payment_succeeded":
65
+ await this.processCheckoutSession(event, true);
66
+ return;
67
+ case "checkout.session.async_payment_failed":
68
+ case "checkout.session.expired":
69
+ await this.markCheckoutAttemptFailed(event);
70
+ return;
71
+ case "customer.subscription.created":
72
+ case "customer.subscription.updated":
73
+ case "customer.subscription.deleted":
74
+ case "customer.subscription.paused":
75
+ case "customer.subscription.resumed":
76
+ await this.processSubscriptionEvent(event);
77
+ return;
78
+ case "invoice.paid":
79
+ case "invoice.payment_failed":
80
+ await this.processInvoiceEvent(event);
81
+ return;
82
+ case "charge.refunded":
83
+ await this.processRefundEvent(event);
84
+ return;
85
+ case "charge.dispute.created":
86
+ await this.processDisputeEvent(event);
87
+ return;
88
+ default:
89
+ return;
90
+ }
91
+ }
92
+ async processCheckoutSession(event, isAsyncPayment) {
93
+ const sessionEvent = event.data.object;
94
+ const session = await this.stripe.checkout.sessions.retrieve(sessionEvent.id, {
95
+ expand: [
96
+ "line_items.data.price.product",
97
+ "customer",
98
+ "subscription",
99
+ ],
100
+ });
101
+ if (!isAsyncPayment && session.payment_status !== "paid") {
102
+ return;
103
+ }
104
+ const lineItems = session.line_items?.data ?? [];
105
+ if (lineItems.length !== 1 || lineItems[0]?.quantity !== 1) {
106
+ throw new Error("Checkout session did not contain the expected product");
107
+ }
108
+ const lineItem = lineItems[0];
109
+ const price = lineItem.price;
110
+ if (!price || typeof price === "string") {
111
+ throw new Error("Checkout session price was not expanded");
112
+ }
113
+ const configuredProduct = this.productService.getByPriceId(price.id);
114
+ const metadata = getMetadata(session);
115
+ if (metadata.productKey &&
116
+ metadata.productKey !== configuredProduct.key) {
117
+ throw new Error("Checkout metadata did not match the configured product");
118
+ }
119
+ const organisationUuid = await this.resolveOrganisationUuid(session, metadata);
120
+ const customer = getCustomer(session.customer);
121
+ const subscriptionId = this.getSubscriptionId(session.subscription);
122
+ let validUntil = getLifetimeDate();
123
+ if (configuredProduct.mode === "subscription") {
124
+ if (!subscriptionId) {
125
+ throw new Error("Subscription checkout did not create a subscription");
126
+ }
127
+ const subscription = await this.retrieveSubscription(subscriptionId);
128
+ validUntil = this.getSubscriptionValidUntil(subscription);
129
+ }
130
+ const productObject = typeof price.product === "string" ? undefined : price.product;
131
+ const input = {
132
+ paymentSystemTransactionId: subscriptionId ?? session.id,
133
+ paymentSystemProductId: productObject?.id ?? price.id,
134
+ paymentSystemCustomerId: customer.id,
135
+ paymentSystemCustomerEmail: customer.email !== "unknown"
136
+ ? customer.email
137
+ : (session.customer_details?.email ?? "unknown"),
138
+ paymentSystemMode: configuredProduct.mode,
139
+ paymentSystemName: "stripe",
140
+ validUntil,
141
+ internalSku: configuredProduct.internalSku,
142
+ productDisplayName: productObject && !("deleted" in productObject)
143
+ ? productObject.name
144
+ : configuredProduct.displayName,
145
+ organisationUuid,
146
+ stripeEventId: event.id,
147
+ stripeEventCreatedAt: this.eventCreatedAt(event),
148
+ stripeStatus: configuredProduct.mode === "subscription" ? "active" : "paid",
149
+ };
150
+ await this.entitlementStore.save(input);
151
+ }
152
+ async markCheckoutAttemptFailed(event) {
153
+ const session = event.data.object;
154
+ await this.attemptRepository.update({ stripeSessionId: session.id }, {
155
+ status: "failed",
156
+ errorMessage: event.type === "checkout.session.expired"
157
+ ? "Checkout session expired"
158
+ : "Asynchronous payment failed",
159
+ });
160
+ this.logger.warn("Stripe Checkout attempt did not complete", {
161
+ eventId: event.id,
162
+ sessionId: session.id,
163
+ eventType: event.type,
164
+ });
165
+ }
166
+ async processSubscriptionEvent(event) {
167
+ const subscriptionEvent = event.data.object;
168
+ const subscription = await this.retrieveSubscription(subscriptionEvent.id);
169
+ await this.saveSubscription(subscription, event);
170
+ }
171
+ async processInvoiceEvent(event) {
172
+ const invoice = event.data.object;
173
+ const parent = invoice.parent;
174
+ const subscriptionId = parent?.type === "subscription_details"
175
+ ? this.getSubscriptionId(parent.subscription)
176
+ : undefined;
177
+ if (!subscriptionId) {
178
+ return;
179
+ }
180
+ const subscription = await this.retrieveSubscription(subscriptionId);
181
+ await this.saveSubscription(subscription, event);
182
+ }
183
+ async processRefundEvent(event) {
184
+ const charge = event.data.object;
185
+ await this.revokeChargeEntitlement(charge, event, "refunded");
186
+ }
187
+ async processDisputeEvent(event) {
188
+ const dispute = event.data.object;
189
+ const chargeId = this.getId(dispute.charge);
190
+ if (!chargeId) {
191
+ return;
192
+ }
193
+ const charge = await this.stripe.charges.retrieve(chargeId);
194
+ await this.revokeChargeEntitlement(charge, event, "disputed");
195
+ }
196
+ async revokeChargeEntitlement(charge, event, status) {
197
+ const input = {
198
+ stripeEventId: event.id,
199
+ stripeEventCreatedAt: this.eventCreatedAt(event),
200
+ stripeStatus: status,
201
+ };
202
+ const paymentIntentId = this.getId(charge.payment_intent);
203
+ if (paymentIntentId) {
204
+ const paymentIntent = await this.stripe.paymentIntents.retrieve(paymentIntentId);
205
+ const paymentIntentMetadata = paymentIntent.metadata;
206
+ const checkoutAttemptId = paymentIntentMetadata.checkoutAttemptId;
207
+ if (/^\d+$/.test(checkoutAttemptId ?? "")) {
208
+ const attempt = await this.attemptRepository.findOne({
209
+ where: { id: Number(checkoutAttemptId) },
210
+ });
211
+ if (attempt?.stripeSessionId) {
212
+ const revoked = await this.entitlementStore.revokePayment(attempt.stripeSessionId, input);
213
+ if (revoked) {
214
+ return;
215
+ }
216
+ }
217
+ }
218
+ }
219
+ const customerId = getCustomer(charge.customer).id;
220
+ if (customerId !== "unknown") {
221
+ await this.entitlementStore.revokeCustomerPayments(customerId, input);
222
+ }
223
+ }
224
+ async saveSubscription(subscription, event) {
225
+ if (subscription.items.data.length === 0) {
226
+ throw new Error("Subscription has no line items");
227
+ }
228
+ const firstItem = subscription.items.data[0];
229
+ const price = firstItem.price;
230
+ if (typeof price === "string") {
231
+ throw new Error("Subscription price was not expanded");
232
+ }
233
+ const configuredProduct = this.productService.getByPriceId(price.id);
234
+ const metadata = getMetadata(subscription);
235
+ const existing = await this.entitlementStore.findByTransactionId(subscription.id);
236
+ const organisationUuid = metadata.organisationUuid ?? existing?.organisationUuid;
237
+ if (!organisationUuid) {
238
+ throw new Error("Subscription event could not be matched to an organisation");
239
+ }
240
+ const customer = getCustomer(subscription.customer);
241
+ const productObject = typeof price.product === "string" ? undefined : price.product;
242
+ const status = event.type === "customer.subscription.deleted"
243
+ ? "canceled"
244
+ : subscription.status;
245
+ await this.entitlementStore.save({
246
+ paymentSystemTransactionId: subscription.id,
247
+ paymentSystemProductId: productObject?.id ?? price.id,
248
+ paymentSystemCustomerId: customer.id,
249
+ paymentSystemCustomerEmail: customer.email,
250
+ paymentSystemMode: "subscription",
251
+ paymentSystemName: "stripe",
252
+ validUntil: this.getSubscriptionValidUntil(subscription, status),
253
+ internalSku: configuredProduct.internalSku,
254
+ productDisplayName: productObject && !("deleted" in productObject)
255
+ ? productObject.name
256
+ : configuredProduct.displayName,
257
+ organisationUuid,
258
+ stripeEventId: event.id,
259
+ stripeEventCreatedAt: this.eventCreatedAt(event),
260
+ stripeStatus: status,
261
+ });
262
+ }
263
+ async resolveOrganisationUuid(session, metadata) {
264
+ if (metadata.organisationUuid) {
265
+ return metadata.organisationUuid;
266
+ }
267
+ const attempt = await this.attemptRepository.findOne({
268
+ where: { stripeSessionId: session.id },
269
+ });
270
+ if (attempt) {
271
+ return attempt.organisationUuid;
272
+ }
273
+ // Preserve compatibility with sessions created by the legacy shared
274
+ // Stripe module, which used a PaymentSessionReference UUID as the
275
+ // Checkout client_reference_id.
276
+ const referenceId = this.getClientReferenceId(session);
277
+ if (referenceId) {
278
+ const paymentReference = await this.paymentSessionService.findSessionByUuid(referenceId);
279
+ if (paymentReference?.organisationUuid) {
280
+ return paymentReference.organisationUuid;
281
+ }
282
+ }
283
+ throw new Error("Checkout session could not be matched to an organisation");
284
+ }
285
+ async retrieveSubscription(id) {
286
+ return this.stripe.subscriptions.retrieve(id, {
287
+ expand: ["items.data.price.product", "customer"],
288
+ });
289
+ }
290
+ getSubscriptionValidUntil(subscription, status = subscription.status) {
291
+ if (status === "canceled" ||
292
+ status === "unpaid" ||
293
+ status === "incomplete_expired" ||
294
+ status === "paused") {
295
+ return new Date();
296
+ }
297
+ const periodEnd = subscription.items.data[0]?.current_period_end;
298
+ if (!periodEnd) {
299
+ throw new Error("Stripe subscription has no current period end");
300
+ }
301
+ return addGracePeriod(new Date(periodEnd * 1000));
302
+ }
303
+ getSubscriptionId(subscription) {
304
+ return typeof subscription === "string"
305
+ ? subscription
306
+ : subscription?.id;
307
+ }
308
+ getId(value) {
309
+ return typeof value === "string" ? value : value?.id;
310
+ }
311
+ getClientReferenceId(session) {
312
+ return typeof session.client_reference_id === "string"
313
+ ? session.client_reference_id
314
+ : undefined;
315
+ }
316
+ eventCreatedAt(event) {
317
+ return new Date(event.created * 1000);
318
+ }
319
+ };
320
+ StripePaymentFulfillmentService = StripePaymentFulfillmentService_1 = __decorate([
321
+ Injectable(),
322
+ __param(0, Inject("SecureStripeClient")),
323
+ __param(1, InjectRepository(StripeCheckoutAttempt)),
324
+ __param(4, Inject(STRIPE_PAYMENTS_ENTITLEMENT_STORE)),
325
+ __metadata("design:paramtypes", [Stripe,
326
+ Repository,
327
+ PaymentSessionService,
328
+ SecureStripeProductService, Object])
329
+ ], StripePaymentFulfillmentService);
330
+ export { StripePaymentFulfillmentService };
331
+ //# sourceMappingURL=stripe-payment-fulfillment.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe-payment-fulfillment.service.js","sourceRoot":"","sources":["../../../src/stripe-payments/services/stripe-payment-fulfillment.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { Queue } from "bullmq";
2
+ import { Repository } from "typeorm";
3
+ import { StripeCheckoutEvent } from "../entities/stripe-payment-event.entity.js";
4
+ export interface StripePaymentsOperationsSnapshot {
5
+ status: "up" | "degraded";
6
+ checkedAt: string;
7
+ events: {
8
+ received: number;
9
+ processing: number;
10
+ failed: number;
11
+ staleProcessing: number;
12
+ };
13
+ queue: {
14
+ waiting: number;
15
+ active: number;
16
+ delayed: number;
17
+ failed: number;
18
+ };
19
+ }
20
+ export declare class StripePaymentsOperationsService {
21
+ private readonly eventRepository;
22
+ private readonly eventQueue;
23
+ constructor(eventRepository: Repository<StripeCheckoutEvent>, eventQueue: Queue);
24
+ getSnapshot(): Promise<StripePaymentsOperationsSnapshot>;
25
+ }
@@ -0,0 +1,59 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { InjectQueue } from "@nestjs/bullmq";
14
+ import { Injectable } from "@nestjs/common";
15
+ import { InjectRepository } from "@nestjs/typeorm";
16
+ import { Queue } from "bullmq";
17
+ import { LessThan, Repository } from "typeorm";
18
+ import { StripeCheckoutEvent } from "../entities/stripe-payment-event.entity.js";
19
+ let StripePaymentsOperationsService = class StripePaymentsOperationsService {
20
+ eventRepository;
21
+ eventQueue;
22
+ constructor(eventRepository, eventQueue) {
23
+ this.eventRepository = eventRepository;
24
+ this.eventQueue = eventQueue;
25
+ }
26
+ async getSnapshot() {
27
+ const staleCutoff = new Date(Date.now() - 5 * 60 * 1000);
28
+ const [received, processing, failed, staleProcessing, queueCounts] = await Promise.all([
29
+ this.eventRepository.countBy({ status: "received" }),
30
+ this.eventRepository.countBy({ status: "processing" }),
31
+ this.eventRepository.countBy({ status: "failed" }),
32
+ this.eventRepository.countBy({
33
+ status: "processing",
34
+ processingStartedAt: LessThan(staleCutoff),
35
+ }),
36
+ this.eventQueue.getJobCounts("waiting", "active", "delayed", "failed"),
37
+ ]);
38
+ return {
39
+ status: failed > 0 || staleProcessing > 0 ? "degraded" : "up",
40
+ checkedAt: new Date().toISOString(),
41
+ events: { received, processing, failed, staleProcessing },
42
+ queue: {
43
+ waiting: queueCounts.waiting,
44
+ active: queueCounts.active,
45
+ delayed: queueCounts.delayed,
46
+ failed: queueCounts.failed,
47
+ },
48
+ };
49
+ }
50
+ };
51
+ StripePaymentsOperationsService = __decorate([
52
+ Injectable(),
53
+ __param(0, InjectRepository(StripeCheckoutEvent)),
54
+ __param(1, InjectQueue("stripe-events")),
55
+ __metadata("design:paramtypes", [Repository,
56
+ Queue])
57
+ ], StripePaymentsOperationsService);
58
+ export { StripePaymentsOperationsService };
59
+ //# sourceMappingURL=stripe-payments-operations.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe-payments-operations.service.js","sourceRoot":"","sources":["../../../src/stripe-payments/services/stripe-payments-operations.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAC,UAAU,EAAC,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAC,gBAAgB,EAAC,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAC,KAAK,EAAC,MAAM,QAAQ,CAAC;AAC7B,OAAO,EAAC,QAAQ,EAAE,UAAU,EAAC,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAC,mBAAmB,EAAC,MAAM,4CAA4C,CAAC;AAoBxE,IAAM,+BAA+B,GAArC,MAAM,+BAA+B;IAGnB;IAC8B;IAHnD,YAEqB,eAAgD,EAClB,UAAiB;QAD/C,oBAAe,GAAf,eAAe,CAAiC;QAClB,eAAU,GAAV,UAAU,CAAO;IACjE,CAAC;IAEJ,KAAK,CAAC,WAAW;QACb,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QACzD,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,WAAW,CAAC,GAC9D,MAAM,OAAO,CAAC,GAAG,CAAC;YACd,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAC,MAAM,EAAE,UAAU,EAAC,CAAC;YAClD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAC,MAAM,EAAE,YAAY,EAAC,CAAC;YACpD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAC,MAAM,EAAE,QAAQ,EAAC,CAAC;YAChD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;gBACzB,MAAM,EAAE,YAAY;gBACpB,mBAAmB,EAAE,QAAQ,CAAC,WAAW,CAAC;aAC7C,CAAC;YACF,IAAI,CAAC,UAAU,CAAC,YAAY,CACxB,SAAS,EACT,QAAQ,EACR,SAAS,EACT,QAAQ,CACX;SACJ,CAAC,CAAC;QAEP,OAAO;YACH,MAAM,EAAE,MAAM,GAAG,CAAC,IAAI,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;YAC7D,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,MAAM,EAAE,EAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,EAAC;YACvD,KAAK,EAAE;gBACH,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,MAAM,EAAE,WAAW,CAAC,MAAM;gBAC1B,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,MAAM,EAAE,WAAW,CAAC,MAAM;aAC7B;SACJ,CAAC;IACN,CAAC;CACJ,CAAA;AAtCY,+BAA+B;IAD3C,UAAU,EAAE;IAGJ,WAAA,gBAAgB,CAAC,mBAAmB,CAAC,CAAA;IAErC,WAAA,WAAW,CAAC,eAAe,CAAC,CAAA;qCADK,UAAU;QACe,KAAK;GAJ3D,+BAA+B,CAsC3C"}
@@ -0,0 +1,7 @@
1
+ import { StripePaymentsTelemetry, StripePaymentsTelemetryEvent } from "../stripe-payments.extensions.js";
2
+ export declare class StripePaymentsTelemetryService {
3
+ private readonly telemetry;
4
+ private readonly logger;
5
+ constructor(telemetry: StripePaymentsTelemetry);
6
+ record(event: StripePaymentsTelemetryEvent): Promise<void>;
7
+ }
@@ -0,0 +1,40 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ var StripePaymentsTelemetryService_1;
14
+ import { Inject, Injectable, Logger } from "@nestjs/common";
15
+ import { STRIPE_PAYMENTS_TELEMETRY, } from "../stripe-payments.extensions.js";
16
+ let StripePaymentsTelemetryService = StripePaymentsTelemetryService_1 = class StripePaymentsTelemetryService {
17
+ telemetry;
18
+ logger = new Logger(StripePaymentsTelemetryService_1.name);
19
+ constructor(telemetry) {
20
+ this.telemetry = telemetry;
21
+ }
22
+ async record(event) {
23
+ try {
24
+ await this.telemetry.record(event);
25
+ }
26
+ catch (error) {
27
+ this.logger.warn("Stripe payment telemetry sink failed", {
28
+ eventName: event.name,
29
+ error: error instanceof Error ? error.message : String(error),
30
+ });
31
+ }
32
+ }
33
+ };
34
+ StripePaymentsTelemetryService = StripePaymentsTelemetryService_1 = __decorate([
35
+ Injectable(),
36
+ __param(0, Inject(STRIPE_PAYMENTS_TELEMETRY)),
37
+ __metadata("design:paramtypes", [Object])
38
+ ], StripePaymentsTelemetryService);
39
+ export { StripePaymentsTelemetryService };
40
+ //# sourceMappingURL=stripe-payments-telemetry.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe-payments-telemetry.service.js","sourceRoot":"","sources":["../../../src/stripe-payments/services/stripe-payments-telemetry.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,OAAO,EAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAC,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EACH,yBAAyB,GAG5B,MAAM,kCAAkC,CAAC;AAGnC,IAAM,8BAA8B,sCAApC,MAAM,8BAA8B;IAKlB;IAJJ,MAAM,GAAG,IAAI,MAAM,CAAC,gCAA8B,CAAC,IAAI,CAAC,CAAC;IAE1E,YAEqB,SAAkC;QAAlC,cAAS,GAAT,SAAS,CAAyB;IACpD,CAAC;IAEJ,KAAK,CAAC,MAAM,CAAC,KAAmC;QAC5C,IAAI,CAAC;YACD,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE;gBACrD,SAAS,EAAE,KAAK,CAAC,IAAI;gBACrB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAChE,CAAC,CAAC;QACP,CAAC;IACL,CAAC;CACJ,CAAA;AAlBY,8BAA8B;IAD1C,UAAU,EAAE;IAKJ,WAAA,MAAM,CAAC,yBAAyB,CAAC,CAAA;;GAJ7B,8BAA8B,CAkB1C"}
@@ -0,0 +1,19 @@
1
+ import { Provider } from "@nestjs/common";
2
+ import { StripePaymentsModuleOptions, StripePaymentsMode, StripePaymentsProduct } from "./stripe-payments.options.js";
3
+ export interface SecureStripeProduct {
4
+ key: string;
5
+ priceId: string;
6
+ mode: StripePaymentsMode;
7
+ internalSku: string;
8
+ displayName: string;
9
+ }
10
+ export interface SecureStripeConfiguration {
11
+ accessToken: string;
12
+ webhookVerificationKey: string;
13
+ redirectsBaseUrl: string;
14
+ products: ReadonlyMap<string, SecureStripeProduct>;
15
+ }
16
+ export declare const SECURE_STRIPE_CONFIGURATION = "SecureStripeConfiguration";
17
+ export declare const secureStripeConfigurationProvider: Provider;
18
+ export declare function parseStripeProductCatalog(value: string): StripePaymentsProduct[];
19
+ export declare function createSecureStripeConfiguration(options: StripePaymentsModuleOptions): SecureStripeConfiguration;
@@ -0,0 +1,98 @@
1
+ import { STRIPE_PAYMENTS_OPTIONS, } from "./stripe-payments.options.js";
2
+ export const SECURE_STRIPE_CONFIGURATION = "SecureStripeConfiguration";
3
+ export const secureStripeConfigurationProvider = {
4
+ provide: SECURE_STRIPE_CONFIGURATION,
5
+ inject: [STRIPE_PAYMENTS_OPTIONS],
6
+ useFactory: (options) => createSecureStripeConfiguration(options),
7
+ };
8
+ function parseProduct(product) {
9
+ const mode = product.mode;
10
+ if (!/^[a-z0-9][a-z0-9_-]{0,63}$/.test(product.key) ||
11
+ !/^price_[A-Za-z0-9]+$/.test(product.priceId) ||
12
+ (mode !== "subscription" && mode !== "payment")) {
13
+ throw new Error(`Invalid Stripe product configuration: ${product.key}`);
14
+ }
15
+ return {
16
+ key: product.key,
17
+ priceId: product.priceId,
18
+ mode,
19
+ internalSku: product.internalSku ?? product.key,
20
+ displayName: product.displayName ?? product.key,
21
+ };
22
+ }
23
+ export function parseStripeProductCatalog(value) {
24
+ let parsed;
25
+ try {
26
+ parsed = JSON.parse(value);
27
+ }
28
+ catch (error) {
29
+ throw new Error("Stripe product catalog must contain valid JSON", {
30
+ cause: error,
31
+ });
32
+ }
33
+ if (typeof parsed !== "object" ||
34
+ parsed === null ||
35
+ Array.isArray(parsed)) {
36
+ throw new Error("Stripe product catalog must be an object keyed by product key");
37
+ }
38
+ return Object.entries(parsed).map(([key, product]) => {
39
+ if (typeof product !== "object" || product === null) {
40
+ throw new Error(`Invalid Stripe product configuration: ${key}`);
41
+ }
42
+ const candidate = product;
43
+ return {
44
+ key,
45
+ priceId: candidate.priceId ?? "",
46
+ mode: candidate.mode ?? "payment",
47
+ internalSku: candidate.internalSku,
48
+ displayName: candidate.displayName,
49
+ };
50
+ });
51
+ }
52
+ export function createSecureStripeConfiguration(options) {
53
+ if (!options.accessToken) {
54
+ throw new Error("Stripe accessToken is required");
55
+ }
56
+ if (!options.webhookVerificationKey) {
57
+ throw new Error("Stripe webhookVerificationKey is required");
58
+ }
59
+ if (!Array.isArray(options.products) || options.products.length === 0) {
60
+ throw new Error("Stripe products must contain at least one product");
61
+ }
62
+ const products = options.products;
63
+ let redirectsBaseUrl;
64
+ try {
65
+ redirectsBaseUrl = new URL(options.redirectsBaseUrl);
66
+ }
67
+ catch (error) {
68
+ throw new Error("Stripe redirectsBaseUrl must be a valid URL", {
69
+ cause: error,
70
+ });
71
+ }
72
+ if (!/^https?:$/.test(redirectsBaseUrl.protocol) ||
73
+ redirectsBaseUrl.pathname !== "/" ||
74
+ redirectsBaseUrl.search ||
75
+ redirectsBaseUrl.hash) {
76
+ throw new Error("Stripe redirectsBaseUrl must contain only an HTTP(S) origin");
77
+ }
78
+ const productsByKey = new Map();
79
+ const priceIds = new Set();
80
+ for (const productInput of products) {
81
+ const product = parseProduct(productInput);
82
+ if (productsByKey.has(product.key)) {
83
+ throw new Error(`Duplicate Stripe product key: ${product.key}`);
84
+ }
85
+ if (priceIds.has(product.priceId)) {
86
+ throw new Error(`Duplicate Stripe price ID: ${product.priceId}`);
87
+ }
88
+ productsByKey.set(product.key, product);
89
+ priceIds.add(product.priceId);
90
+ }
91
+ return {
92
+ accessToken: options.accessToken,
93
+ webhookVerificationKey: options.webhookVerificationKey,
94
+ redirectsBaseUrl: redirectsBaseUrl.origin,
95
+ products: productsByKey,
96
+ };
97
+ }
98
+ //# sourceMappingURL=stripe-payment.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe-payment.config.js","sourceRoot":"","sources":["../../src/stripe-payments/stripe-payment.config.ts"],"names":[],"mappings":"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"}