@reorderjs/reorder 1.0.7 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/.medusa/server/e2e/auth.setup.js +26 -0
  2. package/.medusa/server/e2e/cancellation-retention.spec.js +133 -0
  3. package/.medusa/server/e2e/pages/CancellationCaseDetailPage.js +69 -0
  4. package/.medusa/server/e2e/pages/CancellationsListPage.js +34 -0
  5. package/.medusa/server/e2e/pages/PlanFormPage.js +89 -0
  6. package/.medusa/server/e2e/pages/RenewalDetailPage.js +101 -0
  7. package/.medusa/server/e2e/pages/SubscriptionDetailPage.js +102 -0
  8. package/.medusa/server/e2e/plans-offers.spec.js +96 -0
  9. package/.medusa/server/e2e/renewal-force.spec.js +154 -0
  10. package/.medusa/server/e2e/seed.setup.js +80 -0
  11. package/.medusa/server/e2e/subscription-status.spec.js +109 -0
  12. package/.medusa/server/e2e/subscriptions-list.spec.js +84 -0
  13. package/.medusa/server/playwright.config.js +37 -0
  14. package/.medusa/server/scripts/reset-subscriptions-test-data.js +279 -0
  15. package/.medusa/server/scripts/seed-subscriptions-test-data.js +2425 -0
  16. package/.medusa/server/scripts/wipe-test-data.js +44 -0
  17. package/.medusa/server/src/admin/index.js +13142 -11709
  18. package/.medusa/server/src/admin/index.mjs +13136 -11703
  19. package/.medusa/server/src/admin/types/activity-log.js +2 -1
  20. package/.medusa/server/src/admin/types/analytics.js +2 -1
  21. package/.medusa/server/src/api/admin/cancellations/validators.js +2 -2
  22. package/.medusa/server/src/api/admin/dunning/validators.js +2 -2
  23. package/.medusa/server/src/api/admin/renewals/validators.js +2 -2
  24. package/.medusa/server/src/api/admin/subscription-analytics/validators.js +2 -2
  25. package/.medusa/server/src/api/admin/subscription-logs/validators.js +2 -2
  26. package/.medusa/server/src/api/admin/subscription-offers/validators.js +2 -2
  27. package/.medusa/server/src/api/admin/subscription-settings/validators.js +2 -2
  28. package/.medusa/server/src/api/admin/subscriptions/[id]/payment-method/route.js +19 -0
  29. package/.medusa/server/src/api/admin/subscriptions/[id]/payment-methods/route.js +10 -0
  30. package/.medusa/server/src/api/admin/subscriptions/middlewares.js +8 -1
  31. package/.medusa/server/src/api/admin/subscriptions/utils.js +5 -1
  32. package/.medusa/server/src/api/admin/subscriptions/validators.js +7 -3
  33. package/.medusa/server/src/api/store/customers/me/subscriptions/[id]/payment-method/route.js +26 -0
  34. package/.medusa/server/src/api/store/customers/me/subscriptions/[id]/payment-methods/route.js +15 -0
  35. package/.medusa/server/src/api/store/customers/me/subscriptions/middlewares.js +8 -1
  36. package/.medusa/server/src/api/store/customers/me/subscriptions/utils.js +72 -1
  37. package/.medusa/server/src/api/store/customers/me/subscriptions/validators.js +7 -3
  38. package/.medusa/server/src/api/store/products/validators.js +2 -2
  39. package/.medusa/server/src/modules/activity-log/__tests__/create-subscription-log-event.spec.js +257 -0
  40. package/.medusa/server/src/modules/activity-log/__tests__/normalize-log-event.spec.js +231 -0
  41. package/.medusa/server/src/modules/activity-log/migrations/Migration20260524220933.js +16 -0
  42. package/.medusa/server/src/modules/activity-log/migrations/Migration20260524225625.js +16 -0
  43. package/.medusa/server/src/modules/activity-log/migrations/Migration20260818120000.js +16 -0
  44. package/.medusa/server/src/modules/activity-log/types/index.js +4 -1
  45. package/.medusa/server/src/modules/activity-log/utils/admin-query.js +15 -1
  46. package/.medusa/server/src/modules/analytics/__tests__/admin-query.spec.js +560 -0
  47. package/.medusa/server/src/modules/analytics/index.js +2 -2
  48. package/.medusa/server/src/modules/analytics/utils/admin-query.js +157 -5
  49. package/.medusa/server/src/modules/plan-offer/__tests__/service.spec.js +94 -0
  50. package/.medusa/server/src/modules/renewal/__tests__/service.spec.js +89 -0
  51. package/.medusa/server/src/modules/settings/__tests__/normalize-settings.spec.js +86 -0
  52. package/.medusa/server/src/modules/settings/__tests__/service.spec.js +124 -0
  53. package/.medusa/server/src/modules/subscription/__tests__/payment-methods.spec.js +186 -0
  54. package/.medusa/server/src/modules/subscription/__tests__/service.spec.js +124 -0
  55. package/.medusa/server/src/modules/subscription/utils/admin-query.js +196 -14
  56. package/.medusa/server/src/modules/subscription/utils/payment-methods.js +146 -0
  57. package/.medusa/server/src/subscription-flows/create-subscription-from-cart.js +55 -2
  58. package/.medusa/server/src/workflows/__tests__/cancel-subscription.spec.js +20 -0
  59. package/.medusa/server/src/workflows/__tests__/pause-subscription.spec.js +20 -0
  60. package/.medusa/server/src/workflows/__tests__/update-subscription-shipping-address.spec.js +49 -0
  61. package/.medusa/server/src/workflows/cancel-subscription.js +21 -1
  62. package/.medusa/server/src/workflows/index.js +6 -2
  63. package/.medusa/server/src/workflows/pause-subscription.js +21 -1
  64. package/.medusa/server/src/workflows/steps/rebuild-analytics-daily-snapshots.js +33 -10
  65. package/.medusa/server/src/workflows/steps/update-subscription-payment-method.js +110 -0
  66. package/.medusa/server/src/workflows/steps/validate-subscription-cart.js +7 -22
  67. package/.medusa/server/src/workflows/update-subscription-payment-method.js +65 -0
  68. package/.medusa/server/src/workflows/utils/analytics-incremental.js +1 -1
  69. package/README.md +89 -36
  70. package/package.json +25 -23
@@ -2,10 +2,13 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.listAdminSubscriptions = listAdminSubscriptions;
4
4
  exports.getAdminSubscriptionDetail = getAdminSubscriptionDetail;
5
+ exports.resolveSubscriptionPaymentMethodSummary = resolveSubscriptionPaymentMethodSummary;
6
+ exports.getAdminSubscriptionPaymentMethods = getAdminSubscriptionPaymentMethods;
5
7
  exports.getAdminOrderSubscriptionSummary = getAdminOrderSubscriptionSummary;
6
8
  const utils_1 = require("@medusajs/framework/utils");
7
9
  const subscription_1 = require("../../../admin/types/subscription");
8
10
  const effective_next_renewal_1 = require("./effective-next-renewal");
11
+ const payment_methods_1 = require("./payment-methods");
9
12
  const errors_1 = require("./errors");
10
13
  const listFields = [
11
14
  "id",
@@ -34,6 +37,7 @@ const detailFields = [
34
37
  "started_at",
35
38
  "cancel_effective_at",
36
39
  "shipping_address",
40
+ "payment_context",
37
41
  "pending_update_data",
38
42
  "metadata",
39
43
  ];
@@ -94,9 +98,22 @@ function mapPendingUpdateData(pendingUpdateData) {
94
98
  effective_at: pendingUpdateData.effective_at,
95
99
  };
96
100
  }
97
- function mapListItem(record) {
98
- const customer = record.customer_snapshot ?? {};
99
- const product = record.product_snapshot ?? {};
101
+ function mapListItem(record, displayData) {
102
+ const fallbackCustomer = record.customer_snapshot ?? {};
103
+ const fallbackProduct = record.product_snapshot ?? {};
104
+ const customerName = displayData?.customer_name ??
105
+ fallbackCustomer.full_name ??
106
+ "Unknown customer";
107
+ const customerEmail = displayData?.customer_email ??
108
+ fallbackCustomer.email ??
109
+ "";
110
+ const productTitle = displayData?.product_title ??
111
+ fallbackProduct.product_title ??
112
+ "Unknown product";
113
+ const variantTitle = displayData?.variant_title ??
114
+ fallbackProduct.variant_title ??
115
+ "Unknown variant";
116
+ const sku = displayData?.sku ?? fallbackProduct.sku ?? null;
100
117
  const frequency = {
101
118
  interval: record.frequency_interval === "week"
102
119
  ? subscription_1.SubscriptionFrequencyInterval.WEEK
@@ -118,15 +135,15 @@ function mapListItem(record) {
118
135
  : subscription_1.SubscriptionAdminStatus.PAST_DUE,
119
136
  customer: {
120
137
  id: record.customer_id,
121
- full_name: customer.full_name ?? "Unknown customer",
122
- email: customer.email ?? "",
138
+ full_name: customerName,
139
+ email: customerEmail,
123
140
  },
124
141
  product: {
125
142
  product_id: record.product_id,
126
- product_title: product.product_title ?? "Unknown product",
143
+ product_title: productTitle,
127
144
  variant_id: record.variant_id,
128
- variant_title: product.variant_title ?? "Unknown variant",
129
- sku: product.sku ?? null,
145
+ variant_title: variantTitle,
146
+ sku,
130
147
  },
131
148
  frequency,
132
149
  next_renewal_at: record.next_renewal_at,
@@ -145,9 +162,9 @@ function mapListItem(record) {
145
162
  updated_at: record.updated_at,
146
163
  };
147
164
  }
148
- function mapDetail(record) {
165
+ function mapDetail(record, displayData) {
149
166
  return {
150
- ...mapListItem(record),
167
+ ...mapListItem(record, displayData),
151
168
  created_at: record.created_at,
152
169
  started_at: record.started_at,
153
170
  paused_at: record.paused_at,
@@ -157,6 +174,8 @@ function mapDetail(record) {
157
174
  pending_update_data: mapPendingUpdateData(record.pending_update_data),
158
175
  initial_order: null,
159
176
  renewal_orders: [],
177
+ payment_provider_id: record.payment_context?.payment_provider_id ?? null,
178
+ payment_method: null,
160
179
  };
161
180
  }
162
181
  function mapSubscriptionStatus(status) {
@@ -305,6 +324,92 @@ function matchesSearch(item, search) {
305
324
  .toLowerCase()
306
325
  .includes(value);
307
326
  }
327
+ function buildCustomerDisplayName(customer) {
328
+ if (!customer) {
329
+ return null;
330
+ }
331
+ const fullName = [customer.first_name, customer.last_name]
332
+ .filter((part) => typeof part === "string" && part.trim().length > 0)
333
+ .join(" ")
334
+ .trim();
335
+ return fullName || null;
336
+ }
337
+ async function getSubscriptionDisplayDataMap(container, records) {
338
+ if (!records.length) {
339
+ return new Map();
340
+ }
341
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
342
+ const customerIds = [...new Set(records.map((record) => record.customer_id))];
343
+ const productIds = [...new Set(records.map((record) => record.product_id))];
344
+ const variantIds = [...new Set(records.map((record) => record.variant_id))];
345
+ const [customersResult, productsResult, variantsResult] = await Promise.all([
346
+ customerIds.length
347
+ ? query.graph({
348
+ entity: "customer",
349
+ fields: ["id", "email", "first_name", "last_name"],
350
+ filters: {
351
+ id: customerIds,
352
+ },
353
+ })
354
+ : Promise.resolve({ data: [] }),
355
+ productIds.length
356
+ ? query.graph({
357
+ entity: "product",
358
+ fields: ["id", "title"],
359
+ filters: {
360
+ id: productIds,
361
+ },
362
+ })
363
+ : Promise.resolve({ data: [] }),
364
+ variantIds.length
365
+ ? query.graph({
366
+ entity: "variant",
367
+ fields: ["id", "title", "sku", "product.id", "product.title"],
368
+ filters: {
369
+ id: variantIds,
370
+ },
371
+ })
372
+ : Promise.resolve({ data: [] }),
373
+ ]);
374
+ const customers = new Map((customersResult.data ?? []).map((customer) => [
375
+ customer.id,
376
+ customer,
377
+ ]));
378
+ const products = new Map((productsResult.data ?? []).map((product) => [
379
+ product.id,
380
+ product,
381
+ ]));
382
+ const variants = new Map((variantsResult.data ?? []).map((variant) => [
383
+ variant.id,
384
+ variant,
385
+ ]));
386
+ return new Map(records.map((record) => {
387
+ const fallbackCustomer = record.customer_snapshot ?? {};
388
+ const fallbackProduct = record.product_snapshot ?? {};
389
+ const customer = customers.get(record.customer_id);
390
+ const product = products.get(record.product_id);
391
+ const variant = variants.get(record.variant_id);
392
+ return [
393
+ record.id,
394
+ {
395
+ customer_name: buildCustomerDisplayName(customer) ??
396
+ fallbackCustomer.full_name ??
397
+ "Unknown customer",
398
+ customer_email: customer?.email ??
399
+ fallbackCustomer.email ??
400
+ "",
401
+ product_title: product?.title ??
402
+ variant?.product?.title ??
403
+ fallbackProduct.product_title ??
404
+ "Unknown product",
405
+ variant_title: variant?.title ??
406
+ fallbackProduct.variant_title ??
407
+ "Unknown variant",
408
+ sku: variant?.sku ?? fallbackProduct.sku ?? null,
409
+ },
410
+ ];
411
+ }));
412
+ }
308
413
  async function listAdminSubscriptions(container, input) {
309
414
  assertSortableField(input.order);
310
415
  const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
@@ -332,8 +437,10 @@ async function listAdminSubscriptions(container, input) {
332
437
  : {}),
333
438
  },
334
439
  });
440
+ const records = data;
441
+ const displayDataMap = await getSubscriptionDisplayDataMap(container, records);
335
442
  return {
336
- subscriptions: data.map(mapListItem),
443
+ subscriptions: records.map((record) => mapListItem(record, displayDataMap.get(record.id))),
337
444
  count,
338
445
  limit: take,
339
446
  offset: skip,
@@ -351,7 +458,9 @@ async function listAdminSubscriptions(container, input) {
351
458
  }
352
459
  : undefined,
353
460
  });
354
- let items = data.map(mapListItem);
461
+ const records = data;
462
+ const displayDataMap = await getSubscriptionDisplayDataMap(container, records);
463
+ let items = records.map((record) => mapListItem(record, displayDataMap.get(record.id)));
355
464
  if (input.q) {
356
465
  items = items.filter((item) => matchesSearch(item, input.q));
357
466
  }
@@ -378,6 +487,9 @@ async function getAdminSubscriptionDetail(container, id) {
378
487
  if (!subscription) {
379
488
  throw errors_1.subscriptionErrors.notFound("Subscription", id);
380
489
  }
490
+ const displayDataMap = await getSubscriptionDisplayDataMap(container, [
491
+ subscription,
492
+ ]);
381
493
  const [subscriptionOrderLinksResult, renewalCyclesResult] = await Promise.all([
382
494
  query.graph({
383
495
  entity: "subscription_order",
@@ -438,14 +550,84 @@ async function getAdminSubscriptionDetail(container, id) {
438
550
  const right = b.created_at ? new Date(b.created_at).getTime() : 0;
439
551
  return left - right;
440
552
  })[0] ?? null;
553
+ const paymentContext = (subscription.payment_context ??
554
+ null);
441
555
  return {
442
556
  subscription: {
443
- ...mapDetail(subscription),
557
+ ...mapDetail(subscription, displayDataMap.get(subscription.id)),
444
558
  initial_order: initialOrder,
445
559
  renewal_orders: renewalOrders,
560
+ payment_provider_id: paymentContext?.payment_provider_id ?? null,
561
+ payment_method: await resolveSubscriptionPaymentMethodSummary(container, {
562
+ customer_id: subscription.customer_id,
563
+ payment_context: paymentContext,
564
+ }),
446
565
  },
447
566
  };
448
567
  }
568
+ /**
569
+ * Resolves the card details of the payment method a subscription renews with.
570
+ *
571
+ * Best effort: a removed payment method or an unreachable payment provider must
572
+ * not break the Admin subscription detail view.
573
+ */
574
+ async function resolveSubscriptionPaymentMethodSummary(container, input) {
575
+ const providerId = input.payment_context?.payment_provider_id ?? null;
576
+ const paymentMethodId = input.payment_context?.payment_method_reference ?? null;
577
+ if (!providerId || !paymentMethodId) {
578
+ return null;
579
+ }
580
+ try {
581
+ const resolved = await (0, payment_methods_1.resolveCustomerPaymentMethod)(container, {
582
+ customer_id: input.customer_id,
583
+ provider_id: providerId,
584
+ payment_method_id: paymentMethodId,
585
+ });
586
+ return resolved.summary;
587
+ }
588
+ catch {
589
+ return null;
590
+ }
591
+ }
592
+ /**
593
+ * Lists the payment methods the subscription's customer can renew with, marking
594
+ * the one currently stored on the subscription.
595
+ */
596
+ async function getAdminSubscriptionPaymentMethods(container, id) {
597
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
598
+ const { data } = await query.graph({
599
+ entity: "subscription",
600
+ fields: ["id", "customer_id", "payment_context"],
601
+ filters: {
602
+ id: [id],
603
+ },
604
+ });
605
+ const subscription = data[0];
606
+ if (!subscription) {
607
+ throw errors_1.subscriptionErrors.notFound("Subscription", id);
608
+ }
609
+ const paymentContext = (subscription.payment_context ??
610
+ null);
611
+ const providerId = paymentContext?.payment_provider_id ?? null;
612
+ const currentPaymentMethodId = paymentContext?.payment_method_reference ?? null;
613
+ if (!providerId) {
614
+ return {
615
+ payment_provider_id: null,
616
+ payment_methods: [],
617
+ };
618
+ }
619
+ const paymentMethods = await (0, payment_methods_1.listCustomerPaymentMethods)(container, {
620
+ customer_id: subscription.customer_id,
621
+ provider_id: providerId,
622
+ });
623
+ return {
624
+ payment_provider_id: providerId,
625
+ payment_methods: paymentMethods.map((paymentMethod) => ({
626
+ ...paymentMethod,
627
+ is_current: paymentMethod.id === currentPaymentMethodId,
628
+ })),
629
+ };
630
+ }
449
631
  async function getAdminOrderSubscriptionSummary(container, orderId) {
450
632
  const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
451
633
  const { data } = await query.graph({
@@ -478,4 +660,4 @@ async function getAdminOrderSubscriptionSummary(container, orderId) {
478
660
  summary: mapOrderSubscriptionSummary(link.subscription),
479
661
  };
480
662
  }
481
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4tcXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9zdWJzY3JpcHRpb24vdXRpbHMvYWRtaW4tcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUF3ZkEsd0RBMkVDO0FBRUQsZ0VBMEdDO0FBRUQsNEVBc0NDO0FBdHRCRCxxREFBcUU7QUFDckUsb0VBZTBDO0FBRTFDLHFFQUFvRTtBQUNwRSxxQ0FBNkM7QUF1RzdDLE1BQU0sVUFBVSxHQUFHO0lBQ2pCLElBQUk7SUFDSixXQUFXO0lBQ1gsUUFBUTtJQUNSLGFBQWE7SUFDYixZQUFZO0lBQ1osWUFBWTtJQUNaLG9CQUFvQjtJQUNwQixpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQixXQUFXO0lBQ1gsY0FBYztJQUNkLGlCQUFpQjtJQUNqQixVQUFVO0lBQ1YsZUFBZTtJQUNmLG1CQUFtQjtJQUNuQixrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLFlBQVk7SUFDWixZQUFZO0NBQ0osQ0FBQTtBQUVWLE1BQU0sWUFBWSxHQUFHO0lBQ25CLEdBQUcsVUFBVTtJQUNiLFlBQVk7SUFDWixxQkFBcUI7SUFDckIsa0JBQWtCO0lBQ2xCLHFCQUFxQjtJQUNyQixVQUFVO0NBQ0YsQ0FBQTtBQUVWLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDckMsWUFBWTtJQUNaLFlBQVk7SUFDWixRQUFRO0lBQ1Isb0JBQW9CO0lBQ3BCLGlCQUFpQjtJQUNqQixpQkFBaUI7SUFDakIsZUFBZTtJQUNmLGlCQUFpQjtDQUNsQixDQUFDLENBQUE7QUFFRixNQUFNLHNCQUFzQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ3JDLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsZUFBZTtJQUNmLGVBQWU7SUFDZixnQkFBZ0I7Q0FDakIsQ0FBQyxDQUFBO0FBRUYsU0FBUyxvQkFBb0IsQ0FBQyxRQUFnQixFQUFFLEtBQWE7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
663
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4tcXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9zdWJzY3JpcHRpb24vdXRpbHMvYWRtaW4tcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUF1cUJBLHdEQW9GQztBQUVELGdFQXNIQztBQVFELDBGQTBCQztBQU1ELGdGQTJDQztBQUVELDRFQXNDQztBQTcrQkQscURBQXFFO0FBQ3JFLG9FQWUwQztBQU0xQyxxRUFBb0U7QUFDcEUsdURBRzBCO0FBQzFCLHFDQUE2QztBQXNJN0MsTUFBTSxVQUFVLEdBQUc7SUFDakIsSUFBSTtJQUNKLFdBQVc7SUFDWCxRQUFRO0lBQ1IsYUFBYTtJQUNiLFlBQVk7SUFDWixZQUFZO0lBQ1osb0JBQW9CO0lBQ3BCLGlCQUFpQjtJQUNqQixpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCLFdBQVc7SUFDWCxjQUFjO0lBQ2QsaUJBQWlCO0lBQ2pCLFVBQVU7SUFDVixlQUFlO0lBQ2YsbUJBQW1CO0lBQ25CLGtCQUFrQjtJQUNsQixrQkFBa0I7SUFDbEIsWUFBWTtJQUNaLFlBQVk7Q0FDSixDQUFBO0FBRVYsTUFBTSxZQUFZLEdBQUc7SUFDbkIsR0FBRyxVQUFVO0lBQ2IsWUFBWTtJQUNaLHFCQUFxQjtJQUNyQixrQkFBa0I7SUFDbEIsaUJBQWlCO0lBQ2pCLHFCQUFxQjtJQUNyQixVQUFVO0NBQ0YsQ0FBQTtBQUVWLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDckMsWUFBWTtJQUNaLFlBQVk7SUFDWixRQUFRO0lBQ1Isb0JBQW9CO0lBQ3BCLGlCQUFpQjtJQUNqQixpQkFBaUI7SUFDakIsZUFBZTtJQUNmLGlCQUFpQjtDQUNsQixDQUFDLENBQUE7QUFFRixNQUFNLHNCQUFzQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ3JDLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsZUFBZTtJQUNmLGVBQWU7SUFDZixnQkFBZ0I7Q0FD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
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toPaymentMethodSummary = toPaymentMethodSummary;
4
+ exports.listCustomerPaymentMethods = listCustomerPaymentMethods;
5
+ exports.resolveCustomerPaymentMethod = resolveCustomerPaymentMethod;
6
+ exports.resolveLatestCustomerPaymentMethod = resolveLatestCustomerPaymentMethod;
7
+ exports.listCustomerAccountHolders = listCustomerAccountHolders;
8
+ exports.sortPaymentMethodSummaries = sortPaymentMethodSummaries;
9
+ const utils_1 = require("@medusajs/framework/utils");
10
+ const errors_1 = require("./errors");
11
+ /**
12
+ * Normalizes a payment method returned by a payment provider into a summary that
13
+ * is safe to expose over the Store and Admin APIs.
14
+ *
15
+ * Card details are read defensively because the shape of `data` is provider
16
+ * specific: providers that do not expose card metadata simply yield null fields.
17
+ */
18
+ function toPaymentMethodSummary(method, providerId) {
19
+ const data = (method.data ?? {});
20
+ const card = (data.card ?? {});
21
+ return {
22
+ id: method.id,
23
+ provider_id: providerId,
24
+ type: readNullableString(data.type),
25
+ brand: readNullableString(card.brand),
26
+ last4: readNullableString(card.last4),
27
+ exp_month: readNullableNumber(card.exp_month),
28
+ exp_year: readNullableNumber(card.exp_year),
29
+ created_at: readNullableNumber(data.created),
30
+ };
31
+ }
32
+ /**
33
+ * Lists the payment methods a customer has saved with the configured payment
34
+ * providers, newest first.
35
+ *
36
+ * Stays provider agnostic: account holders and `listPaymentMethods` are part of
37
+ * the Payment Module interface, so any provider implementing them is supported.
38
+ */
39
+ async function listCustomerPaymentMethods(container, input) {
40
+ const accountHolders = await listCustomerAccountHolders(container, input.customer_id, input.provider_id ?? null);
41
+ if (!accountHolders.length) {
42
+ return [];
43
+ }
44
+ const paymentModule = container.resolve(utils_1.Modules.PAYMENT);
45
+ const summaries = [];
46
+ for (const accountHolder of accountHolders) {
47
+ const methods = (await paymentModule.listPaymentMethods({
48
+ provider_id: accountHolder.provider_id,
49
+ context: {
50
+ account_holder: {
51
+ ...accountHolder,
52
+ data: accountHolder.data ?? {},
53
+ },
54
+ },
55
+ }));
56
+ for (const method of methods ?? []) {
57
+ if (!method?.id) {
58
+ continue;
59
+ }
60
+ summaries.push(toPaymentMethodSummary(method, accountHolder.provider_id));
61
+ }
62
+ }
63
+ return sortPaymentMethodSummaries(summaries);
64
+ }
65
+ /**
66
+ * Resolves a single saved payment method and guarantees it belongs to the given
67
+ * customer, so a subscription can never be pointed at another customer's card.
68
+ */
69
+ async function resolveCustomerPaymentMethod(container, input) {
70
+ const accountHolders = await listCustomerAccountHolders(container, input.customer_id, input.provider_id);
71
+ if (!accountHolders.length) {
72
+ throw errors_1.subscriptionErrors.invalidData(`Customer '${input.customer_id}' has no saved payment account holder for provider '${input.provider_id}'`);
73
+ }
74
+ const paymentModule = container.resolve(utils_1.Modules.PAYMENT);
75
+ for (const accountHolder of accountHolders) {
76
+ const methods = (await paymentModule.listPaymentMethods({
77
+ provider_id: accountHolder.provider_id,
78
+ context: {
79
+ account_holder: {
80
+ ...accountHolder,
81
+ data: accountHolder.data ?? {},
82
+ },
83
+ },
84
+ }));
85
+ const match = (methods ?? []).find((method) => method?.id === input.payment_method_id);
86
+ if (match) {
87
+ return {
88
+ summary: toPaymentMethodSummary(match, accountHolder.provider_id),
89
+ account_holder: accountHolder,
90
+ };
91
+ }
92
+ }
93
+ throw errors_1.subscriptionErrors.invalidData(`Payment method '${input.payment_method_id}' is not a saved payment method of customer '${input.customer_id}' for provider '${input.provider_id}'`);
94
+ }
95
+ /**
96
+ * Resolves the most recently saved payment method of a customer for a provider.
97
+ *
98
+ * Used by subscription checkout when the payment session itself does not carry a
99
+ * reusable payment method reference.
100
+ */
101
+ async function resolveLatestCustomerPaymentMethod(container, input) {
102
+ const summaries = await listCustomerPaymentMethods(container, {
103
+ customer_id: input.customer_id,
104
+ provider_id: input.provider_id,
105
+ });
106
+ return summaries[0] ?? null;
107
+ }
108
+ async function listCustomerAccountHolders(container, customerId, providerId) {
109
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
110
+ const { data } = await query.graph({
111
+ entity: "customer",
112
+ fields: ["id", "account_holders.*"],
113
+ filters: {
114
+ id: [customerId],
115
+ },
116
+ });
117
+ const customer = data[0];
118
+ const accountHolders = customer?.account_holders ?? [];
119
+ return accountHolders.filter((accountHolder) => {
120
+ if (!accountHolder?.id || !accountHolder.provider_id) {
121
+ return false;
122
+ }
123
+ return providerId ? accountHolder.provider_id === providerId : true;
124
+ });
125
+ }
126
+ function sortPaymentMethodSummaries(summaries) {
127
+ return summaries
128
+ .slice()
129
+ .sort((left, right) => (right.created_at ?? 0) - (left.created_at ?? 0));
130
+ }
131
+ function readNullableString(value) {
132
+ return typeof value === "string" && value.trim() ? value.trim() : null;
133
+ }
134
+ function readNullableNumber(value) {
135
+ if (typeof value === "number" && Number.isFinite(value)) {
136
+ return value;
137
+ }
138
+ if (typeof value === "string") {
139
+ const parsed = Number.parseInt(value, 10);
140
+ if (Number.isFinite(parsed)) {
141
+ return parsed;
142
+ }
143
+ }
144
+ return null;
145
+ }
146
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bWVudC1tZXRob2RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvc3Vic2NyaXB0aW9uL3V0aWxzL3BheW1lbnQtbWV0aG9kcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTZCQSx3REFpQkM7QUFTRCxnRUF5Q0M7QUFNRCxvRUFnREM7QUFRRCxnRkFhQztBQUVELGdFQXdCQztBQUVELGdFQU1DO0FBek1ELHFEQUE4RTtBQU05RSxxQ0FBNkM7QUFZN0M7Ozs7OztHQU1HO0FBQ0gsU0FBZ0Isc0JBQXNCLENBQ3BDLE1BQXVDLEVBQ3ZDLFVBQWtCO0lBRWxCLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQTRCLENBQUE7SUFDM0QsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBNEIsQ0FBQTtJQUV6RCxPQUFPO1FBQ0wsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFO1FBQ2IsV0FBVyxFQUFFLFVBQVU7UUFDdkIsSUFBSSxFQUFFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDbkMsS0FBSyxFQUFFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDckMsS0FBSyxFQUFFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDckMsU0FBUyxFQUFFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDN0MsUUFBUSxFQUFFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDM0MsVUFBVSxFQUFFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7S0FDN0MsQ0FBQTtBQUNILENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSSxLQUFLLFVBQVUsMEJBQTBCLENBQzlDLFNBQTBCLEVBQzFCLEtBR0M7SUFFRCxNQUFNLGNBQWMsR0FBRyxNQUFNLDBC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