@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,292 @@
|
|
|
1
|
+
import type { SubscriptionCycleStatus } from "@openlup/core/subscription";
|
|
2
|
+
import type { OmsFulfillmentOrderRow,OmsShipmentExternalRefRow } from "../../../model/omsFulfillmentSummary.js";
|
|
3
|
+
import { buildOmsOrderDetailResponse,buildOmsOrderListResponse,type OmsAccountingOutboxRow,type OmsAddressRow,type OmsCommunicationDeliveryRow,type OmsCustomerRow,type OmsHoldRow,type OmsInventoryReservationRow,type OmsOperationRow,type OmsOrderItemRow,type OmsOrderRow,type OmsPaymentAttemptRow,type OmsPaymentIntentRow,type OmsPaymentTransitionRow } from "../../../model/omsReadModel.js";
|
|
4
|
+
import { paymentStatusForOrder,type OmsActionAvailabilityFlags } from "../../../model/omsReadModelHelpers.js";
|
|
5
|
+
import { ORDER_HEADER_MONEY_COLUMNS,ORDER_ITEM_MONEY_COLUMNS } from "../../../orderMoney.js";
|
|
6
|
+
import { omsDeliveryContactResolutionSchema,type AdminCommerceOrderDetailRequest,type AdminCommerceOrderDetailResponse,type AdminCommerceOrdersListRequest,type AdminCommerceOrdersListResponse } from "../../../oms/omsContracts.js";
|
|
7
|
+
import { assertOmsOrderRowCurrency,CommerceOmsPersistenceError } from "../../../oms/omsPorts.js";
|
|
8
|
+
import { readAccountingOutbox } from "./accounting.js";
|
|
9
|
+
import { readFulfillmentOrdersByOrderIds,readFulfillmentParcelsByOrderId,readShipmentRefsByOrderId,readShipmentRefsByOrderIds } from "./fulfillmentReads.js";
|
|
10
|
+
import { readOrderPaidOutboxEvents } from "./outboxEvents.js";
|
|
11
|
+
import { readActivePaymentAttempts } from "./paymentAttempts.js";
|
|
12
|
+
import { readQueueSelection } from "./queueSelection.js";
|
|
13
|
+
import { emptyOmsManagedReadProjections,type OmsManagedReadProjections } from "./readProjections.js";
|
|
14
|
+
import { distinctIds,type CommerceOmsStore } from "./types.js";
|
|
15
|
+
// `sales_channels(slug)` is the order's source channel, embedded through the only
|
|
16
|
+
// foreign key between the two tables and mirroring the `inventory_locations(code)`
|
|
17
|
+
// embed on the reservation read below. The channel id itself is deliberately not
|
|
18
|
+
// selected: nothing on this read path addresses a channel by id, only by slug.
|
|
19
|
+
const ORDER_COLUMNS = `id, order_number, client_id, status, mode, ${ORDER_HEADER_MONEY_COLUMNS}, metadata, created_at, updated_at, subscription_id, subscription_cycle_id, shipping_address_id, source_kind, source_order_ref, sales_channels(slug)`;
|
|
20
|
+
const ORDER_ITEM_COLUMNS = `id, order_id, sku_id, quantity, ${ORDER_ITEM_MONEY_COLUMNS}, product_snapshot, variant_snapshot`;
|
|
21
|
+
const ADDRESS_COLUMNS = "id, label, line1, line2, city, postal_code, country, recipient_name, contact_phone, company_name, tax_id, delivery_notes, courier_instructions";
|
|
22
|
+
const INVOICE_COLUMNS = "id, order_id, invoice_ref, status, provider_kind, provider_invoice_number, total_gross_cents, currency, blocked_reason, updated_at";
|
|
23
|
+
const COMMUNICATION_DELIVERY_COLUMNS = "id, purpose, template_slug, trigger_source, trigger_event, aggregate_type, aggregate_id, dedupe_key, status, provider_kind, provider_message_id, scheduled_due_at, expected_send_at, queued_at, first_attempt_at, sent_at, delivered_at, terminal_at, last_error_code, outbox_event_id, platform_job_run_id, email_send_id, metadata, created_at, updated_at";
|
|
24
|
+
export async function listCommerceOmsOrders(
|
|
25
|
+
client: CommerceOmsStore,
|
|
26
|
+
request: AdminCommerceOrdersListRequest,
|
|
27
|
+
options: { projections?: OmsManagedReadProjections } = {},
|
|
28
|
+
): Promise<AdminCommerceOrdersListResponse> {
|
|
29
|
+
const projections = readProjections(options.projections);
|
|
30
|
+
const queue = await readQueueSelection(client, request, { currency: projections.model?.currency, projectResult: projections.projectQueue, matchSchema: projections.queueMatchSchema });
|
|
31
|
+
if (!queue.orderIds.length) {
|
|
32
|
+
return buildOmsOrderListResponse({
|
|
33
|
+
projections: projections.model,
|
|
34
|
+
orders: [],
|
|
35
|
+
paymentIntents: [],
|
|
36
|
+
paymentAttempts: [],
|
|
37
|
+
activeHoldCounts: {},
|
|
38
|
+
summaryCounts: queue.summaryCounts,
|
|
39
|
+
summaryTotals: queue.summaryTotals,
|
|
40
|
+
searchMatches: queue.matches,
|
|
41
|
+
totalCount: queue.totalCount,
|
|
42
|
+
page: request.page,
|
|
43
|
+
pageSize: request.pageSize,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
const ordersResult = await client.query("commerce_orders").select(options.projections?.orderColumns ?? ORDER_COLUMNS).in("id", queue.orderIds);
|
|
47
|
+
if (ordersResult.error) throw new CommerceOmsPersistenceError("Commerce OMS order list read failed");
|
|
48
|
+
const rowsById = new Map(((ordersResult.data ?? []) as OmsOrderRow[]).map((order) => [order.id, order]));
|
|
49
|
+
const orders = queue.orderIds.map((id) => rowsById.get(id)).filter((order): order is OmsOrderRow => Boolean(order));
|
|
50
|
+
if (orders.length !== queue.orderIds.length) throw new CommerceOmsPersistenceError("Commerce OMS queue order hydration mismatch");
|
|
51
|
+
// The cast above is the only thing asserting these rows' shape. Currency is
|
|
52
|
+
// the one column that can defeat the read model, so it is checked here where
|
|
53
|
+
// the order id is still in hand, not fifteen frames later inside a money node.
|
|
54
|
+
assertOmsOrderRowCurrency(orders, projections.model?.currency);
|
|
55
|
+
const orderIds = orders.map((order) => order.id);
|
|
56
|
+
const clientIds = distinctIds(orders.map((order) => order.client_id));
|
|
57
|
+
const related = await readListRelations(client, orders, orderIds, clientIds, projections);
|
|
58
|
+
const fulfillmentOrderIds = related.fulfillmentOrders.map((order) => order.id);
|
|
59
|
+
const [fulfillmentOperations, dispatchRefs, statusEvidence, accountingOutbox] = await Promise.all([
|
|
60
|
+
projections.readFulfillmentOperations(client, fulfillmentOrderIds),
|
|
61
|
+
projections.readProviderDispatchRefs(client, fulfillmentOrderIds),
|
|
62
|
+
projections.readProviderStatusEvidence(client, fulfillmentOrderIds),
|
|
63
|
+
readAccountingOutbox(client, related.invoices),
|
|
64
|
+
]);
|
|
65
|
+
return buildOmsOrderListResponse({
|
|
66
|
+
orders,
|
|
67
|
+
paymentIntents: related.paymentIntents,
|
|
68
|
+
paymentAttempts: related.paymentAttempts,
|
|
69
|
+
activeHoldCounts: countHoldsByOrder(related.activeHolds),
|
|
70
|
+
activeHoldReasons: holdReasonsByOrder(related.activeHolds),
|
|
71
|
+
fulfillmentHealthDigests: projections.buildHealthDigests({ orders, paymentIntents: related.paymentIntents, fulfillmentOrders: related.fulfillmentOrders, dispatchRefs, statusEvidence }),
|
|
72
|
+
customers: related.customers,
|
|
73
|
+
identityExtras: related.identityExtras,
|
|
74
|
+
projections: projections.model,
|
|
75
|
+
orderItems: related.orderItems,
|
|
76
|
+
inventoryReservations: related.reservations,
|
|
77
|
+
fulfillmentOrders: related.fulfillmentOrders,
|
|
78
|
+
fulfillmentOperations,
|
|
79
|
+
shipmentExternalRefs: related.shipmentRefs,
|
|
80
|
+
providerDispatchRefs: dispatchRefs,
|
|
81
|
+
providerStatusEvidence: statusEvidence,
|
|
82
|
+
releasedProviderExceptionHolds: related.releasedProviderExceptionHolds,
|
|
83
|
+
accountingInvoices: related.invoices,
|
|
84
|
+
accountingOutbox,
|
|
85
|
+
subscriptionCycleStatuses: related.subscriptionCycleStatuses,
|
|
86
|
+
summaryCounts: queue.summaryCounts,
|
|
87
|
+
summaryTotals: queue.summaryTotals,
|
|
88
|
+
searchMatches: queue.matches,
|
|
89
|
+
totalCount: queue.totalCount,
|
|
90
|
+
page: request.page,
|
|
91
|
+
pageSize: request.pageSize,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
export async function getCommerceOmsOrderDetail(client: CommerceOmsStore, request: AdminCommerceOrderDetailRequest,
|
|
95
|
+
options: { actionFlags?: OmsActionAvailabilityFlags; projections?: OmsManagedReadProjections } = {},
|
|
96
|
+
): Promise<AdminCommerceOrderDetailResponse | null> {
|
|
97
|
+
const orderResult = await client.query("commerce_orders").select(options.projections?.orderColumns ?? ORDER_COLUMNS).eq("id", request.orderId).maybeSingle();
|
|
98
|
+
if (orderResult.error) throw new CommerceOmsPersistenceError("Commerce OMS order detail read failed");
|
|
99
|
+
if (!orderResult.data) return null;
|
|
100
|
+
return readOrderDetail(client, orderResult.data as OmsOrderRow, options);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Hydrate a bounded selection without repeating its canonical header query. */
|
|
104
|
+
export async function getCommerceOmsOrderDetails(client: CommerceOmsStore, orderIds: string[],
|
|
105
|
+
options: { actionFlags?: OmsActionAvailabilityFlags; projections?: OmsManagedReadProjections } = {},
|
|
106
|
+
): Promise<Array<AdminCommerceOrderDetailResponse | null>> {
|
|
107
|
+
if (orderIds.length === 0) return [];
|
|
108
|
+
if (orderIds.length > 25) throw new CommerceOmsPersistenceError("Commerce OMS detail batch exceeds 25 orders");
|
|
109
|
+
const result = await client.query("commerce_orders").select(options.projections?.orderColumns ?? ORDER_COLUMNS).in("id", [...new Set(orderIds)]);
|
|
110
|
+
if (result.error) throw new CommerceOmsPersistenceError("Commerce OMS order detail read failed");
|
|
111
|
+
const orders = new Map(((result.data ?? []) as OmsOrderRow[]).map((order) => [order.id, order]));
|
|
112
|
+
return Promise.all(orderIds.map((id) => {
|
|
113
|
+
const order = orders.get(id);
|
|
114
|
+
return order ? readOrderDetail(client, order, options) : null;
|
|
115
|
+
}));
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
async function readOrderDetail(client: CommerceOmsStore, order: OmsOrderRow,
|
|
119
|
+
options: { actionFlags?: OmsActionAvailabilityFlags; projections?: OmsManagedReadProjections },
|
|
120
|
+
): Promise<AdminCommerceOrderDetailResponse> {
|
|
121
|
+
const projections = readProjections(options.projections);
|
|
122
|
+
assertOmsOrderRowCurrency([order], projections.model?.currency);
|
|
123
|
+
|
|
124
|
+
const [related, resolutionResult] = await Promise.all([
|
|
125
|
+
readDetailRelations(client, order, projections),
|
|
126
|
+
client.rpc("commerce_oms_resolve_delivery_contact_v1", { p_order_id: order.id }),
|
|
127
|
+
]);
|
|
128
|
+
if (resolutionResult.error) throw new CommerceOmsPersistenceError("Commerce OMS delivery contact resolution failed");
|
|
129
|
+
const contactResolution = omsDeliveryContactResolutionSchema.safeParse(resolutionResult.data);
|
|
130
|
+
if (!contactResolution.success) throw new CommerceOmsPersistenceError("Commerce OMS delivery contact resolution was malformed");
|
|
131
|
+
const intent = related.intent;
|
|
132
|
+
// Every parcel, current first. Provider evidence stays keyed on the current
|
|
133
|
+
// parcel; widening it would attribute a sibling's state to the live shipment.
|
|
134
|
+
// Superseded parcels travel as separate support/claim nodes below.
|
|
135
|
+
const parcels = related.parcels;
|
|
136
|
+
const fulfillmentOrder = parcels[0] ?? null;
|
|
137
|
+
const invoice = related.invoice;
|
|
138
|
+
const fulfillmentOrderIds = fulfillmentOrder ? [fulfillmentOrder.id] : [];
|
|
139
|
+
const [attemptsResult, transitionsResult, fulfillmentOperations, providerAttempts, dispatchRefs, statusEvidence, releasedProviderExceptionHolds, outboxResult, orderPaidOutboxResult, communicationResult] = await Promise.all([
|
|
140
|
+
intent ? client.query("commerce_payment_attempts").select("id, status, provider, provider_attempt_id, next_action_kind, updated_at").eq("payment_intent_id", intent.id).order("created_at", { ascending: false }) : emptyRows(),
|
|
141
|
+
intent ? client.query("commerce_payment_state_transitions").select("id, transition_kind, from_status, to_status, reason, occurred_at").eq("payment_intent_id", intent.id).order("occurred_at", { ascending: false }) : emptyRows(),
|
|
142
|
+
projections.readFulfillmentOperations(client, fulfillmentOrderIds),
|
|
143
|
+
projections.readProviderAttempts(client, fulfillmentOrderIds),
|
|
144
|
+
projections.readProviderDispatchRefs(client, fulfillmentOrderIds),
|
|
145
|
+
projections.readProviderStatusEvidence(client, fulfillmentOrderIds),
|
|
146
|
+
projections.readReleasedProviderExceptionHolds(client, [order.id]),
|
|
147
|
+
invoice
|
|
148
|
+
? client
|
|
149
|
+
.query("accounting_invoice_issue_outbox")
|
|
150
|
+
.select("invoice_id, status, attempt_count, next_attempt_at, last_error, created_at")
|
|
151
|
+
.eq("invoice_id", invoice.id)
|
|
152
|
+
.order("created_at", { ascending: false })
|
|
153
|
+
: emptyRows(),
|
|
154
|
+
readOrderPaidOutboxEvents(client, order.id),
|
|
155
|
+
client
|
|
156
|
+
.query("communication_email_deliveries")
|
|
157
|
+
.select(COMMUNICATION_DELIVERY_COLUMNS)
|
|
158
|
+
.eq("aggregate_type", "commerce_order")
|
|
159
|
+
.eq("aggregate_id", order.id)
|
|
160
|
+
.order("created_at", { ascending: false }),
|
|
161
|
+
]);
|
|
162
|
+
if ([attemptsResult, transitionsResult, outboxResult, orderPaidOutboxResult, communicationResult].some((result) => result.error)) throw new CommerceOmsPersistenceError("Commerce OMS detail expansion read failed");
|
|
163
|
+
const inboundProviderEvents = await projections.readInboundEvents(client, { order, dispatchRefs });
|
|
164
|
+
const providerStockCurrent = await projections.readProviderStockCurrent(client, related.orderItems);
|
|
165
|
+
const paymentAttempts = (attemptsResult.data ?? []) as OmsPaymentAttemptRow[];
|
|
166
|
+
const fulfillmentHealth = projections.buildHealth({
|
|
167
|
+
order,
|
|
168
|
+
paymentStatus: paymentStatusForOrder(order.id, intent ? [intent] : []),
|
|
169
|
+
fulfillmentOrders: fulfillmentOrder ? [fulfillmentOrder] : [],
|
|
170
|
+
dispatchRefs,
|
|
171
|
+
statusEvidence,
|
|
172
|
+
orderPaidOutboxEvents: (orderPaidOutboxResult.data ?? []) as unknown[],
|
|
173
|
+
});
|
|
174
|
+
return buildOmsOrderDetailResponse({
|
|
175
|
+
order,
|
|
176
|
+
paymentIntent: intent,
|
|
177
|
+
paymentAttempts,
|
|
178
|
+
paymentTransitions: (transitionsResult.data ?? []) as OmsPaymentTransitionRow[],
|
|
179
|
+
holds: related.holds,
|
|
180
|
+
operations: related.operations,
|
|
181
|
+
customer: related.customer,
|
|
182
|
+
identityExtras: related.identityExtras,
|
|
183
|
+
projections: projections.model,
|
|
184
|
+
shippingAddress: related.shippingAddress,
|
|
185
|
+
accountingInvoice: invoice,
|
|
186
|
+
accountingOutbox: (outboxResult.data ?? []) as OmsAccountingOutboxRow[],
|
|
187
|
+
communicationDeliveries: (communicationResult.data ?? []) as OmsCommunicationDeliveryRow[],
|
|
188
|
+
orderItems: related.orderItems,
|
|
189
|
+
inventoryReservations: related.reservations,
|
|
190
|
+
fulfillmentOrders: fulfillmentOrder ? [fulfillmentOrder] : [],
|
|
191
|
+
supersededFulfillmentOrders: parcels.slice(1),
|
|
192
|
+
fulfillmentOperations,
|
|
193
|
+
shipmentExternalRefs: related.shipmentRefs,
|
|
194
|
+
providerAttempts,
|
|
195
|
+
providerDispatchRefs: dispatchRefs,
|
|
196
|
+
providerStatusEvidence: statusEvidence,
|
|
197
|
+
releasedProviderExceptionHolds,
|
|
198
|
+
fulfillmentHealth,
|
|
199
|
+
inboundProviderEvents,
|
|
200
|
+
providerStockCurrent,
|
|
201
|
+
subscriptionCycleStatus: related.cycleStatus,
|
|
202
|
+
subscriptionCyclePaidAt: related.cyclePaidAt, subscriptionNextCycleAt: related.subscriptionNextCycleAt,
|
|
203
|
+
actionFlags: options.actionFlags,
|
|
204
|
+
deliveryContactResolution: contactResolution.data,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
async function readListRelations(
|
|
208
|
+
client: CommerceOmsStore,
|
|
209
|
+
orders: OmsOrderRow[],
|
|
210
|
+
orderIds: string[],
|
|
211
|
+
clientIds: string[],
|
|
212
|
+
projections: ReturnType<typeof readProjections>,
|
|
213
|
+
) {
|
|
214
|
+
const cycleIds = distinctIds(orders.map((order) => order.subscription_cycle_id ?? null));
|
|
215
|
+
const [intent, hold, releasedProviderExceptionHolds, customer, identityExtras, items, reservations, fulfillment, shipmentRefs, invoice, cycles] = await Promise.all([
|
|
216
|
+
orderIds.length ? client.query("commerce_payment_intents").select("id, order_id, payment_id, status, active_attempt_id, provider_payment_id, updated_at").in("order_id", orderIds) : emptyRows(),
|
|
217
|
+
orderIds.length ? client.query("commerce_order_holds").select("order_id, reason").in("order_id", orderIds).eq("status", "active") : emptyRows(),
|
|
218
|
+
projections.readReleasedProviderExceptionHolds(client, orderIds),
|
|
219
|
+
clientIds.length ? client.query("clients").select("id, email, first_name, last_name, phone, lifecycle_stage").in("id", clientIds) : emptyRows(),
|
|
220
|
+
projections.readIdentity(client, orders, "list"),
|
|
221
|
+
orderIds.length ? client.query("commerce_order_items").select(ORDER_ITEM_COLUMNS).in("order_id", orderIds) : emptyRows(),
|
|
222
|
+
orderIds.length ? client.query("inventory_reservations").select("id, order_id, order_item_id, quantity, status, expires_at, location_id, inventory_locations!inventory_reservations_location_id_fkey(code)").in("order_id", orderIds) : emptyRows(),
|
|
223
|
+
readFulfillmentOrdersByOrderIds(client, orderIds),
|
|
224
|
+
readShipmentRefsByOrderIds(client, orderIds),
|
|
225
|
+
orderIds.length ? client.query("accounting_invoices").select(projections.invoiceColumns ?? INVOICE_COLUMNS).in("order_id", orderIds).is("correction_of_invoice_id", null) : emptyRows(),
|
|
226
|
+
cycleIds.length ? client.query("subscription_cycles").select("id, status").in("id", cycleIds) : emptyRows(),
|
|
227
|
+
]);
|
|
228
|
+
if (intent.error || hold.error || customer.error || items.error || reservations.error || fulfillment.error || shipmentRefs.error || invoice.error || cycles.error) {
|
|
229
|
+
throw new CommerceOmsPersistenceError("Commerce OMS related list read failed");
|
|
230
|
+
}
|
|
231
|
+
const paymentIntents = (intent.data ?? []) as OmsPaymentIntentRow[];
|
|
232
|
+
const paymentAttempts = await readActivePaymentAttempts(client, paymentIntents);
|
|
233
|
+
return {
|
|
234
|
+
paymentIntents,
|
|
235
|
+
paymentAttempts,
|
|
236
|
+
activeHolds: (hold.data ?? []) as OmsActiveHoldRow[],
|
|
237
|
+
releasedProviderExceptionHolds,
|
|
238
|
+
customers: (customer.data ?? []) as OmsCustomerRow[],
|
|
239
|
+
identityExtras,
|
|
240
|
+
orderItems: (items.data ?? []) as OmsOrderItemRow[],
|
|
241
|
+
reservations: (reservations.data ?? []) as OmsInventoryReservationRow[],
|
|
242
|
+
fulfillmentOrders: (fulfillment.data ?? []) as OmsFulfillmentOrderRow[],
|
|
243
|
+
shipmentRefs: (shipmentRefs.data ?? []) as OmsShipmentExternalRefRow[],
|
|
244
|
+
invoices: ((invoice.data ?? []) as unknown[]).map(projections.mapInvoice),
|
|
245
|
+
subscriptionCycleStatuses: Object.fromEntries(((cycles.data ?? []) as Array<{ id: string; status: SubscriptionCycleStatus | null }>).map((cycle) => [cycle.id, cycle.status])) as Record<string, SubscriptionCycleStatus | null>,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
async function readDetailRelations(client: CommerceOmsStore, order: OmsOrderRow, projections: ReturnType<typeof readProjections>) {
|
|
249
|
+
const [intent, holds, operations, items, cycle, reservations, fulfillment, shipmentRefs, customer, identityExtras, address, invoice, subscription] = await Promise.all([
|
|
250
|
+
client.query("commerce_payment_intents").select("id, order_id, payment_id, status, active_attempt_id, provider_payment_id, updated_at").eq("order_id", order.id).maybeSingle(),
|
|
251
|
+
client.query("commerce_order_holds").select("id, order_id, status, reason, note, created_at, released_at").eq("order_id", order.id).order("created_at", { ascending: false }),
|
|
252
|
+
client.query("commerce_order_operations").select("id, order_id, operation_type, hold_id, actor_user_id, occurred_at, payload").eq("order_id", order.id).order("occurred_at", { ascending: false }),
|
|
253
|
+
client.query("commerce_order_items").select(ORDER_ITEM_COLUMNS).eq("order_id", order.id),
|
|
254
|
+
order.subscription_cycle_id ? client.query("subscription_cycles").select("status, paid_at").eq("id", order.subscription_cycle_id).maybeSingle() : emptyOne(),
|
|
255
|
+
client.query("inventory_reservations").select("id, order_id, order_item_id, quantity, status, expires_at, location_id, inventory_locations!inventory_reservations_location_id_fkey(code)").eq("order_id", order.id).order("created_at", { ascending: false }),
|
|
256
|
+
readFulfillmentParcelsByOrderId(client, order.id),
|
|
257
|
+
readShipmentRefsByOrderId(client, order.id),
|
|
258
|
+
order.client_id ? client.query("clients").select("id, email, first_name, last_name, phone, lifecycle_stage").eq("id", order.client_id).maybeSingle() : emptyOne(),
|
|
259
|
+
projections.readIdentity(client, [order], "detail"),
|
|
260
|
+
order.shipping_address_id ? client.query("addresses").select(ADDRESS_COLUMNS).eq("id", order.shipping_address_id).maybeSingle() : emptyOne(),
|
|
261
|
+
client.query("accounting_invoices").select(projections.invoiceColumns ?? INVOICE_COLUMNS).eq("order_id", order.id).is("correction_of_invoice_id", null).maybeSingle(),
|
|
262
|
+
order.subscription_id ? client.query("subscriptions").select("next_cycle_at").eq("id", order.subscription_id).maybeSingle() : emptyOne(), // read-only display enrichment (next CHARGE date); deliberately absent from the error check below so a failure degrades to a dash instead of failing the whole detail
|
|
263
|
+
]);
|
|
264
|
+
if (intent.error || holds.error || operations.error || items.error || cycle.error || reservations.error || fulfillment.error || shipmentRefs.error || customer.error || address.error || invoice.error) {
|
|
265
|
+
throw new CommerceOmsPersistenceError("Commerce OMS related detail read failed");
|
|
266
|
+
}
|
|
267
|
+
return {
|
|
268
|
+
intent: (intent.data ?? null) as OmsPaymentIntentRow | null,
|
|
269
|
+
holds: (holds.data ?? []) as OmsHoldRow[],
|
|
270
|
+
operations: (operations.data ?? []) as OmsOperationRow[],
|
|
271
|
+
orderItems: (items.data ?? []) as OmsOrderItemRow[],
|
|
272
|
+
cycleStatus: ((cycle.data as { status?: SubscriptionCycleStatus } | null)?.status ?? null),
|
|
273
|
+
cyclePaidAt: ((cycle.data as { paid_at?: string | null } | null)?.paid_at ?? null), subscriptionNextCycleAt: ((subscription.data as { next_cycle_at?: string | null } | null)?.next_cycle_at ?? null),
|
|
274
|
+
reservations: (reservations.data ?? []) as OmsInventoryReservationRow[],
|
|
275
|
+
parcels: (fulfillment.data ?? []) as OmsFulfillmentOrderRow[],
|
|
276
|
+
shipmentRefs: (shipmentRefs.data ?? []) as OmsShipmentExternalRefRow[],
|
|
277
|
+
customer: (customer.data ?? null) as OmsCustomerRow | null,
|
|
278
|
+
identityExtras: identityExtras[order.id],
|
|
279
|
+
shippingAddress: (address.data ?? null) as OmsAddressRow | null,
|
|
280
|
+
invoice: invoice.data ? projections.mapInvoice(invoice.data) : null,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// One set of rows answers both "how many" and "what for"; reasons distinct, first-seen order.
|
|
285
|
+
type OmsActiveHoldRow = { order_id: string; reason: OmsHoldRow["reason"] };
|
|
286
|
+
function countHoldsByOrder(rows: OmsActiveHoldRow[]): Record<string, number> { return rows.reduce<Record<string, number>>((counts, row) => ({ ...counts, [row.order_id]: (counts[row.order_id] ?? 0) + 1 }), {}); }
|
|
287
|
+
function holdReasonsByOrder(rows: OmsActiveHoldRow[]): Record<string, Array<OmsHoldRow["reason"]>> { return rows.reduce<Record<string, Array<OmsHoldRow["reason"]>>>((reasons, row) => ({ ...reasons, [row.order_id]: [...new Set([...(reasons[row.order_id] ?? []), row.reason])] }), {}); }
|
|
288
|
+
|
|
289
|
+
function emptyRows() { return Promise.resolve({ data: [], error: null }); }
|
|
290
|
+
function emptyOne() { return Promise.resolve({ data: null, error: null }); }
|
|
291
|
+
|
|
292
|
+
function readProjections(projections?: OmsManagedReadProjections) { return { ...emptyOmsManagedReadProjections, ...projections }; }
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type { CommerceOmsRpcClient,CommerceOmsStore,ManagedQueryBuilder,ManagedQueryResult,RpcError } from "../../../contracts/omsTypes.js";
|
|
2
|
+
|
|
3
|
+
// Every read in this directory fans out to a follow-up query keyed on ids it just
|
|
4
|
+
// collected, so all three needed the same two steps: drop the rows that carry no
|
|
5
|
+
// id, and ask for each id once. `compact` was the wrong name for that - it also
|
|
6
|
+
// de-duplicates, which the trim-only helpers elsewhere deliberately do not.
|
|
7
|
+
export function distinctIds(values: Array<string | null | undefined>): string[] {
|
|
8
|
+
return [...new Set(values.filter((value): value is string => Boolean(value)))];
|
|
9
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { commerceIdempotencyKeySchema } from "./contractPrimitives.js";
|
|
3
|
+
|
|
4
|
+
export const CHECKOUT_COMMAND_V1 = "commerce.checkout_command.v1";
|
|
5
|
+
export const REFERENCE_CHECKOUT_V1 = "commerce.reference_checkout.v1";
|
|
6
|
+
|
|
7
|
+
const isoCurrencySchema = z.string().regex(/^[A-Z]{3}$/);
|
|
8
|
+
|
|
9
|
+
export function createCheckoutCommandSchemas<IntentStatus extends z.ZodType<string>, AttemptStatus extends z.ZodType<string>>(schemas: { sku: z.ZodType<string, string>; paymentIntentStatus: IntentStatus; paymentAttemptStatus: AttemptStatus }) {
|
|
10
|
+
const checkoutCommandV1Schema = z
|
|
11
|
+
.object({
|
|
12
|
+
version: z.literal(CHECKOUT_COMMAND_V1),
|
|
13
|
+
idempotencyKey: commerceIdempotencyKeySchema,
|
|
14
|
+
mode: z.enum(["one_time", "subscription"]),
|
|
15
|
+
lines: z.array(z.object({
|
|
16
|
+
sku: schemas.sku,
|
|
17
|
+
quantity: z.number().int().positive().max(99),
|
|
18
|
+
}).strict()).min(1).max(50),
|
|
19
|
+
customer: z.object({
|
|
20
|
+
firstName: z.string().trim().min(1).max(80),
|
|
21
|
+
lastName: z.string().trim().min(1).max(80),
|
|
22
|
+
email: z.string().trim().email().max(160),
|
|
23
|
+
phone: z.string().trim().min(6).max(32),
|
|
24
|
+
}).strict(),
|
|
25
|
+
shippingAddress: z.object({
|
|
26
|
+
street: z.string().trim().min(3).max(160),
|
|
27
|
+
postalCode: z.string().trim().min(3).max(16),
|
|
28
|
+
city: z.string().trim().min(2).max(120),
|
|
29
|
+
country: z.string().trim().regex(/^[A-Z]{2}$/),
|
|
30
|
+
}).strict(),
|
|
31
|
+
currency: isoCurrencySchema,
|
|
32
|
+
cadenceDays: z.number().int().positive().max(120).optional(),
|
|
33
|
+
})
|
|
34
|
+
.strict()
|
|
35
|
+
.superRefine((command, ctx) => {
|
|
36
|
+
if (command.mode === "subscription" && command.cadenceDays === undefined) {
|
|
37
|
+
ctx.addIssue({
|
|
38
|
+
code: z.ZodIssueCode.custom,
|
|
39
|
+
message: "subscription checkout command requires cadenceDays",
|
|
40
|
+
path: ["cadenceDays"],
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
if (command.mode === "one_time" && command.cadenceDays !== undefined) {
|
|
44
|
+
ctx.addIssue({
|
|
45
|
+
code: z.ZodIssueCode.custom,
|
|
46
|
+
message: "one-time checkout command does not accept cadenceDays",
|
|
47
|
+
path: ["cadenceDays"],
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The local reference-store BFF accepts only the neutral command. Payment
|
|
56
|
+
* provider selection stays inside trusted server composition.
|
|
57
|
+
*/
|
|
58
|
+
const referenceCheckoutRequestSchema = z.object({
|
|
59
|
+
command: checkoutCommandV1Schema,
|
|
60
|
+
}).strict();
|
|
61
|
+
|
|
62
|
+
const referenceCheckoutResponseSchema = z.object({
|
|
63
|
+
version: z.literal(REFERENCE_CHECKOUT_V1),
|
|
64
|
+
orderId: z.guid(),
|
|
65
|
+
clientId: z.guid(),
|
|
66
|
+
paymentIntentId: z.guid(),
|
|
67
|
+
paymentAttemptId: z.guid().nullable(),
|
|
68
|
+
paymentStatus: schemas.paymentIntentStatus,
|
|
69
|
+
paymentAttemptStatus: schemas.paymentAttemptStatus.nullable(),
|
|
70
|
+
replayed: z.boolean(),
|
|
71
|
+
total: z.object({
|
|
72
|
+
amountMinor: z.number().int().nonnegative(),
|
|
73
|
+
currency: isoCurrencySchema,
|
|
74
|
+
}).strict(),
|
|
75
|
+
}).strict();
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
return { checkoutCommandV1Schema, referenceCheckoutRequestSchema, referenceCheckoutResponseSchema };
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* The persistence result deliberately carries only IDs already owned by the
|
|
83
|
+
* composed persistence adapter. A subject is optional for a generic checkout.
|
|
84
|
+
*/
|
|
85
|
+
export interface CheckoutCommandPersistenceResult {
|
|
86
|
+
idempotencyKey: string;
|
|
87
|
+
clientId: string;
|
|
88
|
+
subjectId: string | null;
|
|
89
|
+
shippingAddressId: string;
|
|
90
|
+
replayed: boolean;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export type CheckoutCommandV1 = z.output<ReturnType<typeof createCheckoutCommandSchemas>["checkoutCommandV1Schema"]>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export interface OrderDeliveryContactInput {
|
|
2
|
+
recipientName: string;
|
|
3
|
+
contactEmail: string;
|
|
4
|
+
contactPhone: string;
|
|
5
|
+
line1: string;
|
|
6
|
+
line2?: string | null;
|
|
7
|
+
city: string;
|
|
8
|
+
postalCode: string;
|
|
9
|
+
country: string;
|
|
10
|
+
selectedDelivery?: unknown;
|
|
11
|
+
deliveryInstructions?: string | null;
|
|
12
|
+
courierInstructions?: string | null;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Complete order-owned delivery authority. Profile and address-book rows can
|
|
17
|
+
* keep serving defaults, but fulfillment must not reconstruct an order's
|
|
18
|
+
* recipient from those mutable records after checkout.
|
|
19
|
+
*/
|
|
20
|
+
export function buildOrderDeliveryContact(
|
|
21
|
+
input: OrderDeliveryContactInput,
|
|
22
|
+
): Record<string, unknown> {
|
|
23
|
+
return {
|
|
24
|
+
schemaVersion: 1,
|
|
25
|
+
source: "checkout_submission",
|
|
26
|
+
revision: 1,
|
|
27
|
+
recipientName: input.recipientName.trim(),
|
|
28
|
+
contactEmail: input.contactEmail,
|
|
29
|
+
contactPhone: input.contactPhone,
|
|
30
|
+
line1: input.line1,
|
|
31
|
+
line2: input.line2 ?? null,
|
|
32
|
+
city: input.city,
|
|
33
|
+
postalCode: input.postalCode,
|
|
34
|
+
country: input.country,
|
|
35
|
+
selectedDelivery: input.selectedDelivery ?? null,
|
|
36
|
+
deliveryInstructions: input.deliveryInstructions ?? null,
|
|
37
|
+
courierInstructions: input.courierInstructions ?? null,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function uuidFromOrderRef(orderRef: string): string {
|
|
42
|
+
return orderRef.replace(/^order_/, "");
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function messageOf(error: unknown, stage: string): string {
|
|
46
|
+
return error instanceof Error ? `${stage}: ${error.message}` : `${stage}: unknown`;
|
|
47
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { commerceIdempotencyKeySchema } from "./contractPrimitives.js";
|
|
3
|
+
export const CHECKOUT_RESUME_CONTRACT_VERSION = "commerce.checkout_resume.v1";
|
|
4
|
+
export const checkoutResumeTokenSchema = z.string().trim().min(43).max(128).regex(/^[A-Za-z0-9_-]+$/);
|
|
5
|
+
export const checkoutResumeModeSchema = z.enum(["one_time", "subscription"]);
|
|
6
|
+
export const checkoutResumeCompletionCoreSchema = z
|
|
7
|
+
.object({
|
|
8
|
+
productSelection: z.boolean().default(false),
|
|
9
|
+
cadence: z.boolean().default(false),
|
|
10
|
+
account: z.boolean().default(false),
|
|
11
|
+
shipping: z.boolean().default(false),
|
|
12
|
+
billing: z.boolean().default(false),
|
|
13
|
+
payment: z.boolean().default(false),
|
|
14
|
+
review: z.boolean().default(false),
|
|
15
|
+
})
|
|
16
|
+
.strict();
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
export function createCheckoutResumeSchemas<Section extends z.ZodType<string>, Redacted extends z.ZodType<string>, Completion extends z.ZodType>(input: {
|
|
20
|
+
sectionSchema: Section; redactedFieldSchema: Redacted; completionSchema: Completion;
|
|
21
|
+
productSlugSchema: z.ZodType<string, string>; skuSchema: z.ZodType<string, string>;
|
|
22
|
+
additionalForbiddenKeys?: readonly string[];
|
|
23
|
+
}) {
|
|
24
|
+
const checkoutResumeSectionIdSchema = input.sectionSchema;
|
|
25
|
+
const checkoutResumeRedactedFieldSchema = input.redactedFieldSchema;
|
|
26
|
+
const commerceProductSlugSchema = input.productSlugSchema;
|
|
27
|
+
const commerceSkuSchema = input.skuSchema;
|
|
28
|
+
const forbiddenKeys = new Set([...FORBIDDEN_RESUME_STATE_KEYS, ...(input.additionalForbiddenKeys ?? [])]);
|
|
29
|
+
const checkoutResumeDraftStateSchema = z
|
|
30
|
+
.object({
|
|
31
|
+
version: z.literal(CHECKOUT_RESUME_CONTRACT_VERSION),
|
|
32
|
+
mode: checkoutResumeModeSchema.nullable().default(null),
|
|
33
|
+
cadenceDays: z.number().int().positive().max(120).nullable().default(null),
|
|
34
|
+
cart: z
|
|
35
|
+
.object({
|
|
36
|
+
items: z
|
|
37
|
+
.array(
|
|
38
|
+
z
|
|
39
|
+
.object({
|
|
40
|
+
sku: commerceSkuSchema,
|
|
41
|
+
productSlug: commerceProductSlugSchema.nullable().default(null),
|
|
42
|
+
variantId: z.string().trim().min(1).max(120).nullable().default(null),
|
|
43
|
+
quantity: z.number().int().positive().max(99),
|
|
44
|
+
})
|
|
45
|
+
.strict(),
|
|
46
|
+
)
|
|
47
|
+
.max(50)
|
|
48
|
+
.default([]),
|
|
49
|
+
})
|
|
50
|
+
.strict()
|
|
51
|
+
.default({ items: [] }),
|
|
52
|
+
completion: input.completionSchema,
|
|
53
|
+
redactedFields: z.array(checkoutResumeRedactedFieldSchema).max(20).default([]),
|
|
54
|
+
})
|
|
55
|
+
.strict()
|
|
56
|
+
.superRefine((state, ctx) => {
|
|
57
|
+
if (state.mode !== "subscription" && state.cadenceDays !== null) {
|
|
58
|
+
ctx.addIssue({
|
|
59
|
+
code: z.ZodIssueCode.custom,
|
|
60
|
+
message: "cadenceDays can only be set for subscription resume state",
|
|
61
|
+
path: ["cadenceDays"],
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const piiPath = findForbiddenResumeStatePath(state, [], forbiddenKeys);
|
|
66
|
+
if (piiPath) {
|
|
67
|
+
ctx.addIssue({
|
|
68
|
+
code: z.ZodIssueCode.custom,
|
|
69
|
+
message: "checkout resume draft state cannot include raw PII, address or payment fields",
|
|
70
|
+
path: piiPath,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
const checkoutResumeUpsertRequestSchema = z
|
|
76
|
+
.object({
|
|
77
|
+
resumeToken: checkoutResumeTokenSchema.optional(),
|
|
78
|
+
idempotencyKey: commerceIdempotencyKeySchema.optional(),
|
|
79
|
+
lastSectionId: checkoutResumeSectionIdSchema,
|
|
80
|
+
draftState: checkoutResumeDraftStateSchema,
|
|
81
|
+
ttlMinutes: z.number().int().positive().max(10_080).default(120),
|
|
82
|
+
})
|
|
83
|
+
.strict();
|
|
84
|
+
|
|
85
|
+
const checkoutResumeReadRequestSchema = z
|
|
86
|
+
.object({
|
|
87
|
+
resumeToken: checkoutResumeTokenSchema,
|
|
88
|
+
})
|
|
89
|
+
.strict();
|
|
90
|
+
|
|
91
|
+
const checkoutResumeDraftSchema = z
|
|
92
|
+
.object({
|
|
93
|
+
id: z.guid(),
|
|
94
|
+
contractVersion: z.literal(CHECKOUT_RESUME_CONTRACT_VERSION),
|
|
95
|
+
lastSectionId: checkoutResumeSectionIdSchema,
|
|
96
|
+
draftState: checkoutResumeDraftStateSchema,
|
|
97
|
+
expiresAt: z.string().datetime({ offset: true }),
|
|
98
|
+
createdAt: z.string().datetime({ offset: true }),
|
|
99
|
+
updatedAt: z.string().datetime({ offset: true }),
|
|
100
|
+
replayed: z.boolean(),
|
|
101
|
+
})
|
|
102
|
+
.strict();
|
|
103
|
+
|
|
104
|
+
const checkoutResumeUpsertResponseSchema = z
|
|
105
|
+
.object({
|
|
106
|
+
contractVersion: z.literal(CHECKOUT_RESUME_CONTRACT_VERSION),
|
|
107
|
+
resumeToken: checkoutResumeTokenSchema,
|
|
108
|
+
draft: checkoutResumeDraftSchema,
|
|
109
|
+
})
|
|
110
|
+
.strict();
|
|
111
|
+
|
|
112
|
+
const checkoutResumeReadResponseSchema = z
|
|
113
|
+
.object({
|
|
114
|
+
contractVersion: z.literal(CHECKOUT_RESUME_CONTRACT_VERSION),
|
|
115
|
+
draft: checkoutResumeDraftSchema,
|
|
116
|
+
})
|
|
117
|
+
.strict();
|
|
118
|
+
|
|
119
|
+
return { checkoutResumeDraftStateSchema, checkoutResumeUpsertRequestSchema, checkoutResumeReadRequestSchema, checkoutResumeDraftSchema, checkoutResumeUpsertResponseSchema, checkoutResumeReadResponseSchema };
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const FORBIDDEN_RESUME_STATE_KEYS = new Set([
|
|
123
|
+
"name",
|
|
124
|
+
"firstName",
|
|
125
|
+
"lastName",
|
|
126
|
+
"email",
|
|
127
|
+
"phone",
|
|
128
|
+
"street",
|
|
129
|
+
"postalCode",
|
|
130
|
+
"city",
|
|
131
|
+
"address",
|
|
132
|
+
"shippingAddress",
|
|
133
|
+
"billingAddress",
|
|
134
|
+
"deliveryNotes",
|
|
135
|
+
"courierInstructions",
|
|
136
|
+
"providerPayload",
|
|
137
|
+
"pspReference",
|
|
138
|
+
"paymentProvider",
|
|
139
|
+
"card",
|
|
140
|
+
"rawFormPayload",
|
|
141
|
+
]);
|
|
142
|
+
|
|
143
|
+
function findForbiddenResumeStatePath(
|
|
144
|
+
value: unknown,
|
|
145
|
+
path: (string | number)[] = [],
|
|
146
|
+
forbiddenKeys: ReadonlySet<string> = FORBIDDEN_RESUME_STATE_KEYS,
|
|
147
|
+
): (string | number)[] | null {
|
|
148
|
+
if (!value || typeof value !== "object") return null;
|
|
149
|
+
if (Array.isArray(value)) {
|
|
150
|
+
for (const [index, item] of value.entries()) {
|
|
151
|
+
const result = findForbiddenResumeStatePath(item, [...path, index], forbiddenKeys);
|
|
152
|
+
if (result) return result;
|
|
153
|
+
}
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
for (const [key, nestedValue] of Object.entries(value)) {
|
|
158
|
+
if (forbiddenKeys.has(key)) return [...path, key];
|
|
159
|
+
const result = findForbiddenResumeStatePath(nestedValue, [...path, key], forbiddenKeys);
|
|
160
|
+
if (result) return result;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return null;
|
|
164
|
+
}
|