@openlup/platform 0.26.0 → 0.28.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 +305 -327
- package/README.md +332 -16
- package/dist/account-support/accountReadFacade.d.ts +8 -0
- package/dist/account-support/accountReadFacade.js +10 -0
- package/dist/account-support/accountReadModels.d.ts +69 -0
- package/dist/account-support/accountReadModels.js +272 -0
- package/dist/account-support/bindings.d.ts +23 -0
- package/dist/account-support/bindings.js +16 -0
- package/dist/account-support/contracts/account.d.ts +281 -0
- package/dist/account-support/contracts/account.js +1 -0
- package/dist/account-support/contracts/capabilities.d.ts +44 -0
- package/dist/account-support/contracts/capabilities.js +1 -0
- package/dist/account-support/contracts/commands.d.ts +307 -0
- package/dist/account-support/contracts/commands.js +1 -0
- package/dist/account-support/contracts/customer360.d.ts +154 -0
- package/dist/account-support/contracts/customer360.js +1 -0
- package/dist/account-support/contracts/index.d.ts +10 -0
- package/dist/account-support/contracts/index.js +1 -0
- package/dist/account-support/contracts/invoice.d.ts +79 -0
- package/dist/account-support/contracts/invoice.js +1 -0
- package/dist/account-support/contracts/operator.d.ts +289 -0
- package/dist/account-support/contracts/operator.js +1 -0
- package/dist/account-support/contribution.d.ts +24 -0
- package/dist/account-support/contribution.js +22 -0
- package/dist/account-support/customer360.d.ts +106 -0
- package/dist/account-support/customer360.js +163 -0
- package/dist/account-support/customerAccountReadDiagnostics.d.ts +11 -0
- package/dist/account-support/customerAccountReadDiagnostics.js +71 -0
- package/dist/account-support/index.d.ts +26 -0
- package/dist/account-support/index.js +15 -0
- package/dist/account-support/invoiceAccess.d.ts +57 -0
- package/dist/account-support/invoiceAccess.js +40 -0
- package/dist/account-support/migrations.d.ts +14 -0
- package/dist/account-support/migrations.js +7 -0
- package/dist/account-support/operatorAuthority.d.ts +67 -0
- package/dist/account-support/operatorAuthority.js +379 -0
- package/dist/account-support/operatorRecovery.d.ts +66 -0
- package/dist/account-support/operatorRecovery.js +129 -0
- package/dist/account-support/orderHistory.d.ts +50 -0
- package/dist/account-support/orderHistory.js +188 -0
- package/dist/account-support/paymentMethodComposition.d.ts +5 -0
- package/dist/account-support/paymentMethodComposition.js +4 -0
- package/dist/account-support/postgresOperatorAuthority.d.ts +16 -0
- package/dist/account-support/postgresOperatorAuthority.js +93 -0
- package/dist/account-support/selfService.d.ts +6 -0
- package/dist/account-support/selfService.js +81 -0
- package/dist/account-support/subscriptionCommandCodec.d.ts +10 -0
- package/dist/account-support/subscriptionCommandCodec.js +38 -0
- package/dist/catalog/draftSchemas.d.ts +1 -1
- package/dist/catalog/foundationSchemas.d.ts +3 -3
- package/dist/catalog/resolvedSkuProjection.d.ts +2 -2
- package/dist/catalog/sellableSchemas.d.ts +2 -2
- 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 +10 -10
- package/dist/composition/accountSupportContribution.d.ts +18 -0
- package/dist/composition/accountSupportContribution.js +21 -0
- package/dist/composition/commerceContribution.d.ts +21 -0
- package/dist/composition/commerceContribution.js +27 -0
- package/dist/composition/index.d.ts +2 -0
- package/dist/composition/index.js +2 -0
- package/dist/fulfillment/handlerSchemas.d.ts +69 -69
- 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 +4 -4
- 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/invoicing/snapshot.d.ts +1 -1
- package/dist/pricing/acquisitionQuoteBinding.d.ts +1 -1
- package/dist/pricing/browser/index.d.ts +6 -0
- package/dist/pricing/browser/index.js +6 -0
- package/dist/pricing/catalogFactsSchemas.d.ts +1 -1
- package/dist/pricing/quotePromotionEvidence.d.ts +1 -1
- package/dist/pricing/quoteSchemas.d.ts +56 -56
- package/dist/promotions/adminPromotionCodesContracts.d.ts +30 -30
- package/dist/promotions/adminPromotionsContracts.d.ts +16 -16
- package/dist/subscriptions/index.d.ts +3 -2
- package/dist/subscriptions/index.js +3 -2
- package/package.json +32 -2
- package/release-gates.json +90 -8
- package/sql/20261026120000_account_support_operator_authority.sql +693 -0
- package/src/account-support/accountReadFacade.ts +15 -0
- package/src/account-support/accountReadModels.ts +371 -0
- package/src/account-support/bindings.ts +28 -0
- package/src/account-support/contracts/account.ts +306 -0
- package/src/account-support/contracts/capabilities.ts +30 -0
- package/src/account-support/contracts/commands.ts +243 -0
- package/src/account-support/contracts/customer360.ts +150 -0
- package/src/account-support/contracts/index.ts +141 -0
- package/src/account-support/contracts/invoice.ts +44 -0
- package/src/account-support/contracts/operator.ts +123 -0
- package/src/account-support/contribution.ts +35 -0
- package/src/account-support/customer360.ts +268 -0
- package/src/account-support/customerAccountReadDiagnostics.ts +83 -0
- package/src/account-support/index.ts +72 -0
- package/src/account-support/invoiceAccess.ts +63 -0
- package/src/account-support/migrations.ts +7 -0
- package/src/account-support/operatorAuthority.ts +393 -0
- package/src/account-support/operatorRecovery.ts +136 -0
- package/src/account-support/orderHistory.ts +309 -0
- package/src/account-support/paymentMethodComposition.ts +8 -0
- package/src/account-support/postgresOperatorAuthority.ts +92 -0
- package/src/account-support/selfService.ts +83 -0
- package/src/account-support/subscriptionCommandCodec.ts +48 -0
- 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/accountSupportContribution.ts +28 -0
- package/src/composition/commerceContribution.ts +35 -0
- package/src/composition/index.ts +2 -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,81 @@
|
|
|
1
|
+
import { CHECKOUT_RESUME_CONTRACT_VERSION } from "../checkoutResumeSchemas.js";
|
|
2
|
+
import { CommerceCheckoutResumePersistenceError } from "../errors.js";
|
|
3
|
+
const SELECT_COLUMNS = "id, last_section_id, draft_state, expires_at, created_at, updated_at";
|
|
4
|
+
export function createCommerceCheckoutResumeQueryPort(client, draftSchema) {
|
|
5
|
+
return {
|
|
6
|
+
async upsertDraft(input) {
|
|
7
|
+
const payload = {
|
|
8
|
+
token_hash: input.tokenHash,
|
|
9
|
+
idempotency_key_hash: input.idempotencyKeyHash,
|
|
10
|
+
last_section_id: input.lastSectionId,
|
|
11
|
+
draft_state: input.draftState,
|
|
12
|
+
redacted_fields: input.draftState.redactedFields,
|
|
13
|
+
expires_at: input.expiresAt,
|
|
14
|
+
revoked_at: null,
|
|
15
|
+
updated_at: input.now,
|
|
16
|
+
};
|
|
17
|
+
const { data: existing, error: existingError } = await client
|
|
18
|
+
.from("commerce_checkout_resume_drafts")
|
|
19
|
+
.select("id, expires_at, revoked_at")
|
|
20
|
+
.eq("token_hash", input.tokenHash)
|
|
21
|
+
.maybeSingle();
|
|
22
|
+
if (existingError)
|
|
23
|
+
throw mapError(existingError);
|
|
24
|
+
if (existing && !isActiveResumeRow(existing, input.now)) {
|
|
25
|
+
throw new CommerceCheckoutResumePersistenceError("Checkout resume draft token is expired or revoked", { boundary: "commerce_checkout_resume_drafts", reason: "expired_or_revoked" });
|
|
26
|
+
}
|
|
27
|
+
const query = existing
|
|
28
|
+
? client
|
|
29
|
+
.from("commerce_checkout_resume_drafts")
|
|
30
|
+
.update(payload)
|
|
31
|
+
.eq("token_hash", input.tokenHash)
|
|
32
|
+
.is("revoked_at", null)
|
|
33
|
+
.gt("expires_at", input.now)
|
|
34
|
+
: client.from("commerce_checkout_resume_drafts").insert(payload);
|
|
35
|
+
const { data, error } = await query.select(SELECT_COLUMNS).single();
|
|
36
|
+
if (error)
|
|
37
|
+
throw mapError(error);
|
|
38
|
+
return parseRow(data, false);
|
|
39
|
+
},
|
|
40
|
+
async readDraftByTokenHash(input) {
|
|
41
|
+
const { data, error } = await client
|
|
42
|
+
.from("commerce_checkout_resume_drafts")
|
|
43
|
+
.select(SELECT_COLUMNS)
|
|
44
|
+
.eq("token_hash", input.tokenHash)
|
|
45
|
+
.is("revoked_at", null)
|
|
46
|
+
.gt("expires_at", input.now)
|
|
47
|
+
.maybeSingle();
|
|
48
|
+
if (error)
|
|
49
|
+
throw mapError(error);
|
|
50
|
+
if (!data)
|
|
51
|
+
return null;
|
|
52
|
+
return parseRow(data, true);
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
function isActiveResumeRow(row, now) {
|
|
56
|
+
return !row.revoked_at && !!row.expires_at && row.expires_at > now;
|
|
57
|
+
}
|
|
58
|
+
function parseRow(row, replayed) {
|
|
59
|
+
const data = row;
|
|
60
|
+
const parsed = draftSchema.safeParse({
|
|
61
|
+
id: data.id,
|
|
62
|
+
contractVersion: CHECKOUT_RESUME_CONTRACT_VERSION,
|
|
63
|
+
lastSectionId: data.last_section_id,
|
|
64
|
+
draftState: data.draft_state,
|
|
65
|
+
expiresAt: data.expires_at,
|
|
66
|
+
createdAt: data.created_at,
|
|
67
|
+
updatedAt: data.updated_at,
|
|
68
|
+
replayed,
|
|
69
|
+
});
|
|
70
|
+
if (!parsed.success) {
|
|
71
|
+
throw new CommerceCheckoutResumePersistenceError("Checkout resume draft response invalid", { boundary: "commerce_checkout_resume_drafts" });
|
|
72
|
+
}
|
|
73
|
+
return parsed.data;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function mapError(error) {
|
|
77
|
+
return new CommerceCheckoutResumePersistenceError("Checkout resume draft persistence failed", {
|
|
78
|
+
code: error.code,
|
|
79
|
+
boundary: "commerce_checkout_resume_drafts",
|
|
80
|
+
});
|
|
81
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { CheckoutKind, CommerceResumableOrderReadPort, ResumableOrderSnapshot } from "../contracts/index.js";
|
|
3
|
+
export declare function subscriptionResponse(intent: {
|
|
4
|
+
cadenceDays: number | null;
|
|
5
|
+
}, checkoutKind: CheckoutKind): {
|
|
6
|
+
requested: boolean;
|
|
7
|
+
cadenceDays: null;
|
|
8
|
+
activationStatus: "not_applicable";
|
|
9
|
+
} | {
|
|
10
|
+
requested: boolean;
|
|
11
|
+
cadenceDays: number | null;
|
|
12
|
+
activationStatus: "pending_payment_success";
|
|
13
|
+
};
|
|
14
|
+
export interface CheckoutResumeGuardDeps {
|
|
15
|
+
resumableOrderPort?: CommerceResumableOrderReadPort;
|
|
16
|
+
resumeWindowMinutes?: number;
|
|
17
|
+
}
|
|
18
|
+
export declare function selectedDeliveryMatches(orderMetadata: Record<string, unknown> | null | undefined, intent: {
|
|
19
|
+
selectedDelivery?: unknown;
|
|
20
|
+
}): boolean;
|
|
21
|
+
export interface QuoteLikeSnapshot {
|
|
22
|
+
currency: string;
|
|
23
|
+
totalGross: {
|
|
24
|
+
amountMinor: number;
|
|
25
|
+
currency: string;
|
|
26
|
+
};
|
|
27
|
+
lines: ReadonlyArray<{
|
|
28
|
+
sku: string;
|
|
29
|
+
quantity: number;
|
|
30
|
+
}>;
|
|
31
|
+
}
|
|
32
|
+
export declare function createCheckoutResumeGuard<Intent extends {
|
|
33
|
+
idempotencyKey: string;
|
|
34
|
+
cadenceDays: number | null;
|
|
35
|
+
selectedDelivery?: unknown;
|
|
36
|
+
}, Response>(bindings: {
|
|
37
|
+
responseSchema: z.ZodType<Response>;
|
|
38
|
+
statusUrl(orderId: string, paymentIntentId: string, clientId: string): string;
|
|
39
|
+
}): {
|
|
40
|
+
resolveResumeOpenOrderResponse: (input: {
|
|
41
|
+
deps: CheckoutResumeGuardDeps;
|
|
42
|
+
clientId: string;
|
|
43
|
+
checkoutKind: CheckoutKind;
|
|
44
|
+
intent: Intent;
|
|
45
|
+
acceptedQuote?: QuoteLikeSnapshot;
|
|
46
|
+
now: () => Date;
|
|
47
|
+
}) => Promise<Response | null>;
|
|
48
|
+
buildSavedOrderResumeResponse: (input: {
|
|
49
|
+
resumable: ResumableOrderSnapshot;
|
|
50
|
+
clientId: string;
|
|
51
|
+
checkoutKind: CheckoutKind;
|
|
52
|
+
intent: Intent;
|
|
53
|
+
}) => Response;
|
|
54
|
+
};
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { resolveDeliverySelectionEvidence } from "../../shipping/index.js";
|
|
2
|
+
import { CHECKOUT_CONTRACT_VERSION } from "../checkoutSchemas.js";
|
|
3
|
+
import { safeCommerceDiagnosticValue } from "./commerceDiagnostics.js";
|
|
4
|
+
export function subscriptionResponse(intent, checkoutKind) {
|
|
5
|
+
return checkoutKind === "one_time" ? { requested: false, cadenceDays: null, activationStatus: "not_applicable" }
|
|
6
|
+
: { requested: true, cadenceDays: intent.cadenceDays, activationStatus: "pending_payment_success" };
|
|
7
|
+
}
|
|
8
|
+
const DEFAULT_RESUME_WINDOW_MINUTES = 60;
|
|
9
|
+
export function selectedDeliveryMatches(orderMetadata, intent) {
|
|
10
|
+
const existing = resolveDeliverySelectionEvidence({ orderMetadata }).selection;
|
|
11
|
+
const fresh = resolveDeliverySelectionEvidence({
|
|
12
|
+
orderMetadata: { selectedDelivery: intent.selectedDelivery },
|
|
13
|
+
}).selection;
|
|
14
|
+
if (!existing || !fresh)
|
|
15
|
+
return false;
|
|
16
|
+
return deliveryKey(existing) === deliveryKey(fresh);
|
|
17
|
+
}
|
|
18
|
+
function deliveryKey(selection) {
|
|
19
|
+
const pickupPoint = selection.pickupPoint && typeof selection.pickupPoint === "object"
|
|
20
|
+
? selection.pickupPoint
|
|
21
|
+
: {};
|
|
22
|
+
return [
|
|
23
|
+
text(selection.providerKind),
|
|
24
|
+
text(selection.carrierKind),
|
|
25
|
+
text(selection.carrierCode),
|
|
26
|
+
text(selection.serviceCode ?? selection.service),
|
|
27
|
+
text(selection.deliveryKind ?? selection.kind),
|
|
28
|
+
text(pickupPoint.id ?? pickupPoint.pointId),
|
|
29
|
+
].join("|");
|
|
30
|
+
}
|
|
31
|
+
function text(value) {
|
|
32
|
+
return typeof value === "string" ? value.trim().toLowerCase() : "";
|
|
33
|
+
}
|
|
34
|
+
function quoteMatches(orderMetadata, accepted) {
|
|
35
|
+
const stored = readStoredQuote(orderMetadata);
|
|
36
|
+
if (!stored)
|
|
37
|
+
return false;
|
|
38
|
+
return stored.currency === accepted.currency
|
|
39
|
+
&& stored.totalGross.currency === accepted.totalGross.currency
|
|
40
|
+
&& stored.totalGross.amountMinor === accepted.totalGross.amountMinor
|
|
41
|
+
&& lineKey(stored.lines) === lineKey(accepted.lines);
|
|
42
|
+
}
|
|
43
|
+
function readStoredQuote(orderMetadata) {
|
|
44
|
+
// The producer stores the whole envelope, so the quote sits one level down.
|
|
45
|
+
const snapshot = orderMetadata?.quoteSnapshot;
|
|
46
|
+
const quote = isRecord(snapshot) ? snapshot.quote : undefined;
|
|
47
|
+
if (!isRecord(quote))
|
|
48
|
+
return null;
|
|
49
|
+
const total = quote.totalGross;
|
|
50
|
+
const lines = quote.lines;
|
|
51
|
+
if (typeof quote.currency !== "string" || !isRecord(total) || !Array.isArray(lines))
|
|
52
|
+
return null;
|
|
53
|
+
if (typeof total.amountMinor !== "number" || typeof total.currency !== "string")
|
|
54
|
+
return null;
|
|
55
|
+
const parsed = [];
|
|
56
|
+
for (const line of lines) {
|
|
57
|
+
if (!isRecord(line) || typeof line.sku !== "string" || typeof line.quantity !== "number") {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
parsed.push({ sku: line.sku, quantity: line.quantity });
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
currency: quote.currency,
|
|
64
|
+
totalGross: { amountMinor: total.amountMinor, currency: total.currency },
|
|
65
|
+
lines: parsed,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function lineKey(lines) {
|
|
69
|
+
return lines.map((line) => `${line.sku}x${line.quantity}`).sort().join("|");
|
|
70
|
+
}
|
|
71
|
+
function isRecord(value) {
|
|
72
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
73
|
+
}
|
|
74
|
+
export function createCheckoutResumeGuard(bindings) {
|
|
75
|
+
function buildSavedOrderResumeResponse(input) {
|
|
76
|
+
const { resumable, clientId, checkoutKind, intent } = input;
|
|
77
|
+
return bindings.responseSchema.parse({
|
|
78
|
+
contractVersion: CHECKOUT_CONTRACT_VERSION,
|
|
79
|
+
checkoutKind,
|
|
80
|
+
orderRef: `order_${resumable.orderId}`,
|
|
81
|
+
orderId: resumable.orderId,
|
|
82
|
+
status: resumable.status,
|
|
83
|
+
paymentIntentId: resumable.paymentIntentId,
|
|
84
|
+
clientId,
|
|
85
|
+
clientAction: { kind: "none" },
|
|
86
|
+
statusUrl: bindings.statusUrl(resumable.orderId, resumable.paymentIntentId, clientId),
|
|
87
|
+
subscription: subscriptionResponse(intent, checkoutKind),
|
|
88
|
+
payment: { requiresReusablePaymentMethod: checkoutKind === "subscription_initial" },
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
async function resolveResumeOpenOrderResponse(input) {
|
|
92
|
+
const { deps, clientId, checkoutKind, intent, acceptedQuote, now } = input;
|
|
93
|
+
if (!deps.resumableOrderPort)
|
|
94
|
+
return null;
|
|
95
|
+
try {
|
|
96
|
+
const resumable = await deps.resumableOrderPort.findResumableOrderForClient({
|
|
97
|
+
clientId,
|
|
98
|
+
withinMinutes: deps.resumeWindowMinutes ?? DEFAULT_RESUME_WINDOW_MINUTES,
|
|
99
|
+
now: now(),
|
|
100
|
+
journeyKey: intent.idempotencyKey,
|
|
101
|
+
});
|
|
102
|
+
if (!resumable)
|
|
103
|
+
return null;
|
|
104
|
+
if (acceptedQuote && resumable.sameJourney) {
|
|
105
|
+
// The buyer edited their cart; they did not come back on another device.
|
|
106
|
+
// Answering with this order would re-offer the OLD total. Falling through
|
|
107
|
+
// hands the case to `commerce_supersede_pre_payment_order_draft`, which
|
|
108
|
+
// cancels the unpaid order plus its intent, attempt and PROVISIONAL
|
|
109
|
+
// subscription and re-drafts at the new price — and which refuses outright
|
|
110
|
+
// once money has moved, at which point this guard legitimately owns it.
|
|
111
|
+
console.info("checkout_resume_skipped_same_journey", JSON.stringify({ orderId: resumable.orderId, status: resumable.status }));
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
if (!selectedDeliveryMatches(resumable.metadata, intent)) {
|
|
115
|
+
console.info("checkout_resume_skipped_delivery_mismatch", JSON.stringify({ orderId: resumable.orderId, status: resumable.status }));
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
if (acceptedQuote && !quoteMatches(resumable.metadata, acceptedQuote)) {
|
|
119
|
+
// Second, independent barrier. A different journey can still hold a
|
|
120
|
+
// different basket — same buyer, two tabs, two configurations — and money
|
|
121
|
+
// is what the buyer is about to authorize, so it must be the money they
|
|
122
|
+
// were just shown.
|
|
123
|
+
console.info("checkout_resume_skipped_quote_mismatch", JSON.stringify({ orderId: resumable.orderId, status: resumable.status }));
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
const response = buildSavedOrderResumeResponse({ resumable, clientId, checkoutKind, intent });
|
|
127
|
+
console.info("checkout_resumed_open_order", JSON.stringify({ orderId: resumable.orderId, status: resumable.status }));
|
|
128
|
+
return response;
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
console.warn("checkout_resume_lookup_failed", JSON.stringify({
|
|
132
|
+
message: safeCommerceDiagnosticValue(error instanceof Error ? error.message : String(error)),
|
|
133
|
+
}));
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return { resolveResumeOpenOrderResponse, buildSavedOrderResumeResponse };
|
|
138
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { HttpRequest } from "../../http/index.js";
|
|
2
|
+
interface CheckoutSavedPaymentMethodResolverPort<Flow extends string, MethodKind extends string = string, RecurringModel extends string = string> {
|
|
3
|
+
resolveSavedPaymentMethod(input: {
|
|
4
|
+
accessToken: string;
|
|
5
|
+
clientId: string;
|
|
6
|
+
savedMethodId: string;
|
|
7
|
+
requestedFlow: Flow;
|
|
8
|
+
now: Date;
|
|
9
|
+
}): Promise<{
|
|
10
|
+
providerMethodRef: string;
|
|
11
|
+
providerAliasType: MethodKind;
|
|
12
|
+
recurringModel?: RecurringModel;
|
|
13
|
+
} | null>;
|
|
14
|
+
}
|
|
15
|
+
export type ResolveSavedMethodResult<MethodKind extends string = string, RecurringModel extends string = string> = {
|
|
16
|
+
kind: "none";
|
|
17
|
+
} | {
|
|
18
|
+
kind: "resolved";
|
|
19
|
+
paymentMethodRef: string;
|
|
20
|
+
paymentMethodAliasType: MethodKind;
|
|
21
|
+
paymentMethodRecurringModel?: RecurringModel;
|
|
22
|
+
} | {
|
|
23
|
+
kind: "rejected";
|
|
24
|
+
reason: "saved_payment_method_resolver_unavailable" | "saved_payment_method_session_required" | "saved_payment_method_unavailable" | "saved_payment_method_read_failed";
|
|
25
|
+
};
|
|
26
|
+
export declare function createCheckoutSavedPaymentMethodResolver<Execution, Flow extends string, MethodKind extends string = string, RecurringModel extends string = string>(requestForExecution: (execution: Execution | undefined) => {
|
|
27
|
+
flow: Flow;
|
|
28
|
+
savedMethodId: string;
|
|
29
|
+
} | null): {
|
|
30
|
+
resolveSavedPaymentMethodForCheckout: ({ req, paymentExecution, clientId, savedPaymentMethodResolverPort, now, recordStage, }: {
|
|
31
|
+
req: HttpRequest;
|
|
32
|
+
paymentExecution: Execution | undefined;
|
|
33
|
+
clientId: string;
|
|
34
|
+
savedPaymentMethodResolverPort?: CheckoutSavedPaymentMethodResolverPort<Flow, MethodKind, RecurringModel>;
|
|
35
|
+
now: () => Date;
|
|
36
|
+
recordStage: <T>(stage: "payment_method_ref", operation: () => Promise<T>) => Promise<T>;
|
|
37
|
+
}) => Promise<ResolveSavedMethodResult<MethodKind, RecurringModel>>;
|
|
38
|
+
};
|
|
39
|
+
export {};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export function createCheckoutSavedPaymentMethodResolver(requestForExecution) {
|
|
2
|
+
async function resolveSavedPaymentMethodForCheckout({ req, paymentExecution, clientId, savedPaymentMethodResolverPort, now, recordStage, }) {
|
|
3
|
+
const savedPaymentMethodRequest = requestForExecution(paymentExecution);
|
|
4
|
+
if (!savedPaymentMethodRequest)
|
|
5
|
+
return { kind: "none" };
|
|
6
|
+
if (!savedPaymentMethodResolverPort) {
|
|
7
|
+
return { kind: "rejected", reason: "saved_payment_method_resolver_unavailable" };
|
|
8
|
+
}
|
|
9
|
+
const accessToken = readBearerToken(req);
|
|
10
|
+
if (!accessToken) {
|
|
11
|
+
return { kind: "rejected", reason: "saved_payment_method_session_required" };
|
|
12
|
+
}
|
|
13
|
+
try {
|
|
14
|
+
const resolved = await recordStage("payment_method_ref", () => savedPaymentMethodResolverPort.resolveSavedPaymentMethod({
|
|
15
|
+
accessToken,
|
|
16
|
+
clientId,
|
|
17
|
+
savedMethodId: savedPaymentMethodRequest.savedMethodId,
|
|
18
|
+
requestedFlow: savedPaymentMethodRequest.flow,
|
|
19
|
+
now: now(),
|
|
20
|
+
}));
|
|
21
|
+
if (!resolved) {
|
|
22
|
+
return { kind: "rejected", reason: "saved_payment_method_unavailable" };
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
kind: "resolved",
|
|
26
|
+
paymentMethodRef: resolved.providerMethodRef,
|
|
27
|
+
paymentMethodAliasType: resolved.providerAliasType,
|
|
28
|
+
...(resolved.recurringModel
|
|
29
|
+
? { paymentMethodRecurringModel: resolved.recurringModel }
|
|
30
|
+
: {}),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return { kind: "rejected", reason: "saved_payment_method_read_failed" };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function readBearerToken(req) {
|
|
38
|
+
const raw = req.headers.authorization;
|
|
39
|
+
const value = Array.isArray(raw) ? raw[0] : raw;
|
|
40
|
+
const match = value?.match(/^Bearer\s+(.+)$/i);
|
|
41
|
+
return match?.[1]?.trim() || null;
|
|
42
|
+
}
|
|
43
|
+
return { resolveSavedPaymentMethodForCheckout };
|
|
44
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { CheckoutOrchestrationError } from "./commerceCheckoutOrchestrationError.js";
|
|
2
|
+
export declare function createCheckoutStartRuntimeFailure(bindings: {
|
|
3
|
+
checkoutProviderAttemptFailure(error: unknown): CheckoutOrchestrationError | null;
|
|
4
|
+
prepareConflictReason: string;
|
|
5
|
+
}): {
|
|
6
|
+
mapStartRuntimeFailure: (error: unknown, draftOrderId: string) => CheckoutOrchestrationError;
|
|
7
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { CommerceRuntimeConflictError } from "../runtimeErrors.js";
|
|
2
|
+
import { isInventoryAdmissionBusy } from "./checkoutConflictClassifiers.js";
|
|
3
|
+
import { messageOf } from "../checkoutHelpers.js";
|
|
4
|
+
import { CheckoutOrchestrationError } from "./commerceCheckoutOrchestrationError.js";
|
|
5
|
+
export function createCheckoutStartRuntimeFailure(bindings) {
|
|
6
|
+
function mapStartRuntimeFailure(error, draftOrderId) {
|
|
7
|
+
const providerAttemptFailure = bindings.checkoutProviderAttemptFailure(error);
|
|
8
|
+
if (providerAttemptFailure) {
|
|
9
|
+
// `executePreparedProviderAttempt` writes the payment-control attempt
|
|
10
|
+
// before it calls the PSP. Once that dispatch throws, the PSP may still
|
|
11
|
+
// have accepted the charge. Keep the finalized order, reservation and
|
|
12
|
+
// provisional subscription intact until reconciliation establishes the
|
|
13
|
+
// terminal result; a compensating release here could both oversell stock
|
|
14
|
+
// and permit a second charge for the same journey.
|
|
15
|
+
return providerAttemptFailure;
|
|
16
|
+
}
|
|
17
|
+
if (error instanceof CommerceRuntimeConflictError &&
|
|
18
|
+
error.details.reason === bindings.prepareConflictReason) {
|
|
19
|
+
// D8 refused a changed request before a second PSP call. Keep the existing
|
|
20
|
+
// prepared attempt and aggregate fenced until reconciliation resolves it.
|
|
21
|
+
return new CheckoutOrchestrationError("start_runtime: provider attempt remains in flight", null, "provider_attempt_in_flight");
|
|
22
|
+
}
|
|
23
|
+
if (error instanceof CommerceRuntimeConflictError && error.details.reason === "acquisition_terms_changed") {
|
|
24
|
+
return new CheckoutOrchestrationError("Acquisition terms changed", draftOrderId, "acquisition_terms_changed");
|
|
25
|
+
}
|
|
26
|
+
if (isInventoryAdmissionBusy(error)) {
|
|
27
|
+
return new CheckoutOrchestrationError("Inventory admission temporarily unavailable", null, "inventory_admission_busy");
|
|
28
|
+
}
|
|
29
|
+
if (error instanceof CommerceRuntimeConflictError &&
|
|
30
|
+
error.details.reason === "journey_consumed") {
|
|
31
|
+
// The journey key already finalized an order; the fresh draft minted for
|
|
32
|
+
// this submit is abandoned and needs compensation, and the client must
|
|
33
|
+
// rotate its key before retrying.
|
|
34
|
+
return new CheckoutOrchestrationError(messageOf(error, "start_runtime"), draftOrderId, "journey_consumed");
|
|
35
|
+
}
|
|
36
|
+
return new CheckoutOrchestrationError(messageOf(error, "start_runtime"), draftOrderId);
|
|
37
|
+
}
|
|
38
|
+
return { mapStartRuntimeFailure };
|
|
39
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type CheckoutStage = "quote" | "order_draft" | "start_runtime" | "account_link" | "apply_payment_result";
|
|
2
|
+
export type CheckoutStageRecorder = <T>(stage: CheckoutStage, operation: () => Promise<T>) => Promise<T>;
|
|
3
|
+
export type CheckoutTimingStage = CheckoutStage | "rate_limit" | "risk_blocklist" | "persist_intent" | "payment_method_ref" | "customer_defaults" | "total";
|
|
4
|
+
export type CheckoutTimingOutcome = "success" | "error" | "rejected";
|
|
5
|
+
export declare function createCheckoutTimingLogger(requestId: string, route: string): {
|
|
6
|
+
record: CheckoutStageRecorder & (<T>(stage: CheckoutTimingStage, operation: () => Promise<T>) => Promise<T>);
|
|
7
|
+
log: (stage: CheckoutTimingStage, outcome: CheckoutTimingOutcome) => void;
|
|
8
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export function createCheckoutTimingLogger(requestId, route) {
|
|
2
|
+
const totalStartedAt = Date.now();
|
|
3
|
+
const write = (stage, startedAt, outcome) => {
|
|
4
|
+
console.log(JSON.stringify({
|
|
5
|
+
level: "info",
|
|
6
|
+
event: "checkout_stage",
|
|
7
|
+
request_id: requestId,
|
|
8
|
+
route,
|
|
9
|
+
stage,
|
|
10
|
+
duration_ms: Math.max(0, Date.now() - startedAt),
|
|
11
|
+
outcome,
|
|
12
|
+
}));
|
|
13
|
+
};
|
|
14
|
+
return {
|
|
15
|
+
async record(stage, operation) {
|
|
16
|
+
const startedAt = Date.now();
|
|
17
|
+
try {
|
|
18
|
+
const result = await operation();
|
|
19
|
+
write(stage, startedAt, "success");
|
|
20
|
+
return result;
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
write(stage, startedAt, "error");
|
|
24
|
+
throw error;
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
log(stage, outcome) {
|
|
28
|
+
write(stage, totalStartedAt, outcome);
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function safeCommerceDiagnosticValue(value: unknown): string | null;
|
|
2
|
+
export declare function checkoutOrchestrationFailureDetails(reason: string | null, previewDiagnosticsEnabled?: boolean): {
|
|
3
|
+
feature: "checkout";
|
|
4
|
+
stage: "orchestrate_order";
|
|
5
|
+
diagnosticReason?: string;
|
|
6
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
const MAX_DIAGNOSTIC_LENGTH = 240;
|
|
2
|
+
const REDACTION_PATTERNS = [
|
|
3
|
+
[/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/g, "[redacted-email]"],
|
|
4
|
+
[/\b(?:sk|pk|rk)_(?:live|test)_[A-Za-z0-9_]+\b/g, "[redacted-key]"],
|
|
5
|
+
[
|
|
6
|
+
/\b(client_secret|payment_secret|secret|token|authorization|password|pass|apikey|api_key)\s*[:=]\s*["']?[^"',\s}]+/gi,
|
|
7
|
+
"$1=[redacted]",
|
|
8
|
+
],
|
|
9
|
+
[/\bBearer\s+[A-Za-z0-9._~+/-]+=*/gi, "Bearer [redacted]"],
|
|
10
|
+
[/\b[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\b/gi, "[redacted-uuid]"],
|
|
11
|
+
[/\b(?:intent|checkout|order|payment|subscription|idempotency)[-_a-z0-9]*[:=][A-Za-z0-9._:-]{12,}/gi, "[redacted-id]"],
|
|
12
|
+
[/\+?\d[\d\s().-]{7,}\d/g, "[redacted-number]"],
|
|
13
|
+
];
|
|
14
|
+
export function safeCommerceDiagnosticValue(value) {
|
|
15
|
+
if (value === null || value === undefined)
|
|
16
|
+
return null;
|
|
17
|
+
let text = String(value);
|
|
18
|
+
for (const [pattern, replacement] of REDACTION_PATTERNS) {
|
|
19
|
+
text = text.replace(pattern, replacement);
|
|
20
|
+
}
|
|
21
|
+
return text.length > MAX_DIAGNOSTIC_LENGTH
|
|
22
|
+
? `${text.slice(0, MAX_DIAGNOSTIC_LENGTH - 3)}...`
|
|
23
|
+
: text;
|
|
24
|
+
}
|
|
25
|
+
export function checkoutOrchestrationFailureDetails(reason, previewDiagnosticsEnabled = false) {
|
|
26
|
+
return {
|
|
27
|
+
feature: "checkout",
|
|
28
|
+
stage: "orchestrate_order",
|
|
29
|
+
...(previewDiagnosticsEnabled && reason ? { diagnosticReason: reason } : {}),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
@@ -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 createAdminCommerceOrderCancelHandler<Response>({ authorizeAdmin, omsPort, mutationsEnabled, respond, }: BaseDeps<Response> & {
|
|
5
|
+
omsPort: Pick<CommerceOmsHoldPort, "cancelOrder">;
|
|
6
|
+
mutationsEnabled: () => boolean;
|
|
7
|
+
}): (req: OmsHandlerRequest, res: Response) => Promise<void>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { adminCommerceOrderCancelRequestSchema, adminCommerceOrderMarkRefundedResponseSchema, } from "../oms/omsContracts.js";
|
|
2
|
+
import { authorize, parseOmsRequest, sendOmsMutationResponse } from "./commerceOmsHandlers.js";
|
|
3
|
+
// This is deliberately not the fulfillment cancellation boundary. It only
|
|
4
|
+
// terminalizes an unpaid commerce order; the SQL RPC owns the state-machine and
|
|
5
|
+
// reservation-release side effect.
|
|
6
|
+
export function createAdminCommerceOrderCancelHandler({ authorizeAdmin, omsPort, mutationsEnabled, respond, }) {
|
|
7
|
+
return async function handler(req, res) {
|
|
8
|
+
if (req.method !== "POST")
|
|
9
|
+
return respond.sendMethodNotAllowed(res, ["POST"]);
|
|
10
|
+
const auth = await authorize(req, res, authorizeAdmin, respond);
|
|
11
|
+
if (!auth)
|
|
12
|
+
return;
|
|
13
|
+
if (!mutationsEnabled()) {
|
|
14
|
+
respond.sendBffError(res, "FORBIDDEN", "Commerce OMS order cancellation is not enabled");
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const request = parseOmsRequest(res, respond, adminCommerceOrderCancelRequestSchema, req.body ?? {}, "Invalid admin commerce order cancellation request");
|
|
18
|
+
if (request === undefined)
|
|
19
|
+
return;
|
|
20
|
+
await sendOmsMutationResponse(res, respond, () => omsPort.cancelOrder({ ...request, actorUserId: auth.userId }), adminCommerceOrderMarkRefundedResponseSchema, "Admin commerce order cancellation returned invalid response", "Admin commerce order cancellation failed", (data) => data.status === "cancelled");
|
|
21
|
+
};
|
|
22
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { OmsHandlerDeps, OmsHandlerRequest } from "./handlerSupport.js";
|
|
2
|
+
/**
|
|
3
|
+
* The `?view=control_plane_v1` read handlers. Unlike the V0 handlers in
|
|
4
|
+
* `commerceOmsHandlers.ts`, these deliberately take NO `governance` dependency and
|
|
5
|
+
* do not run `applyOmsAgentCustomerReadGate`: `commerce.oms_control_plane.v1`
|
|
6
|
+
* carries no customer identity, so the gate would audit a `customer_read` of zero
|
|
7
|
+
* customers and mask a field the strict contract forbids — and the portable
|
|
8
|
+
* `node-postgres` branch of this same contract has neither an actor kind nor an
|
|
9
|
+
* audit client to run it with. The exemption holds only while the projection stays
|
|
10
|
+
* customer-free, a precondition pinned in `omsControlPlaneReadGovernance.test.ts`.
|
|
11
|
+
*/
|
|
12
|
+
import { type CommerceOmsControlPlanePort } from "../oms/omsControlPlane.js";
|
|
13
|
+
type Deps<Response> = OmsHandlerDeps<Response> & {
|
|
14
|
+
port: CommerceOmsControlPlanePort;
|
|
15
|
+
};
|
|
16
|
+
export declare function createCommerceOmsControlPlaneListHandler<Response>({ authorizeAdmin, port, respond }: Deps<Response>): (req: OmsHandlerRequest, res: Response) => Promise<void>;
|
|
17
|
+
export declare function createCommerceOmsControlPlaneDetailHandler<Response>({ authorizeAdmin, port, respond }: Deps<Response>): (req: OmsHandlerRequest, res: Response) => Promise<void>;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `?view=control_plane_v1` read handlers. Unlike the V0 handlers in
|
|
3
|
+
* `commerceOmsHandlers.ts`, these deliberately take NO `governance` dependency and
|
|
4
|
+
* do not run `applyOmsAgentCustomerReadGate`: `commerce.oms_control_plane.v1`
|
|
5
|
+
* carries no customer identity, so the gate would audit a `customer_read` of zero
|
|
6
|
+
* customers and mask a field the strict contract forbids — and the portable
|
|
7
|
+
* `node-postgres` branch of this same contract has neither an actor kind nor an
|
|
8
|
+
* audit client to run it with. The exemption holds only while the projection stays
|
|
9
|
+
* customer-free, a precondition pinned in `omsControlPlaneReadGovernance.test.ts`.
|
|
10
|
+
*/
|
|
11
|
+
import { omsControlPlaneDetailRequestSchema, omsControlPlaneDetailResponseSchema, omsControlPlaneListRequestSchema, omsControlPlaneListResponseSchema, } from "../oms/omsControlPlane.js";
|
|
12
|
+
export function createCommerceOmsControlPlaneListHandler({ authorizeAdmin, port, respond }) {
|
|
13
|
+
return async (req, res) => {
|
|
14
|
+
if (req.method !== "GET")
|
|
15
|
+
return respond.sendMethodNotAllowed(res, ["GET"]);
|
|
16
|
+
if (!await authorize(req, res, authorizeAdmin, respond))
|
|
17
|
+
return;
|
|
18
|
+
const request = omsControlPlaneListRequestSchema.safeParse(req.query ?? {});
|
|
19
|
+
if (!request.success) {
|
|
20
|
+
respond.sendBffError(res, "BAD_REQUEST", "Invalid OMS control-plane list request", { details: request.error.flatten() });
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const result = omsControlPlaneListResponseSchema.parse(await port.listOrders(request.data));
|
|
25
|
+
respond.sendBffSuccess(res, result);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
respond.sendBffError(res, "UPSTREAM_UNAVAILABLE", "OMS control-plane list is unavailable");
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export function createCommerceOmsControlPlaneDetailHandler({ authorizeAdmin, port, respond }) {
|
|
33
|
+
return async (req, res) => {
|
|
34
|
+
if (req.method !== "GET")
|
|
35
|
+
return respond.sendMethodNotAllowed(res, ["GET"]);
|
|
36
|
+
if (!await authorize(req, res, authorizeAdmin, respond))
|
|
37
|
+
return;
|
|
38
|
+
const request = omsControlPlaneDetailRequestSchema.safeParse(req.query ?? {});
|
|
39
|
+
if (!request.success) {
|
|
40
|
+
respond.sendBffError(res, "BAD_REQUEST", "Invalid OMS control-plane detail request", { details: request.error.flatten() });
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
const result = await port.getOrderDetail(request.data);
|
|
45
|
+
if (!result)
|
|
46
|
+
return respond.sendBffError(res, "NOT_FOUND", "Commerce order not found");
|
|
47
|
+
respond.sendBffSuccess(res, omsControlPlaneDetailResponseSchema.parse(result));
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
respond.sendBffError(res, "UPSTREAM_UNAVAILABLE", "OMS control-plane detail is unavailable");
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
async function authorize(req, res, authorizeAdmin, respond) {
|
|
55
|
+
const result = await authorizeAdmin(req);
|
|
56
|
+
if (result.ok === true)
|
|
57
|
+
return true;
|
|
58
|
+
respond.sendBffError(res, result.code, result.message);
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type CommerceOmsHoldPort, type CommerceOmsReadPort } from "../oms/omsPorts.js";
|
|
2
|
+
import type { OmsHandlerDeps, OmsHandlerRequest, OmsHandlerResponder } from "./handlerSupport.js";
|
|
3
|
+
import { type OmsAdminAuthResult as AdminAuthResult } from "./handlerSupport.js";
|
|
4
|
+
export type { OmsAdminAuthResult as AdminAuthResult } from "./handlerSupport.js";
|
|
5
|
+
export type BaseDeps<Response> = OmsHandlerDeps<Response>;
|
|
6
|
+
export declare function createAdminCommerceOrdersListHandler<Response>({ authorizeAdmin, omsPort, readGate, listRequestSchema, listResponseSchema, detailResponseSchema, respond, }: BaseDeps<Response> & {
|
|
7
|
+
omsPort: Pick<CommerceOmsReadPort, "listOrders">;
|
|
8
|
+
}): (req: OmsHandlerRequest, res: Response) => Promise<void>;
|
|
9
|
+
export declare function createAdminCommerceOrderDetailHandler<Response>({ authorizeAdmin, omsPort, readGate, listRequestSchema, listResponseSchema, detailResponseSchema, respond, }: BaseDeps<Response> & {
|
|
10
|
+
omsPort: Pick<CommerceOmsReadPort, "getOrderDetail">;
|
|
11
|
+
}): (req: OmsHandlerRequest, res: Response) => Promise<void>;
|
|
12
|
+
export declare function createAdminCommerceOrderHoldHandler<Response>({ authorizeAdmin, omsPort, respond, }: BaseDeps<Response> & {
|
|
13
|
+
omsPort: Pick<CommerceOmsHoldPort, "createHold">;
|
|
14
|
+
}): (req: OmsHandlerRequest, res: Response) => Promise<void>;
|
|
15
|
+
export declare function createAdminCommerceOrderReleaseHoldHandler<Response>({ authorizeAdmin, omsPort, respond, }: BaseDeps<Response> & {
|
|
16
|
+
omsPort: Pick<CommerceOmsHoldPort, "releaseHold">;
|
|
17
|
+
}): (req: OmsHandlerRequest, res: Response) => Promise<void>;
|
|
18
|
+
export declare function createAdminCommerceOrderNoteHandler<Response>({ authorizeAdmin, omsPort, respond, }: BaseDeps<Response> & {
|
|
19
|
+
omsPort: Pick<CommerceOmsHoldPort, "addNote">;
|
|
20
|
+
}): (req: OmsHandlerRequest, res: Response) => Promise<void>;
|
|
21
|
+
export declare function createAdminCommerceOrderUpdateShippingAddressHandler<Response>({ authorizeAdmin, omsPort, respond, }: BaseDeps<Response> & {
|
|
22
|
+
omsPort: Pick<CommerceOmsHoldPort, "updateShippingAddress">;
|
|
23
|
+
}): (req: OmsHandlerRequest, res: Response) => Promise<void>;
|
|
24
|
+
export declare function authorize<Response>(req: OmsHandlerRequest, res: Response, authorizeAdmin: (req: OmsHandlerRequest) => Promise<AdminAuthResult>, respond: OmsHandlerResponder<Response>): Promise<{
|
|
25
|
+
ok: true;
|
|
26
|
+
userId: string;
|
|
27
|
+
isMachineActor?: boolean;
|
|
28
|
+
} | null>;
|
|
29
|
+
export declare function parseOmsRequest<Response, T>(res: Response, respond: OmsHandlerResponder<Response>, schema: {
|
|
30
|
+
safeParse: (input: unknown) => {
|
|
31
|
+
success: true;
|
|
32
|
+
data: T;
|
|
33
|
+
} | {
|
|
34
|
+
success: false;
|
|
35
|
+
error: {
|
|
36
|
+
flatten: () => unknown;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
}, input: unknown, message: string): T | undefined;
|
|
40
|
+
export declare function sendOmsMutationResponse<Response, T>(res: Response, respond: OmsHandlerResponder<Response>, action: () => Promise<unknown>, schema: {
|
|
41
|
+
safeParse: (input: unknown) => {
|
|
42
|
+
success: true;
|
|
43
|
+
data: T;
|
|
44
|
+
} | {
|
|
45
|
+
success: false;
|
|
46
|
+
};
|
|
47
|
+
}, invalidMessage: string, failedMessage: string, accept?: (data: T) => boolean): Promise<void>;
|