@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.
- package/CHANGELOG.md +138 -218
- package/README.md +229 -16
- package/dist/commerce/adapters/managed/commerceOmsControlPlane.d.ts +3 -0
- package/dist/commerce/adapters/managed/commerceOmsControlPlane.js +71 -0
- package/dist/commerce/adapters/managed/commerceOmsMutations.d.ts +10 -0
- package/dist/commerce/adapters/managed/commerceOmsMutations.js +119 -0
- package/dist/commerce/adapters/managed/commerceOmsPort.d.ts +28 -0
- package/dist/commerce/adapters/managed/commerceOmsPort.js +101 -0
- package/dist/commerce/adapters/managed/oms/accounting.d.ts +3 -0
- package/dist/commerce/adapters/managed/oms/accounting.js +13 -0
- package/dist/commerce/adapters/managed/oms/fulfillmentReads.d.ts +17 -0
- package/dist/commerce/adapters/managed/oms/fulfillmentReads.js +81 -0
- package/dist/commerce/adapters/managed/oms/inboundEvents.d.ts +9 -0
- package/dist/commerce/adapters/managed/oms/inboundEvents.js +40 -0
- package/dist/commerce/adapters/managed/oms/outboxEvents.d.ts +2 -0
- package/dist/commerce/adapters/managed/oms/outboxEvents.js +23 -0
- package/dist/commerce/adapters/managed/oms/paymentAttempts.d.ts +3 -0
- package/dist/commerce/adapters/managed/oms/paymentAttempts.js +15 -0
- package/dist/commerce/adapters/managed/oms/queueSelection.d.ts +12 -0
- package/dist/commerce/adapters/managed/oms/queueSelection.js +109 -0
- package/dist/commerce/adapters/managed/oms/readProjections.d.ts +18 -0
- package/dist/commerce/adapters/managed/oms/readProjections.js +13 -0
- package/dist/commerce/adapters/managed/oms/readQueries.d.ts +16 -0
- package/dist/commerce/adapters/managed/oms/readQueries.js +276 -0
- package/dist/commerce/adapters/managed/oms/types.d.ts +2 -0
- package/dist/commerce/adapters/managed/oms/types.js +7 -0
- package/dist/commerce/checkoutCommandSchemas.d.ts +89 -0
- package/dist/commerce/checkoutCommandSchemas.js +70 -0
- package/dist/commerce/checkoutHelpers.d.ts +21 -0
- package/dist/commerce/checkoutHelpers.js +29 -0
- package/dist/commerce/checkoutResumeSchemas.d.ts +158 -0
- package/dist/commerce/checkoutResumeSchemas.js +145 -0
- package/dist/commerce/checkoutSchemas.d.ts +158 -0
- package/dist/commerce/checkoutSchemas.js +161 -0
- package/dist/commerce/commerceReturnsPort.d.ts +97 -0
- package/dist/commerce/commerceReturnsPort.js +39 -0
- package/dist/commerce/configuratorIntentPersistenceSchemas.d.ts +20 -0
- package/dist/commerce/configuratorIntentPersistenceSchemas.js +21 -0
- package/dist/commerce/configuratorIntentSchemas.d.ts +63 -0
- package/dist/commerce/configuratorIntentSchemas.js +43 -0
- package/dist/commerce/contractPrimitives.d.ts +50 -0
- package/dist/commerce/contractPrimitives.js +25 -0
- package/dist/commerce/contracts/availability.d.ts +23 -0
- package/dist/commerce/contracts/availability.js +1 -0
- package/dist/commerce/contracts/fulfillmentRecovery.d.ts +25 -0
- package/dist/commerce/contracts/fulfillmentRecovery.js +1 -0
- package/dist/commerce/contracts/index.d.ts +13 -0
- package/dist/commerce/contracts/index.js +1 -0
- package/dist/commerce/contracts/intent.d.ts +86 -0
- package/dist/commerce/contracts/intent.js +1 -0
- package/dist/commerce/contracts/omsTypes.d.ts +1216 -0
- package/dist/commerce/contracts/omsTypes.js +1 -0
- package/dist/commerce/contracts/order.d.ts +39 -0
- package/dist/commerce/contracts/order.js +1 -0
- package/dist/commerce/contracts/orderMoney.d.ts +52 -0
- package/dist/commerce/contracts/orderMoney.js +1 -0
- package/dist/commerce/contracts/ports.d.ts +113 -0
- package/dist/commerce/contracts/ports.js +1 -0
- package/dist/commerce/contracts/recovery.d.ts +11 -0
- package/dist/commerce/contracts/recovery.js +1 -0
- package/dist/commerce/contracts/runtimePorts.d.ts +196 -0
- package/dist/commerce/contracts/runtimePorts.js +1 -0
- package/dist/commerce/contracts/state.d.ts +26 -0
- package/dist/commerce/contracts/state.js +43 -0
- package/dist/commerce/customerDefaultsSnapshotSchemas.d.ts +51 -0
- package/dist/commerce/customerDefaultsSnapshotSchemas.js +106 -0
- package/dist/commerce/errors.d.ts +18 -0
- package/dist/commerce/errors.js +36 -0
- package/dist/commerce/fulfillmentEligibility.d.ts +6 -0
- package/dist/commerce/fulfillmentEligibility.js +31 -0
- package/dist/commerce/index.d.ts +72 -0
- package/dist/commerce/index.js +67 -0
- package/dist/commerce/model/customerFulfillmentRecovery.d.ts +40 -0
- package/dist/commerce/model/customerFulfillmentRecovery.js +144 -0
- package/dist/commerce/model/fulfillmentCancellationEligibility.d.ts +7 -0
- package/dist/commerce/model/fulfillmentCancellationEligibility.js +9 -0
- package/dist/commerce/model/omsAccountingVisibility.d.ts +12 -0
- package/dist/commerce/model/omsAccountingVisibility.js +118 -0
- package/dist/commerce/model/omsBillingInvoiceBuyer.d.ts +2 -0
- package/dist/commerce/model/omsBillingInvoiceBuyer.js +15 -0
- package/dist/commerce/model/omsCurrency.d.ts +4 -0
- package/dist/commerce/model/omsCurrency.js +5 -0
- package/dist/commerce/model/omsFulfillmentDebug.d.ts +20 -0
- package/dist/commerce/model/omsFulfillmentDebug.js +122 -0
- package/dist/commerce/model/omsFulfillmentSummary.d.ts +16 -0
- package/dist/commerce/model/omsFulfillmentSummary.js +189 -0
- package/dist/commerce/model/omsListTotals.d.ts +13 -0
- package/dist/commerce/model/omsListTotals.js +32 -0
- package/dist/commerce/model/omsOperationalLadder.d.ts +51 -0
- package/dist/commerce/model/omsOperationalLadder.js +158 -0
- package/dist/commerce/model/omsOrderLineMoney.d.ts +4 -0
- package/dist/commerce/model/omsOrderLineMoney.js +25 -0
- package/dist/commerce/model/omsPaymentMethodSummary.d.ts +5 -0
- package/dist/commerce/model/omsPaymentMethodSummary.js +11 -0
- package/dist/commerce/model/omsReadModel.d.ts +43 -0
- package/dist/commerce/model/omsReadModel.js +211 -0
- package/dist/commerce/model/omsReadModelCommunication.d.ts +3 -0
- package/dist/commerce/model/omsReadModelCommunication.js +29 -0
- package/dist/commerce/model/omsReadModelHelpers.d.ts +125 -0
- package/dist/commerce/model/omsReadModelHelpers.js +212 -0
- package/dist/commerce/model/omsReadModelList.d.ts +33 -0
- package/dist/commerce/model/omsReadModelList.js +50 -0
- package/dist/commerce/model/omsReadModelListSummary.d.ts +3 -0
- package/dist/commerce/model/omsReadModelListSummary.js +13 -0
- package/dist/commerce/model/omsReadModelPricing.d.ts +5 -0
- package/dist/commerce/model/omsReadModelPricing.js +36 -0
- package/dist/commerce/model/omsReadModelProjections.d.ts +1 -0
- package/dist/commerce/model/omsReadModelProjections.js +1 -0
- package/dist/commerce/model/omsReadModelRowCore.d.ts +79 -0
- package/dist/commerce/model/omsReadModelRowCore.js +149 -0
- package/dist/commerce/model/omsReadModelRows.d.ts +1 -0
- package/dist/commerce/model/omsReadModelRows.js +6 -0
- package/dist/commerce/offerAvailability.d.ts +18 -0
- package/dist/commerce/offerAvailability.js +53 -0
- package/dist/commerce/offerAvailabilitySchemas.d.ts +43 -0
- package/dist/commerce/offerAvailabilitySchemas.js +42 -0
- package/dist/commerce/offerEvidenceSchemas.d.ts +7 -0
- package/dist/commerce/offerEvidenceSchemas.js +13 -0
- package/dist/commerce/oms/omsContractBase.d.ts +130 -0
- package/dist/commerce/oms/omsContractBase.js +86 -0
- package/dist/commerce/oms/omsContractReadAuxSchemas.d.ts +222 -0
- package/dist/commerce/oms/omsContractReadAuxSchemas.js +123 -0
- package/dist/commerce/oms/omsContractReadSchemas.d.ts +2266 -0
- package/dist/commerce/oms/omsContractReadSchemas.js +277 -0
- package/dist/commerce/oms/omsContractRequests.d.ts +196 -0
- package/dist/commerce/oms/omsContractRequests.js +118 -0
- package/dist/commerce/oms/omsContracts.d.ts +5 -0
- package/dist/commerce/oms/omsContracts.js +4 -0
- package/dist/commerce/oms/omsControlPlane.d.ts +275 -0
- package/dist/commerce/oms/omsControlPlane.js +72 -0
- package/dist/commerce/oms/omsFulfillmentContractSchemas.d.ts +203 -0
- package/dist/commerce/oms/omsFulfillmentContractSchemas.js +94 -0
- package/dist/commerce/oms/omsFulfillmentDebugSchemas.d.ts +69 -0
- package/dist/commerce/oms/omsFulfillmentDebugSchemas.js +33 -0
- package/dist/commerce/oms/omsFulfillmentHealthSchemas.d.ts +67 -0
- package/dist/commerce/oms/omsFulfillmentHealthSchemas.js +44 -0
- package/dist/commerce/oms/omsPorts.d.ts +84 -0
- package/dist/commerce/oms/omsPorts.js +148 -0
- package/dist/commerce/oms/omsPrimitives.d.ts +5 -0
- package/dist/commerce/oms/omsPrimitives.js +3 -0
- package/dist/commerce/oms/omsProviderEvidenceSchemas.d.ts +15 -0
- package/dist/commerce/oms/omsProviderEvidenceSchemas.js +12 -0
- package/dist/commerce/orderDraftErrors.d.ts +13 -0
- package/dist/commerce/orderDraftErrors.js +20 -0
- package/dist/commerce/orderEmailEligibility.d.ts +54 -0
- package/dist/commerce/orderEmailEligibility.js +123 -0
- package/dist/commerce/orderEmailLines.d.ts +12 -0
- package/dist/commerce/orderEmailLines.js +8 -0
- package/dist/commerce/orderFeedbackContracts.d.ts +41 -0
- package/dist/commerce/orderFeedbackContracts.js +33 -0
- package/dist/commerce/orderMoney.d.ts +6 -0
- package/dist/commerce/orderMoney.js +168 -0
- package/dist/commerce/orderReviewContracts.d.ts +475 -0
- package/dist/commerce/orderReviewContracts.js +94 -0
- package/dist/commerce/orderReviewPorts.d.ts +140 -0
- package/dist/commerce/orderReviewPorts.js +1 -0
- package/dist/commerce/outboxDispatchContracts.d.ts +30 -0
- package/dist/commerce/outboxDispatchContracts.js +1 -0
- package/dist/commerce/outboxEventSchemas.d.ts +162 -0
- package/dist/commerce/outboxEventSchemas.js +164 -0
- package/dist/commerce/outboxOrderDraftEmailPorts.d.ts +207 -0
- package/dist/commerce/outboxOrderDraftEmailPorts.js +12 -0
- package/dist/commerce/paymentContinuation.d.ts +4 -0
- package/dist/commerce/paymentContinuation.js +4 -0
- package/dist/commerce/ports.d.ts +8 -0
- package/dist/commerce/ports.js +1 -0
- package/dist/commerce/recoveryDestination.d.ts +3 -0
- package/dist/commerce/recoveryDestination.js +17 -0
- package/dist/commerce/runtimeErrors.d.ts +8 -0
- package/dist/commerce/runtimeErrors.js +16 -0
- package/dist/commerce/salesChannelEnvelope.d.ts +20 -0
- package/dist/commerce/salesChannelEnvelope.js +7 -0
- package/dist/commerce/schemas.d.ts +174 -0
- package/dist/commerce/schemas.js +84 -0
- package/dist/commerce/server/checkoutCompensation.d.ts +21 -0
- package/dist/commerce/server/checkoutCompensation.js +32 -0
- package/dist/commerce/server/checkoutConflictClassifiers.d.ts +17 -0
- package/dist/commerce/server/checkoutConflictClassifiers.js +38 -0
- package/dist/commerce/server/checkoutExpiredRecoveryPolicy.d.ts +38 -0
- package/dist/commerce/server/checkoutExpiredRecoveryPolicy.js +85 -0
- package/dist/commerce/server/checkoutInvoiceBuyerSnapshot.d.ts +22 -0
- package/dist/commerce/server/checkoutInvoiceBuyerSnapshot.js +30 -0
- package/dist/commerce/server/checkoutOfferPolicyPort.d.ts +33 -0
- package/dist/commerce/server/checkoutOfferPolicyPort.js +49 -0
- package/dist/commerce/server/checkoutPaymentContinuationCredential.d.ts +58 -0
- package/dist/commerce/server/checkoutPaymentContinuationCredential.js +154 -0
- package/dist/commerce/server/checkoutQuoteTypes.d.ts +19 -0
- package/dist/commerce/server/checkoutQuoteTypes.js +1 -0
- package/dist/commerce/server/checkoutRecoveryOrderPort.d.ts +42 -0
- package/dist/commerce/server/checkoutRecoveryOrderPort.js +1 -0
- package/dist/commerce/server/checkoutRecoveryToken.d.ts +40 -0
- package/dist/commerce/server/checkoutRecoveryToken.js +26 -0
- package/dist/commerce/server/checkoutRefusalContinuation.d.ts +24 -0
- package/dist/commerce/server/checkoutRefusalContinuation.js +18 -0
- package/dist/commerce/server/checkoutRuntimeTypes.d.ts +81 -0
- package/dist/commerce/server/checkoutRuntimeTypes.js +1 -0
- package/dist/commerce/server/commerceCheckoutCommandExecution.d.ts +60 -0
- package/dist/commerce/server/commerceCheckoutCommandExecution.js +136 -0
- package/dist/commerce/server/commerceCheckoutCompensation.d.ts +26 -0
- package/dist/commerce/server/commerceCheckoutCompensation.js +46 -0
- package/dist/commerce/server/commerceCheckoutContinuationTerms.d.ts +50 -0
- package/dist/commerce/server/commerceCheckoutContinuationTerms.js +66 -0
- package/dist/commerce/server/commerceCheckoutCustomerDefaults.d.ts +18 -0
- package/dist/commerce/server/commerceCheckoutCustomerDefaults.js +17 -0
- package/dist/commerce/server/commerceCheckoutFailureHandler.d.ts +51 -0
- package/dist/commerce/server/commerceCheckoutFailureHandler.js +90 -0
- package/dist/commerce/server/commerceCheckoutHandler.d.ts +213 -0
- package/dist/commerce/server/commerceCheckoutHandler.js +196 -0
- package/dist/commerce/server/commerceCheckoutHandlerAdmission.d.ts +58 -0
- package/dist/commerce/server/commerceCheckoutHandlerAdmission.js +94 -0
- package/dist/commerce/server/commerceCheckoutHandlerHelpers.d.ts +67 -0
- package/dist/commerce/server/commerceCheckoutHandlerHelpers.js +155 -0
- package/dist/commerce/server/commerceCheckoutOrchestrationError.d.ts +9 -0
- package/dist/commerce/server/commerceCheckoutOrchestrationError.js +14 -0
- package/dist/commerce/server/commerceCheckoutPromotionPriceChange.d.ts +47 -0
- package/dist/commerce/server/commerceCheckoutPromotionPriceChange.js +43 -0
- package/dist/commerce/server/commerceCheckoutProviderPayment.d.ts +34 -0
- package/dist/commerce/server/commerceCheckoutProviderPayment.js +37 -0
- package/dist/commerce/server/commerceCheckoutQuoteGuard.d.ts +62 -0
- package/dist/commerce/server/commerceCheckoutQuoteGuard.js +106 -0
- package/dist/commerce/server/commerceCheckoutResume.d.ts +29 -0
- package/dist/commerce/server/commerceCheckoutResume.js +81 -0
- package/dist/commerce/server/commerceCheckoutResumeGuard.d.ts +54 -0
- package/dist/commerce/server/commerceCheckoutResumeGuard.js +138 -0
- package/dist/commerce/server/commerceCheckoutSavedPaymentMethod.d.ts +39 -0
- package/dist/commerce/server/commerceCheckoutSavedPaymentMethod.js +44 -0
- package/dist/commerce/server/commerceCheckoutStartRuntimeFailure.d.ts +7 -0
- package/dist/commerce/server/commerceCheckoutStartRuntimeFailure.js +39 -0
- package/dist/commerce/server/commerceCheckoutTiming.d.ts +8 -0
- package/dist/commerce/server/commerceCheckoutTiming.js +31 -0
- package/dist/commerce/server/commerceDiagnostics.d.ts +6 -0
- package/dist/commerce/server/commerceDiagnostics.js +31 -0
- package/dist/commerce/server/commerceOmsCancelOrderHandler.d.ts +7 -0
- package/dist/commerce/server/commerceOmsCancelOrderHandler.js +22 -0
- package/dist/commerce/server/commerceOmsControlPlaneHandlers.d.ts +18 -0
- package/dist/commerce/server/commerceOmsControlPlaneHandlers.js +60 -0
- package/dist/commerce/server/commerceOmsHandlers.d.ts +47 -0
- package/dist/commerce/server/commerceOmsHandlers.js +176 -0
- package/dist/commerce/server/commerceOmsMarkRefundedHandler.d.ts +7 -0
- package/dist/commerce/server/commerceOmsMarkRefundedHandler.js +19 -0
- package/dist/commerce/server/commerceOrderDraft.d.ts +24 -0
- package/dist/commerce/server/commerceOrderDraft.js +92 -0
- package/dist/commerce/server/commercePaidOrderOrchestration.d.ts +131 -0
- package/dist/commerce/server/commercePaidOrderOrchestration.js +140 -0
- package/dist/commerce/server/commerceProviderAttemptFailure.d.ts +133 -0
- package/dist/commerce/server/commerceProviderAttemptFailure.js +175 -0
- package/dist/commerce/server/commerceReturnsHandlers.d.ts +41 -0
- package/dist/commerce/server/commerceReturnsHandlers.js +100 -0
- package/dist/commerce/server/commerceRuntimePort.d.ts +16 -0
- package/dist/commerce/server/commerceRuntimePort.js +57 -0
- package/dist/commerce/server/commerceRuntimeService.d.ts +98 -0
- package/dist/commerce/server/commerceRuntimeService.js +186 -0
- package/dist/commerce/server/commerceRuntimeStartResponse.d.ts +37 -0
- package/dist/commerce/server/commerceRuntimeStartResponse.js +56 -0
- package/dist/commerce/server/commerceStarterOfferGuard.d.ts +55 -0
- package/dist/commerce/server/commerceStarterOfferGuard.js +128 -0
- package/dist/commerce/server/configuratorIntentPersistence.d.ts +47 -0
- package/dist/commerce/server/configuratorIntentPersistence.js +85 -0
- package/dist/commerce/server/configuratorIntentPersistenceHandler.d.ts +14 -0
- package/dist/commerce/server/configuratorIntentPersistenceHandler.js +42 -0
- package/dist/commerce/server/emailRuntime.d.ts +47 -0
- package/dist/commerce/server/emailRuntime.js +1 -0
- package/dist/commerce/server/handlerSupport.d.ts +68 -0
- package/dist/commerce/server/handlerSupport.js +1 -0
- package/dist/commerce/server/index.d.ts +178 -0
- package/dist/commerce/server/index.js +127 -0
- package/dist/commerce/server/offerAvailability.d.ts +21 -0
- package/dist/commerce/server/offerAvailability.js +163 -0
- package/dist/commerce/server/orderDraftRpcPayload.d.ts +20 -0
- package/dist/commerce/server/orderDraftRpcPayload.js +21 -0
- package/dist/commerce/server/orderFeedbackSubmit.d.ts +20 -0
- package/dist/commerce/server/orderFeedbackSubmit.js +16 -0
- package/dist/commerce/server/orderFeedbackTokenCheck.d.ts +17 -0
- package/dist/commerce/server/orderFeedbackTokenCheck.js +14 -0
- package/dist/commerce/server/orderReviewAdminHandlers.d.ts +47 -0
- package/dist/commerce/server/orderReviewAdminHandlers.js +41 -0
- package/dist/commerce/server/orderReviewHandlers.d.ts +114 -0
- package/dist/commerce/server/orderReviewHandlers.js +42 -0
- package/dist/commerce/server/orderReviewLifecycle.d.ts +10 -0
- package/dist/commerce/server/orderReviewLifecycle.js +121 -0
- package/dist/commerce/server/orderReviewMedia.d.ts +11 -0
- package/dist/commerce/server/orderReviewMedia.js +172 -0
- package/dist/commerce/server/orderReviewRawUploadHandler.d.ts +40 -0
- package/dist/commerce/server/orderReviewRawUploadHandler.js +316 -0
- package/dist/commerce/server/outboxCheckoutExpiredEmailHandler.d.ts +14 -0
- package/dist/commerce/server/outboxCheckoutExpiredEmailHandler.js +57 -0
- package/dist/commerce/server/outboxCheckoutRecoveryEmailHandler.d.ts +13 -0
- package/dist/commerce/server/outboxCheckoutRecoveryEmailHandler.js +150 -0
- package/dist/commerce/server/outboxDispatchRegistry.d.ts +46 -0
- package/dist/commerce/server/outboxDispatchRegistry.js +184 -0
- package/dist/commerce/server/outboxDispatchRegistryComposition.d.ts +6 -0
- package/dist/commerce/server/outboxDispatchRegistryComposition.js +23 -0
- package/dist/commerce/server/outboxOrderDraftEmailHandler.d.ts +14 -0
- package/dist/commerce/server/outboxOrderDraftEmailHandler.js +130 -0
- package/dist/commerce/server/outboxOrderPaidEmailHandler.d.ts +21 -0
- package/dist/commerce/server/outboxOrderPaidEmailHandler.js +93 -0
- package/dist/commerce/server/outboxOrderPaidFulfillmentHandler.d.ts +3 -0
- package/dist/commerce/server/outboxOrderPaidFulfillmentHandler.js +1 -0
- package/dist/commerce/server/outboxOrderPaidFulfillmentPorts.d.ts +3 -0
- package/dist/commerce/server/outboxOrderPaidFulfillmentPorts.js +1 -0
- package/dist/commerce/server/outboxOrderRefundedEmailHandler.d.ts +13 -0
- package/dist/commerce/server/outboxOrderRefundedEmailHandler.js +42 -0
- package/dist/commerce/server/outboxPaymentFailedEmailHandler.d.ts +14 -0
- package/dist/commerce/server/outboxPaymentFailedEmailHandler.js +65 -0
- package/dist/commerce/server/outboxReturnEmailHandlers.d.ts +26 -0
- package/dist/commerce/server/outboxReturnEmailHandlers.js +53 -0
- package/dist/commerce/server/outboxShipmentDeliveredEmailHandler.d.ts +17 -0
- package/dist/commerce/server/outboxShipmentDeliveredEmailHandler.js +52 -0
- package/dist/commerce/server/outboxShipmentDispatchedEmailHandler.d.ts +13 -0
- package/dist/commerce/server/outboxShipmentDispatchedEmailHandler.js +87 -0
- package/dist/commerce/server/outboxShipmentExceptionEmailHandler.d.ts +13 -0
- package/dist/commerce/server/outboxShipmentExceptionEmailHandler.js +46 -0
- package/dist/commerce/server/referenceCheckoutHandler.d.ts +48 -0
- package/dist/commerce/server/referenceCheckoutHandler.js +68 -0
- package/dist/commerce/server/reservationSweepPort.d.ts +31 -0
- package/dist/commerce/server/reservationSweepPort.js +45 -0
- package/dist/commerce/server/starterTermsPort.d.ts +22 -0
- package/dist/commerce/server/starterTermsPort.js +1 -0
- package/dist/commerce/server/supabaseCommerceReturnsPort.d.ts +13 -0
- package/dist/commerce/server/supabaseCommerceReturnsPort.js +56 -0
- package/dist/communications/consentPurposeRegistry.d.ts +1 -1
- package/dist/communications/newsletterIntegrationContracts.d.ts +5 -5
- package/dist/composition/commerceContribution.d.ts +21 -0
- package/dist/composition/commerceContribution.js +27 -0
- package/dist/composition/index.d.ts +1 -0
- package/dist/composition/index.js +1 -0
- package/dist/fulfillment/handlerSchemas.d.ts +41 -41
- package/dist/fulfillment/index.d.ts +1 -1
- package/dist/fulfillment/index.js +1 -1
- package/dist/fulfillment/paidHandoff.d.ts +12 -1
- package/dist/fulfillment/paidHandoff.js +2 -2
- package/dist/fulfillment/providerDispatchWorker.d.ts +4 -4
- package/dist/identity/customerContracts.d.ts +2 -2
- package/dist/inventory/bindings.d.ts +3 -0
- package/dist/inventory/bindings.js +10 -4
- package/dist/inventory/index.d.ts +1 -0
- package/dist/inventory/index.js +1 -0
- package/dist/inventory/managedStockAvailability.d.ts +15 -0
- package/dist/inventory/managedStockAvailability.js +16 -0
- package/dist/inventory/postgresStockAvailability.js +2 -25
- package/dist/inventory/schemas.d.ts +1 -1
- package/dist/inventory/stockReadResponse.d.ts +4 -0
- package/dist/inventory/stockReadResponse.js +27 -0
- package/dist/pricing/browser/index.d.ts +6 -0
- package/dist/pricing/browser/index.js +6 -0
- package/dist/promotions/adminPromotionsContracts.d.ts +2 -2
- package/dist/subscriptions/index.d.ts +3 -2
- package/dist/subscriptions/index.js +3 -2
- package/package.json +22 -2
- package/release-gates.json +63 -8
- package/src/commerce/adapters/managed/commerceOmsControlPlane.ts +80 -0
- package/src/commerce/adapters/managed/commerceOmsMutations.ts +145 -0
- package/src/commerce/adapters/managed/commerceOmsPort.ts +158 -0
- package/src/commerce/adapters/managed/oms/accounting.ts +18 -0
- package/src/commerce/adapters/managed/oms/fulfillmentReads.ts +82 -0
- package/src/commerce/adapters/managed/oms/inboundEvents.ts +45 -0
- package/src/commerce/adapters/managed/oms/outboxEvents.ts +30 -0
- package/src/commerce/adapters/managed/oms/paymentAttempts.ts +19 -0
- package/src/commerce/adapters/managed/oms/queueSelection.ts +132 -0
- package/src/commerce/adapters/managed/oms/readProjections.ts +22 -0
- package/src/commerce/adapters/managed/oms/readQueries.ts +292 -0
- package/src/commerce/adapters/managed/oms/types.ts +9 -0
- package/src/commerce/checkoutCommandSchemas.ts +93 -0
- package/src/commerce/checkoutHelpers.ts +47 -0
- package/src/commerce/checkoutResumeSchemas.ts +164 -0
- package/src/commerce/checkoutSchemas.ts +182 -0
- package/src/commerce/commerceReturnsPort.ts +67 -0
- package/src/commerce/configuratorIntentPersistenceSchemas.ts +26 -0
- package/src/commerce/configuratorIntentSchemas.ts +47 -0
- package/src/commerce/contractPrimitives.ts +30 -0
- package/src/commerce/contracts/availability.ts +21 -0
- package/src/commerce/contracts/fulfillmentRecovery.ts +26 -0
- package/src/commerce/contracts/index.ts +17 -0
- package/src/commerce/contracts/intent.ts +58 -0
- package/src/commerce/contracts/omsTypes.ts +1217 -0
- package/src/commerce/contracts/order.ts +44 -0
- package/src/commerce/contracts/orderMoney.ts +75 -0
- package/src/commerce/contracts/ports.ts +124 -0
- package/src/commerce/contracts/recovery.ts +24 -0
- package/src/commerce/contracts/runtimePorts.ts +201 -0
- package/src/commerce/contracts/state.ts +64 -0
- package/src/commerce/customerDefaultsSnapshotSchemas.ts +117 -0
- package/src/commerce/errors.ts +53 -0
- package/src/commerce/fulfillmentEligibility.ts +32 -0
- package/src/commerce/index.ts +82 -0
- package/src/commerce/model/customerFulfillmentRecovery.ts +185 -0
- package/src/commerce/model/fulfillmentCancellationEligibility.ts +18 -0
- package/src/commerce/model/omsAccountingVisibility.ts +135 -0
- package/src/commerce/model/omsBillingInvoiceBuyer.ts +20 -0
- package/src/commerce/model/omsCurrency.ts +8 -0
- package/src/commerce/model/omsFulfillmentDebug.ts +157 -0
- package/src/commerce/model/omsFulfillmentSummary.ts +225 -0
- package/src/commerce/model/omsListTotals.ts +38 -0
- package/src/commerce/model/omsOperationalLadder.ts +181 -0
- package/src/commerce/model/omsOrderLineMoney.ts +34 -0
- package/src/commerce/model/omsPaymentMethodSummary.ts +19 -0
- package/src/commerce/model/omsReadModel.ts +302 -0
- package/src/commerce/model/omsReadModelCommunication.ts +32 -0
- package/src/commerce/model/omsReadModelHelpers.ts +279 -0
- package/src/commerce/model/omsReadModelList.ts +90 -0
- package/src/commerce/model/omsReadModelListSummary.ts +19 -0
- package/src/commerce/model/omsReadModelPricing.ts +57 -0
- package/src/commerce/model/omsReadModelProjections.ts +1 -0
- package/src/commerce/model/omsReadModelRowCore.ts +193 -0
- package/src/commerce/model/omsReadModelRows.ts +7 -0
- package/src/commerce/offerAvailability.ts +75 -0
- package/src/commerce/offerAvailabilitySchemas.ts +56 -0
- package/src/commerce/offerEvidenceSchemas.ts +17 -0
- package/src/commerce/oms/omsContractBase.ts +92 -0
- package/src/commerce/oms/omsContractReadAuxSchemas.ts +130 -0
- package/src/commerce/oms/omsContractReadSchemas.ts +303 -0
- package/src/commerce/oms/omsContractRequests.ts +143 -0
- package/src/commerce/oms/omsContracts.ts +6 -0
- package/src/commerce/oms/omsControlPlane.ts +85 -0
- package/src/commerce/oms/omsFulfillmentContractSchemas.ts +113 -0
- package/src/commerce/oms/omsFulfillmentDebugSchemas.ts +38 -0
- package/src/commerce/oms/omsFulfillmentHealthSchemas.ts +46 -0
- package/src/commerce/oms/omsPorts.ts +165 -0
- package/src/commerce/oms/omsPrimitives.ts +3 -0
- package/src/commerce/oms/omsProviderEvidenceSchemas.ts +13 -0
- package/src/commerce/orderDraftErrors.ts +28 -0
- package/src/commerce/orderEmailEligibility.ts +131 -0
- package/src/commerce/orderEmailLines.ts +22 -0
- package/src/commerce/orderFeedbackContracts.ts +47 -0
- package/src/commerce/orderMoney.ts +207 -0
- package/src/commerce/orderReviewContracts.ts +124 -0
- package/src/commerce/orderReviewPorts.ts +94 -0
- package/src/commerce/outboxDispatchContracts.ts +30 -0
- package/src/commerce/outboxEventSchemas.ts +230 -0
- package/src/commerce/outboxOrderDraftEmailPorts.ts +241 -0
- package/src/commerce/paymentContinuation.ts +5 -0
- package/src/commerce/ports.ts +7 -0
- package/src/commerce/recoveryDestination.ts +23 -0
- package/src/commerce/runtimeErrors.ts +19 -0
- package/src/commerce/salesChannelEnvelope.ts +28 -0
- package/src/commerce/schemas.ts +104 -0
- package/src/commerce/server/checkoutCompensation.ts +49 -0
- package/src/commerce/server/checkoutConflictClassifiers.ts +53 -0
- package/src/commerce/server/checkoutExpiredRecoveryPolicy.ts +107 -0
- package/src/commerce/server/checkoutInvoiceBuyerSnapshot.ts +36 -0
- package/src/commerce/server/checkoutOfferPolicyPort.ts +60 -0
- package/src/commerce/server/checkoutPaymentContinuationCredential.ts +222 -0
- package/src/commerce/server/checkoutQuoteTypes.ts +9 -0
- package/src/commerce/server/checkoutRecoveryOrderPort.ts +40 -0
- package/src/commerce/server/checkoutRecoveryToken.ts +63 -0
- package/src/commerce/server/checkoutRefusalContinuation.ts +29 -0
- package/src/commerce/server/checkoutRuntimeTypes.ts +26 -0
- package/src/commerce/server/commerceCheckoutCommandExecution.ts +188 -0
- package/src/commerce/server/commerceCheckoutCompensation.ts +66 -0
- package/src/commerce/server/commerceCheckoutContinuationTerms.ts +87 -0
- package/src/commerce/server/commerceCheckoutCustomerDefaults.ts +24 -0
- package/src/commerce/server/commerceCheckoutFailureHandler.ts +144 -0
- package/src/commerce/server/commerceCheckoutHandler.ts +269 -0
- package/src/commerce/server/commerceCheckoutHandlerAdmission.ts +157 -0
- package/src/commerce/server/commerceCheckoutHandlerHelpers.ts +223 -0
- package/src/commerce/server/commerceCheckoutOrchestrationError.ts +15 -0
- package/src/commerce/server/commerceCheckoutPromotionPriceChange.ts +83 -0
- package/src/commerce/server/commerceCheckoutProviderPayment.ts +45 -0
- package/src/commerce/server/commerceCheckoutQuoteGuard.ts +172 -0
- package/src/commerce/server/commerceCheckoutResume.ts +132 -0
- package/src/commerce/server/commerceCheckoutResumeGuard.ts +195 -0
- package/src/commerce/server/commerceCheckoutSavedPaymentMethod.ts +85 -0
- package/src/commerce/server/commerceCheckoutStartRuntimeFailure.ts +59 -0
- package/src/commerce/server/commerceCheckoutTiming.ts +53 -0
- package/src/commerce/server/commerceDiagnostics.ts +37 -0
- package/src/commerce/server/commerceOmsCancelOrderHandler.ts +43 -0
- package/src/commerce/server/commerceOmsControlPlaneHandlers.ts +71 -0
- package/src/commerce/server/commerceOmsHandlers.ts +275 -0
- package/src/commerce/server/commerceOmsMarkRefundedHandler.ts +39 -0
- package/src/commerce/server/commerceOrderDraft.ts +131 -0
- package/src/commerce/server/commercePaidOrderOrchestration.ts +275 -0
- package/src/commerce/server/commerceProviderAttemptFailure.ts +257 -0
- package/src/commerce/server/commerceReturnsHandlers.ts +143 -0
- package/src/commerce/server/commerceRuntimePort.ts +75 -0
- package/src/commerce/server/commerceRuntimeService.ts +229 -0
- package/src/commerce/server/commerceRuntimeStartResponse.ts +76 -0
- package/src/commerce/server/commerceStarterOfferGuard.ts +200 -0
- package/src/commerce/server/configuratorIntentPersistence.ts +161 -0
- package/src/commerce/server/configuratorIntentPersistenceHandler.ts +54 -0
- package/src/commerce/server/emailRuntime.ts +30 -0
- package/src/commerce/server/handlerSupport.ts +22 -0
- package/src/commerce/server/index.ts +181 -0
- package/src/commerce/server/offerAvailability.ts +275 -0
- package/src/commerce/server/orderDraftRpcPayload.ts +39 -0
- package/src/commerce/server/orderFeedbackSubmit.ts +40 -0
- package/src/commerce/server/orderFeedbackTokenCheck.ts +28 -0
- package/src/commerce/server/orderReviewAdminHandlers.ts +43 -0
- package/src/commerce/server/orderReviewHandlers.ts +57 -0
- package/src/commerce/server/orderReviewLifecycle.ts +129 -0
- package/src/commerce/server/orderReviewMedia.ts +170 -0
- package/src/commerce/server/orderReviewRawUploadHandler.ts +300 -0
- package/src/commerce/server/outboxCheckoutExpiredEmailHandler.ts +86 -0
- package/src/commerce/server/outboxCheckoutRecoveryEmailHandler.ts +188 -0
- package/src/commerce/server/outboxDispatchRegistry.ts +269 -0
- package/src/commerce/server/outboxDispatchRegistryComposition.ts +31 -0
- package/src/commerce/server/outboxOrderDraftEmailHandler.ts +162 -0
- package/src/commerce/server/outboxOrderPaidEmailHandler.ts +147 -0
- package/src/commerce/server/outboxOrderPaidFulfillmentHandler.ts +4 -0
- package/src/commerce/server/outboxOrderPaidFulfillmentPorts.ts +3 -0
- package/src/commerce/server/outboxOrderRefundedEmailHandler.ts +58 -0
- package/src/commerce/server/outboxPaymentFailedEmailHandler.ts +99 -0
- package/src/commerce/server/outboxReturnEmailHandlers.ts +92 -0
- package/src/commerce/server/outboxShipmentDeliveredEmailHandler.ts +94 -0
- package/src/commerce/server/outboxShipmentDispatchedEmailHandler.ts +112 -0
- package/src/commerce/server/outboxShipmentExceptionEmailHandler.ts +73 -0
- package/src/commerce/server/referenceCheckoutHandler.ts +87 -0
- package/src/commerce/server/reservationSweepPort.ts +67 -0
- package/src/commerce/server/starterTermsPort.ts +22 -0
- package/src/commerce/server/supabaseCommerceReturnsPort.ts +81 -0
- package/src/composition/commerceContribution.ts +35 -0
- package/src/composition/index.ts +1 -0
- package/src/fulfillment/index.ts +1 -1
- package/src/fulfillment/paidHandoff.ts +2 -2
- package/src/inventory/bindings.ts +12 -4
- package/src/inventory/index.ts +1 -0
- package/src/inventory/managedStockAvailability.ts +23 -0
- package/src/inventory/postgresStockAvailability.ts +2 -21
- package/src/inventory/stockReadResponse.ts +25 -0
- package/src/pricing/browser/index.ts +6 -0
- package/src/subscriptions/index.ts +3 -2
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { adminCommerceOrderDetailRequestSchema, adminCommerceOrderDetailResponseSchema, adminCommerceOrderHoldRequestSchema, adminCommerceOrderHoldResponseSchema, adminCommerceOrderNoteRequestSchema, adminCommerceOrderNoteResponseSchema, adminCommerceOrderReleaseHoldRequestSchema, adminCommerceOrderUpdateShippingAddressRequestSchema, adminCommerceOrderUpdateShippingAddressResponseSchema, adminCommerceOrdersListRequestSchema, adminCommerceOrdersListResponseSchema, } from "../oms/omsContracts.js";
|
|
2
|
+
import { CommerceOmsConflictError } from "../oms/omsPorts.js";
|
|
3
|
+
import { unprojectedOmsReadGate } from "./handlerSupport.js";
|
|
4
|
+
export function createAdminCommerceOrdersListHandler({ authorizeAdmin, omsPort, readGate, listRequestSchema = adminCommerceOrdersListRequestSchema, listResponseSchema = adminCommerceOrdersListResponseSchema, detailResponseSchema = adminCommerceOrderDetailResponseSchema, respond, }) {
|
|
5
|
+
return async function handler(req, res) {
|
|
6
|
+
if (req.method !== "GET" && req.method !== "POST")
|
|
7
|
+
return respond.sendMethodNotAllowed(res, ["GET", "POST"]);
|
|
8
|
+
const auth = await authorize(req, res, authorizeAdmin, respond);
|
|
9
|
+
if (!auth)
|
|
10
|
+
return;
|
|
11
|
+
const rawRequest = req.method === "GET" ? req.query ?? {} : req.body ?? {};
|
|
12
|
+
const request = parseOmsRequest(res, respond, listRequestSchema, rawRequest, "Invalid admin commerce orders request");
|
|
13
|
+
if (request === undefined)
|
|
14
|
+
return;
|
|
15
|
+
// Wave 7a: gate the machine actor; the human admin OMS UI is unaffected.
|
|
16
|
+
const gate = readGate?.({
|
|
17
|
+
authorization: auth,
|
|
18
|
+
view: "list",
|
|
19
|
+
query: auditSafeListQuery(request),
|
|
20
|
+
}) ?? unprojectedOmsReadGate;
|
|
21
|
+
if (gate.blocked)
|
|
22
|
+
return;
|
|
23
|
+
try {
|
|
24
|
+
const result = await omsPort.listOrders(request);
|
|
25
|
+
const response = listResponseSchema.safeParse(result);
|
|
26
|
+
if (!response.success) {
|
|
27
|
+
respond.sendBffError(res, "INVALID_RESPONSE", "Admin commerce orders returned invalid response");
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
await gate.audit(response.data.orders.flatMap((o) => (o.clientId ? [o.clientId] : [])));
|
|
31
|
+
respond.sendBffSuccess(res, gate.maskOrders(response.data));
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
respond.sendBffError(res, "UPSTREAM_UNAVAILABLE", "Admin commerce orders read failed");
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function auditSafeListQuery(request) {
|
|
39
|
+
const { search, ...safe } = request;
|
|
40
|
+
return search ? { ...safe, search: "[redacted]" } : safe;
|
|
41
|
+
}
|
|
42
|
+
export function createAdminCommerceOrderDetailHandler({ authorizeAdmin, omsPort, readGate, listRequestSchema = adminCommerceOrdersListRequestSchema, listResponseSchema = adminCommerceOrdersListResponseSchema, detailResponseSchema = adminCommerceOrderDetailResponseSchema, respond, }) {
|
|
43
|
+
return async function handler(req, res) {
|
|
44
|
+
if (req.method !== "GET")
|
|
45
|
+
return respond.sendMethodNotAllowed(res, ["GET"]);
|
|
46
|
+
const auth = await authorize(req, res, authorizeAdmin, respond);
|
|
47
|
+
if (!auth)
|
|
48
|
+
return;
|
|
49
|
+
const request = parseOmsRequest(res, respond, adminCommerceOrderDetailRequestSchema, req.query, "Invalid admin commerce order detail request");
|
|
50
|
+
if (request === undefined)
|
|
51
|
+
return;
|
|
52
|
+
// Wave 7a: gate the machine actor. Detail returns FULL PII (gated + audited).
|
|
53
|
+
const gate = readGate?.({
|
|
54
|
+
authorization: auth,
|
|
55
|
+
view: "detail",
|
|
56
|
+
query: { ...request },
|
|
57
|
+
}) ?? unprojectedOmsReadGate;
|
|
58
|
+
if (gate.blocked)
|
|
59
|
+
return;
|
|
60
|
+
try {
|
|
61
|
+
const result = await omsPort.getOrderDetail(request);
|
|
62
|
+
if (!result) {
|
|
63
|
+
respond.sendBffError(res, "NOT_FOUND", "Commerce order not found");
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const response = detailResponseSchema.safeParse(result);
|
|
67
|
+
if (!response.success) {
|
|
68
|
+
respond.sendBffError(res, "INVALID_RESPONSE", "Admin commerce order detail returned invalid response");
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
await gate.audit(response.data.order.clientId ? [response.data.order.clientId] : []);
|
|
72
|
+
const masked = gate.maskOrders({ orders: [response.data.order] });
|
|
73
|
+
respond.sendBffSuccess(res, { ...response.data, order: masked.orders[0] });
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
respond.sendBffError(res, "UPSTREAM_UNAVAILABLE", "Admin commerce order detail failed");
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
export function createAdminCommerceOrderHoldHandler({ authorizeAdmin, omsPort, respond, }) {
|
|
81
|
+
return async function handler(req, res) {
|
|
82
|
+
if (req.method !== "POST")
|
|
83
|
+
return respond.sendMethodNotAllowed(res, ["POST"]);
|
|
84
|
+
const auth = await authorize(req, res, authorizeAdmin, respond);
|
|
85
|
+
if (!auth)
|
|
86
|
+
return;
|
|
87
|
+
const request = parseOmsRequest(res, respond, adminCommerceOrderHoldRequestSchema, req.body ?? {}, "Invalid admin commerce order hold request");
|
|
88
|
+
if (request === undefined)
|
|
89
|
+
return;
|
|
90
|
+
await sendHoldResponse(res, respond, () => omsPort.createHold({ ...request, actorUserId: auth.userId }));
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
export function createAdminCommerceOrderReleaseHoldHandler({ authorizeAdmin, omsPort, respond, }) {
|
|
94
|
+
return async function handler(req, res) {
|
|
95
|
+
if (req.method !== "POST")
|
|
96
|
+
return respond.sendMethodNotAllowed(res, ["POST"]);
|
|
97
|
+
const auth = await authorize(req, res, authorizeAdmin, respond);
|
|
98
|
+
if (!auth)
|
|
99
|
+
return;
|
|
100
|
+
const request = parseOmsRequest(res, respond, adminCommerceOrderReleaseHoldRequestSchema, req.body ?? {}, "Invalid admin commerce order release request");
|
|
101
|
+
if (request === undefined)
|
|
102
|
+
return;
|
|
103
|
+
await sendHoldResponse(res, respond, () => omsPort.releaseHold({ ...request, actorUserId: auth.userId }));
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
export function createAdminCommerceOrderNoteHandler({ authorizeAdmin, omsPort, respond, }) {
|
|
107
|
+
return async function handler(req, res) {
|
|
108
|
+
if (req.method !== "POST")
|
|
109
|
+
return respond.sendMethodNotAllowed(res, ["POST"]);
|
|
110
|
+
const auth = await authorize(req, res, authorizeAdmin, respond);
|
|
111
|
+
if (!auth)
|
|
112
|
+
return;
|
|
113
|
+
const request = parseOmsRequest(res, respond, adminCommerceOrderNoteRequestSchema, req.body ?? {}, "Invalid admin commerce order note request");
|
|
114
|
+
if (request === undefined)
|
|
115
|
+
return;
|
|
116
|
+
await sendOmsMutationResponse(res, respond, () => omsPort.addNote({ ...request, actorUserId: auth.userId }), adminCommerceOrderNoteResponseSchema, "Admin commerce note mutation returned invalid response", "Admin commerce note mutation failed");
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
export function createAdminCommerceOrderUpdateShippingAddressHandler({ authorizeAdmin, omsPort, respond, }) {
|
|
120
|
+
return async function handler(req, res) {
|
|
121
|
+
if (req.method !== "POST")
|
|
122
|
+
return respond.sendMethodNotAllowed(res, ["POST"]);
|
|
123
|
+
const auth = await authorize(req, res, authorizeAdmin, respond);
|
|
124
|
+
if (!auth)
|
|
125
|
+
return;
|
|
126
|
+
const request = parseOmsRequest(res, respond, adminCommerceOrderUpdateShippingAddressRequestSchema, req.body ?? {}, "Invalid admin commerce order shipping address request");
|
|
127
|
+
if (request === undefined)
|
|
128
|
+
return;
|
|
129
|
+
await sendOmsMutationResponse(res, respond, () => omsPort.updateShippingAddress({ ...request, actorUserId: auth.userId }), adminCommerceOrderUpdateShippingAddressResponseSchema, "Admin commerce shipping address mutation returned invalid response", "Admin commerce shipping address mutation failed");
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
export async function authorize(req, res, authorizeAdmin, respond) {
|
|
133
|
+
try {
|
|
134
|
+
const authorization = await authorizeAdmin(req);
|
|
135
|
+
if (authorization.ok === false) {
|
|
136
|
+
respond.sendBffError(res, authorization.code, authorization.message);
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
return { ok: true, userId: authorization.userId, isMachineActor: authorization.isMachineActor };
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
respond.sendBffError(res, "UPSTREAM_UNAVAILABLE", "Admin authorization failed");
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function sendHoldResponse(res, respond, action) {
|
|
147
|
+
return sendOmsMutationResponse(res, respond, action, adminCommerceOrderHoldResponseSchema, "Admin commerce hold mutation returned invalid response", "Admin commerce hold mutation failed");
|
|
148
|
+
}
|
|
149
|
+
// Returns the parsed request, or answers the 400 with the flattened details and returns undefined.
|
|
150
|
+
export function parseOmsRequest(res, respond, schema, input, message) {
|
|
151
|
+
const request = schema.safeParse(input);
|
|
152
|
+
if (request.success === false) {
|
|
153
|
+
respond.sendBffError(res, "BAD_REQUEST", message, { details: request.error.flatten() });
|
|
154
|
+
return undefined;
|
|
155
|
+
}
|
|
156
|
+
return request.data;
|
|
157
|
+
}
|
|
158
|
+
// One OMS mutation answer: 502 on a refused or unaccepted result, 409 on a conflict, 503 on any other throw.
|
|
159
|
+
export async function sendOmsMutationResponse(res, respond, action, schema, invalidMessage, failedMessage, accept = () => true) {
|
|
160
|
+
try {
|
|
161
|
+
const result = await action();
|
|
162
|
+
const response = schema.safeParse(result);
|
|
163
|
+
if (response.success === false || !accept(response.data)) {
|
|
164
|
+
respond.sendBffError(res, "INVALID_RESPONSE", invalidMessage);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
respond.sendBffSuccess(res, response.data);
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
if (error instanceof CommerceOmsConflictError) {
|
|
171
|
+
respond.sendBffError(res, "CONFLICT", error.message, { details: error.details });
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
respond.sendBffError(res, "UPSTREAM_UNAVAILABLE", failedMessage);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CommerceOmsHoldPort } from "../oms/omsPorts.js";
|
|
2
|
+
import { type BaseDeps } from "./commerceOmsHandlers.js";
|
|
3
|
+
import type { OmsHandlerRequest } from "./handlerSupport.js";
|
|
4
|
+
export declare function createAdminCommerceOrderMarkRefundedHandler<Response>({ authorizeAdmin, omsPort, mutationsEnabled, respond, }: BaseDeps<Response> & {
|
|
5
|
+
omsPort: Pick<CommerceOmsHoldPort, "markRefunded">;
|
|
6
|
+
mutationsEnabled: () => boolean;
|
|
7
|
+
}): (req: OmsHandlerRequest, res: Response) => Promise<void>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { adminCommerceOrderMarkRefundedRequestSchema, adminCommerceOrderMarkRefundedResponseSchema, } from "../oms/omsContracts.js";
|
|
2
|
+
import { authorize, parseOmsRequest, sendOmsMutationResponse } from "./commerceOmsHandlers.js";
|
|
3
|
+
export function createAdminCommerceOrderMarkRefundedHandler({ authorizeAdmin, omsPort, mutationsEnabled, respond, }) {
|
|
4
|
+
return async function handler(req, res) {
|
|
5
|
+
if (req.method !== "POST")
|
|
6
|
+
return respond.sendMethodNotAllowed(res, ["POST"]);
|
|
7
|
+
const auth = await authorize(req, res, authorizeAdmin, respond);
|
|
8
|
+
if (!auth)
|
|
9
|
+
return;
|
|
10
|
+
if (!mutationsEnabled()) {
|
|
11
|
+
respond.sendBffError(res, "FORBIDDEN", "Commerce OMS refund mutations are not enabled");
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const request = parseOmsRequest(res, respond, adminCommerceOrderMarkRefundedRequestSchema, req.body ?? {}, "Invalid admin commerce order mark-refunded request");
|
|
15
|
+
if (request === undefined)
|
|
16
|
+
return;
|
|
17
|
+
await sendOmsMutationResponse(res, respond, () => omsPort.markRefunded({ ...request, actorUserId: auth.userId }), adminCommerceOrderMarkRefundedResponseSchema, "Admin commerce mark-refunded mutation returned invalid response", "Admin commerce mark-refunded mutation failed");
|
|
18
|
+
};
|
|
19
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { CommerceOrderDraftWritePort } from "../contracts/ports.js";
|
|
3
|
+
import type { RpcError as CommerceOrderDraftRpcError } from "../contracts/omsTypes.js";
|
|
4
|
+
import { ORDER_DRAFT_RPC_NAME } from "./orderDraftRpcPayload.js";
|
|
5
|
+
/** Companion RPC that supersedes a stale pre-payment draft for a stable journey key. */
|
|
6
|
+
export declare const ORDER_DRAFT_SUPERSEDE_RPC_NAME: "commerce_supersede_pre_payment_order_draft";
|
|
7
|
+
export interface CommerceOrderDraftRpcClient<Args extends Record<string, unknown>> {
|
|
8
|
+
rpc(functionName: typeof ORDER_DRAFT_RPC_NAME, args: Args): PromiseLike<{
|
|
9
|
+
data: unknown;
|
|
10
|
+
error: CommerceOrderDraftRpcError | null;
|
|
11
|
+
}>;
|
|
12
|
+
rpc(functionName: typeof ORDER_DRAFT_SUPERSEDE_RPC_NAME, args: {
|
|
13
|
+
p_idempotency_key: string;
|
|
14
|
+
}): PromiseLike<{
|
|
15
|
+
data: unknown;
|
|
16
|
+
error: CommerceOrderDraftRpcError | null;
|
|
17
|
+
}>;
|
|
18
|
+
}
|
|
19
|
+
export declare function createCommerceOrderDraftRpcPort<Request extends {
|
|
20
|
+
idempotencyKey: string;
|
|
21
|
+
}, Response, Args extends Record<string, unknown>>(client: CommerceOrderDraftRpcClient<Args>, bindings: {
|
|
22
|
+
createOrderDraftRpcArgs(request: Request, clientId: string | null): Args;
|
|
23
|
+
responseSchema: z.ZodType<Response>;
|
|
24
|
+
}): CommerceOrderDraftWritePort<Request, Response>;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { CommerceOrderDraftConflictError, CommerceOrderDraftInvalidResponseError, CommerceOrderDraftPersistenceError } from "../errors.js";
|
|
2
|
+
import { CommerceOrderDraftPriceChangedError } from "../orderDraftErrors.js";
|
|
3
|
+
import { ORDER_DRAFT_RPC_NAME } from "./orderDraftRpcPayload.js";
|
|
4
|
+
/** Companion RPC that supersedes a stale pre-payment draft for a stable journey key. */
|
|
5
|
+
export const ORDER_DRAFT_SUPERSEDE_RPC_NAME = "commerce_supersede_pre_payment_order_draft";
|
|
6
|
+
export function createCommerceOrderDraftRpcPort(client, bindings) {
|
|
7
|
+
return {
|
|
8
|
+
async createOrderDraft(request, options) {
|
|
9
|
+
const args = bindings.createOrderDraftRpcArgs(request, options?.clientId ?? null);
|
|
10
|
+
let response = await client.rpc(ORDER_DRAFT_RPC_NAME, args);
|
|
11
|
+
// Stable journey key + edited cart: the producer keys the draft by
|
|
12
|
+
// idempotencyKey and 23505s when the same key arrives with a different
|
|
13
|
+
// (frozen-money) snapshot. Canonical order money freezes an order's amounts
|
|
14
|
+
// once written, so the stale draft cannot be mutated in place — supersede it
|
|
15
|
+
// (cancel the unpaid draft, drop the key) and retry create ONCE via the
|
|
16
|
+
// order-draft supersede RPC. If nothing was superseded (funds already moved),
|
|
17
|
+
// the conflict stands and the caller's resume path owns the in-flight order.
|
|
18
|
+
if (response.error && isIdempotencyConflict(response.error)) {
|
|
19
|
+
const superseded = await supersedeStalePrePaymentDraft(client, request.idempotencyKey);
|
|
20
|
+
if (superseded) {
|
|
21
|
+
response = await client.rpc(ORDER_DRAFT_RPC_NAME, args);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (response.error)
|
|
25
|
+
throw mapRpcError(response.error);
|
|
26
|
+
const parsed = bindings.responseSchema.safeParse(response.data);
|
|
27
|
+
if (!parsed.success) {
|
|
28
|
+
throw new CommerceOrderDraftInvalidResponseError();
|
|
29
|
+
}
|
|
30
|
+
return parsed.data;
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Best-effort supersede of a stale pre-payment draft for this idempotency key.
|
|
36
|
+
* Any failure returns false so the original conflict is preserved (fail-closed to
|
|
37
|
+
* the existing conflict path — never masks a real error as a fresh draft).
|
|
38
|
+
*/
|
|
39
|
+
async function supersedeStalePrePaymentDraft(client, idempotencyKey) {
|
|
40
|
+
try {
|
|
41
|
+
const { data, error } = await client.rpc(ORDER_DRAFT_SUPERSEDE_RPC_NAME, {
|
|
42
|
+
p_idempotency_key: idempotencyKey,
|
|
43
|
+
});
|
|
44
|
+
if (error)
|
|
45
|
+
return false;
|
|
46
|
+
return data === true;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function mapRpcError(error) {
|
|
53
|
+
const catalogReason = ["commerce_order_draft_catalog_head_moved", "commerce_order_draft_catalog_anchor_missing", "commerce_order_draft_offer_membership_refused"]
|
|
54
|
+
.find((reason) => [error.message, error.details, error.hint].some((value) => value?.includes(reason)));
|
|
55
|
+
if (catalogReason)
|
|
56
|
+
return new CommerceOrderDraftConflictError("Commerce catalog admission changed", {
|
|
57
|
+
reason: catalogReason, code: error.code, boundary: ORDER_DRAFT_RPC_NAME,
|
|
58
|
+
});
|
|
59
|
+
if (isPromotionPriceChanged(error)) {
|
|
60
|
+
return new CommerceOrderDraftPriceChangedError("Commerce order draft promotion changed", {
|
|
61
|
+
code: error.code,
|
|
62
|
+
boundary: ORDER_DRAFT_RPC_NAME,
|
|
63
|
+
reason: "promotion_code_unavailable",
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
if (isIdempotencyConflict(error)) {
|
|
67
|
+
return new CommerceOrderDraftConflictError("Commerce order draft idempotency conflict", {
|
|
68
|
+
code: error.code,
|
|
69
|
+
boundary: ORDER_DRAFT_RPC_NAME,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return new CommerceOrderDraftPersistenceError("Commerce order draft RPC failed", {
|
|
73
|
+
code: error.code,
|
|
74
|
+
boundary: ORDER_DRAFT_RPC_NAME,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
function isPromotionPriceChanged(error) {
|
|
78
|
+
const searchable = [error.message, error.details, error.hint].filter(Boolean).join(" ");
|
|
79
|
+
return [
|
|
80
|
+
"promotion_code_global_limit_reached",
|
|
81
|
+
"promotion_code_customer_limit_reached",
|
|
82
|
+
"promotion_code_not_active",
|
|
83
|
+
"promotion_code_not_found",
|
|
84
|
+
"promotion_code_definition_changed",
|
|
85
|
+
"promotion_code_snapshot_revision_mismatch",
|
|
86
|
+
].some((reason) => searchable.includes(reason));
|
|
87
|
+
}
|
|
88
|
+
function isIdempotencyConflict(error) {
|
|
89
|
+
const searchable = [error.message, error.details, error.hint].filter(Boolean).join(" ");
|
|
90
|
+
return (error.code === "23505" ||
|
|
91
|
+
searchable.includes("commerce_order_draft_idempotency_conflict"));
|
|
92
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
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 { CheckoutOrchestrationError } from "./commerceCheckoutOrchestrationError.js";
|
|
5
|
+
import type { CheckoutPaymentExecution } from "./commerceCheckoutProviderPayment.js";
|
|
6
|
+
import type { CheckoutQuoteSnapshot } from "./checkoutQuoteTypes.js";
|
|
7
|
+
export interface CheckoutJourneyRuntimeRequest<Snapshot, PaymentExecution extends CheckoutPaymentExecution, Provider extends string = string, Flow extends string = string, MethodKind extends string = string, RecurringModel extends string = string> {
|
|
8
|
+
idempotencyKey: string;
|
|
9
|
+
paymentAttemptSequence?: number;
|
|
10
|
+
orderDraft: {
|
|
11
|
+
orderId: string;
|
|
12
|
+
status: "draft";
|
|
13
|
+
paymentStatus: "not_started";
|
|
14
|
+
idempotencyKey: string;
|
|
15
|
+
quoteSnapshot: Snapshot;
|
|
16
|
+
replayed: boolean;
|
|
17
|
+
};
|
|
18
|
+
mode: "one_time" | "subscription_cycle";
|
|
19
|
+
saveForFutureUse: boolean;
|
|
20
|
+
clientId: string;
|
|
21
|
+
shippingAddressId: string;
|
|
22
|
+
paymentProvider: Provider;
|
|
23
|
+
returnContext: "public" | "account";
|
|
24
|
+
providerFlow: Flow;
|
|
25
|
+
paymentMethodRef?: string;
|
|
26
|
+
paymentMethodAliasType?: MethodKind;
|
|
27
|
+
paymentMethodRecurringModel?: RecurringModel;
|
|
28
|
+
paymentExecution?: PaymentExecution;
|
|
29
|
+
declaredBankId?: string;
|
|
30
|
+
providerPayer?: {
|
|
31
|
+
email: string;
|
|
32
|
+
name: string;
|
|
33
|
+
ip?: string | null;
|
|
34
|
+
userAgent?: string | null;
|
|
35
|
+
};
|
|
36
|
+
metadata: Record<string, unknown>;
|
|
37
|
+
}
|
|
38
|
+
export interface CheckoutJourneyRuntimeResponse<Provider extends string = string> {
|
|
39
|
+
runtime: {
|
|
40
|
+
orderId: string;
|
|
41
|
+
payment: {
|
|
42
|
+
paymentIntentId: string;
|
|
43
|
+
paymentAttemptId: string | null;
|
|
44
|
+
status: string;
|
|
45
|
+
attemptStatus: string | null;
|
|
46
|
+
provider: Provider;
|
|
47
|
+
continuationActionOrigin?: "fresh_execution" | null;
|
|
48
|
+
providerClientSecret?: string | null;
|
|
49
|
+
providerAttemptId?: string | null;
|
|
50
|
+
providerRedirectUrl?: string | null;
|
|
51
|
+
providerNextActionKind?: string | null;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export interface CheckoutJourneyResultRequest {
|
|
56
|
+
idempotencyKey: string;
|
|
57
|
+
orderId: string;
|
|
58
|
+
paymentIntentId: string;
|
|
59
|
+
resultStatus: "succeeded";
|
|
60
|
+
occurredAt: string;
|
|
61
|
+
}
|
|
62
|
+
export interface CheckoutPaymentStartedEvent {
|
|
63
|
+
email: string;
|
|
64
|
+
clientId: string;
|
|
65
|
+
orderId: string;
|
|
66
|
+
paymentIntentId: string;
|
|
67
|
+
}
|
|
68
|
+
export type CheckoutStage = "quote" | "order_draft" | "start_runtime" | "account_link" | "apply_payment_result";
|
|
69
|
+
export type CheckoutStageRecorder = <T>(stage: CheckoutStage, operation: () => Promise<T>) => Promise<T>;
|
|
70
|
+
export interface OrchestratedCheckoutResult<Snapshot, Provider extends string = string> {
|
|
71
|
+
orderId: string;
|
|
72
|
+
paymentIntentId: string;
|
|
73
|
+
paymentAttemptId: string | null;
|
|
74
|
+
paymentAttemptStatus?: string | null;
|
|
75
|
+
runtimePaymentStatus?: string;
|
|
76
|
+
executionRail: Provider;
|
|
77
|
+
continuationActionOrigin: "fresh_execution" | null;
|
|
78
|
+
providerClientSecret: string | null;
|
|
79
|
+
providerPaymentId: string | null;
|
|
80
|
+
providerRedirectUrl: string | null;
|
|
81
|
+
providerNextActionKind: string | null;
|
|
82
|
+
quoteSnapshot: Snapshot;
|
|
83
|
+
status: "paid" | "processing" | "failed";
|
|
84
|
+
}
|
|
85
|
+
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> = {
|
|
86
|
+
provisioned: Provisioned;
|
|
87
|
+
checkoutKind: CheckoutKind;
|
|
88
|
+
quotePort: CommerceQuotePort<Request, Snapshot, import("../../pricing/index.js").CreateQuoteOptions>;
|
|
89
|
+
orderDraftPort: CommerceOrderDraftWritePort<{
|
|
90
|
+
idempotencyKey: string;
|
|
91
|
+
quoteSnapshot: Snapshot;
|
|
92
|
+
}, Draft>;
|
|
93
|
+
runtimePort: CommerceCheckoutRuntimePort<CheckoutJourneyRuntimeRequest<Snapshot, PaymentExecution, Provider, Flow, MethodKind, RecurringModel> & Extension, Runtime, CheckoutJourneyResultRequest, Settlement>;
|
|
94
|
+
paymentProvider?: Provider;
|
|
95
|
+
saveForFutureUse?: boolean;
|
|
96
|
+
paymentAttemptSequence?: number;
|
|
97
|
+
returnContext?: "public" | "account";
|
|
98
|
+
paymentExecution?: PaymentExecution;
|
|
99
|
+
declaredBankId?: string;
|
|
100
|
+
paymentMethodRef?: string;
|
|
101
|
+
paymentMethodAliasType?: MethodKind;
|
|
102
|
+
paymentMethodRecurringModel?: RecurringModel;
|
|
103
|
+
quoteSnapshot?: Snapshot;
|
|
104
|
+
providerPayer?: {
|
|
105
|
+
email: string;
|
|
106
|
+
name: string;
|
|
107
|
+
ip?: string | null;
|
|
108
|
+
userAgent?: string | null;
|
|
109
|
+
};
|
|
110
|
+
onPaymentStarted?: (event: CheckoutPaymentStartedEvent) => Promise<void>;
|
|
111
|
+
recordStage?: CheckoutStageRecorder;
|
|
112
|
+
now: () => Date;
|
|
113
|
+
};
|
|
114
|
+
export declare function createPaidOrderOrchestration<Provisioned extends {
|
|
115
|
+
clientId: string;
|
|
116
|
+
addressId: string;
|
|
117
|
+
}, Request, Snapshot extends CheckoutQuoteSnapshot, Draft extends {
|
|
118
|
+
orderDraft: {
|
|
119
|
+
orderId: string;
|
|
120
|
+
};
|
|
121
|
+
}, 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: {
|
|
122
|
+
defaultPaymentProvider: Provider;
|
|
123
|
+
rehearsalPaymentProvider: Provider;
|
|
124
|
+
confirmationProvider: Provider;
|
|
125
|
+
missingConfirmationMessage: string;
|
|
126
|
+
providerFlowFor(provider: Provider, execution: PaymentExecution | undefined): Flow;
|
|
127
|
+
runtimeRequestExtension(provisioned: Provisioned): Extension;
|
|
128
|
+
mapStartRuntimeFailure(error: unknown, draftOrderId: string): CheckoutOrchestrationError;
|
|
129
|
+
}): {
|
|
130
|
+
orchestrateCheckoutJourney: (deps: PaidOrderOrchestrationDeps<Provisioned, Request, Snapshot, Draft, Extension, Runtime, Settlement, PaymentExecution, Provider, Flow, MethodKind, RecurringModel>, journey: CheckoutJourney<Request, PricingPolicySnapshot>) => Promise<OrchestratedCheckoutResult<Snapshot, Provider>>;
|
|
131
|
+
};
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { CommerceOrderDraftPriceChangedError } from "../orderDraftErrors.js";
|
|
2
|
+
import { uuidFromOrderRef, messageOf } from "../checkoutHelpers.js";
|
|
3
|
+
import { CheckoutOrchestrationError } from "./commerceCheckoutOrchestrationError.js";
|
|
4
|
+
export function createPaidOrderOrchestration(bindings) {
|
|
5
|
+
async function orchestrateCheckoutJourney(deps, journey) {
|
|
6
|
+
const { provisioned, checkoutKind, quotePort, orderDraftPort, runtimePort, paymentProvider = bindings.defaultPaymentProvider, paymentAttemptSequence, paymentExecution, declaredBankId, paymentMethodRef, paymentMethodAliasType, paymentMethodRecurringModel, quoteSnapshot: providedQuoteSnapshot, providerPayer, onPaymentStarted, recordStage, now, } = deps;
|
|
7
|
+
const stage = recordStage ?? ((_stage, operation) => operation());
|
|
8
|
+
// (b) quote(one_time) -> snapshot. No order persisted yet -> no compensation.
|
|
9
|
+
let quoteSnapshot = providedQuoteSnapshot;
|
|
10
|
+
if (!quoteSnapshot) {
|
|
11
|
+
try {
|
|
12
|
+
quoteSnapshot = await stage("quote", () => quotePort.createQuote(journey.createQuoteRequest(), { clientId: provisioned.clientId }));
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
throw new CheckoutOrchestrationError(messageOf(error, "quote"), null);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
// (c) order-draft(idempotencyKey, snapshot). If the canonical writer throws,
|
|
19
|
+
// its transaction (including any promotion claim) rolls back, so there is no
|
|
20
|
+
// persisted order id to compensate.
|
|
21
|
+
let draftOrderId;
|
|
22
|
+
try {
|
|
23
|
+
const draft = await stage("order_draft", () => orderDraftPort.createOrderDraft({ idempotencyKey: journey.idempotencyKey, quoteSnapshot }, { clientId: provisioned.clientId }));
|
|
24
|
+
draftOrderId = uuidFromOrderRef(draft.orderDraft.orderId);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
if (error instanceof CommerceOrderDraftPriceChangedError) {
|
|
28
|
+
throw new CheckoutOrchestrationError(messageOf(error, "order_draft"), null, "promotion_code_price_changed");
|
|
29
|
+
}
|
|
30
|
+
throw new CheckoutOrchestrationError(messageOf(error, "order_draft"), null);
|
|
31
|
+
}
|
|
32
|
+
// (d) startRuntime -> finalizes order, reserves inventory, opens payment intent.
|
|
33
|
+
// From here on a throw leaves a live reservation, so compensation targets the order.
|
|
34
|
+
let orderId;
|
|
35
|
+
let paymentIntentId;
|
|
36
|
+
let paymentContinuation;
|
|
37
|
+
let providerClientSecret;
|
|
38
|
+
let providerPaymentId;
|
|
39
|
+
let providerRedirectUrl;
|
|
40
|
+
let providerNextActionKind;
|
|
41
|
+
let runtimeRefused;
|
|
42
|
+
try {
|
|
43
|
+
const started = await stage("start_runtime", () => runtimePort.startRuntime({
|
|
44
|
+
idempotencyKey: journey.idempotencyKey,
|
|
45
|
+
paymentAttemptSequence,
|
|
46
|
+
orderDraft: {
|
|
47
|
+
orderId: `order_${draftOrderId}`,
|
|
48
|
+
status: "draft",
|
|
49
|
+
paymentStatus: "not_started",
|
|
50
|
+
idempotencyKey: journey.idempotencyKey,
|
|
51
|
+
quoteSnapshot,
|
|
52
|
+
replayed: false,
|
|
53
|
+
},
|
|
54
|
+
// subscription_initial finalizes as subscription_cycle: finalize creates+links
|
|
55
|
+
// the provisional subscription; one_time would violate the mode contract.
|
|
56
|
+
mode: checkoutKind === "subscription_initial" ? "subscription_cycle" : "one_time",
|
|
57
|
+
saveForFutureUse: deps.saveForFutureUse ?? checkoutKind === "subscription_initial",
|
|
58
|
+
clientId: provisioned.clientId, shippingAddressId: provisioned.addressId, ...bindings.runtimeRequestExtension(provisioned),
|
|
59
|
+
paymentProvider,
|
|
60
|
+
returnContext: deps.returnContext ?? "public",
|
|
61
|
+
providerFlow: bindings.providerFlowFor(paymentProvider, paymentExecution),
|
|
62
|
+
paymentMethodRef, paymentMethodAliasType, paymentMethodRecurringModel,
|
|
63
|
+
paymentExecution,
|
|
64
|
+
declaredBankId,
|
|
65
|
+
providerPayer,
|
|
66
|
+
metadata: journey.createRuntimeMetadata(quoteSnapshot.quote.context?.pricingPolicy),
|
|
67
|
+
}));
|
|
68
|
+
orderId = started.runtime.orderId;
|
|
69
|
+
paymentIntentId = started.runtime.payment.paymentIntentId;
|
|
70
|
+
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 };
|
|
71
|
+
providerClientSecret = started.runtime.payment.providerClientSecret ?? null;
|
|
72
|
+
providerPaymentId = started.runtime.payment.providerAttemptId ?? null;
|
|
73
|
+
providerRedirectUrl = started.runtime.payment.providerRedirectUrl ?? null;
|
|
74
|
+
providerNextActionKind = started.runtime.payment.providerNextActionKind ?? null;
|
|
75
|
+
runtimeRefused = started.runtime.payment.status === "failed" || started.runtime.payment.attemptStatus === "failed";
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
// startRuntime is itself a multi-step saga; reservations may already exist.
|
|
79
|
+
throw bindings.mapStartRuntimeFailure(error, draftOrderId);
|
|
80
|
+
}
|
|
81
|
+
// A confirmation-bearing runtime that returned without its confirmation capability has
|
|
82
|
+
// already crossed the PSP boundary. Preserve the aggregate for payment-control
|
|
83
|
+
// reconciliation rather than treating this post-dispatch contract failure as
|
|
84
|
+
// permission to release stock or mint another attempt.
|
|
85
|
+
const settledFreshRefusal = paymentContinuation.continuationActionOrigin === "fresh_execution"
|
|
86
|
+
&& paymentContinuation.runtimePaymentStatus === "failed" && paymentContinuation.paymentAttemptStatus === "failed"
|
|
87
|
+
&& Boolean(orderId && paymentIntentId && paymentContinuation.paymentAttemptId) && paymentContinuation.executionRail === paymentProvider;
|
|
88
|
+
if (paymentProvider === bindings.confirmationProvider && !providerClientSecret && !settledFreshRefusal) {
|
|
89
|
+
throw new CheckoutOrchestrationError(bindings.missingConfirmationMessage, null, "provider_attempt_in_flight");
|
|
90
|
+
}
|
|
91
|
+
if (onPaymentStarted && !runtimeRefused) {
|
|
92
|
+
try {
|
|
93
|
+
await stage("account_link", () => onPaymentStarted({
|
|
94
|
+
email: journey.contactEmail,
|
|
95
|
+
clientId: provisioned.clientId,
|
|
96
|
+
orderId,
|
|
97
|
+
paymentIntentId,
|
|
98
|
+
}));
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
console.warn("checkout_payment_started_hook_failed", JSON.stringify({ orderId }));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// (e) For the rehearsal no-op provider only: applyPaymentResult(succeeded).
|
|
105
|
+
// For real PSPs, the saga returns `"processing"`; payment-control is flipped
|
|
106
|
+
// by the webhook (Wave B) once the provider confirms the charge. Auto-marking
|
|
107
|
+
// a real-provider intent as `succeeded` here would bypass the webhook proof
|
|
108
|
+
// and risk a "local paid / provider unpaid" mismatch. A rehearsal adapter that
|
|
109
|
+
// already declined (the reference profile's refusal simulator) must never be
|
|
110
|
+
// auto-settled as succeeded either — the runtime's own terminal answer wins.
|
|
111
|
+
if (paymentProvider === bindings.rehearsalPaymentProvider && !runtimeRefused) {
|
|
112
|
+
try {
|
|
113
|
+
await stage("apply_payment_result", () => runtimePort.applyPaymentResult({
|
|
114
|
+
idempotencyKey: journey.idempotencyKey,
|
|
115
|
+
orderId,
|
|
116
|
+
paymentIntentId,
|
|
117
|
+
resultStatus: "succeeded",
|
|
118
|
+
occurredAt: now().toISOString(),
|
|
119
|
+
}));
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
throw new CheckoutOrchestrationError(messageOf(error, "apply_payment_result"), orderId);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
orderId,
|
|
127
|
+
paymentIntentId,
|
|
128
|
+
...paymentContinuation,
|
|
129
|
+
providerClientSecret,
|
|
130
|
+
providerPaymentId,
|
|
131
|
+
providerRedirectUrl,
|
|
132
|
+
providerNextActionKind,
|
|
133
|
+
quoteSnapshot,
|
|
134
|
+
// A refusal the saga already knows about must not be reported as a wait.
|
|
135
|
+
status: paymentProvider === bindings.rehearsalPaymentProvider && !runtimeRefused ? "paid"
|
|
136
|
+
: runtimeRefused ? "failed" : "processing",
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
return { orchestrateCheckoutJourney };
|
|
140
|
+
}
|