@carlonicora/nestjs-neo4jsonapi 6.9.0 → 7.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 (205) hide show
  1. package/dist/common/decorators/audit.decorator.d.ts +3 -0
  2. package/dist/common/decorators/audit.decorator.d.ts.map +1 -1
  3. package/dist/common/decorators/audit.decorator.js +15 -2
  4. package/dist/common/decorators/audit.decorator.js.map +1 -1
  5. package/dist/common/decorators/cache-invalidate.decorator.d.ts +2 -1
  6. package/dist/common/decorators/cache-invalidate.decorator.d.ts.map +1 -1
  7. package/dist/common/decorators/cache-invalidate.decorator.js +15 -3
  8. package/dist/common/decorators/cache-invalidate.decorator.js.map +1 -1
  9. package/dist/common/decorators/handler-wrapper.d.ts +13 -0
  10. package/dist/common/decorators/handler-wrapper.d.ts.map +1 -0
  11. package/dist/common/decorators/handler-wrapper.js +25 -0
  12. package/dist/common/decorators/handler-wrapper.js.map +1 -0
  13. package/dist/common/decorators/validate-id.decorator.d.ts +4 -1
  14. package/dist/common/decorators/validate-id.decorator.d.ts.map +1 -1
  15. package/dist/common/decorators/validate-id.decorator.js +14 -2
  16. package/dist/common/decorators/validate-id.decorator.js.map +1 -1
  17. package/dist/foundations/ai-connection/controllers/ai-connection.controller.d.ts +2 -1
  18. package/dist/foundations/ai-connection/controllers/ai-connection.controller.d.ts.map +1 -1
  19. package/dist/foundations/ai-connection/controllers/ai-connection.controller.js +5 -4
  20. package/dist/foundations/ai-connection/controllers/ai-connection.controller.js.map +1 -1
  21. package/dist/foundations/analytics/controllers/analytics.admin.controller.d.ts +2 -1
  22. package/dist/foundations/analytics/controllers/analytics.admin.controller.d.ts.map +1 -1
  23. package/dist/foundations/analytics/controllers/analytics.admin.controller.js +5 -4
  24. package/dist/foundations/analytics/controllers/analytics.admin.controller.js.map +1 -1
  25. package/dist/foundations/foundations.modules.d.ts.map +1 -1
  26. package/dist/foundations/foundations.modules.js +2 -0
  27. package/dist/foundations/foundations.modules.js.map +1 -1
  28. package/dist/foundations/handbook/controllers/handbook.controller.d.ts +3 -2
  29. package/dist/foundations/handbook/controllers/handbook.controller.d.ts.map +1 -1
  30. package/dist/foundations/handbook/controllers/handbook.controller.js +10 -8
  31. package/dist/foundations/handbook/controllers/handbook.controller.js.map +1 -1
  32. package/dist/foundations/notification/controllers/notification.controller.d.ts.map +1 -1
  33. package/dist/foundations/notification/controllers/notification.controller.js +0 -1
  34. package/dist/foundations/notification/controllers/notification.controller.js.map +1 -1
  35. package/dist/foundations/role/controllers/role.controller.d.ts +4 -3
  36. package/dist/foundations/role/controllers/role.controller.d.ts.map +1 -1
  37. package/dist/foundations/role/controllers/role.controller.js +13 -10
  38. package/dist/foundations/role/controllers/role.controller.js.map +1 -1
  39. package/dist/foundations/stripe/index.d.ts +1 -0
  40. package/dist/foundations/stripe/index.d.ts.map +1 -1
  41. package/dist/foundations/stripe/index.js +2 -0
  42. package/dist/foundations/stripe/index.js.map +1 -1
  43. package/dist/foundations/stripe-coupon/controllers/stripe-coupon-code-checkout.controller.d.ts +15 -0
  44. package/dist/foundations/stripe-coupon/controllers/stripe-coupon-code-checkout.controller.d.ts.map +1 -0
  45. package/dist/foundations/stripe-coupon/controllers/stripe-coupon-code-checkout.controller.js +61 -0
  46. package/dist/foundations/stripe-coupon/controllers/stripe-coupon-code-checkout.controller.js.map +1 -0
  47. package/dist/foundations/stripe-coupon/controllers/stripe-coupon-code.controller.d.ts +28 -0
  48. package/dist/foundations/stripe-coupon/controllers/stripe-coupon-code.controller.d.ts.map +1 -0
  49. package/dist/foundations/stripe-coupon/controllers/stripe-coupon-code.controller.js +137 -0
  50. package/dist/foundations/stripe-coupon/controllers/stripe-coupon-code.controller.js.map +1 -0
  51. package/dist/foundations/stripe-coupon/controllers/stripe-coupon.controller.d.ts +26 -0
  52. package/dist/foundations/stripe-coupon/controllers/stripe-coupon.controller.d.ts.map +1 -0
  53. package/dist/foundations/stripe-coupon/controllers/stripe-coupon.controller.js +132 -0
  54. package/dist/foundations/stripe-coupon/controllers/stripe-coupon.controller.js.map +1 -0
  55. package/dist/foundations/stripe-coupon/controllers/stripe-coupon.public.controller.d.ts +12 -0
  56. package/dist/foundations/stripe-coupon/controllers/stripe-coupon.public.controller.d.ts.map +1 -0
  57. package/dist/foundations/stripe-coupon/controllers/stripe-coupon.public.controller.js +49 -0
  58. package/dist/foundations/stripe-coupon/controllers/stripe-coupon.public.controller.js.map +1 -0
  59. package/dist/foundations/stripe-coupon/dtos/stripe-coupon-code.automatic.query.dto.d.ts +8 -0
  60. package/dist/foundations/stripe-coupon/dtos/stripe-coupon-code.automatic.query.dto.d.ts.map +1 -0
  61. package/dist/foundations/stripe-coupon/dtos/stripe-coupon-code.automatic.query.dto.js +25 -0
  62. package/dist/foundations/stripe-coupon/dtos/stripe-coupon-code.automatic.query.dto.js.map +1 -0
  63. package/dist/foundations/stripe-coupon/dtos/stripe-coupon-code.patch.dto.d.ts +13 -0
  64. package/dist/foundations/stripe-coupon/dtos/stripe-coupon-code.patch.dto.d.ts.map +1 -0
  65. package/dist/foundations/stripe-coupon/dtos/stripe-coupon-code.patch.dto.js +55 -0
  66. package/dist/foundations/stripe-coupon/dtos/stripe-coupon-code.patch.dto.js.map +1 -0
  67. package/dist/foundations/stripe-coupon/dtos/stripe-coupon-code.post.dto.d.ts +24 -0
  68. package/dist/foundations/stripe-coupon/dtos/stripe-coupon-code.post.dto.d.ts.map +1 -0
  69. package/dist/foundations/stripe-coupon/dtos/stripe-coupon-code.post.dto.js +105 -0
  70. package/dist/foundations/stripe-coupon/dtos/stripe-coupon-code.post.dto.js.map +1 -0
  71. package/dist/foundations/stripe-coupon/dtos/stripe-coupon.dto.d.ts +8 -0
  72. package/dist/foundations/stripe-coupon/dtos/stripe-coupon.dto.d.ts.map +1 -0
  73. package/dist/foundations/stripe-coupon/dtos/stripe-coupon.dto.js +36 -0
  74. package/dist/foundations/stripe-coupon/dtos/stripe-coupon.dto.js.map +1 -0
  75. package/dist/foundations/stripe-coupon/dtos/stripe-coupon.patch.dto.d.ts +12 -0
  76. package/dist/foundations/stripe-coupon/dtos/stripe-coupon.patch.dto.d.ts.map +1 -0
  77. package/dist/foundations/stripe-coupon/dtos/stripe-coupon.patch.dto.js +51 -0
  78. package/dist/foundations/stripe-coupon/dtos/stripe-coupon.patch.dto.js.map +1 -0
  79. package/dist/foundations/stripe-coupon/dtos/stripe-coupon.post.dto.d.ts +31 -0
  80. package/dist/foundations/stripe-coupon/dtos/stripe-coupon.post.dto.d.ts.map +1 -0
  81. package/dist/foundations/stripe-coupon/dtos/stripe-coupon.post.dto.js +120 -0
  82. package/dist/foundations/stripe-coupon/dtos/stripe-coupon.post.dto.js.map +1 -0
  83. package/dist/foundations/stripe-coupon/entities/stripe-coupon-code.d.ts +28 -0
  84. package/dist/foundations/stripe-coupon/entities/stripe-coupon-code.d.ts.map +1 -0
  85. package/dist/foundations/stripe-coupon/entities/stripe-coupon-code.js +35 -0
  86. package/dist/foundations/stripe-coupon/entities/stripe-coupon-code.js.map +1 -0
  87. package/dist/foundations/stripe-coupon/entities/stripe-coupon-code.meta.d.ts +5 -0
  88. package/dist/foundations/stripe-coupon/entities/stripe-coupon-code.meta.d.ts.map +1 -0
  89. package/dist/foundations/stripe-coupon/entities/stripe-coupon-code.meta.js +12 -0
  90. package/dist/foundations/stripe-coupon/entities/stripe-coupon-code.meta.js.map +1 -0
  91. package/dist/foundations/stripe-coupon/entities/stripe-coupon-offer.d.ts +23 -0
  92. package/dist/foundations/stripe-coupon/entities/stripe-coupon-offer.d.ts.map +1 -0
  93. package/dist/foundations/stripe-coupon/entities/stripe-coupon-offer.js +21 -0
  94. package/dist/foundations/stripe-coupon/entities/stripe-coupon-offer.js.map +1 -0
  95. package/dist/foundations/stripe-coupon/entities/stripe-coupon-offer.meta.d.ts +6 -0
  96. package/dist/foundations/stripe-coupon/entities/stripe-coupon-offer.meta.d.ts.map +1 -0
  97. package/dist/foundations/stripe-coupon/entities/stripe-coupon-offer.meta.js +13 -0
  98. package/dist/foundations/stripe-coupon/entities/stripe-coupon-offer.meta.js.map +1 -0
  99. package/dist/foundations/stripe-coupon/entities/stripe-coupon.d.ts +55 -0
  100. package/dist/foundations/stripe-coupon/entities/stripe-coupon.d.ts.map +1 -0
  101. package/dist/foundations/stripe-coupon/entities/stripe-coupon.js +37 -0
  102. package/dist/foundations/stripe-coupon/entities/stripe-coupon.js.map +1 -0
  103. package/dist/foundations/stripe-coupon/entities/stripe-coupon.meta.d.ts +5 -0
  104. package/dist/foundations/stripe-coupon/entities/stripe-coupon.meta.d.ts.map +1 -0
  105. package/dist/foundations/stripe-coupon/entities/stripe-coupon.meta.js +12 -0
  106. package/dist/foundations/stripe-coupon/entities/stripe-coupon.meta.js.map +1 -0
  107. package/dist/foundations/stripe-coupon/index.d.ts +22 -0
  108. package/dist/foundations/stripe-coupon/index.d.ts.map +1 -0
  109. package/dist/foundations/stripe-coupon/index.js +44 -0
  110. package/dist/foundations/stripe-coupon/index.js.map +1 -0
  111. package/dist/foundations/stripe-coupon/repositories/stripe-coupon-code.repository.d.ts +41 -0
  112. package/dist/foundations/stripe-coupon/repositories/stripe-coupon-code.repository.d.ts.map +1 -0
  113. package/dist/foundations/stripe-coupon/repositories/stripe-coupon-code.repository.js +97 -0
  114. package/dist/foundations/stripe-coupon/repositories/stripe-coupon-code.repository.js.map +1 -0
  115. package/dist/foundations/stripe-coupon/repositories/stripe-coupon.repository.d.ts +29 -0
  116. package/dist/foundations/stripe-coupon/repositories/stripe-coupon.repository.d.ts.map +1 -0
  117. package/dist/foundations/stripe-coupon/repositories/stripe-coupon.repository.js +55 -0
  118. package/dist/foundations/stripe-coupon/repositories/stripe-coupon.repository.js.map +1 -0
  119. package/dist/foundations/stripe-coupon/services/stripe-coupon-api.service.d.ts +67 -0
  120. package/dist/foundations/stripe-coupon/services/stripe-coupon-api.service.d.ts.map +1 -0
  121. package/dist/foundations/stripe-coupon/services/stripe-coupon-api.service.js +172 -0
  122. package/dist/foundations/stripe-coupon/services/stripe-coupon-api.service.js.map +1 -0
  123. package/dist/foundations/stripe-coupon/services/stripe-coupon-code-checkout.service.d.ts +81 -0
  124. package/dist/foundations/stripe-coupon/services/stripe-coupon-code-checkout.service.d.ts.map +1 -0
  125. package/dist/foundations/stripe-coupon/services/stripe-coupon-code-checkout.service.js +206 -0
  126. package/dist/foundations/stripe-coupon/services/stripe-coupon-code-checkout.service.js.map +1 -0
  127. package/dist/foundations/stripe-coupon/services/stripe-coupon-code.service.d.ts +92 -0
  128. package/dist/foundations/stripe-coupon/services/stripe-coupon-code.service.d.ts.map +1 -0
  129. package/dist/foundations/stripe-coupon/services/stripe-coupon-code.service.js +134 -0
  130. package/dist/foundations/stripe-coupon/services/stripe-coupon-code.service.js.map +1 -0
  131. package/dist/foundations/stripe-coupon/services/stripe-coupon-offer.service.d.ts +29 -0
  132. package/dist/foundations/stripe-coupon/services/stripe-coupon-offer.service.d.ts.map +1 -0
  133. package/dist/foundations/stripe-coupon/services/stripe-coupon-offer.service.js +73 -0
  134. package/dist/foundations/stripe-coupon/services/stripe-coupon-offer.service.js.map +1 -0
  135. package/dist/foundations/stripe-coupon/services/stripe-coupon.service.d.ts +98 -0
  136. package/dist/foundations/stripe-coupon/services/stripe-coupon.service.d.ts.map +1 -0
  137. package/dist/foundations/stripe-coupon/services/stripe-coupon.service.js +236 -0
  138. package/dist/foundations/stripe-coupon/services/stripe-coupon.service.js.map +1 -0
  139. package/dist/foundations/stripe-coupon/stripe-coupon.module.d.ts +14 -0
  140. package/dist/foundations/stripe-coupon/stripe-coupon.module.d.ts.map +1 -0
  141. package/dist/foundations/stripe-coupon/stripe-coupon.module.js +91 -0
  142. package/dist/foundations/stripe-coupon/stripe-coupon.module.js.map +1 -0
  143. package/dist/foundations/stripe-coupon/utils/places-left.d.ts +19 -0
  144. package/dist/foundations/stripe-coupon/utils/places-left.d.ts.map +1 -0
  145. package/dist/foundations/stripe-coupon/utils/places-left.js +33 -0
  146. package/dist/foundations/stripe-coupon/utils/places-left.js.map +1 -0
  147. package/dist/foundations/stripe-subscription/backfills/stripe-subscription-backfill.repository.d.ts +22 -0
  148. package/dist/foundations/stripe-subscription/backfills/stripe-subscription-backfill.repository.d.ts.map +1 -0
  149. package/dist/foundations/stripe-subscription/backfills/stripe-subscription-backfill.repository.js +48 -0
  150. package/dist/foundations/stripe-subscription/backfills/stripe-subscription-backfill.repository.js.map +1 -0
  151. package/dist/foundations/stripe-subscription/backfills/stripe-subscription-discount-backfill.service.d.ts +51 -0
  152. package/dist/foundations/stripe-subscription/backfills/stripe-subscription-discount-backfill.service.d.ts.map +1 -0
  153. package/dist/foundations/stripe-subscription/backfills/stripe-subscription-discount-backfill.service.js +129 -0
  154. package/dist/foundations/stripe-subscription/backfills/stripe-subscription-discount-backfill.service.js.map +1 -0
  155. package/dist/foundations/stripe-subscription/controllers/stripe-subscription.controller.d.ts +7 -1
  156. package/dist/foundations/stripe-subscription/controllers/stripe-subscription.controller.d.ts.map +1 -1
  157. package/dist/foundations/stripe-subscription/controllers/stripe-subscription.controller.js +18 -5
  158. package/dist/foundations/stripe-subscription/controllers/stripe-subscription.controller.js.map +1 -1
  159. package/dist/foundations/stripe-subscription/entities/stripe-subscription.discount.d.ts +30 -0
  160. package/dist/foundations/stripe-subscription/entities/stripe-subscription.discount.d.ts.map +1 -0
  161. package/dist/foundations/stripe-subscription/entities/stripe-subscription.discount.js +57 -0
  162. package/dist/foundations/stripe-subscription/entities/stripe-subscription.discount.js.map +1 -0
  163. package/dist/foundations/stripe-subscription/entities/stripe-subscription.entity.d.ts +7 -0
  164. package/dist/foundations/stripe-subscription/entities/stripe-subscription.entity.d.ts.map +1 -1
  165. package/dist/foundations/stripe-subscription/entities/stripe-subscription.map.d.ts.map +1 -1
  166. package/dist/foundations/stripe-subscription/entities/stripe-subscription.map.js +6 -0
  167. package/dist/foundations/stripe-subscription/entities/stripe-subscription.map.js.map +1 -1
  168. package/dist/foundations/stripe-subscription/entities/stripe-subscription.meta.d.ts +8 -0
  169. package/dist/foundations/stripe-subscription/entities/stripe-subscription.meta.d.ts.map +1 -1
  170. package/dist/foundations/stripe-subscription/entities/stripe-subscription.meta.js +9 -1
  171. package/dist/foundations/stripe-subscription/entities/stripe-subscription.meta.js.map +1 -1
  172. package/dist/foundations/stripe-subscription/index.d.ts +3 -2
  173. package/dist/foundations/stripe-subscription/index.d.ts.map +1 -1
  174. package/dist/foundations/stripe-subscription/index.js +5 -1
  175. package/dist/foundations/stripe-subscription/index.js.map +1 -1
  176. package/dist/foundations/stripe-subscription/repositories/stripe-subscription.repository.d.ts +14 -0
  177. package/dist/foundations/stripe-subscription/repositories/stripe-subscription.repository.d.ts.map +1 -1
  178. package/dist/foundations/stripe-subscription/repositories/stripe-subscription.repository.js +32 -0
  179. package/dist/foundations/stripe-subscription/repositories/stripe-subscription.repository.js.map +1 -1
  180. package/dist/foundations/stripe-subscription/serialisers/stripe-subscription.serialiser.d.ts.map +1 -1
  181. package/dist/foundations/stripe-subscription/serialisers/stripe-subscription.serialiser.js +6 -0
  182. package/dist/foundations/stripe-subscription/serialisers/stripe-subscription.serialiser.js.map +1 -1
  183. package/dist/foundations/stripe-subscription/services/stripe-subscription-admin.service.d.ts +34 -1
  184. package/dist/foundations/stripe-subscription/services/stripe-subscription-admin.service.d.ts.map +1 -1
  185. package/dist/foundations/stripe-subscription/services/stripe-subscription-admin.service.js +165 -29
  186. package/dist/foundations/stripe-subscription/services/stripe-subscription-admin.service.js.map +1 -1
  187. package/dist/foundations/stripe-subscription/services/stripe-subscription-api.service.d.ts +7 -0
  188. package/dist/foundations/stripe-subscription/services/stripe-subscription-api.service.d.ts.map +1 -1
  189. package/dist/foundations/stripe-subscription/services/stripe-subscription-api.service.js +29 -2
  190. package/dist/foundations/stripe-subscription/services/stripe-subscription-api.service.js.map +1 -1
  191. package/dist/foundations/stripe-subscription/services/subscription-payment-confirmation.d.ts +27 -0
  192. package/dist/foundations/stripe-subscription/services/subscription-payment-confirmation.d.ts.map +1 -0
  193. package/dist/foundations/stripe-subscription/services/subscription-payment-confirmation.js +62 -0
  194. package/dist/foundations/stripe-subscription/services/subscription-payment-confirmation.js.map +1 -0
  195. package/dist/foundations/stripe-subscription/stripe-subscription.module.d.ts.map +1 -1
  196. package/dist/foundations/stripe-subscription/stripe-subscription.module.js +10 -0
  197. package/dist/foundations/stripe-subscription/stripe-subscription.module.js.map +1 -1
  198. package/dist/foundations/stripe-webhook/processors/stripe-webhook.processor.d.ts.map +1 -1
  199. package/dist/foundations/stripe-webhook/processors/stripe-webhook.processor.js +16 -1
  200. package/dist/foundations/stripe-webhook/processors/stripe-webhook.processor.js.map +1 -1
  201. package/dist/foundations/two-factor/controllers/passkey.controller.d.ts +1 -1
  202. package/dist/foundations/two-factor/controllers/passkey.controller.d.ts.map +1 -1
  203. package/dist/foundations/two-factor/controllers/passkey.controller.js +6 -5
  204. package/dist/foundations/two-factor/controllers/passkey.controller.js.map +1 -1
  205. package/package.json +1 -1
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.StripeCouponModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const registry_1 = require("../../common/registries/registry");
12
+ const cache_module_1 = require("../../core/cache/cache.module");
13
+ const jsonapi_module_1 = require("../../core/jsonapi/jsonapi.module");
14
+ const neo4j_module_1 = require("../../core/neo4j/neo4j.module");
15
+ const security_module_1 = require("../../core/security/security.module");
16
+ const audit_module_1 = require("../audit/audit.module");
17
+ const stripe_customer_module_1 = require("../stripe-customer/stripe-customer.module");
18
+ const stripe_price_module_1 = require("../stripe-price/stripe-price.module");
19
+ const stripe_product_module_1 = require("../stripe-product/stripe-product.module");
20
+ const stripe_subscription_module_1 = require("../stripe-subscription/stripe-subscription.module");
21
+ const stripe_module_1 = require("../stripe/stripe.module");
22
+ const stripe_coupon_code_checkout_controller_1 = require("./controllers/stripe-coupon-code-checkout.controller");
23
+ const stripe_coupon_code_controller_1 = require("./controllers/stripe-coupon-code.controller");
24
+ const stripe_coupon_controller_1 = require("./controllers/stripe-coupon.controller");
25
+ const stripe_coupon_public_controller_1 = require("./controllers/stripe-coupon.public.controller");
26
+ const stripe_coupon_1 = require("./entities/stripe-coupon");
27
+ const stripe_coupon_code_1 = require("./entities/stripe-coupon-code");
28
+ const stripe_coupon_offer_1 = require("./entities/stripe-coupon-offer");
29
+ const stripe_coupon_code_repository_1 = require("./repositories/stripe-coupon-code.repository");
30
+ const stripe_coupon_repository_1 = require("./repositories/stripe-coupon.repository");
31
+ const stripe_coupon_api_service_1 = require("./services/stripe-coupon-api.service");
32
+ const stripe_coupon_code_checkout_service_1 = require("./services/stripe-coupon-code-checkout.service");
33
+ const stripe_coupon_code_service_1 = require("./services/stripe-coupon-code.service");
34
+ const stripe_coupon_offer_service_1 = require("./services/stripe-coupon-offer.service");
35
+ const stripe_coupon_service_1 = require("./services/stripe-coupon.service");
36
+ /**
37
+ * StripeCouponModule — admin-managed Stripe coupons and their customer-facing codes.
38
+ *
39
+ * - Coupons and codes are created in Stripe first and mirrored as nodes
40
+ * (`StripeCoupon` -[:HAS_CODE]-> `StripeCouponCode`), like products
41
+ * - One code at a time can be "Apply automatically"; the subscription service
42
+ * attaches it at a GM's first payment (`StripeCouponCodeCheckoutService`)
43
+ * - A public read of the automatic code's places left (`StripeCouponPublicController`)
44
+ */
45
+ let StripeCouponModule = class StripeCouponModule {
46
+ onModuleInit() {
47
+ registry_1.modelRegistry.register(stripe_coupon_1.StripeCouponDescriptor.model);
48
+ registry_1.modelRegistry.register(stripe_coupon_code_1.StripeCouponCodeDescriptor.model);
49
+ // Synthetic resource (never a node): buildList needs it in the registry
50
+ registry_1.modelRegistry.register(stripe_coupon_offer_1.StripeCouponOfferDescriptor.model);
51
+ }
52
+ };
53
+ exports.StripeCouponModule = StripeCouponModule;
54
+ exports.StripeCouponModule = StripeCouponModule = __decorate([
55
+ (0, common_1.Module)({
56
+ imports: [
57
+ neo4j_module_1.Neo4JModule,
58
+ jsonapi_module_1.JsonApiModule,
59
+ security_module_1.SecurityModule,
60
+ cache_module_1.CacheModule,
61
+ audit_module_1.AuditModule,
62
+ (0, common_1.forwardRef)(() => stripe_module_1.StripeModule),
63
+ (0, common_1.forwardRef)(() => stripe_product_module_1.StripeProductModule),
64
+ (0, common_1.forwardRef)(() => stripe_price_module_1.StripePriceModule),
65
+ (0, common_1.forwardRef)(() => stripe_customer_module_1.StripeCustomerModule),
66
+ (0, common_1.forwardRef)(() => stripe_subscription_module_1.StripeSubscriptionModule),
67
+ ],
68
+ // The checkout controller comes first: its literal `stripe-coupon-codes/automatic`
69
+ // route must register before `stripe-coupon-codes/:codeId`.
70
+ controllers: [
71
+ stripe_coupon_code_checkout_controller_1.StripeCouponCodeCheckoutController,
72
+ stripe_coupon_controller_1.StripeCouponController,
73
+ stripe_coupon_code_controller_1.StripeCouponCodeController,
74
+ stripe_coupon_public_controller_1.StripeCouponPublicController,
75
+ ],
76
+ providers: [
77
+ stripe_coupon_1.StripeCouponDescriptor.model.serialiser,
78
+ stripe_coupon_code_1.StripeCouponCodeDescriptor.model.serialiser,
79
+ stripe_coupon_offer_1.StripeCouponOfferDescriptor.model.serialiser,
80
+ stripe_coupon_api_service_1.StripeCouponApiService,
81
+ stripe_coupon_repository_1.StripeCouponRepository,
82
+ stripe_coupon_code_repository_1.StripeCouponCodeRepository,
83
+ stripe_coupon_service_1.StripeCouponService,
84
+ stripe_coupon_code_service_1.StripeCouponCodeService,
85
+ stripe_coupon_code_checkout_service_1.StripeCouponCodeCheckoutService,
86
+ stripe_coupon_offer_service_1.StripeCouponOfferService,
87
+ ],
88
+ exports: [stripe_coupon_code_checkout_service_1.StripeCouponCodeCheckoutService, stripe_coupon_code_repository_1.StripeCouponCodeRepository, stripe_coupon_api_service_1.StripeCouponApiService],
89
+ })
90
+ ], StripeCouponModule);
91
+ //# sourceMappingURL=stripe-coupon.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe-coupon.module.js","sourceRoot":"","sources":["../../../src/foundations/stripe-coupon/stripe-coupon.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAkE;AAClE,+DAAiE;AACjE,gEAA4D;AAC5D,sEAAkE;AAClE,gEAA4D;AAC5D,yEAAqE;AACrE,wDAAoD;AACpD,sFAAiF;AACjF,6EAAwE;AACxE,mFAA8E;AAC9E,kGAA6F;AAC7F,2DAAuD;AACvD,iHAA0G;AAC1G,+FAAyF;AACzF,qFAAgF;AAChF,mGAA6F;AAC7F,4DAAkE;AAClE,sEAA2E;AAC3E,wEAA6E;AAC7E,gGAA0F;AAC1F,sFAAiF;AACjF,oFAA8E;AAC9E,wGAAiG;AACjG,sFAAgF;AAChF,wFAAkF;AAClF,4EAAuE;AAEvE;;;;;;;;GAQG;AAoCI,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAC7B,YAAY;QACV,wBAAa,CAAC,QAAQ,CAAC,sCAAsB,CAAC,KAAK,CAAC,CAAC;QACrD,wBAAa,CAAC,QAAQ,CAAC,+CAA0B,CAAC,KAAK,CAAC,CAAC;QACzD,wEAAwE;QACxE,wBAAa,CAAC,QAAQ,CAAC,iDAA2B,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC;CACF,CAAA;AAPY,gDAAkB;6BAAlB,kBAAkB;IAnC9B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,0BAAW;YACX,8BAAa;YACb,gCAAc;YACd,0BAAW;YACX,0BAAW;YACX,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,4BAAY,CAAC;YAC9B,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,2CAAmB,CAAC;YACrC,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,uCAAiB,CAAC;YACnC,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,6CAAoB,CAAC;YACtC,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,qDAAwB,CAAC;SAC3C;QACD,mFAAmF;QACnF,4DAA4D;QAC5D,WAAW,EAAE;YACX,2EAAkC;YAClC,iDAAsB;YACtB,0DAA0B;YAC1B,8DAA4B;SAC7B;QACD,SAAS,EAAE;YACT,sCAAsB,CAAC,KAAK,CAAC,UAAU;YACvC,+CAA0B,CAAC,KAAK,CAAC,UAAU;YAC3C,iDAA2B,CAAC,KAAK,CAAC,UAAU;YAC5C,kDAAsB;YACtB,iDAAsB;YACtB,0DAA0B;YAC1B,2CAAmB;YACnB,oDAAuB;YACvB,qEAA+B;YAC/B,sDAAwB;SACzB;QACD,OAAO,EAAE,CAAC,qEAA+B,EAAE,0DAA0B,EAAE,kDAAsB,CAAC;KAC/F,CAAC;GACW,kBAAkB,CAO9B"}
@@ -0,0 +1,19 @@
1
+ import type { StripeCoupon } from "../entities/stripe-coupon";
2
+ import type { StripeCouponCode } from "../entities/stripe-coupon-code";
3
+ type CodeLimits = Pick<StripeCouponCode, "maxRedemptions" | "timesRedeemed">;
4
+ type CouponLimits = Pick<StripeCoupon, "maxRedemptions" | "timesRedeemed">;
5
+ /**
6
+ * Places left for a code: the smaller of (coupon limit - coupon redeemed) and
7
+ * (code limit - code redeemed), counting only the limits that are set. Never below zero.
8
+ *
9
+ * @returns null when neither limit is set (unlimited)
10
+ */
11
+ export declare function placesLeft(code: CodeLimits, coupon: CouponLimits): number | null;
12
+ /**
13
+ * Total places for a code: the smaller of the set limits (coupon and code).
14
+ *
15
+ * @returns null when neither limit is set (unlimited)
16
+ */
17
+ export declare function placesTotal(code: CodeLimits, coupon: CouponLimits): number | null;
18
+ export {};
19
+ //# sourceMappingURL=places-left.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"places-left.d.ts","sourceRoot":"","sources":["../../../../src/foundations/stripe-coupon/utils/places-left.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAEvE,KAAK,UAAU,GAAG,IAAI,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,eAAe,CAAC,CAAC;AAC7E,KAAK,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,gBAAgB,GAAG,eAAe,CAAC,CAAC;AAI3E;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAMhF;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAIjF"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.placesLeft = placesLeft;
4
+ exports.placesTotal = placesTotal;
5
+ const isSet = (value) => value !== undefined && value !== null;
6
+ /**
7
+ * Places left for a code: the smaller of (coupon limit - coupon redeemed) and
8
+ * (code limit - code redeemed), counting only the limits that are set. Never below zero.
9
+ *
10
+ * @returns null when neither limit is set (unlimited)
11
+ */
12
+ function placesLeft(code, coupon) {
13
+ const remaining = [];
14
+ if (isSet(coupon.maxRedemptions))
15
+ remaining.push(coupon.maxRedemptions - (coupon.timesRedeemed ?? 0));
16
+ if (isSet(code.maxRedemptions))
17
+ remaining.push(code.maxRedemptions - (code.timesRedeemed ?? 0));
18
+ if (remaining.length === 0)
19
+ return null;
20
+ return Math.max(0, Math.min(...remaining));
21
+ }
22
+ /**
23
+ * Total places for a code: the smaller of the set limits (coupon and code).
24
+ *
25
+ * @returns null when neither limit is set (unlimited)
26
+ */
27
+ function placesTotal(code, coupon) {
28
+ const limits = [coupon.maxRedemptions, code.maxRedemptions].filter(isSet);
29
+ if (limits.length === 0)
30
+ return null;
31
+ return Math.min(...limits);
32
+ }
33
+ //# sourceMappingURL=places-left.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"places-left.js","sourceRoot":"","sources":["../../../../src/foundations/stripe-coupon/utils/places-left.ts"],"names":[],"mappings":";;AAcA,gCAMC;AAOD,kCAIC;AAzBD,MAAM,KAAK,GAAG,CAAC,KAAgC,EAAmB,EAAE,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC;AAE3G;;;;;GAKG;AACH,SAAgB,UAAU,CAAC,IAAgB,EAAE,MAAoB;IAC/D,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC;QAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC;IACtG,IAAI,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC;QAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC;IAChG,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,SAAgB,WAAW,CAAC,IAAgB,EAAE,MAAoB;IAChE,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { Neo4jService } from "../../../core/neo4j";
2
+ /**
3
+ * Records which one-off StripeSubscription backfills have finished, so a worker
4
+ * boot runs each of them once per database.
5
+ *
6
+ * The marker is a `(:StripeSubscriptionBackfill {id})` node. It is not a
7
+ * `(:Migration)` node on purpose: the migrator orders Migration nodes by their
8
+ * date/increment version and reads the newest as "last applied", so a library
9
+ * marker there would make it skip the app's own migrations.
10
+ */
11
+ export declare class StripeSubscriptionBackfillRepository {
12
+ private readonly neo4j;
13
+ constructor(neo4j: Neo4jService);
14
+ isCompleted(params: {
15
+ id: string;
16
+ }): Promise<boolean>;
17
+ markCompleted(params: {
18
+ id: string;
19
+ summary: string;
20
+ }): Promise<void>;
21
+ }
22
+ //# sourceMappingURL=stripe-subscription-backfill.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe-subscription-backfill.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/stripe-subscription/backfills/stripe-subscription-backfill.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD;;;;;;;;GAQG;AACH,qBACa,oCAAoC;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,YAAY;IAE1C,WAAW,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAQrD,aAAa,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAU5E"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.StripeSubscriptionBackfillRepository = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const neo4j_1 = require("../../../core/neo4j");
15
+ /**
16
+ * Records which one-off StripeSubscription backfills have finished, so a worker
17
+ * boot runs each of them once per database.
18
+ *
19
+ * The marker is a `(:StripeSubscriptionBackfill {id})` node. It is not a
20
+ * `(:Migration)` node on purpose: the migrator orders Migration nodes by their
21
+ * date/increment version and reads the newest as "last applied", so a library
22
+ * marker there would make it skip the app's own migrations.
23
+ */
24
+ let StripeSubscriptionBackfillRepository = class StripeSubscriptionBackfillRepository {
25
+ constructor(neo4j) {
26
+ this.neo4j = neo4j;
27
+ }
28
+ async isCompleted(params) {
29
+ const total = await this.neo4j.readCount(`MATCH (backfill:StripeSubscriptionBackfill {id: $id}) RETURN count(backfill) AS total`, { id: params.id });
30
+ return total > 0;
31
+ }
32
+ async markCompleted(params) {
33
+ await this.neo4j.writeOne({
34
+ query: `
35
+ MERGE (backfill:StripeSubscriptionBackfill {id: $id})
36
+ ON CREATE SET backfill.createdAt = datetime()
37
+ SET backfill.completedAt = datetime(), backfill.summary = $summary
38
+ `,
39
+ queryParams: { id: params.id, summary: params.summary },
40
+ });
41
+ }
42
+ };
43
+ exports.StripeSubscriptionBackfillRepository = StripeSubscriptionBackfillRepository;
44
+ exports.StripeSubscriptionBackfillRepository = StripeSubscriptionBackfillRepository = __decorate([
45
+ (0, common_1.Injectable)(),
46
+ __metadata("design:paramtypes", [neo4j_1.Neo4jService])
47
+ ], StripeSubscriptionBackfillRepository);
48
+ //# sourceMappingURL=stripe-subscription-backfill.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe-subscription-backfill.repository.js","sourceRoot":"","sources":["../../../../src/foundations/stripe-subscription/backfills/stripe-subscription-backfill.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,+CAAmD;AAEnD;;;;;;;;GAQG;AAEI,IAAM,oCAAoC,GAA1C,MAAM,oCAAoC;IAC/C,YAA6B,KAAmB;QAAnB,UAAK,GAAL,KAAK,CAAc;IAAG,CAAC;IAEpD,KAAK,CAAC,WAAW,CAAC,MAAsB;QACtC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CACtC,uFAAuF,EACvF,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAClB,CAAC;QACF,OAAO,KAAK,GAAG,CAAC,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAuC;QACzD,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;YACxB,KAAK,EAAE;;;;OAIN;YACD,WAAW,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE;SACxD,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AArBY,oFAAoC;+CAApC,oCAAoC;IADhD,IAAA,mBAAU,GAAE;qCAEyB,oBAAY;GADrC,oCAAoC,CAqBhD"}
@@ -0,0 +1,51 @@
1
+ import { OnApplicationBootstrap } from "@nestjs/common";
2
+ import { ClsService } from "nestjs-cls";
3
+ import { AppLoggingService } from "../../../core/logging/services/logging.service";
4
+ import { StripeService } from "../../stripe/services/stripe.service";
5
+ import { StripeSubscriptionRepository } from "../repositories/stripe-subscription.repository";
6
+ import { StripeSubscriptionApiService } from "../services/stripe-subscription-api.service";
7
+ import { StripeSubscriptionBackfillRepository } from "./stripe-subscription-backfill.repository";
8
+ /** Marker id: changing it makes every deployed app run the backfill again. */
9
+ export declare const STRIPE_SUBSCRIPTION_DISCOUNT_BACKFILL_ID = "stripe-subscription-discount-20261024";
10
+ export type StripeSubscriptionDiscountBackfillResult = {
11
+ /** Skipped without touching anything: Stripe off, or the marker already exists. */
12
+ skipped: "stripe-not-configured" | "already-completed" | null;
13
+ total: number;
14
+ /** Discount fields written (a discount, or null when Stripe says there is none). */
15
+ updated: number;
16
+ /** Stripe no longer has the subscription; node left as it is. */
17
+ missing: number;
18
+ /** Stripe answered but the discount could not be read; node left as it is. */
19
+ unreadable: number;
20
+ /** Any other error (network, rate limit, Neo4j); node left as it is, run retried on next boot. */
21
+ failed: number;
22
+ };
23
+ /**
24
+ * One-off backfill of the discount fields on every StripeSubscription node.
25
+ *
26
+ * The discount fields are written on create, plan change and Stripe sync only, so a
27
+ * subscription stored before they existed shows no discount until its next change.
28
+ * This reads each subscription from Stripe (with the discount expanded) and writes
29
+ * only the discount fields through {@link StripeSubscriptionRepository.update}.
30
+ *
31
+ * Runs in worker mode at application bootstrap, after the migrator (module init),
32
+ * in the background so a long list never delays the worker. A
33
+ * `(:StripeSubscriptionBackfill)` marker stops later boots from running it again; the
34
+ * marker is written only when no subscription failed for a transient reason, so an
35
+ * outage during the deploy is retried on the next boot. Re-running is harmless: each
36
+ * write is the value Stripe holds now.
37
+ */
38
+ export declare class StripeSubscriptionDiscountBackfillService implements OnApplicationBootstrap {
39
+ private readonly stripeService;
40
+ private readonly stripeSubscriptionApiService;
41
+ private readonly subscriptionRepository;
42
+ private readonly backfillRepository;
43
+ private readonly cls;
44
+ private readonly logger;
45
+ constructor(stripeService: StripeService, stripeSubscriptionApiService: StripeSubscriptionApiService, subscriptionRepository: StripeSubscriptionRepository, backfillRepository: StripeSubscriptionBackfillRepository, cls: ClsService, logger: AppLoggingService);
46
+ onApplicationBootstrap(): void;
47
+ /** Repository queries read the request context, so the run gets an empty one. */
48
+ run(): Promise<StripeSubscriptionDiscountBackfillResult>;
49
+ private backfill;
50
+ }
51
+ //# sourceMappingURL=stripe-subscription-discount-backfill.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe-subscription-discount-backfill.service.d.ts","sourceRoot":"","sources":["../../../../src/foundations/stripe-subscription/backfills/stripe-subscription-discount-backfill.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AAEnF,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAErE,OAAO,EAAE,4BAA4B,EAAE,MAAM,gDAAgD,CAAC;AAC9F,OAAO,EAAE,4BAA4B,EAAE,MAAM,6CAA6C,CAAC;AAC3F,OAAO,EAAE,oCAAoC,EAAE,MAAM,2CAA2C,CAAC;AAEjG,8EAA8E;AAC9E,eAAO,MAAM,wCAAwC,0CAA0C,CAAC;AAEhG,MAAM,MAAM,wCAAwC,GAAG;IACrD,mFAAmF;IACnF,OAAO,EAAE,uBAAuB,GAAG,mBAAmB,GAAG,IAAI,CAAC;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,oFAAoF;IACpF,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAC;IACnB,kGAAkG;IAClG,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,qBACa,yCAA0C,YAAW,sBAAsB;IAEpF,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,4BAA4B;IAC7C,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBALN,aAAa,EAAE,aAAa,EAC5B,4BAA4B,EAAE,4BAA4B,EAC1D,sBAAsB,EAAE,4BAA4B,EACpD,kBAAkB,EAAE,oCAAoC,EACxD,GAAG,EAAE,UAAU,EACf,MAAM,EAAE,iBAAiB;IAG5C,sBAAsB,IAAI,IAAI;IAM9B,iFAAiF;IAC3E,GAAG,IAAI,OAAO,CAAC,wCAAwC,CAAC;YAIhD,QAAQ;CAmEvB"}
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.StripeSubscriptionDiscountBackfillService = exports.STRIPE_SUBSCRIPTION_DISCOUNT_BACKFILL_ID = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const nestjs_cls_1 = require("nestjs-cls");
15
+ const logging_service_1 = require("../../../core/logging/services/logging.service");
16
+ const stripe_errors_1 = require("../../stripe/errors/stripe.errors");
17
+ const stripe_service_1 = require("../../stripe/services/stripe.service");
18
+ const stripe_subscription_discount_1 = require("../entities/stripe-subscription.discount");
19
+ const stripe_subscription_repository_1 = require("../repositories/stripe-subscription.repository");
20
+ const stripe_subscription_api_service_1 = require("../services/stripe-subscription-api.service");
21
+ const stripe_subscription_backfill_repository_1 = require("./stripe-subscription-backfill.repository");
22
+ /** Marker id: changing it makes every deployed app run the backfill again. */
23
+ exports.STRIPE_SUBSCRIPTION_DISCOUNT_BACKFILL_ID = "stripe-subscription-discount-20261024";
24
+ /**
25
+ * One-off backfill of the discount fields on every StripeSubscription node.
26
+ *
27
+ * The discount fields are written on create, plan change and Stripe sync only, so a
28
+ * subscription stored before they existed shows no discount until its next change.
29
+ * This reads each subscription from Stripe (with the discount expanded) and writes
30
+ * only the discount fields through {@link StripeSubscriptionRepository.update}.
31
+ *
32
+ * Runs in worker mode at application bootstrap, after the migrator (module init),
33
+ * in the background so a long list never delays the worker. A
34
+ * `(:StripeSubscriptionBackfill)` marker stops later boots from running it again; the
35
+ * marker is written only when no subscription failed for a transient reason, so an
36
+ * outage during the deploy is retried on the next boot. Re-running is harmless: each
37
+ * write is the value Stripe holds now.
38
+ */
39
+ let StripeSubscriptionDiscountBackfillService = class StripeSubscriptionDiscountBackfillService {
40
+ constructor(stripeService, stripeSubscriptionApiService, subscriptionRepository, backfillRepository, cls, logger) {
41
+ this.stripeService = stripeService;
42
+ this.stripeSubscriptionApiService = stripeSubscriptionApiService;
43
+ this.subscriptionRepository = subscriptionRepository;
44
+ this.backfillRepository = backfillRepository;
45
+ this.cls = cls;
46
+ this.logger = logger;
47
+ }
48
+ onApplicationBootstrap() {
49
+ void this.run().catch((error) => {
50
+ this.logger.error("Stripe subscription discount backfill aborted", error);
51
+ });
52
+ }
53
+ /** Repository queries read the request context, so the run gets an empty one. */
54
+ async run() {
55
+ return this.cls.run(() => this.backfill());
56
+ }
57
+ async backfill() {
58
+ const result = {
59
+ skipped: null,
60
+ total: 0,
61
+ updated: 0,
62
+ missing: 0,
63
+ unreadable: 0,
64
+ failed: 0,
65
+ };
66
+ if (!this.stripeService.isConfigured()) {
67
+ return { ...result, skipped: "stripe-not-configured" };
68
+ }
69
+ if (await this.backfillRepository.isCompleted({ id: exports.STRIPE_SUBSCRIPTION_DISCOUNT_BACKFILL_ID })) {
70
+ return { ...result, skipped: "already-completed" };
71
+ }
72
+ const subscriptions = await this.subscriptionRepository.findAll();
73
+ result.total = subscriptions.length;
74
+ this.logger.log(`Stripe subscription discount backfill: ${subscriptions.length} subscriptions`);
75
+ // Sequential on purpose: one Stripe read at a time.
76
+ for (const subscription of subscriptions) {
77
+ try {
78
+ const stripeSubscription = await this.stripeSubscriptionApiService.retrieveSubscription(subscription.stripeSubscriptionId);
79
+ const discount = (0, stripe_subscription_discount_1.discountFromStripeSubscription)(stripeSubscription);
80
+ if (discount === undefined) {
81
+ result.unreadable++;
82
+ this.logger.warn(`Stripe subscription discount backfill: discount of ${subscription.stripeSubscriptionId} is unreadable, left as it is`);
83
+ continue;
84
+ }
85
+ await this.subscriptionRepository.update({ id: subscription.id, discount });
86
+ result.updated++;
87
+ }
88
+ catch (error) {
89
+ if (isMissingInStripe(error)) {
90
+ result.missing++;
91
+ this.logger.warn(`Stripe subscription discount backfill: ${subscription.stripeSubscriptionId} not found in Stripe, left as it is`);
92
+ continue;
93
+ }
94
+ result.failed++;
95
+ this.logger.error(`Stripe subscription discount backfill: ${subscription.stripeSubscriptionId} failed, left as it is`, error);
96
+ }
97
+ }
98
+ const summary = `total=${result.total} updated=${result.updated} missing=${result.missing} unreadable=${result.unreadable} failed=${result.failed}`;
99
+ if (result.failed === 0) {
100
+ await this.backfillRepository.markCompleted({ id: exports.STRIPE_SUBSCRIPTION_DISCOUNT_BACKFILL_ID, summary });
101
+ this.logger.log(`Stripe subscription discount backfill completed: ${summary}`);
102
+ }
103
+ else {
104
+ this.logger.warn(`Stripe subscription discount backfill incomplete, retried on next boot: ${summary}`);
105
+ }
106
+ return result;
107
+ }
108
+ };
109
+ exports.StripeSubscriptionDiscountBackfillService = StripeSubscriptionDiscountBackfillService;
110
+ exports.StripeSubscriptionDiscountBackfillService = StripeSubscriptionDiscountBackfillService = __decorate([
111
+ (0, common_1.Injectable)(),
112
+ __metadata("design:paramtypes", [stripe_service_1.StripeService,
113
+ stripe_subscription_api_service_1.StripeSubscriptionApiService,
114
+ stripe_subscription_repository_1.StripeSubscriptionRepository,
115
+ stripe_subscription_backfill_repository_1.StripeSubscriptionBackfillRepository,
116
+ nestjs_cls_1.ClsService,
117
+ logging_service_1.AppLoggingService])
118
+ ], StripeSubscriptionDiscountBackfillService);
119
+ /**
120
+ * A deleted or unknown subscription: Stripe answers 404 `resource_missing`, which
121
+ * {@link StripeSubscriptionApiService.retrieveSubscription} rethrows as a 400 StripeError.
122
+ */
123
+ function isMissingInStripe(error) {
124
+ if (error instanceof stripe_errors_1.StripeError)
125
+ return error.stripeCode === "resource_missing";
126
+ const raw = error;
127
+ return raw?.code === "resource_missing" || raw?.statusCode === common_1.HttpStatus.NOT_FOUND;
128
+ }
129
+ //# sourceMappingURL=stripe-subscription-discount-backfill.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe-subscription-discount-backfill.service.js","sourceRoot":"","sources":["../../../../src/foundations/stripe-subscription/backfills/stripe-subscription-discount-backfill.service.ts"],"names":[],"mappings":"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"}
@@ -3,9 +3,11 @@ import { AuthenticatedRequest } from "../../../common/interfaces/authenticated.r
3
3
  import { StripeSubscriptionCancelDTO, StripeSubscriptionChangePlanDTO, StripeSubscriptionPostDTO } from "../dtos/stripe-subscription.dto";
4
4
  import { StripeSubscriptionStatus } from "../entities/stripe-subscription.entity";
5
5
  import { StripeSubscriptionAdminService } from "../services/stripe-subscription-admin.service";
6
+ import { CacheService } from "../../../core/cache/services/cache.service";
6
7
  export declare class StripeSubscriptionController {
7
8
  private readonly subscriptionService;
8
- constructor(subscriptionService: StripeSubscriptionAdminService);
9
+ private readonly cacheService;
10
+ constructor(subscriptionService: StripeSubscriptionAdminService, cacheService: CacheService);
9
11
  listSubscriptions(req: AuthenticatedRequest, reply: FastifyReply, query: any, status?: StripeSubscriptionStatus): Promise<void>;
10
12
  getSubscription(req: AuthenticatedRequest, reply: FastifyReply, subscriptionId: string): Promise<void>;
11
13
  createSubscription(req: AuthenticatedRequest, reply: FastifyReply, body: StripeSubscriptionPostDTO): Promise<void>;
@@ -14,6 +16,10 @@ export declare class StripeSubscriptionController {
14
16
  resumeSubscription(req: AuthenticatedRequest, reply: FastifyReply, subscriptionId: string): Promise<void>;
15
17
  changePlan(req: AuthenticatedRequest, reply: FastifyReply, subscriptionId: string, body: StripeSubscriptionChangePlanDTO): Promise<void>;
16
18
  previewProration(req: AuthenticatedRequest, reply: FastifyReply, subscriptionId: string, priceId: string): Promise<void>;
19
+ /**
20
+ * Re-reads the subscription from Stripe and stores it. The wizard calls it right after the
21
+ * browser confirmed the first payment, before the webhooks arrive.
22
+ */
17
23
  syncSubscription(req: AuthenticatedRequest, reply: FastifyReply, subscriptionId: string): Promise<void>;
18
24
  }
19
25
  //# sourceMappingURL=stripe-subscription.controller.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stripe-subscription.controller.d.ts","sourceRoot":"","sources":["../../../../src/foundations/stripe-subscription/controllers/stripe-subscription.controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,4DAA4D,CAAC;AAClG,OAAO,EACL,2BAA2B,EAC3B,+BAA+B,EAC/B,yBAAyB,EAC1B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAElF,OAAO,EAAE,8BAA8B,EAAE,MAAM,+CAA+C,CAAC;AAI/F,qBAEa,4BAA4B;IAC3B,OAAO,CAAC,QAAQ,CAAC,mBAAmB;gBAAnB,mBAAmB,EAAE,8BAA8B;IAK1E,iBAAiB,CACd,GAAG,EAAE,oBAAoB,EACzB,KAAK,EAAE,YAAY,EACjB,KAAK,EAAE,GAAG,EACF,MAAM,CAAC,EAAE,wBAAwB;IAc9C,eAAe,CACZ,GAAG,EAAE,oBAAoB,EACzB,KAAK,EAAE,YAAY,EACD,cAAc,EAAE,MAAM;IAa3C,kBAAkB,CACf,GAAG,EAAE,oBAAoB,EACzB,KAAK,EAAE,YAAY,EAClB,IAAI,EAAE,yBAAyB;IA0BnC,kBAAkB,CACf,GAAG,EAAE,oBAAoB,EACzB,KAAK,EAAE,YAAY,EACD,cAAc,EAAE,MAAM,EACvC,IAAI,EAAE,2BAA2B;IAcrC,iBAAiB,CACd,GAAG,EAAE,oBAAoB,EACzB,KAAK,EAAE,YAAY,EACD,cAAc,EAAE,MAAM;IAa3C,kBAAkB,CACf,GAAG,EAAE,oBAAoB,EACzB,KAAK,EAAE,YAAY,EACD,cAAc,EAAE,MAAM;IAa3C,UAAU,CACP,GAAG,EAAE,oBAAoB,EACzB,KAAK,EAAE,YAAY,EACD,cAAc,EAAE,MAAM,EACvC,IAAI,EAAE,+BAA+B;IAoBzC,gBAAgB,CACb,GAAG,EAAE,oBAAoB,EACzB,KAAK,EAAE,YAAY,EACD,cAAc,EAAE,MAAM,EAC7B,OAAO,EAAE,MAAM;IAkB7B,gBAAgB,CACb,GAAG,EAAE,oBAAoB,EACzB,KAAK,EAAE,YAAY,EACD,cAAc,EAAE,MAAM;CA2BlD"}
1
+ {"version":3,"file":"stripe-subscription.controller.d.ts","sourceRoot":"","sources":["../../../../src/foundations/stripe-subscription/controllers/stripe-subscription.controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,4DAA4D,CAAC;AAClG,OAAO,EACL,2BAA2B,EAC3B,+BAA+B,EAC/B,yBAAyB,EAC1B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAElF,OAAO,EAAE,8BAA8B,EAAE,MAAM,+CAA+C,CAAC;AAI/F,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAE1E,qBAEa,4BAA4B;IAErC,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IAEpC,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAFZ,mBAAmB,EAAE,8BAA8B,EAEnD,YAAY,EAAE,YAAY;IAMvC,iBAAiB,CACd,GAAG,EAAE,oBAAoB,EACzB,KAAK,EAAE,YAAY,EACjB,KAAK,EAAE,GAAG,EACF,MAAM,CAAC,EAAE,wBAAwB;IAc9C,eAAe,CACZ,GAAG,EAAE,oBAAoB,EACzB,KAAK,EAAE,YAAY,EACD,cAAc,EAAE,MAAM;IAa3C,kBAAkB,CACf,GAAG,EAAE,oBAAoB,EACzB,KAAK,EAAE,YAAY,EAClB,IAAI,EAAE,yBAAyB;IA0BnC,kBAAkB,CACf,GAAG,EAAE,oBAAoB,EACzB,KAAK,EAAE,YAAY,EACD,cAAc,EAAE,MAAM,EACvC,IAAI,EAAE,2BAA2B;IAcrC,iBAAiB,CACd,GAAG,EAAE,oBAAoB,EACzB,KAAK,EAAE,YAAY,EACD,cAAc,EAAE,MAAM;IAa3C,kBAAkB,CACf,GAAG,EAAE,oBAAoB,EACzB,KAAK,EAAE,YAAY,EACD,cAAc,EAAE,MAAM;IAa3C,UAAU,CACP,GAAG,EAAE,oBAAoB,EACzB,KAAK,EAAE,YAAY,EACD,cAAc,EAAE,MAAM,EACvC,IAAI,EAAE,+BAA+B;IAoBzC,gBAAgB,CACb,GAAG,EAAE,oBAAoB,EACzB,KAAK,EAAE,YAAY,EACD,cAAc,EAAE,MAAM,EAC7B,OAAO,EAAE,MAAM;IAgBnC;;;OAGG;IAOG,gBAAgB,CACb,GAAG,EAAE,oBAAoB,EACzB,KAAK,EAAE,YAAY,EACD,cAAc,EAAE,MAAM;CA0BlD"}
@@ -20,9 +20,14 @@ const stripe_subscription_meta_1 = require("../entities/stripe-subscription.meta
20
20
  const stripe_subscription_admin_service_1 = require("../services/stripe-subscription-admin.service");
21
21
  const module_decorator_1 = require("../../../common/decorators/module.decorator");
22
22
  const core_module_ids_1 = require("../../../common/constants/core-module.ids");
23
+ const cache_invalidate_decorator_1 = require("../../../common/decorators/cache-invalidate.decorator");
24
+ const cache_service_1 = require("../../../core/cache/services/cache.service");
23
25
  let StripeSubscriptionController = class StripeSubscriptionController {
24
- constructor(subscriptionService) {
26
+ constructor(subscriptionService,
27
+ // Read by @CacheInvalidate
28
+ cacheService) {
25
29
  this.subscriptionService = subscriptionService;
30
+ this.cacheService = cacheService;
26
31
  }
27
32
  async listSubscriptions(req, reply, query, status) {
28
33
  const response = await this.subscriptionService.listSubscriptions({
@@ -105,13 +110,18 @@ let StripeSubscriptionController = class StripeSubscriptionController {
105
110
  });
106
111
  reply.send(response);
107
112
  }
113
+ /**
114
+ * Re-reads the subscription from Stripe and stores it. The wizard calls it right after the
115
+ * browser confirmed the first payment, before the webhooks arrive.
116
+ */
117
+ // @Roles sits above @CacheInvalidate, which replaces the method: metadata set
118
+ // below it would land on the discarded original and never be enforced.
108
119
  async syncSubscription(req, reply, subscriptionId) {
109
- // First get the subscription to verify ownership and get stripe ID
120
+ // Ownership: getSubscription answers 404 / 403 for a subscription of another company
110
121
  const subscription = await this.subscriptionService.getSubscription({
111
122
  id: subscriptionId,
112
123
  companyId: req.user.companyId,
113
124
  });
114
- // Extract stripeSubscriptionId from the response
115
125
  const stripeSubscriptionId = subscription.data?.attributes?.stripeSubscriptionId;
116
126
  if (!stripeSubscriptionId) {
117
127
  reply.status(common_1.HttpStatus.BAD_REQUEST).send({ error: "Subscription has no Stripe ID" });
@@ -222,8 +232,10 @@ __decorate([
222
232
  __metadata("design:returntype", Promise)
223
233
  ], StripeSubscriptionController.prototype, "previewProration", null);
224
234
  __decorate([
225
- (0, common_1.Post)(`${stripe_subscription_meta_1.stripeSubscriptionMeta.endpoint}/:subscriptionId/sync`),
235
+ (0, common_1.Post)(`${stripe_subscription_meta_1.stripeSubscriptionMeta.endpoint}/:subscriptionId/${stripe_subscription_meta_1.STRIPE_SUBSCRIPTION_SYNC_SEGMENT}`),
226
236
  (0, common_1.UseGuards)(common_2.JwtAuthGuard),
237
+ (0, common_2.Roles)(common_2.RoleId.CompanyAdministrator),
238
+ (0, cache_invalidate_decorator_1.CacheInvalidate)(stripe_subscription_meta_1.stripeSubscriptionMeta, "subscriptionId"),
227
239
  __param(0, (0, common_1.Req)()),
228
240
  __param(1, (0, common_1.Res)()),
229
241
  __param(2, (0, common_1.Param)("subscriptionId")),
@@ -234,6 +246,7 @@ __decorate([
234
246
  exports.StripeSubscriptionController = StripeSubscriptionController = __decorate([
235
247
  (0, module_decorator_1.ModuleACL)({ module: core_module_ids_1.CoreModuleId.Billing }),
236
248
  (0, common_1.Controller)(),
237
- __metadata("design:paramtypes", [stripe_subscription_admin_service_1.StripeSubscriptionAdminService])
249
+ __metadata("design:paramtypes", [stripe_subscription_admin_service_1.StripeSubscriptionAdminService,
250
+ cache_service_1.CacheService])
238
251
  ], StripeSubscriptionController);
239
252
  //# sourceMappingURL=stripe-subscription.controller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stripe-subscription.controller.js","sourceRoot":"","sources":["../../../../src/foundations/stripe-subscription/controllers/stripe-subscription.controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stripe-subscription.controller.js","sourceRoot":"","sources":["../../../../src/foundations/stripe-subscription/controllers/stripe-subscription.controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import Stripe from "stripe";
2
+ import { StripeSubscriptionDiscountDuration } from "./stripe-subscription.entity";
3
+ /**
4
+ * The discount a subscription carries, as written to the StripeSubscription node.
5
+ * Every field is null when the coupon does not set it, so a write clears what an
6
+ * earlier discount left behind.
7
+ */
8
+ export type StripeSubscriptionDiscount = {
9
+ percentOff: number | null;
10
+ amountOff: number | null;
11
+ currency: string | null;
12
+ duration: StripeSubscriptionDiscountDuration;
13
+ durationInMonths: number | null;
14
+ end: Date | null;
15
+ };
16
+ /**
17
+ * The Stripe `expand` path that makes `subscription.discounts` readable by
18
+ * {@link discountFromStripeSubscription}. Without it Stripe returns discount ids only.
19
+ */
20
+ export declare const STRIPE_SUBSCRIPTION_DISCOUNT_EXPAND = "discounts.source.coupon";
21
+ /**
22
+ * Reads the discount of a Stripe subscription (its first subscription-level discount).
23
+ *
24
+ * - `null`: Stripe says the subscription has no discount; the stored one must be cleared.
25
+ * - `undefined`: the discount cannot be read (ids not expanded); leave the stored one as it is.
26
+ */
27
+ export declare function discountFromStripeSubscription(subscription: Pick<Stripe.Subscription, "discounts">): StripeSubscriptionDiscount | null | undefined;
28
+ /** Query parameters for the discount fields; all null when there is no discount. */
29
+ export declare function discountQueryParams(discount: StripeSubscriptionDiscount | null): Record<string, unknown>;
30
+ //# sourceMappingURL=stripe-subscription.discount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe-subscription.discount.d.ts","sourceRoot":"","sources":["../../../../src/foundations/stripe-subscription/entities/stripe-subscription.discount.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,kCAAkC,EAAE,MAAM,8BAA8B,CAAC;AAElF;;;;GAIG;AACH,MAAM,MAAM,0BAA0B,GAAG;IACvC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,kCAAkC,CAAC;IAC7C,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,GAAG,EAAE,IAAI,GAAG,IAAI,CAAC;CAClB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,mCAAmC,4BAA4B,CAAC;AAE7E;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAC5C,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,GACnD,0BAA0B,GAAG,IAAI,GAAG,SAAS,CAsB/C;AAQD,oFAAoF;AACpF,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,0BAA0B,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASxG"}