@openlup/platform 0.26.0 → 0.27.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 (520) hide show
  1. package/CHANGELOG.md +138 -218
  2. package/README.md +229 -16
  3. package/dist/commerce/adapters/managed/commerceOmsControlPlane.d.ts +3 -0
  4. package/dist/commerce/adapters/managed/commerceOmsControlPlane.js +71 -0
  5. package/dist/commerce/adapters/managed/commerceOmsMutations.d.ts +10 -0
  6. package/dist/commerce/adapters/managed/commerceOmsMutations.js +119 -0
  7. package/dist/commerce/adapters/managed/commerceOmsPort.d.ts +28 -0
  8. package/dist/commerce/adapters/managed/commerceOmsPort.js +101 -0
  9. package/dist/commerce/adapters/managed/oms/accounting.d.ts +3 -0
  10. package/dist/commerce/adapters/managed/oms/accounting.js +13 -0
  11. package/dist/commerce/adapters/managed/oms/fulfillmentReads.d.ts +17 -0
  12. package/dist/commerce/adapters/managed/oms/fulfillmentReads.js +81 -0
  13. package/dist/commerce/adapters/managed/oms/inboundEvents.d.ts +9 -0
  14. package/dist/commerce/adapters/managed/oms/inboundEvents.js +40 -0
  15. package/dist/commerce/adapters/managed/oms/outboxEvents.d.ts +2 -0
  16. package/dist/commerce/adapters/managed/oms/outboxEvents.js +23 -0
  17. package/dist/commerce/adapters/managed/oms/paymentAttempts.d.ts +3 -0
  18. package/dist/commerce/adapters/managed/oms/paymentAttempts.js +15 -0
  19. package/dist/commerce/adapters/managed/oms/queueSelection.d.ts +12 -0
  20. package/dist/commerce/adapters/managed/oms/queueSelection.js +109 -0
  21. package/dist/commerce/adapters/managed/oms/readProjections.d.ts +18 -0
  22. package/dist/commerce/adapters/managed/oms/readProjections.js +13 -0
  23. package/dist/commerce/adapters/managed/oms/readQueries.d.ts +16 -0
  24. package/dist/commerce/adapters/managed/oms/readQueries.js +276 -0
  25. package/dist/commerce/adapters/managed/oms/types.d.ts +2 -0
  26. package/dist/commerce/adapters/managed/oms/types.js +7 -0
  27. package/dist/commerce/checkoutCommandSchemas.d.ts +89 -0
  28. package/dist/commerce/checkoutCommandSchemas.js +70 -0
  29. package/dist/commerce/checkoutHelpers.d.ts +21 -0
  30. package/dist/commerce/checkoutHelpers.js +29 -0
  31. package/dist/commerce/checkoutResumeSchemas.d.ts +158 -0
  32. package/dist/commerce/checkoutResumeSchemas.js +145 -0
  33. package/dist/commerce/checkoutSchemas.d.ts +158 -0
  34. package/dist/commerce/checkoutSchemas.js +161 -0
  35. package/dist/commerce/commerceReturnsPort.d.ts +97 -0
  36. package/dist/commerce/commerceReturnsPort.js +39 -0
  37. package/dist/commerce/configuratorIntentPersistenceSchemas.d.ts +20 -0
  38. package/dist/commerce/configuratorIntentPersistenceSchemas.js +21 -0
  39. package/dist/commerce/configuratorIntentSchemas.d.ts +63 -0
  40. package/dist/commerce/configuratorIntentSchemas.js +43 -0
  41. package/dist/commerce/contractPrimitives.d.ts +50 -0
  42. package/dist/commerce/contractPrimitives.js +25 -0
  43. package/dist/commerce/contracts/availability.d.ts +23 -0
  44. package/dist/commerce/contracts/availability.js +1 -0
  45. package/dist/commerce/contracts/fulfillmentRecovery.d.ts +25 -0
  46. package/dist/commerce/contracts/fulfillmentRecovery.js +1 -0
  47. package/dist/commerce/contracts/index.d.ts +13 -0
  48. package/dist/commerce/contracts/index.js +1 -0
  49. package/dist/commerce/contracts/intent.d.ts +86 -0
  50. package/dist/commerce/contracts/intent.js +1 -0
  51. package/dist/commerce/contracts/omsTypes.d.ts +1216 -0
  52. package/dist/commerce/contracts/omsTypes.js +1 -0
  53. package/dist/commerce/contracts/order.d.ts +39 -0
  54. package/dist/commerce/contracts/order.js +1 -0
  55. package/dist/commerce/contracts/orderMoney.d.ts +52 -0
  56. package/dist/commerce/contracts/orderMoney.js +1 -0
  57. package/dist/commerce/contracts/ports.d.ts +113 -0
  58. package/dist/commerce/contracts/ports.js +1 -0
  59. package/dist/commerce/contracts/recovery.d.ts +11 -0
  60. package/dist/commerce/contracts/recovery.js +1 -0
  61. package/dist/commerce/contracts/runtimePorts.d.ts +196 -0
  62. package/dist/commerce/contracts/runtimePorts.js +1 -0
  63. package/dist/commerce/contracts/state.d.ts +26 -0
  64. package/dist/commerce/contracts/state.js +43 -0
  65. package/dist/commerce/customerDefaultsSnapshotSchemas.d.ts +51 -0
  66. package/dist/commerce/customerDefaultsSnapshotSchemas.js +106 -0
  67. package/dist/commerce/errors.d.ts +18 -0
  68. package/dist/commerce/errors.js +36 -0
  69. package/dist/commerce/fulfillmentEligibility.d.ts +6 -0
  70. package/dist/commerce/fulfillmentEligibility.js +31 -0
  71. package/dist/commerce/index.d.ts +72 -0
  72. package/dist/commerce/index.js +67 -0
  73. package/dist/commerce/model/customerFulfillmentRecovery.d.ts +40 -0
  74. package/dist/commerce/model/customerFulfillmentRecovery.js +144 -0
  75. package/dist/commerce/model/fulfillmentCancellationEligibility.d.ts +7 -0
  76. package/dist/commerce/model/fulfillmentCancellationEligibility.js +9 -0
  77. package/dist/commerce/model/omsAccountingVisibility.d.ts +12 -0
  78. package/dist/commerce/model/omsAccountingVisibility.js +118 -0
  79. package/dist/commerce/model/omsBillingInvoiceBuyer.d.ts +2 -0
  80. package/dist/commerce/model/omsBillingInvoiceBuyer.js +15 -0
  81. package/dist/commerce/model/omsCurrency.d.ts +4 -0
  82. package/dist/commerce/model/omsCurrency.js +5 -0
  83. package/dist/commerce/model/omsFulfillmentDebug.d.ts +20 -0
  84. package/dist/commerce/model/omsFulfillmentDebug.js +122 -0
  85. package/dist/commerce/model/omsFulfillmentSummary.d.ts +16 -0
  86. package/dist/commerce/model/omsFulfillmentSummary.js +189 -0
  87. package/dist/commerce/model/omsListTotals.d.ts +13 -0
  88. package/dist/commerce/model/omsListTotals.js +32 -0
  89. package/dist/commerce/model/omsOperationalLadder.d.ts +51 -0
  90. package/dist/commerce/model/omsOperationalLadder.js +158 -0
  91. package/dist/commerce/model/omsOrderLineMoney.d.ts +4 -0
  92. package/dist/commerce/model/omsOrderLineMoney.js +25 -0
  93. package/dist/commerce/model/omsPaymentMethodSummary.d.ts +5 -0
  94. package/dist/commerce/model/omsPaymentMethodSummary.js +11 -0
  95. package/dist/commerce/model/omsReadModel.d.ts +43 -0
  96. package/dist/commerce/model/omsReadModel.js +211 -0
  97. package/dist/commerce/model/omsReadModelCommunication.d.ts +3 -0
  98. package/dist/commerce/model/omsReadModelCommunication.js +29 -0
  99. package/dist/commerce/model/omsReadModelHelpers.d.ts +125 -0
  100. package/dist/commerce/model/omsReadModelHelpers.js +212 -0
  101. package/dist/commerce/model/omsReadModelList.d.ts +33 -0
  102. package/dist/commerce/model/omsReadModelList.js +50 -0
  103. package/dist/commerce/model/omsReadModelListSummary.d.ts +3 -0
  104. package/dist/commerce/model/omsReadModelListSummary.js +13 -0
  105. package/dist/commerce/model/omsReadModelPricing.d.ts +5 -0
  106. package/dist/commerce/model/omsReadModelPricing.js +36 -0
  107. package/dist/commerce/model/omsReadModelProjections.d.ts +1 -0
  108. package/dist/commerce/model/omsReadModelProjections.js +1 -0
  109. package/dist/commerce/model/omsReadModelRowCore.d.ts +79 -0
  110. package/dist/commerce/model/omsReadModelRowCore.js +149 -0
  111. package/dist/commerce/model/omsReadModelRows.d.ts +1 -0
  112. package/dist/commerce/model/omsReadModelRows.js +6 -0
  113. package/dist/commerce/offerAvailability.d.ts +18 -0
  114. package/dist/commerce/offerAvailability.js +53 -0
  115. package/dist/commerce/offerAvailabilitySchemas.d.ts +43 -0
  116. package/dist/commerce/offerAvailabilitySchemas.js +42 -0
  117. package/dist/commerce/offerEvidenceSchemas.d.ts +7 -0
  118. package/dist/commerce/offerEvidenceSchemas.js +13 -0
  119. package/dist/commerce/oms/omsContractBase.d.ts +130 -0
  120. package/dist/commerce/oms/omsContractBase.js +86 -0
  121. package/dist/commerce/oms/omsContractReadAuxSchemas.d.ts +222 -0
  122. package/dist/commerce/oms/omsContractReadAuxSchemas.js +123 -0
  123. package/dist/commerce/oms/omsContractReadSchemas.d.ts +2266 -0
  124. package/dist/commerce/oms/omsContractReadSchemas.js +277 -0
  125. package/dist/commerce/oms/omsContractRequests.d.ts +196 -0
  126. package/dist/commerce/oms/omsContractRequests.js +118 -0
  127. package/dist/commerce/oms/omsContracts.d.ts +5 -0
  128. package/dist/commerce/oms/omsContracts.js +4 -0
  129. package/dist/commerce/oms/omsControlPlane.d.ts +275 -0
  130. package/dist/commerce/oms/omsControlPlane.js +72 -0
  131. package/dist/commerce/oms/omsFulfillmentContractSchemas.d.ts +203 -0
  132. package/dist/commerce/oms/omsFulfillmentContractSchemas.js +94 -0
  133. package/dist/commerce/oms/omsFulfillmentDebugSchemas.d.ts +69 -0
  134. package/dist/commerce/oms/omsFulfillmentDebugSchemas.js +33 -0
  135. package/dist/commerce/oms/omsFulfillmentHealthSchemas.d.ts +67 -0
  136. package/dist/commerce/oms/omsFulfillmentHealthSchemas.js +44 -0
  137. package/dist/commerce/oms/omsPorts.d.ts +84 -0
  138. package/dist/commerce/oms/omsPorts.js +148 -0
  139. package/dist/commerce/oms/omsPrimitives.d.ts +5 -0
  140. package/dist/commerce/oms/omsPrimitives.js +3 -0
  141. package/dist/commerce/oms/omsProviderEvidenceSchemas.d.ts +15 -0
  142. package/dist/commerce/oms/omsProviderEvidenceSchemas.js +12 -0
  143. package/dist/commerce/orderDraftErrors.d.ts +13 -0
  144. package/dist/commerce/orderDraftErrors.js +20 -0
  145. package/dist/commerce/orderEmailEligibility.d.ts +54 -0
  146. package/dist/commerce/orderEmailEligibility.js +123 -0
  147. package/dist/commerce/orderEmailLines.d.ts +12 -0
  148. package/dist/commerce/orderEmailLines.js +8 -0
  149. package/dist/commerce/orderFeedbackContracts.d.ts +41 -0
  150. package/dist/commerce/orderFeedbackContracts.js +33 -0
  151. package/dist/commerce/orderMoney.d.ts +6 -0
  152. package/dist/commerce/orderMoney.js +168 -0
  153. package/dist/commerce/orderReviewContracts.d.ts +475 -0
  154. package/dist/commerce/orderReviewContracts.js +94 -0
  155. package/dist/commerce/orderReviewPorts.d.ts +140 -0
  156. package/dist/commerce/orderReviewPorts.js +1 -0
  157. package/dist/commerce/outboxDispatchContracts.d.ts +30 -0
  158. package/dist/commerce/outboxDispatchContracts.js +1 -0
  159. package/dist/commerce/outboxEventSchemas.d.ts +162 -0
  160. package/dist/commerce/outboxEventSchemas.js +164 -0
  161. package/dist/commerce/outboxOrderDraftEmailPorts.d.ts +207 -0
  162. package/dist/commerce/outboxOrderDraftEmailPorts.js +12 -0
  163. package/dist/commerce/paymentContinuation.d.ts +4 -0
  164. package/dist/commerce/paymentContinuation.js +4 -0
  165. package/dist/commerce/ports.d.ts +8 -0
  166. package/dist/commerce/ports.js +1 -0
  167. package/dist/commerce/recoveryDestination.d.ts +3 -0
  168. package/dist/commerce/recoveryDestination.js +17 -0
  169. package/dist/commerce/runtimeErrors.d.ts +8 -0
  170. package/dist/commerce/runtimeErrors.js +16 -0
  171. package/dist/commerce/salesChannelEnvelope.d.ts +20 -0
  172. package/dist/commerce/salesChannelEnvelope.js +7 -0
  173. package/dist/commerce/schemas.d.ts +174 -0
  174. package/dist/commerce/schemas.js +84 -0
  175. package/dist/commerce/server/checkoutCompensation.d.ts +21 -0
  176. package/dist/commerce/server/checkoutCompensation.js +32 -0
  177. package/dist/commerce/server/checkoutConflictClassifiers.d.ts +17 -0
  178. package/dist/commerce/server/checkoutConflictClassifiers.js +38 -0
  179. package/dist/commerce/server/checkoutExpiredRecoveryPolicy.d.ts +38 -0
  180. package/dist/commerce/server/checkoutExpiredRecoveryPolicy.js +85 -0
  181. package/dist/commerce/server/checkoutInvoiceBuyerSnapshot.d.ts +22 -0
  182. package/dist/commerce/server/checkoutInvoiceBuyerSnapshot.js +30 -0
  183. package/dist/commerce/server/checkoutOfferPolicyPort.d.ts +33 -0
  184. package/dist/commerce/server/checkoutOfferPolicyPort.js +49 -0
  185. package/dist/commerce/server/checkoutPaymentContinuationCredential.d.ts +58 -0
  186. package/dist/commerce/server/checkoutPaymentContinuationCredential.js +154 -0
  187. package/dist/commerce/server/checkoutQuoteTypes.d.ts +19 -0
  188. package/dist/commerce/server/checkoutQuoteTypes.js +1 -0
  189. package/dist/commerce/server/checkoutRecoveryOrderPort.d.ts +42 -0
  190. package/dist/commerce/server/checkoutRecoveryOrderPort.js +1 -0
  191. package/dist/commerce/server/checkoutRecoveryToken.d.ts +40 -0
  192. package/dist/commerce/server/checkoutRecoveryToken.js +26 -0
  193. package/dist/commerce/server/checkoutRefusalContinuation.d.ts +24 -0
  194. package/dist/commerce/server/checkoutRefusalContinuation.js +18 -0
  195. package/dist/commerce/server/checkoutRuntimeTypes.d.ts +81 -0
  196. package/dist/commerce/server/checkoutRuntimeTypes.js +1 -0
  197. package/dist/commerce/server/commerceCheckoutCommandExecution.d.ts +60 -0
  198. package/dist/commerce/server/commerceCheckoutCommandExecution.js +136 -0
  199. package/dist/commerce/server/commerceCheckoutCompensation.d.ts +26 -0
  200. package/dist/commerce/server/commerceCheckoutCompensation.js +46 -0
  201. package/dist/commerce/server/commerceCheckoutContinuationTerms.d.ts +50 -0
  202. package/dist/commerce/server/commerceCheckoutContinuationTerms.js +66 -0
  203. package/dist/commerce/server/commerceCheckoutCustomerDefaults.d.ts +18 -0
  204. package/dist/commerce/server/commerceCheckoutCustomerDefaults.js +17 -0
  205. package/dist/commerce/server/commerceCheckoutFailureHandler.d.ts +51 -0
  206. package/dist/commerce/server/commerceCheckoutFailureHandler.js +90 -0
  207. package/dist/commerce/server/commerceCheckoutHandler.d.ts +213 -0
  208. package/dist/commerce/server/commerceCheckoutHandler.js +196 -0
  209. package/dist/commerce/server/commerceCheckoutHandlerAdmission.d.ts +58 -0
  210. package/dist/commerce/server/commerceCheckoutHandlerAdmission.js +94 -0
  211. package/dist/commerce/server/commerceCheckoutHandlerHelpers.d.ts +67 -0
  212. package/dist/commerce/server/commerceCheckoutHandlerHelpers.js +155 -0
  213. package/dist/commerce/server/commerceCheckoutOrchestrationError.d.ts +9 -0
  214. package/dist/commerce/server/commerceCheckoutOrchestrationError.js +14 -0
  215. package/dist/commerce/server/commerceCheckoutPromotionPriceChange.d.ts +47 -0
  216. package/dist/commerce/server/commerceCheckoutPromotionPriceChange.js +43 -0
  217. package/dist/commerce/server/commerceCheckoutProviderPayment.d.ts +34 -0
  218. package/dist/commerce/server/commerceCheckoutProviderPayment.js +37 -0
  219. package/dist/commerce/server/commerceCheckoutQuoteGuard.d.ts +62 -0
  220. package/dist/commerce/server/commerceCheckoutQuoteGuard.js +106 -0
  221. package/dist/commerce/server/commerceCheckoutResume.d.ts +29 -0
  222. package/dist/commerce/server/commerceCheckoutResume.js +81 -0
  223. package/dist/commerce/server/commerceCheckoutResumeGuard.d.ts +54 -0
  224. package/dist/commerce/server/commerceCheckoutResumeGuard.js +138 -0
  225. package/dist/commerce/server/commerceCheckoutSavedPaymentMethod.d.ts +39 -0
  226. package/dist/commerce/server/commerceCheckoutSavedPaymentMethod.js +44 -0
  227. package/dist/commerce/server/commerceCheckoutStartRuntimeFailure.d.ts +7 -0
  228. package/dist/commerce/server/commerceCheckoutStartRuntimeFailure.js +39 -0
  229. package/dist/commerce/server/commerceCheckoutTiming.d.ts +8 -0
  230. package/dist/commerce/server/commerceCheckoutTiming.js +31 -0
  231. package/dist/commerce/server/commerceDiagnostics.d.ts +6 -0
  232. package/dist/commerce/server/commerceDiagnostics.js +31 -0
  233. package/dist/commerce/server/commerceOmsCancelOrderHandler.d.ts +7 -0
  234. package/dist/commerce/server/commerceOmsCancelOrderHandler.js +22 -0
  235. package/dist/commerce/server/commerceOmsControlPlaneHandlers.d.ts +18 -0
  236. package/dist/commerce/server/commerceOmsControlPlaneHandlers.js +60 -0
  237. package/dist/commerce/server/commerceOmsHandlers.d.ts +47 -0
  238. package/dist/commerce/server/commerceOmsHandlers.js +176 -0
  239. package/dist/commerce/server/commerceOmsMarkRefundedHandler.d.ts +7 -0
  240. package/dist/commerce/server/commerceOmsMarkRefundedHandler.js +19 -0
  241. package/dist/commerce/server/commerceOrderDraft.d.ts +24 -0
  242. package/dist/commerce/server/commerceOrderDraft.js +92 -0
  243. package/dist/commerce/server/commercePaidOrderOrchestration.d.ts +131 -0
  244. package/dist/commerce/server/commercePaidOrderOrchestration.js +140 -0
  245. package/dist/commerce/server/commerceProviderAttemptFailure.d.ts +133 -0
  246. package/dist/commerce/server/commerceProviderAttemptFailure.js +175 -0
  247. package/dist/commerce/server/commerceReturnsHandlers.d.ts +41 -0
  248. package/dist/commerce/server/commerceReturnsHandlers.js +100 -0
  249. package/dist/commerce/server/commerceRuntimePort.d.ts +16 -0
  250. package/dist/commerce/server/commerceRuntimePort.js +57 -0
  251. package/dist/commerce/server/commerceRuntimeService.d.ts +98 -0
  252. package/dist/commerce/server/commerceRuntimeService.js +186 -0
  253. package/dist/commerce/server/commerceRuntimeStartResponse.d.ts +37 -0
  254. package/dist/commerce/server/commerceRuntimeStartResponse.js +56 -0
  255. package/dist/commerce/server/commerceStarterOfferGuard.d.ts +55 -0
  256. package/dist/commerce/server/commerceStarterOfferGuard.js +128 -0
  257. package/dist/commerce/server/configuratorIntentPersistence.d.ts +47 -0
  258. package/dist/commerce/server/configuratorIntentPersistence.js +85 -0
  259. package/dist/commerce/server/configuratorIntentPersistenceHandler.d.ts +14 -0
  260. package/dist/commerce/server/configuratorIntentPersistenceHandler.js +42 -0
  261. package/dist/commerce/server/emailRuntime.d.ts +47 -0
  262. package/dist/commerce/server/emailRuntime.js +1 -0
  263. package/dist/commerce/server/handlerSupport.d.ts +68 -0
  264. package/dist/commerce/server/handlerSupport.js +1 -0
  265. package/dist/commerce/server/index.d.ts +178 -0
  266. package/dist/commerce/server/index.js +127 -0
  267. package/dist/commerce/server/offerAvailability.d.ts +21 -0
  268. package/dist/commerce/server/offerAvailability.js +163 -0
  269. package/dist/commerce/server/orderDraftRpcPayload.d.ts +20 -0
  270. package/dist/commerce/server/orderDraftRpcPayload.js +21 -0
  271. package/dist/commerce/server/orderFeedbackSubmit.d.ts +20 -0
  272. package/dist/commerce/server/orderFeedbackSubmit.js +16 -0
  273. package/dist/commerce/server/orderFeedbackTokenCheck.d.ts +17 -0
  274. package/dist/commerce/server/orderFeedbackTokenCheck.js +14 -0
  275. package/dist/commerce/server/orderReviewAdminHandlers.d.ts +47 -0
  276. package/dist/commerce/server/orderReviewAdminHandlers.js +41 -0
  277. package/dist/commerce/server/orderReviewHandlers.d.ts +114 -0
  278. package/dist/commerce/server/orderReviewHandlers.js +42 -0
  279. package/dist/commerce/server/orderReviewLifecycle.d.ts +10 -0
  280. package/dist/commerce/server/orderReviewLifecycle.js +121 -0
  281. package/dist/commerce/server/orderReviewMedia.d.ts +11 -0
  282. package/dist/commerce/server/orderReviewMedia.js +172 -0
  283. package/dist/commerce/server/orderReviewRawUploadHandler.d.ts +40 -0
  284. package/dist/commerce/server/orderReviewRawUploadHandler.js +316 -0
  285. package/dist/commerce/server/outboxCheckoutExpiredEmailHandler.d.ts +14 -0
  286. package/dist/commerce/server/outboxCheckoutExpiredEmailHandler.js +57 -0
  287. package/dist/commerce/server/outboxCheckoutRecoveryEmailHandler.d.ts +13 -0
  288. package/dist/commerce/server/outboxCheckoutRecoveryEmailHandler.js +150 -0
  289. package/dist/commerce/server/outboxDispatchRegistry.d.ts +46 -0
  290. package/dist/commerce/server/outboxDispatchRegistry.js +184 -0
  291. package/dist/commerce/server/outboxDispatchRegistryComposition.d.ts +6 -0
  292. package/dist/commerce/server/outboxDispatchRegistryComposition.js +23 -0
  293. package/dist/commerce/server/outboxOrderDraftEmailHandler.d.ts +14 -0
  294. package/dist/commerce/server/outboxOrderDraftEmailHandler.js +130 -0
  295. package/dist/commerce/server/outboxOrderPaidEmailHandler.d.ts +21 -0
  296. package/dist/commerce/server/outboxOrderPaidEmailHandler.js +93 -0
  297. package/dist/commerce/server/outboxOrderPaidFulfillmentHandler.d.ts +3 -0
  298. package/dist/commerce/server/outboxOrderPaidFulfillmentHandler.js +1 -0
  299. package/dist/commerce/server/outboxOrderPaidFulfillmentPorts.d.ts +3 -0
  300. package/dist/commerce/server/outboxOrderPaidFulfillmentPorts.js +1 -0
  301. package/dist/commerce/server/outboxOrderRefundedEmailHandler.d.ts +13 -0
  302. package/dist/commerce/server/outboxOrderRefundedEmailHandler.js +42 -0
  303. package/dist/commerce/server/outboxPaymentFailedEmailHandler.d.ts +14 -0
  304. package/dist/commerce/server/outboxPaymentFailedEmailHandler.js +65 -0
  305. package/dist/commerce/server/outboxReturnEmailHandlers.d.ts +26 -0
  306. package/dist/commerce/server/outboxReturnEmailHandlers.js +53 -0
  307. package/dist/commerce/server/outboxShipmentDeliveredEmailHandler.d.ts +17 -0
  308. package/dist/commerce/server/outboxShipmentDeliveredEmailHandler.js +52 -0
  309. package/dist/commerce/server/outboxShipmentDispatchedEmailHandler.d.ts +13 -0
  310. package/dist/commerce/server/outboxShipmentDispatchedEmailHandler.js +87 -0
  311. package/dist/commerce/server/outboxShipmentExceptionEmailHandler.d.ts +13 -0
  312. package/dist/commerce/server/outboxShipmentExceptionEmailHandler.js +46 -0
  313. package/dist/commerce/server/referenceCheckoutHandler.d.ts +48 -0
  314. package/dist/commerce/server/referenceCheckoutHandler.js +68 -0
  315. package/dist/commerce/server/reservationSweepPort.d.ts +31 -0
  316. package/dist/commerce/server/reservationSweepPort.js +45 -0
  317. package/dist/commerce/server/starterTermsPort.d.ts +22 -0
  318. package/dist/commerce/server/starterTermsPort.js +1 -0
  319. package/dist/commerce/server/supabaseCommerceReturnsPort.d.ts +13 -0
  320. package/dist/commerce/server/supabaseCommerceReturnsPort.js +56 -0
  321. package/dist/communications/consentPurposeRegistry.d.ts +1 -1
  322. package/dist/communications/newsletterIntegrationContracts.d.ts +5 -5
  323. package/dist/composition/commerceContribution.d.ts +21 -0
  324. package/dist/composition/commerceContribution.js +27 -0
  325. package/dist/composition/index.d.ts +1 -0
  326. package/dist/composition/index.js +1 -0
  327. package/dist/fulfillment/handlerSchemas.d.ts +41 -41
  328. package/dist/fulfillment/index.d.ts +1 -1
  329. package/dist/fulfillment/index.js +1 -1
  330. package/dist/fulfillment/paidHandoff.d.ts +12 -1
  331. package/dist/fulfillment/paidHandoff.js +2 -2
  332. package/dist/fulfillment/providerDispatchWorker.d.ts +4 -4
  333. package/dist/identity/customerContracts.d.ts +2 -2
  334. package/dist/inventory/bindings.d.ts +3 -0
  335. package/dist/inventory/bindings.js +10 -4
  336. package/dist/inventory/index.d.ts +1 -0
  337. package/dist/inventory/index.js +1 -0
  338. package/dist/inventory/managedStockAvailability.d.ts +15 -0
  339. package/dist/inventory/managedStockAvailability.js +16 -0
  340. package/dist/inventory/postgresStockAvailability.js +2 -25
  341. package/dist/inventory/schemas.d.ts +1 -1
  342. package/dist/inventory/stockReadResponse.d.ts +4 -0
  343. package/dist/inventory/stockReadResponse.js +27 -0
  344. package/dist/pricing/browser/index.d.ts +6 -0
  345. package/dist/pricing/browser/index.js +6 -0
  346. package/dist/promotions/adminPromotionsContracts.d.ts +2 -2
  347. package/dist/subscriptions/index.d.ts +3 -2
  348. package/dist/subscriptions/index.js +3 -2
  349. package/package.json +22 -2
  350. package/release-gates.json +63 -8
  351. package/src/commerce/adapters/managed/commerceOmsControlPlane.ts +80 -0
  352. package/src/commerce/adapters/managed/commerceOmsMutations.ts +145 -0
  353. package/src/commerce/adapters/managed/commerceOmsPort.ts +158 -0
  354. package/src/commerce/adapters/managed/oms/accounting.ts +18 -0
  355. package/src/commerce/adapters/managed/oms/fulfillmentReads.ts +82 -0
  356. package/src/commerce/adapters/managed/oms/inboundEvents.ts +45 -0
  357. package/src/commerce/adapters/managed/oms/outboxEvents.ts +30 -0
  358. package/src/commerce/adapters/managed/oms/paymentAttempts.ts +19 -0
  359. package/src/commerce/adapters/managed/oms/queueSelection.ts +132 -0
  360. package/src/commerce/adapters/managed/oms/readProjections.ts +22 -0
  361. package/src/commerce/adapters/managed/oms/readQueries.ts +292 -0
  362. package/src/commerce/adapters/managed/oms/types.ts +9 -0
  363. package/src/commerce/checkoutCommandSchemas.ts +93 -0
  364. package/src/commerce/checkoutHelpers.ts +47 -0
  365. package/src/commerce/checkoutResumeSchemas.ts +164 -0
  366. package/src/commerce/checkoutSchemas.ts +182 -0
  367. package/src/commerce/commerceReturnsPort.ts +67 -0
  368. package/src/commerce/configuratorIntentPersistenceSchemas.ts +26 -0
  369. package/src/commerce/configuratorIntentSchemas.ts +47 -0
  370. package/src/commerce/contractPrimitives.ts +30 -0
  371. package/src/commerce/contracts/availability.ts +21 -0
  372. package/src/commerce/contracts/fulfillmentRecovery.ts +26 -0
  373. package/src/commerce/contracts/index.ts +17 -0
  374. package/src/commerce/contracts/intent.ts +58 -0
  375. package/src/commerce/contracts/omsTypes.ts +1217 -0
  376. package/src/commerce/contracts/order.ts +44 -0
  377. package/src/commerce/contracts/orderMoney.ts +75 -0
  378. package/src/commerce/contracts/ports.ts +124 -0
  379. package/src/commerce/contracts/recovery.ts +24 -0
  380. package/src/commerce/contracts/runtimePorts.ts +201 -0
  381. package/src/commerce/contracts/state.ts +64 -0
  382. package/src/commerce/customerDefaultsSnapshotSchemas.ts +117 -0
  383. package/src/commerce/errors.ts +53 -0
  384. package/src/commerce/fulfillmentEligibility.ts +32 -0
  385. package/src/commerce/index.ts +82 -0
  386. package/src/commerce/model/customerFulfillmentRecovery.ts +185 -0
  387. package/src/commerce/model/fulfillmentCancellationEligibility.ts +18 -0
  388. package/src/commerce/model/omsAccountingVisibility.ts +135 -0
  389. package/src/commerce/model/omsBillingInvoiceBuyer.ts +20 -0
  390. package/src/commerce/model/omsCurrency.ts +8 -0
  391. package/src/commerce/model/omsFulfillmentDebug.ts +157 -0
  392. package/src/commerce/model/omsFulfillmentSummary.ts +225 -0
  393. package/src/commerce/model/omsListTotals.ts +38 -0
  394. package/src/commerce/model/omsOperationalLadder.ts +181 -0
  395. package/src/commerce/model/omsOrderLineMoney.ts +34 -0
  396. package/src/commerce/model/omsPaymentMethodSummary.ts +19 -0
  397. package/src/commerce/model/omsReadModel.ts +302 -0
  398. package/src/commerce/model/omsReadModelCommunication.ts +32 -0
  399. package/src/commerce/model/omsReadModelHelpers.ts +279 -0
  400. package/src/commerce/model/omsReadModelList.ts +90 -0
  401. package/src/commerce/model/omsReadModelListSummary.ts +19 -0
  402. package/src/commerce/model/omsReadModelPricing.ts +57 -0
  403. package/src/commerce/model/omsReadModelProjections.ts +1 -0
  404. package/src/commerce/model/omsReadModelRowCore.ts +193 -0
  405. package/src/commerce/model/omsReadModelRows.ts +7 -0
  406. package/src/commerce/offerAvailability.ts +75 -0
  407. package/src/commerce/offerAvailabilitySchemas.ts +56 -0
  408. package/src/commerce/offerEvidenceSchemas.ts +17 -0
  409. package/src/commerce/oms/omsContractBase.ts +92 -0
  410. package/src/commerce/oms/omsContractReadAuxSchemas.ts +130 -0
  411. package/src/commerce/oms/omsContractReadSchemas.ts +303 -0
  412. package/src/commerce/oms/omsContractRequests.ts +143 -0
  413. package/src/commerce/oms/omsContracts.ts +6 -0
  414. package/src/commerce/oms/omsControlPlane.ts +85 -0
  415. package/src/commerce/oms/omsFulfillmentContractSchemas.ts +113 -0
  416. package/src/commerce/oms/omsFulfillmentDebugSchemas.ts +38 -0
  417. package/src/commerce/oms/omsFulfillmentHealthSchemas.ts +46 -0
  418. package/src/commerce/oms/omsPorts.ts +165 -0
  419. package/src/commerce/oms/omsPrimitives.ts +3 -0
  420. package/src/commerce/oms/omsProviderEvidenceSchemas.ts +13 -0
  421. package/src/commerce/orderDraftErrors.ts +28 -0
  422. package/src/commerce/orderEmailEligibility.ts +131 -0
  423. package/src/commerce/orderEmailLines.ts +22 -0
  424. package/src/commerce/orderFeedbackContracts.ts +47 -0
  425. package/src/commerce/orderMoney.ts +207 -0
  426. package/src/commerce/orderReviewContracts.ts +124 -0
  427. package/src/commerce/orderReviewPorts.ts +94 -0
  428. package/src/commerce/outboxDispatchContracts.ts +30 -0
  429. package/src/commerce/outboxEventSchemas.ts +230 -0
  430. package/src/commerce/outboxOrderDraftEmailPorts.ts +241 -0
  431. package/src/commerce/paymentContinuation.ts +5 -0
  432. package/src/commerce/ports.ts +7 -0
  433. package/src/commerce/recoveryDestination.ts +23 -0
  434. package/src/commerce/runtimeErrors.ts +19 -0
  435. package/src/commerce/salesChannelEnvelope.ts +28 -0
  436. package/src/commerce/schemas.ts +104 -0
  437. package/src/commerce/server/checkoutCompensation.ts +49 -0
  438. package/src/commerce/server/checkoutConflictClassifiers.ts +53 -0
  439. package/src/commerce/server/checkoutExpiredRecoveryPolicy.ts +107 -0
  440. package/src/commerce/server/checkoutInvoiceBuyerSnapshot.ts +36 -0
  441. package/src/commerce/server/checkoutOfferPolicyPort.ts +60 -0
  442. package/src/commerce/server/checkoutPaymentContinuationCredential.ts +222 -0
  443. package/src/commerce/server/checkoutQuoteTypes.ts +9 -0
  444. package/src/commerce/server/checkoutRecoveryOrderPort.ts +40 -0
  445. package/src/commerce/server/checkoutRecoveryToken.ts +63 -0
  446. package/src/commerce/server/checkoutRefusalContinuation.ts +29 -0
  447. package/src/commerce/server/checkoutRuntimeTypes.ts +26 -0
  448. package/src/commerce/server/commerceCheckoutCommandExecution.ts +188 -0
  449. package/src/commerce/server/commerceCheckoutCompensation.ts +66 -0
  450. package/src/commerce/server/commerceCheckoutContinuationTerms.ts +87 -0
  451. package/src/commerce/server/commerceCheckoutCustomerDefaults.ts +24 -0
  452. package/src/commerce/server/commerceCheckoutFailureHandler.ts +144 -0
  453. package/src/commerce/server/commerceCheckoutHandler.ts +269 -0
  454. package/src/commerce/server/commerceCheckoutHandlerAdmission.ts +157 -0
  455. package/src/commerce/server/commerceCheckoutHandlerHelpers.ts +223 -0
  456. package/src/commerce/server/commerceCheckoutOrchestrationError.ts +15 -0
  457. package/src/commerce/server/commerceCheckoutPromotionPriceChange.ts +83 -0
  458. package/src/commerce/server/commerceCheckoutProviderPayment.ts +45 -0
  459. package/src/commerce/server/commerceCheckoutQuoteGuard.ts +172 -0
  460. package/src/commerce/server/commerceCheckoutResume.ts +132 -0
  461. package/src/commerce/server/commerceCheckoutResumeGuard.ts +195 -0
  462. package/src/commerce/server/commerceCheckoutSavedPaymentMethod.ts +85 -0
  463. package/src/commerce/server/commerceCheckoutStartRuntimeFailure.ts +59 -0
  464. package/src/commerce/server/commerceCheckoutTiming.ts +53 -0
  465. package/src/commerce/server/commerceDiagnostics.ts +37 -0
  466. package/src/commerce/server/commerceOmsCancelOrderHandler.ts +43 -0
  467. package/src/commerce/server/commerceOmsControlPlaneHandlers.ts +71 -0
  468. package/src/commerce/server/commerceOmsHandlers.ts +275 -0
  469. package/src/commerce/server/commerceOmsMarkRefundedHandler.ts +39 -0
  470. package/src/commerce/server/commerceOrderDraft.ts +131 -0
  471. package/src/commerce/server/commercePaidOrderOrchestration.ts +275 -0
  472. package/src/commerce/server/commerceProviderAttemptFailure.ts +257 -0
  473. package/src/commerce/server/commerceReturnsHandlers.ts +143 -0
  474. package/src/commerce/server/commerceRuntimePort.ts +75 -0
  475. package/src/commerce/server/commerceRuntimeService.ts +229 -0
  476. package/src/commerce/server/commerceRuntimeStartResponse.ts +76 -0
  477. package/src/commerce/server/commerceStarterOfferGuard.ts +200 -0
  478. package/src/commerce/server/configuratorIntentPersistence.ts +161 -0
  479. package/src/commerce/server/configuratorIntentPersistenceHandler.ts +54 -0
  480. package/src/commerce/server/emailRuntime.ts +30 -0
  481. package/src/commerce/server/handlerSupport.ts +22 -0
  482. package/src/commerce/server/index.ts +181 -0
  483. package/src/commerce/server/offerAvailability.ts +275 -0
  484. package/src/commerce/server/orderDraftRpcPayload.ts +39 -0
  485. package/src/commerce/server/orderFeedbackSubmit.ts +40 -0
  486. package/src/commerce/server/orderFeedbackTokenCheck.ts +28 -0
  487. package/src/commerce/server/orderReviewAdminHandlers.ts +43 -0
  488. package/src/commerce/server/orderReviewHandlers.ts +57 -0
  489. package/src/commerce/server/orderReviewLifecycle.ts +129 -0
  490. package/src/commerce/server/orderReviewMedia.ts +170 -0
  491. package/src/commerce/server/orderReviewRawUploadHandler.ts +300 -0
  492. package/src/commerce/server/outboxCheckoutExpiredEmailHandler.ts +86 -0
  493. package/src/commerce/server/outboxCheckoutRecoveryEmailHandler.ts +188 -0
  494. package/src/commerce/server/outboxDispatchRegistry.ts +269 -0
  495. package/src/commerce/server/outboxDispatchRegistryComposition.ts +31 -0
  496. package/src/commerce/server/outboxOrderDraftEmailHandler.ts +162 -0
  497. package/src/commerce/server/outboxOrderPaidEmailHandler.ts +147 -0
  498. package/src/commerce/server/outboxOrderPaidFulfillmentHandler.ts +4 -0
  499. package/src/commerce/server/outboxOrderPaidFulfillmentPorts.ts +3 -0
  500. package/src/commerce/server/outboxOrderRefundedEmailHandler.ts +58 -0
  501. package/src/commerce/server/outboxPaymentFailedEmailHandler.ts +99 -0
  502. package/src/commerce/server/outboxReturnEmailHandlers.ts +92 -0
  503. package/src/commerce/server/outboxShipmentDeliveredEmailHandler.ts +94 -0
  504. package/src/commerce/server/outboxShipmentDispatchedEmailHandler.ts +112 -0
  505. package/src/commerce/server/outboxShipmentExceptionEmailHandler.ts +73 -0
  506. package/src/commerce/server/referenceCheckoutHandler.ts +87 -0
  507. package/src/commerce/server/reservationSweepPort.ts +67 -0
  508. package/src/commerce/server/starterTermsPort.ts +22 -0
  509. package/src/commerce/server/supabaseCommerceReturnsPort.ts +81 -0
  510. package/src/composition/commerceContribution.ts +35 -0
  511. package/src/composition/index.ts +1 -0
  512. package/src/fulfillment/index.ts +1 -1
  513. package/src/fulfillment/paidHandoff.ts +2 -2
  514. package/src/inventory/bindings.ts +12 -4
  515. package/src/inventory/index.ts +1 -0
  516. package/src/inventory/managedStockAvailability.ts +23 -0
  517. package/src/inventory/postgresStockAvailability.ts +2 -21
  518. package/src/inventory/stockReadResponse.ts +25 -0
  519. package/src/pricing/browser/index.ts +6 -0
  520. package/src/subscriptions/index.ts +3 -2
@@ -0,0 +1,275 @@
1
+ import type { PricingPolicySnapshot } from "../../pricing/index.js";
2
+ import type { CheckoutJourney, CheckoutKind, CommerceOrderDraftWritePort, CommerceCheckoutRuntimePort } from "../contracts/index.js";
3
+ import type { CommerceQuotePort } from "../ports.js";
4
+ import { CommerceOrderDraftPriceChangedError } from "../orderDraftErrors.js";
5
+ import { uuidFromOrderRef, messageOf } from "../checkoutHelpers.js";
6
+ import { CheckoutOrchestrationError } from "./commerceCheckoutOrchestrationError.js";
7
+ import type { CheckoutPaymentExecution } from "./commerceCheckoutProviderPayment.js";
8
+ import type { CheckoutQuoteSnapshot } from "./checkoutQuoteTypes.js";
9
+ import type { CheckoutExecutionProvider, CheckoutProviderFlow } from "./checkoutRuntimeTypes.js";
10
+ export interface CheckoutJourneyRuntimeRequest<Snapshot, PaymentExecution extends CheckoutPaymentExecution, Provider extends string = string, Flow extends string = string, MethodKind extends string = string, RecurringModel extends string = string> {
11
+ idempotencyKey: string; paymentAttemptSequence?: number;
12
+ orderDraft: { orderId: string; status: "draft"; paymentStatus: "not_started"; idempotencyKey: string; quoteSnapshot: Snapshot; replayed: boolean };
13
+ mode: "one_time" | "subscription_cycle"; saveForFutureUse: boolean;
14
+ clientId: string; shippingAddressId: string; paymentProvider: Provider;
15
+ returnContext: "public" | "account"; providerFlow: Flow;
16
+ paymentMethodRef?: string; paymentMethodAliasType?: MethodKind; paymentMethodRecurringModel?: RecurringModel;
17
+ paymentExecution?: PaymentExecution; declaredBankId?: string;
18
+ providerPayer?: { email: string; name: string; ip?: string | null; userAgent?: string | null };
19
+ metadata: Record<string, unknown>;
20
+ }
21
+ export interface CheckoutJourneyRuntimeResponse<Provider extends string = string> {
22
+ runtime: { orderId: string; payment: { paymentIntentId: string; paymentAttemptId: string | null; status: string; attemptStatus: string | null; provider: Provider; continuationActionOrigin?: "fresh_execution" | null; providerClientSecret?: string | null; providerAttemptId?: string | null; providerRedirectUrl?: string | null; providerNextActionKind?: string | null } };
23
+ }
24
+ export interface CheckoutJourneyResultRequest { idempotencyKey: string; orderId: string; paymentIntentId: string; resultStatus: "succeeded"; occurredAt: string }
25
+ export interface CheckoutPaymentStartedEvent {
26
+ email: string;
27
+ clientId: string;
28
+ orderId: string;
29
+ paymentIntentId: string;
30
+ }
31
+
32
+ export type CheckoutStage =
33
+ | "quote"
34
+ | "order_draft"
35
+ | "start_runtime"
36
+ | "account_link"
37
+ | "apply_payment_result";
38
+
39
+ export type CheckoutStageRecorder = <T>(
40
+ stage: CheckoutStage,
41
+ operation: () => Promise<T>,
42
+ ) => Promise<T>;
43
+
44
+ export interface OrchestratedCheckoutResult<Snapshot, Provider extends string = string> {
45
+ orderId: string;
46
+ paymentIntentId: string;
47
+ paymentAttemptId: string | null;
48
+ paymentAttemptStatus?: string | null;
49
+ runtimePaymentStatus?: string;
50
+ executionRail: Provider;
51
+ continuationActionOrigin: "fresh_execution" | null;
52
+ providerClientSecret: string | null;
53
+ providerPaymentId: string | null;
54
+ providerRedirectUrl: string | null;
55
+ providerNextActionKind: string | null;
56
+ quoteSnapshot: Snapshot;
57
+ status: "paid" | "processing" | "failed";
58
+ }
59
+
60
+ export type PaidOrderOrchestrationDeps<Provisioned, Request, Snapshot, Draft, Extension, Runtime, Settlement, PaymentExecution extends CheckoutPaymentExecution, Provider extends string = string, Flow extends string = string, MethodKind extends string = string, RecurringModel extends string = string> = {
61
+ provisioned: Provisioned;
62
+ checkoutKind: CheckoutKind;
63
+ quotePort: CommerceQuotePort<Request, Snapshot, import("../../pricing/index.js").CreateQuoteOptions>;
64
+ orderDraftPort: CommerceOrderDraftWritePort<{ idempotencyKey: string; quoteSnapshot: Snapshot }, Draft>;
65
+ runtimePort: CommerceCheckoutRuntimePort<CheckoutJourneyRuntimeRequest<Snapshot, PaymentExecution, Provider, Flow, MethodKind, RecurringModel> & Extension, Runtime, CheckoutJourneyResultRequest, Settlement>;
66
+ paymentProvider?: Provider;
67
+ saveForFutureUse?: boolean;
68
+ paymentAttemptSequence?: number;
69
+ returnContext?: "public" | "account"; // Host redirect return; defaults to "public"
70
+ paymentExecution?: PaymentExecution;
71
+ declaredBankId?: string;
72
+ paymentMethodRef?: string;
73
+ paymentMethodAliasType?: MethodKind;
74
+ paymentMethodRecurringModel?: RecurringModel;
75
+ quoteSnapshot?: Snapshot;
76
+ providerPayer?: {
77
+ email: string;
78
+ name: string;
79
+ ip?: string | null;
80
+ userAgent?: string | null;
81
+ };
82
+ onPaymentStarted?: (event: CheckoutPaymentStartedEvent) => Promise<void>;
83
+ recordStage?: CheckoutStageRecorder;
84
+ now: () => Date;
85
+ }
86
+
87
+ export function createPaidOrderOrchestration<Provisioned extends { clientId: string; addressId: string }, Request, Snapshot extends CheckoutQuoteSnapshot, Draft extends { orderDraft: { orderId: string } }, Extension extends object, Runtime extends CheckoutJourneyRuntimeResponse<Provider>, Settlement, PaymentExecution extends CheckoutPaymentExecution, Provider extends string, Flow extends string, MethodKind extends string = string, RecurringModel extends string = string>(bindings: {
88
+ defaultPaymentProvider: Provider; rehearsalPaymentProvider: Provider; confirmationProvider: Provider; missingConfirmationMessage: string;
89
+ providerFlowFor(provider: Provider, execution: PaymentExecution | undefined): Flow;
90
+ runtimeRequestExtension(provisioned: Provisioned): Extension;
91
+ mapStartRuntimeFailure(error: unknown, draftOrderId: string): CheckoutOrchestrationError;
92
+ }) {
93
+
94
+ async function orchestrateCheckoutJourney(
95
+ deps: PaidOrderOrchestrationDeps<Provisioned, Request, Snapshot, Draft, Extension, Runtime, Settlement, PaymentExecution, Provider, Flow, MethodKind, RecurringModel>,
96
+ journey: CheckoutJourney<Request, PricingPolicySnapshot>,
97
+ ): Promise<OrchestratedCheckoutResult<Snapshot, Provider>> {
98
+ const {
99
+ provisioned,
100
+ checkoutKind,
101
+ quotePort,
102
+ orderDraftPort,
103
+ runtimePort,
104
+ paymentProvider = bindings.defaultPaymentProvider,
105
+ paymentAttemptSequence,
106
+ paymentExecution,
107
+ declaredBankId,
108
+ paymentMethodRef,
109
+ paymentMethodAliasType,
110
+ paymentMethodRecurringModel,
111
+ quoteSnapshot: providedQuoteSnapshot,
112
+ providerPayer,
113
+ onPaymentStarted,
114
+ recordStage,
115
+ now,
116
+ } = deps;
117
+ const stage: CheckoutStageRecorder = recordStage ?? ((_stage, operation) => operation());
118
+
119
+ // (b) quote(one_time) -> snapshot. No order persisted yet -> no compensation.
120
+ let quoteSnapshot: Snapshot | undefined = providedQuoteSnapshot;
121
+ if (!quoteSnapshot) {
122
+ try {
123
+ quoteSnapshot = await stage("quote", () =>
124
+ quotePort.createQuote(journey.createQuoteRequest(), { clientId: provisioned.clientId }),
125
+ );
126
+ } catch (error) {
127
+ throw new CheckoutOrchestrationError(messageOf(error, "quote"), null);
128
+ }
129
+ }
130
+
131
+ // (c) order-draft(idempotencyKey, snapshot). If the canonical writer throws,
132
+ // its transaction (including any promotion claim) rolls back, so there is no
133
+ // persisted order id to compensate.
134
+ let draftOrderId: string;
135
+ try {
136
+ const draft = await stage("order_draft", () =>
137
+ orderDraftPort.createOrderDraft(
138
+ { idempotencyKey: journey.idempotencyKey, quoteSnapshot },
139
+ { clientId: provisioned.clientId }, // out-of-band -> commerce_orders.client_id -> outbox recipient
140
+ ),
141
+ );
142
+ draftOrderId = uuidFromOrderRef(draft.orderDraft.orderId);
143
+ } catch (error) {
144
+ if (error instanceof CommerceOrderDraftPriceChangedError) {
145
+ throw new CheckoutOrchestrationError(
146
+ messageOf(error, "order_draft"),
147
+ null,
148
+ "promotion_code_price_changed",
149
+ );
150
+ }
151
+ throw new CheckoutOrchestrationError(messageOf(error, "order_draft"), null);
152
+ }
153
+
154
+ // (d) startRuntime -> finalizes order, reserves inventory, opens payment intent.
155
+ // From here on a throw leaves a live reservation, so compensation targets the order.
156
+ let orderId: string;
157
+ let paymentIntentId: string;
158
+ let paymentContinuation: Pick<OrchestratedCheckoutResult<Snapshot, Provider>, "paymentAttemptId" | "paymentAttemptStatus" | "runtimePaymentStatus" | "executionRail" | "continuationActionOrigin">;
159
+ let providerClientSecret: string | null;
160
+ let providerPaymentId: string | null;
161
+ let providerRedirectUrl: string | null;
162
+ let providerNextActionKind: string | null;
163
+ let runtimeRefused: boolean;
164
+ try {
165
+ const started = await stage("start_runtime", () =>
166
+ runtimePort.startRuntime({
167
+ idempotencyKey: journey.idempotencyKey,
168
+ paymentAttemptSequence,
169
+ orderDraft: {
170
+ orderId: `order_${draftOrderId}`,
171
+ status: "draft",
172
+ paymentStatus: "not_started",
173
+ idempotencyKey: journey.idempotencyKey,
174
+ quoteSnapshot,
175
+ replayed: false,
176
+ },
177
+ // subscription_initial finalizes as subscription_cycle: finalize creates+links
178
+ // the provisional subscription; one_time would violate the mode contract.
179
+ mode: checkoutKind === "subscription_initial" ? "subscription_cycle" : "one_time",
180
+ saveForFutureUse: deps.saveForFutureUse ?? checkoutKind === "subscription_initial",
181
+ clientId: provisioned.clientId, shippingAddressId: provisioned.addressId, ...bindings.runtimeRequestExtension(provisioned),
182
+ paymentProvider,
183
+ returnContext: deps.returnContext ?? "public",
184
+ providerFlow: bindings.providerFlowFor(paymentProvider, paymentExecution),
185
+ paymentMethodRef, paymentMethodAliasType, paymentMethodRecurringModel,
186
+ paymentExecution,
187
+ declaredBankId,
188
+ providerPayer,
189
+ metadata: journey.createRuntimeMetadata(quoteSnapshot.quote.context?.pricingPolicy),
190
+ }),
191
+ );
192
+ orderId = started.runtime.orderId;
193
+ paymentIntentId = started.runtime.payment.paymentIntentId;
194
+ paymentContinuation = { paymentAttemptStatus: started.runtime.payment.attemptStatus, runtimePaymentStatus: started.runtime.payment.status, paymentAttemptId: started.runtime.payment.paymentAttemptId, executionRail: started.runtime.payment.provider, continuationActionOrigin: started.runtime.payment.continuationActionOrigin ?? null };
195
+ providerClientSecret = started.runtime.payment.providerClientSecret ?? null;
196
+ providerPaymentId = started.runtime.payment.providerAttemptId ?? null;
197
+ providerRedirectUrl = started.runtime.payment.providerRedirectUrl ?? null;
198
+ providerNextActionKind = started.runtime.payment.providerNextActionKind ?? null;
199
+ runtimeRefused = started.runtime.payment.status === "failed" || started.runtime.payment.attemptStatus === "failed";
200
+ } catch (error) {
201
+ // startRuntime is itself a multi-step saga; reservations may already exist.
202
+ throw bindings.mapStartRuntimeFailure(error, draftOrderId);
203
+ }
204
+
205
+ // A confirmation-bearing runtime that returned without its confirmation capability has
206
+ // already crossed the PSP boundary. Preserve the aggregate for payment-control
207
+ // reconciliation rather than treating this post-dispatch contract failure as
208
+ // permission to release stock or mint another attempt.
209
+ const settledFreshRefusal = paymentContinuation.continuationActionOrigin === "fresh_execution"
210
+ && paymentContinuation.runtimePaymentStatus === "failed" && paymentContinuation.paymentAttemptStatus === "failed"
211
+ && Boolean(orderId && paymentIntentId && paymentContinuation.paymentAttemptId) && paymentContinuation.executionRail === paymentProvider;
212
+ if (paymentProvider === bindings.confirmationProvider && !providerClientSecret && !settledFreshRefusal) {
213
+ throw new CheckoutOrchestrationError(
214
+ bindings.missingConfirmationMessage,
215
+ null,
216
+ "provider_attempt_in_flight",
217
+ );
218
+ }
219
+
220
+ if (onPaymentStarted && !runtimeRefused) {
221
+ try {
222
+ await stage("account_link", () =>
223
+ onPaymentStarted({
224
+ email: journey.contactEmail,
225
+ clientId: provisioned.clientId,
226
+ orderId,
227
+ paymentIntentId,
228
+ }),
229
+ );
230
+ } catch {
231
+ console.warn("checkout_payment_started_hook_failed", JSON.stringify({ orderId }));
232
+ }
233
+ }
234
+
235
+ // (e) For the rehearsal no-op provider only: applyPaymentResult(succeeded).
236
+ // For real PSPs, the saga returns `"processing"`; payment-control is flipped
237
+ // by the webhook (Wave B) once the provider confirms the charge. Auto-marking
238
+ // a real-provider intent as `succeeded` here would bypass the webhook proof
239
+ // and risk a "local paid / provider unpaid" mismatch. A rehearsal adapter that
240
+ // already declined (the reference profile's refusal simulator) must never be
241
+ // auto-settled as succeeded either — the runtime's own terminal answer wins.
242
+ if (paymentProvider === bindings.rehearsalPaymentProvider && !runtimeRefused) {
243
+ try {
244
+ await stage("apply_payment_result", () =>
245
+ runtimePort.applyPaymentResult({
246
+ idempotencyKey: journey.idempotencyKey,
247
+ orderId,
248
+ paymentIntentId,
249
+ resultStatus: "succeeded",
250
+ occurredAt: now().toISOString(),
251
+ }),
252
+ );
253
+ } catch (error) {
254
+ throw new CheckoutOrchestrationError(messageOf(error, "apply_payment_result"), orderId);
255
+ }
256
+
257
+ }
258
+
259
+ return {
260
+ orderId,
261
+ paymentIntentId,
262
+ ...paymentContinuation,
263
+ providerClientSecret,
264
+ providerPaymentId,
265
+ providerRedirectUrl,
266
+ providerNextActionKind,
267
+ quoteSnapshot,
268
+ // A refusal the saga already knows about must not be reported as a wait.
269
+ status: paymentProvider === bindings.rehearsalPaymentProvider && !runtimeRefused ? "paid"
270
+ : runtimeRefused ? "failed" : "processing",
271
+ };
272
+ }
273
+
274
+ return { orchestrateCheckoutJourney };
275
+ }
@@ -0,0 +1,257 @@
1
+ import type { z } from "zod";
2
+ import type { FinalizedCheckoutOrder } from "../contracts/index.js";
3
+ import { CheckoutOrchestrationError } from "./commerceCheckoutOrchestrationError.js";
4
+ type ProviderAttemptDispatchState = "not_dispatched" | "refused" | "unknown";
5
+ export interface CheckoutAttemptFailureFacts extends Error { paymentAttemptId: string | null; phase: string; dispatchState: ProviderAttemptDispatchState }
6
+ export interface CheckoutPreDispatchFailure extends CheckoutAttemptFailureFacts { code: string; retryCount: number }
7
+ export interface CheckoutInFlightFailure extends CheckoutAttemptFailureFacts { code: string }
8
+ export interface CheckoutUncertainFailure<Diagnostic> extends CheckoutAttemptFailureFacts { errorCode: string; failureDiagnostic: Diagnostic | null }
9
+ interface ReopenPaymentPort<Evidence> {
10
+ reopenInteractivePreparedAttempt?(input: { idempotencyKey: string; paymentIntentId: string; paymentAttemptId: string; expectedOrderId: string; expectedSubscriptionId: string | null; expectedSubscriptionCycleId: string | null; evidence: Evidence }): Promise<{ paymentAttemptId: string; paymentIntentId: string }>;
11
+ }
12
+ export function createCheckoutProviderAttemptFailure<Order extends FinalizedCheckoutOrder<string>, Reservation, Response, Diagnostic, PreDispatch extends CheckoutPreDispatchFailure, InFlight extends CheckoutInFlightFailure, Uncertain extends CheckoutUncertainFailure<Diagnostic>, Evidence>(bindings: {
13
+ trustedPreDispatchEvidence(error: PreDispatch): Evidence | null;
14
+ isPreDispatch(error: unknown): error is PreDispatch;
15
+ isInFlight(error: unknown): error is InFlight;
16
+ isUncertain(error: unknown): error is Uncertain;
17
+ providerAttemptFailureLogFields(error: { paymentAttemptId: string | null; phase: string; code: string; dispatchState: ProviderAttemptDispatchState; retryCount: number; failureDiagnostic: Diagnostic | null }): unknown;
18
+ responseSchema: z.ZodType<Response>;
19
+ runtimeResponseExtension(order: Order): object;
20
+ contractVersion: string;
21
+ }) {
22
+
23
+ type ProviderAttemptFailure =
24
+ | InFlight
25
+ | PreDispatch
26
+ | Uncertain;
27
+
28
+ class CheckoutProviderAttemptFailure extends CheckoutOrchestrationError {
29
+ readonly paymentAttemptId: string | null;
30
+ readonly phase: string;
31
+ readonly code: string;
32
+ readonly dispatchState: ProviderAttemptDispatchState;
33
+ readonly retryCount: number;
34
+ readonly failureDiagnostic: Diagnostic | null;
35
+
36
+ constructor(error: ProviderAttemptFailure) {
37
+ const notDispatched = bindings.isPreDispatch(error);
38
+ super(
39
+ notDispatched
40
+ ? "start_runtime: provider transaction was not dispatched"
41
+ : "start_runtime: provider attempt remains in flight",
42
+ null,
43
+ notDispatched ? "provider_attempt_not_dispatched" : "provider_attempt_in_flight",
44
+ );
45
+ this.name = "CheckoutProviderAttemptFailure";
46
+ this.paymentAttemptId = error.paymentAttemptId;
47
+ this.phase = error.phase;
48
+ this.code = bindings.isUncertain(error) ? error.errorCode : error.code;
49
+ this.dispatchState = error.dispatchState;
50
+ this.retryCount = bindings.isPreDispatch(error) ? error.retryCount : 0;
51
+ this.failureDiagnostic = bindings.isUncertain(error)
52
+ ? error.failureDiagnostic
53
+ : null;
54
+ }
55
+ }
56
+
57
+ function checkoutProviderAttemptFailure(error: unknown): CheckoutProviderAttemptFailure | null {
58
+ if (
59
+ bindings.isInFlight(error) ||
60
+ bindings.isPreDispatch(error) ||
61
+ bindings.isUncertain(error)
62
+ ) {
63
+ return new CheckoutProviderAttemptFailure(error);
64
+ }
65
+ return null;
66
+ }
67
+
68
+ function logCheckoutProviderAttemptFailure(error: CheckoutProviderAttemptFailure): void {
69
+ console.error("checkout_provider_attempt_failure", JSON.stringify(bindings.providerAttemptFailureLogFields(error)));
70
+ }
71
+
72
+ const trustedPreDispatchEvidence = bindings.trustedPreDispatchEvidence;
73
+
74
+ function buildReopenedPreparedAttemptResponse(input: {
75
+ order: Order;
76
+ reservations: Reservation[];
77
+ intent: { paymentIntentId: string; paymentId: string };
78
+ paymentAttemptId: string;
79
+ provider: string;
80
+ }): Response {
81
+ return bindings.responseSchema.parse({
82
+ contractVersion: bindings.contractVersion,
83
+ runtime: {
84
+ orderId: input.order.orderId,
85
+ orderRef: input.order.orderRef,
86
+ mode: input.order.mode,
87
+ clientId: input.order.clientId,
88
+ ...bindings.runtimeResponseExtension(input.order),
89
+ shippingAddressId: input.order.shippingAddressId,
90
+ total: input.order.total,
91
+ finalizedReplayed: input.order.replayed,
92
+ reservations: input.reservations,
93
+ payment: {
94
+ paymentIntentId: input.intent.paymentIntentId,
95
+ paymentId: input.intent.paymentId,
96
+ paymentAttemptId: input.paymentAttemptId,
97
+ status: "failed",
98
+ attemptStatus: "failed",
99
+ provider: input.provider,
100
+ providerAttemptId: null,
101
+ providerClientSecret: null,
102
+ providerRedirectUrl: null,
103
+ providerNextActionKind: null,
104
+ continuationActionOrigin: null,
105
+ },
106
+ readiness: {
107
+ omsEligibility: { allowed: false, reason: "order_not_paid" },
108
+ fulfillmentCreate: { allowed: false, reason: "order_not_paid", omsReason: "order_not_paid" },
109
+ },
110
+ nextAction: { kind: "await_hidden_payment_result", provider: input.provider },
111
+ },
112
+ });
113
+ }
114
+
115
+ type PreDispatchReopenGate = {
116
+ paymentAttemptId: string;
117
+ evidence: Evidence;
118
+ reopen: NonNullable<ReopenPaymentPort<Evidence>["reopenInteractivePreparedAttempt"]>;
119
+ };
120
+
121
+ interface PreDispatchReopenIdentity {
122
+ paymentIntentId: string;
123
+ orderId: string;
124
+ subscriptionId: string | null;
125
+ subscriptionCycleId: string | null;
126
+ }
127
+
128
+ function preDispatchReopenGate(
129
+ error: PreDispatch,
130
+ paymentPort: ReopenPaymentPort<Evidence>,
131
+ ): PreDispatchReopenGate | null {
132
+ const evidence = trustedPreDispatchEvidence(error);
133
+ const paymentAttemptId = error.paymentAttemptId;
134
+ const reopen = paymentPort.reopenInteractivePreparedAttempt;
135
+ if (!evidence || !paymentAttemptId || typeof reopen !== "function") {
136
+ logPreDispatchReopenFailure(error, "capability_unavailable");
137
+ return null;
138
+ }
139
+ return { paymentAttemptId, evidence, reopen };
140
+ }
141
+
142
+ async function writePreDispatchReopen(input: {
143
+ gate: PreDispatchReopenGate;
144
+ error: PreDispatch;
145
+ paymentPort: ReopenPaymentPort<Evidence>;
146
+ paymentExecutionIdempotencyKey: string;
147
+ identity: PreDispatchReopenIdentity;
148
+ }): Promise<boolean> {
149
+ const { gate, identity } = input;
150
+ const request = {
151
+ idempotencyKey: `${input.paymentExecutionIdempotencyKey}:reopen-not-dispatched`,
152
+ paymentIntentId: identity.paymentIntentId,
153
+ paymentAttemptId: gate.paymentAttemptId,
154
+ expectedOrderId: identity.orderId,
155
+ expectedSubscriptionId: identity.subscriptionId,
156
+ expectedSubscriptionCycleId: identity.subscriptionCycleId,
157
+ evidence: gate.evidence,
158
+ };
159
+ const call = async () => {
160
+ const result = await gate.reopen.call(input.paymentPort, request);
161
+ if (result.paymentAttemptId !== gate.paymentAttemptId || result.paymentIntentId !== identity.paymentIntentId) {
162
+ throw new Error("interactive_prepared_attempt_reopen_identity_mismatch");
163
+ }
164
+ };
165
+ try {
166
+ await call();
167
+ return true;
168
+ } catch {
169
+ console.error("provider_attempt_predispatch_reopen_retry", JSON.stringify({
170
+ paymentAttemptId: gate.paymentAttemptId,
171
+ retryOrdinal: 1,
172
+ }));
173
+ try {
174
+ await call();
175
+ return true;
176
+ } catch {
177
+ logPreDispatchReopenFailure(input.error, "rpc_unavailable");
178
+ return false;
179
+ }
180
+ }
181
+ }
182
+
183
+ async function reopenExhaustedPreDispatchAttempt(input: {
184
+ error: PreDispatch;
185
+ paymentPort: ReopenPaymentPort<Evidence>;
186
+ paymentExecutionIdempotencyKey: string;
187
+ order: Order;
188
+ reservations: Reservation[];
189
+ intent: { paymentIntentId: string; paymentId: string };
190
+ provider: string;
191
+ }): Promise<Response> {
192
+ const gate = preDispatchReopenGate(input.error, input.paymentPort);
193
+ if (!gate) throw input.error;
194
+ // Build and validate the response before the mutation. No fallible work may
195
+ // follow a successful reopen, or a schema/readiness error could compensate a
196
+ // now-payable order whose old provider attempt is already terminal.
197
+ const response = buildReopenedPreparedAttemptResponse({
198
+ order: input.order,
199
+ reservations: input.reservations,
200
+ intent: input.intent,
201
+ paymentAttemptId: gate.paymentAttemptId,
202
+ provider: input.provider,
203
+ });
204
+ const reopened = await writePreDispatchReopen({
205
+ gate,
206
+ error: input.error,
207
+ paymentPort: input.paymentPort,
208
+ paymentExecutionIdempotencyKey: input.paymentExecutionIdempotencyKey,
209
+ identity: {
210
+ paymentIntentId: input.intent.paymentIntentId,
211
+ orderId: input.order.orderId,
212
+ subscriptionId: input.order.subscriptionId,
213
+ subscriptionCycleId: input.order.subscriptionCycleId,
214
+ },
215
+ });
216
+ if (!reopened) throw input.error;
217
+ return response;
218
+ }
219
+
220
+ async function reopenExhaustedPreDispatchRecoveryAttempt(input: {
221
+ error: PreDispatch;
222
+ paymentPort: ReopenPaymentPort<Evidence>;
223
+ paymentExecutionIdempotencyKey: string;
224
+ paymentIntentId: string;
225
+ order: { orderId: string; subscriptionId: string | null; subscriptionCycleId: string | null };
226
+ }): Promise<boolean> {
227
+ const gate = preDispatchReopenGate(input.error, input.paymentPort);
228
+ if (!gate) return false;
229
+ return writePreDispatchReopen({
230
+ gate,
231
+ error: input.error,
232
+ paymentPort: input.paymentPort,
233
+ paymentExecutionIdempotencyKey: input.paymentExecutionIdempotencyKey,
234
+ identity: {
235
+ paymentIntentId: input.paymentIntentId,
236
+ orderId: input.order.orderId,
237
+ subscriptionId: input.order.subscriptionId,
238
+ subscriptionCycleId: input.order.subscriptionCycleId,
239
+ },
240
+ });
241
+ }
242
+
243
+ function logPreDispatchReopenFailure(
244
+ error: PreDispatch,
245
+ reason: "capability_unavailable" | "rpc_unavailable",
246
+ ): void {
247
+ console.error("provider_attempt_predispatch_reopen_failed", JSON.stringify({
248
+ paymentAttemptId: error.paymentAttemptId,
249
+ phase: error.phase,
250
+ code: error.code,
251
+ dispatchState: error.dispatchState,
252
+ reason,
253
+ }));
254
+ }
255
+
256
+ return { CheckoutProviderAttemptFailure, checkoutProviderAttemptFailure, logCheckoutProviderAttemptFailure, trustedPreDispatchEvidence, buildReopenedPreparedAttemptResponse, reopenExhaustedPreDispatchAttempt, reopenExhaustedPreDispatchRecoveryAttempt };
257
+ }
@@ -0,0 +1,143 @@
1
+ // BFF handlers for the Commerce Returns R0 control plane:
2
+ // - customer: POST /api/bff/commerce/returns/request (bearer-authenticated)
3
+ // - admin: POST /api/bff/admin/returns/approve|reject
4
+ // Each validates with the returns port schemas and calls the service-role port,
5
+ // mapping RPC input/state errors (ERRCODE 22023) to 400s.
6
+
7
+ import type { HttpRequest, HttpResponse } from "../../http/index.js";
8
+ import type { BffResponder } from "../../bff/index.js";
9
+ import type { z } from "zod";
10
+ import {
11
+ returnApproveSchema,
12
+ returnRejectSchema,
13
+ returnRequestCreateSchema,
14
+ type CommerceReturnsPort,
15
+ type ReturnRequestCreateInput,
16
+ } from "../commerceReturnsPort.js";
17
+
18
+ type AdminAuthResult =
19
+ | { ok: true; userId: string }
20
+ | { ok: false; code: "UNAUTHORIZED" | "FORBIDDEN" | "INTERNAL"; message: string };
21
+
22
+ // Local auth-result shape (structural match for the customers auth result) so the
23
+ // commerce domain stays free of a cross-domain import of customers internals.
24
+ type CustomerAuthResult =
25
+ | { ok: true; userId: string }
26
+ | { ok: false; code: "UNAUTHORIZED"; message: string };
27
+
28
+ // RPC validation/state errors that map to a 400 (vs an unexpected 500).
29
+ const CLIENT_ERROR = /_invalid_input|_invalid_state|_not_found|_not_returnable|_quantity_exceeds_ordered|_line_not_in_order/;
30
+
31
+ function methodGuard(req: HttpRequest, res: HttpResponse, responder: BffResponder): boolean {
32
+ const { sendBffError } = responder;
33
+ if (req.method !== "POST") {
34
+ sendBffError(res, "METHOD_NOT_ALLOWED", "Method not allowed", { status: 405 });
35
+ return false;
36
+ }
37
+ return true;
38
+ }
39
+
40
+ function mapExecuteError(res: HttpResponse, error: unknown, responder: BffResponder): void {
41
+ const { sendBffError } = responder;
42
+ const message = error instanceof Error ? error.message : "return_operation_failed";
43
+ if (CLIENT_ERROR.test(message)) {
44
+ sendBffError(res, "BAD_REQUEST", "Return request rejected", { details: { reason: message } });
45
+ return;
46
+ }
47
+ sendBffError(res, "INTERNAL", "Return operation failed");
48
+ }
49
+
50
+ /** Returns request/approve/reject only. Restock and refund fields record intent; no receive, restock or refund execution. */
51
+ export function createCustomerReturnRequestHandler(deps: {
52
+ responder: BffResponder;
53
+ port: Pick<CommerceReturnsPort<string>, "createRequest">;
54
+ requestSchema?: z.ZodType<ReturnRequestCreateInput<string>>;
55
+ authenticateUser: () => Promise<CustomerAuthResult>;
56
+ enabled: () => boolean;
57
+ }) {
58
+ const { sendBffError, sendBffSuccess } = deps.responder;
59
+ return async function handler(req: HttpRequest, res: HttpResponse): Promise<void> {
60
+ if (!methodGuard(req, res, deps.responder)) return;
61
+ if (!deps.enabled()) {
62
+ sendBffError(res, "UPSTREAM_UNAVAILABLE", "Returns are not enabled", {
63
+ details: { feature: "commerce_returns", featureFlag: "COMMERCE_RETURNS_ENABLED", reason: "feature_flag_disabled" },
64
+ });
65
+ return;
66
+ }
67
+ const auth = await deps.authenticateUser();
68
+ if (!auth.ok) {
69
+ sendBffError(res, "UNAUTHORIZED", "Sign in required to request a return");
70
+ return;
71
+ }
72
+ const parsed = (deps.requestSchema ?? returnRequestCreateSchema).safeParse(req.body ?? {});
73
+ if (!parsed.success) {
74
+ sendBffError(res, "BAD_REQUEST", "Invalid return request", { details: parsed.error.flatten() });
75
+ return;
76
+ }
77
+ try {
78
+ const result = await deps.port.createRequest({ ...parsed.data, requestedBy: auth.userId });
79
+ sendBffSuccess(res, result);
80
+ } catch (error) {
81
+ mapExecuteError(res, error, deps.responder);
82
+ }
83
+ };
84
+ }
85
+
86
+ function createAdminReturnHandler<T>(deps: {
87
+ responder: BffResponder;
88
+ authorizeAdmin: (req: HttpRequest) => Promise<AdminAuthResult>;
89
+ requestSchema: { safeParse: (input: unknown) => { success: true; data: T } | { success: false; error: { flatten: () => unknown } } };
90
+ invalidMessage: string;
91
+ execute: (request: T, actorUserId: string) => Promise<unknown>;
92
+ }) {
93
+ const { sendBffError, sendBffSuccess } = deps.responder;
94
+ return async function handler(req: HttpRequest, res: HttpResponse): Promise<void> {
95
+ if (!methodGuard(req, res, deps.responder)) return;
96
+ const auth = await deps.authorizeAdmin(req);
97
+ if (auth.ok === false) {
98
+ sendBffError(res, auth.code, auth.message);
99
+ return;
100
+ }
101
+ const parsed = deps.requestSchema.safeParse(req.body ?? {});
102
+ if (parsed.success === false) {
103
+ sendBffError(res, "BAD_REQUEST", deps.invalidMessage, { details: parsed.error.flatten() });
104
+ return;
105
+ }
106
+ try {
107
+ const result = await deps.execute(parsed.data, auth.userId);
108
+ sendBffSuccess(res, result);
109
+ } catch (error) {
110
+ mapExecuteError(res, error, deps.responder);
111
+ }
112
+ };
113
+ }
114
+
115
+ /** Returns request/approve/reject only. Restock and refund fields record intent; no receive, restock or refund execution. */
116
+ export function createAdminReturnApproveHandler(deps: {
117
+ responder: BffResponder;
118
+ authorizeAdmin: (req: HttpRequest) => Promise<AdminAuthResult>;
119
+ port: Pick<CommerceReturnsPort, "approve">;
120
+ }) {
121
+ return createAdminReturnHandler({
122
+ responder: deps.responder,
123
+ authorizeAdmin: deps.authorizeAdmin,
124
+ requestSchema: returnApproveSchema,
125
+ invalidMessage: "Invalid return approve request",
126
+ execute: (request, actorUserId) => deps.port.approve({ ...request, actorUserId }),
127
+ });
128
+ }
129
+
130
+ /** Returns request/approve/reject only. Restock and refund fields record intent; no receive, restock or refund execution. */
131
+ export function createAdminReturnRejectHandler(deps: {
132
+ responder: BffResponder;
133
+ authorizeAdmin: (req: HttpRequest) => Promise<AdminAuthResult>;
134
+ port: Pick<CommerceReturnsPort, "reject">;
135
+ }) {
136
+ return createAdminReturnHandler({
137
+ responder: deps.responder,
138
+ authorizeAdmin: deps.authorizeAdmin,
139
+ requestSchema: returnRejectSchema,
140
+ invalidMessage: "Invalid return reject request",
141
+ execute: (request, actorUserId) => deps.port.reject({ ...request, actorUserId }),
142
+ });
143
+ }