@openlup/platform 0.26.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +138 -218
- package/README.md +229 -16
- package/dist/commerce/adapters/managed/commerceOmsControlPlane.d.ts +3 -0
- package/dist/commerce/adapters/managed/commerceOmsControlPlane.js +71 -0
- package/dist/commerce/adapters/managed/commerceOmsMutations.d.ts +10 -0
- package/dist/commerce/adapters/managed/commerceOmsMutations.js +119 -0
- package/dist/commerce/adapters/managed/commerceOmsPort.d.ts +28 -0
- package/dist/commerce/adapters/managed/commerceOmsPort.js +101 -0
- package/dist/commerce/adapters/managed/oms/accounting.d.ts +3 -0
- package/dist/commerce/adapters/managed/oms/accounting.js +13 -0
- package/dist/commerce/adapters/managed/oms/fulfillmentReads.d.ts +17 -0
- package/dist/commerce/adapters/managed/oms/fulfillmentReads.js +81 -0
- package/dist/commerce/adapters/managed/oms/inboundEvents.d.ts +9 -0
- package/dist/commerce/adapters/managed/oms/inboundEvents.js +40 -0
- package/dist/commerce/adapters/managed/oms/outboxEvents.d.ts +2 -0
- package/dist/commerce/adapters/managed/oms/outboxEvents.js +23 -0
- package/dist/commerce/adapters/managed/oms/paymentAttempts.d.ts +3 -0
- package/dist/commerce/adapters/managed/oms/paymentAttempts.js +15 -0
- package/dist/commerce/adapters/managed/oms/queueSelection.d.ts +12 -0
- package/dist/commerce/adapters/managed/oms/queueSelection.js +109 -0
- package/dist/commerce/adapters/managed/oms/readProjections.d.ts +18 -0
- package/dist/commerce/adapters/managed/oms/readProjections.js +13 -0
- package/dist/commerce/adapters/managed/oms/readQueries.d.ts +16 -0
- package/dist/commerce/adapters/managed/oms/readQueries.js +276 -0
- package/dist/commerce/adapters/managed/oms/types.d.ts +2 -0
- package/dist/commerce/adapters/managed/oms/types.js +7 -0
- package/dist/commerce/checkoutCommandSchemas.d.ts +89 -0
- package/dist/commerce/checkoutCommandSchemas.js +70 -0
- package/dist/commerce/checkoutHelpers.d.ts +21 -0
- package/dist/commerce/checkoutHelpers.js +29 -0
- package/dist/commerce/checkoutResumeSchemas.d.ts +158 -0
- package/dist/commerce/checkoutResumeSchemas.js +145 -0
- package/dist/commerce/checkoutSchemas.d.ts +158 -0
- package/dist/commerce/checkoutSchemas.js +161 -0
- package/dist/commerce/commerceReturnsPort.d.ts +97 -0
- package/dist/commerce/commerceReturnsPort.js +39 -0
- package/dist/commerce/configuratorIntentPersistenceSchemas.d.ts +20 -0
- package/dist/commerce/configuratorIntentPersistenceSchemas.js +21 -0
- package/dist/commerce/configuratorIntentSchemas.d.ts +63 -0
- package/dist/commerce/configuratorIntentSchemas.js +43 -0
- package/dist/commerce/contractPrimitives.d.ts +50 -0
- package/dist/commerce/contractPrimitives.js +25 -0
- package/dist/commerce/contracts/availability.d.ts +23 -0
- package/dist/commerce/contracts/availability.js +1 -0
- package/dist/commerce/contracts/fulfillmentRecovery.d.ts +25 -0
- package/dist/commerce/contracts/fulfillmentRecovery.js +1 -0
- package/dist/commerce/contracts/index.d.ts +13 -0
- package/dist/commerce/contracts/index.js +1 -0
- package/dist/commerce/contracts/intent.d.ts +86 -0
- package/dist/commerce/contracts/intent.js +1 -0
- package/dist/commerce/contracts/omsTypes.d.ts +1216 -0
- package/dist/commerce/contracts/omsTypes.js +1 -0
- package/dist/commerce/contracts/order.d.ts +39 -0
- package/dist/commerce/contracts/order.js +1 -0
- package/dist/commerce/contracts/orderMoney.d.ts +52 -0
- package/dist/commerce/contracts/orderMoney.js +1 -0
- package/dist/commerce/contracts/ports.d.ts +113 -0
- package/dist/commerce/contracts/ports.js +1 -0
- package/dist/commerce/contracts/recovery.d.ts +11 -0
- package/dist/commerce/contracts/recovery.js +1 -0
- package/dist/commerce/contracts/runtimePorts.d.ts +196 -0
- package/dist/commerce/contracts/runtimePorts.js +1 -0
- package/dist/commerce/contracts/state.d.ts +26 -0
- package/dist/commerce/contracts/state.js +43 -0
- package/dist/commerce/customerDefaultsSnapshotSchemas.d.ts +51 -0
- package/dist/commerce/customerDefaultsSnapshotSchemas.js +106 -0
- package/dist/commerce/errors.d.ts +18 -0
- package/dist/commerce/errors.js +36 -0
- package/dist/commerce/fulfillmentEligibility.d.ts +6 -0
- package/dist/commerce/fulfillmentEligibility.js +31 -0
- package/dist/commerce/index.d.ts +72 -0
- package/dist/commerce/index.js +67 -0
- package/dist/commerce/model/customerFulfillmentRecovery.d.ts +40 -0
- package/dist/commerce/model/customerFulfillmentRecovery.js +144 -0
- package/dist/commerce/model/fulfillmentCancellationEligibility.d.ts +7 -0
- package/dist/commerce/model/fulfillmentCancellationEligibility.js +9 -0
- package/dist/commerce/model/omsAccountingVisibility.d.ts +12 -0
- package/dist/commerce/model/omsAccountingVisibility.js +118 -0
- package/dist/commerce/model/omsBillingInvoiceBuyer.d.ts +2 -0
- package/dist/commerce/model/omsBillingInvoiceBuyer.js +15 -0
- package/dist/commerce/model/omsCurrency.d.ts +4 -0
- package/dist/commerce/model/omsCurrency.js +5 -0
- package/dist/commerce/model/omsFulfillmentDebug.d.ts +20 -0
- package/dist/commerce/model/omsFulfillmentDebug.js +122 -0
- package/dist/commerce/model/omsFulfillmentSummary.d.ts +16 -0
- package/dist/commerce/model/omsFulfillmentSummary.js +189 -0
- package/dist/commerce/model/omsListTotals.d.ts +13 -0
- package/dist/commerce/model/omsListTotals.js +32 -0
- package/dist/commerce/model/omsOperationalLadder.d.ts +51 -0
- package/dist/commerce/model/omsOperationalLadder.js +158 -0
- package/dist/commerce/model/omsOrderLineMoney.d.ts +4 -0
- package/dist/commerce/model/omsOrderLineMoney.js +25 -0
- package/dist/commerce/model/omsPaymentMethodSummary.d.ts +5 -0
- package/dist/commerce/model/omsPaymentMethodSummary.js +11 -0
- package/dist/commerce/model/omsReadModel.d.ts +43 -0
- package/dist/commerce/model/omsReadModel.js +211 -0
- package/dist/commerce/model/omsReadModelCommunication.d.ts +3 -0
- package/dist/commerce/model/omsReadModelCommunication.js +29 -0
- package/dist/commerce/model/omsReadModelHelpers.d.ts +125 -0
- package/dist/commerce/model/omsReadModelHelpers.js +212 -0
- package/dist/commerce/model/omsReadModelList.d.ts +33 -0
- package/dist/commerce/model/omsReadModelList.js +50 -0
- package/dist/commerce/model/omsReadModelListSummary.d.ts +3 -0
- package/dist/commerce/model/omsReadModelListSummary.js +13 -0
- package/dist/commerce/model/omsReadModelPricing.d.ts +5 -0
- package/dist/commerce/model/omsReadModelPricing.js +36 -0
- package/dist/commerce/model/omsReadModelProjections.d.ts +1 -0
- package/dist/commerce/model/omsReadModelProjections.js +1 -0
- package/dist/commerce/model/omsReadModelRowCore.d.ts +79 -0
- package/dist/commerce/model/omsReadModelRowCore.js +149 -0
- package/dist/commerce/model/omsReadModelRows.d.ts +1 -0
- package/dist/commerce/model/omsReadModelRows.js +6 -0
- package/dist/commerce/offerAvailability.d.ts +18 -0
- package/dist/commerce/offerAvailability.js +53 -0
- package/dist/commerce/offerAvailabilitySchemas.d.ts +43 -0
- package/dist/commerce/offerAvailabilitySchemas.js +42 -0
- package/dist/commerce/offerEvidenceSchemas.d.ts +7 -0
- package/dist/commerce/offerEvidenceSchemas.js +13 -0
- package/dist/commerce/oms/omsContractBase.d.ts +130 -0
- package/dist/commerce/oms/omsContractBase.js +86 -0
- package/dist/commerce/oms/omsContractReadAuxSchemas.d.ts +222 -0
- package/dist/commerce/oms/omsContractReadAuxSchemas.js +123 -0
- package/dist/commerce/oms/omsContractReadSchemas.d.ts +2266 -0
- package/dist/commerce/oms/omsContractReadSchemas.js +277 -0
- package/dist/commerce/oms/omsContractRequests.d.ts +196 -0
- package/dist/commerce/oms/omsContractRequests.js +118 -0
- package/dist/commerce/oms/omsContracts.d.ts +5 -0
- package/dist/commerce/oms/omsContracts.js +4 -0
- package/dist/commerce/oms/omsControlPlane.d.ts +275 -0
- package/dist/commerce/oms/omsControlPlane.js +72 -0
- package/dist/commerce/oms/omsFulfillmentContractSchemas.d.ts +203 -0
- package/dist/commerce/oms/omsFulfillmentContractSchemas.js +94 -0
- package/dist/commerce/oms/omsFulfillmentDebugSchemas.d.ts +69 -0
- package/dist/commerce/oms/omsFulfillmentDebugSchemas.js +33 -0
- package/dist/commerce/oms/omsFulfillmentHealthSchemas.d.ts +67 -0
- package/dist/commerce/oms/omsFulfillmentHealthSchemas.js +44 -0
- package/dist/commerce/oms/omsPorts.d.ts +84 -0
- package/dist/commerce/oms/omsPorts.js +148 -0
- package/dist/commerce/oms/omsPrimitives.d.ts +5 -0
- package/dist/commerce/oms/omsPrimitives.js +3 -0
- package/dist/commerce/oms/omsProviderEvidenceSchemas.d.ts +15 -0
- package/dist/commerce/oms/omsProviderEvidenceSchemas.js +12 -0
- package/dist/commerce/orderDraftErrors.d.ts +13 -0
- package/dist/commerce/orderDraftErrors.js +20 -0
- package/dist/commerce/orderEmailEligibility.d.ts +54 -0
- package/dist/commerce/orderEmailEligibility.js +123 -0
- package/dist/commerce/orderEmailLines.d.ts +12 -0
- package/dist/commerce/orderEmailLines.js +8 -0
- package/dist/commerce/orderFeedbackContracts.d.ts +41 -0
- package/dist/commerce/orderFeedbackContracts.js +33 -0
- package/dist/commerce/orderMoney.d.ts +6 -0
- package/dist/commerce/orderMoney.js +168 -0
- package/dist/commerce/orderReviewContracts.d.ts +475 -0
- package/dist/commerce/orderReviewContracts.js +94 -0
- package/dist/commerce/orderReviewPorts.d.ts +140 -0
- package/dist/commerce/orderReviewPorts.js +1 -0
- package/dist/commerce/outboxDispatchContracts.d.ts +30 -0
- package/dist/commerce/outboxDispatchContracts.js +1 -0
- package/dist/commerce/outboxEventSchemas.d.ts +162 -0
- package/dist/commerce/outboxEventSchemas.js +164 -0
- package/dist/commerce/outboxOrderDraftEmailPorts.d.ts +207 -0
- package/dist/commerce/outboxOrderDraftEmailPorts.js +12 -0
- package/dist/commerce/paymentContinuation.d.ts +4 -0
- package/dist/commerce/paymentContinuation.js +4 -0
- package/dist/commerce/ports.d.ts +8 -0
- package/dist/commerce/ports.js +1 -0
- package/dist/commerce/recoveryDestination.d.ts +3 -0
- package/dist/commerce/recoveryDestination.js +17 -0
- package/dist/commerce/runtimeErrors.d.ts +8 -0
- package/dist/commerce/runtimeErrors.js +16 -0
- package/dist/commerce/salesChannelEnvelope.d.ts +20 -0
- package/dist/commerce/salesChannelEnvelope.js +7 -0
- package/dist/commerce/schemas.d.ts +174 -0
- package/dist/commerce/schemas.js +84 -0
- package/dist/commerce/server/checkoutCompensation.d.ts +21 -0
- package/dist/commerce/server/checkoutCompensation.js +32 -0
- package/dist/commerce/server/checkoutConflictClassifiers.d.ts +17 -0
- package/dist/commerce/server/checkoutConflictClassifiers.js +38 -0
- package/dist/commerce/server/checkoutExpiredRecoveryPolicy.d.ts +38 -0
- package/dist/commerce/server/checkoutExpiredRecoveryPolicy.js +85 -0
- package/dist/commerce/server/checkoutInvoiceBuyerSnapshot.d.ts +22 -0
- package/dist/commerce/server/checkoutInvoiceBuyerSnapshot.js +30 -0
- package/dist/commerce/server/checkoutOfferPolicyPort.d.ts +33 -0
- package/dist/commerce/server/checkoutOfferPolicyPort.js +49 -0
- package/dist/commerce/server/checkoutPaymentContinuationCredential.d.ts +58 -0
- package/dist/commerce/server/checkoutPaymentContinuationCredential.js +154 -0
- package/dist/commerce/server/checkoutQuoteTypes.d.ts +19 -0
- package/dist/commerce/server/checkoutQuoteTypes.js +1 -0
- package/dist/commerce/server/checkoutRecoveryOrderPort.d.ts +42 -0
- package/dist/commerce/server/checkoutRecoveryOrderPort.js +1 -0
- package/dist/commerce/server/checkoutRecoveryToken.d.ts +40 -0
- package/dist/commerce/server/checkoutRecoveryToken.js +26 -0
- package/dist/commerce/server/checkoutRefusalContinuation.d.ts +24 -0
- package/dist/commerce/server/checkoutRefusalContinuation.js +18 -0
- package/dist/commerce/server/checkoutRuntimeTypes.d.ts +81 -0
- package/dist/commerce/server/checkoutRuntimeTypes.js +1 -0
- package/dist/commerce/server/commerceCheckoutCommandExecution.d.ts +60 -0
- package/dist/commerce/server/commerceCheckoutCommandExecution.js +136 -0
- package/dist/commerce/server/commerceCheckoutCompensation.d.ts +26 -0
- package/dist/commerce/server/commerceCheckoutCompensation.js +46 -0
- package/dist/commerce/server/commerceCheckoutContinuationTerms.d.ts +50 -0
- package/dist/commerce/server/commerceCheckoutContinuationTerms.js +66 -0
- package/dist/commerce/server/commerceCheckoutCustomerDefaults.d.ts +18 -0
- package/dist/commerce/server/commerceCheckoutCustomerDefaults.js +17 -0
- package/dist/commerce/server/commerceCheckoutFailureHandler.d.ts +51 -0
- package/dist/commerce/server/commerceCheckoutFailureHandler.js +90 -0
- package/dist/commerce/server/commerceCheckoutHandler.d.ts +213 -0
- package/dist/commerce/server/commerceCheckoutHandler.js +196 -0
- package/dist/commerce/server/commerceCheckoutHandlerAdmission.d.ts +58 -0
- package/dist/commerce/server/commerceCheckoutHandlerAdmission.js +94 -0
- package/dist/commerce/server/commerceCheckoutHandlerHelpers.d.ts +67 -0
- package/dist/commerce/server/commerceCheckoutHandlerHelpers.js +155 -0
- package/dist/commerce/server/commerceCheckoutOrchestrationError.d.ts +9 -0
- package/dist/commerce/server/commerceCheckoutOrchestrationError.js +14 -0
- package/dist/commerce/server/commerceCheckoutPromotionPriceChange.d.ts +47 -0
- package/dist/commerce/server/commerceCheckoutPromotionPriceChange.js +43 -0
- package/dist/commerce/server/commerceCheckoutProviderPayment.d.ts +34 -0
- package/dist/commerce/server/commerceCheckoutProviderPayment.js +37 -0
- package/dist/commerce/server/commerceCheckoutQuoteGuard.d.ts +62 -0
- package/dist/commerce/server/commerceCheckoutQuoteGuard.js +106 -0
- package/dist/commerce/server/commerceCheckoutResume.d.ts +29 -0
- package/dist/commerce/server/commerceCheckoutResume.js +81 -0
- package/dist/commerce/server/commerceCheckoutResumeGuard.d.ts +54 -0
- package/dist/commerce/server/commerceCheckoutResumeGuard.js +138 -0
- package/dist/commerce/server/commerceCheckoutSavedPaymentMethod.d.ts +39 -0
- package/dist/commerce/server/commerceCheckoutSavedPaymentMethod.js +44 -0
- package/dist/commerce/server/commerceCheckoutStartRuntimeFailure.d.ts +7 -0
- package/dist/commerce/server/commerceCheckoutStartRuntimeFailure.js +39 -0
- package/dist/commerce/server/commerceCheckoutTiming.d.ts +8 -0
- package/dist/commerce/server/commerceCheckoutTiming.js +31 -0
- package/dist/commerce/server/commerceDiagnostics.d.ts +6 -0
- package/dist/commerce/server/commerceDiagnostics.js +31 -0
- package/dist/commerce/server/commerceOmsCancelOrderHandler.d.ts +7 -0
- package/dist/commerce/server/commerceOmsCancelOrderHandler.js +22 -0
- package/dist/commerce/server/commerceOmsControlPlaneHandlers.d.ts +18 -0
- package/dist/commerce/server/commerceOmsControlPlaneHandlers.js +60 -0
- package/dist/commerce/server/commerceOmsHandlers.d.ts +47 -0
- package/dist/commerce/server/commerceOmsHandlers.js +176 -0
- package/dist/commerce/server/commerceOmsMarkRefundedHandler.d.ts +7 -0
- package/dist/commerce/server/commerceOmsMarkRefundedHandler.js +19 -0
- package/dist/commerce/server/commerceOrderDraft.d.ts +24 -0
- package/dist/commerce/server/commerceOrderDraft.js +92 -0
- package/dist/commerce/server/commercePaidOrderOrchestration.d.ts +131 -0
- package/dist/commerce/server/commercePaidOrderOrchestration.js +140 -0
- package/dist/commerce/server/commerceProviderAttemptFailure.d.ts +133 -0
- package/dist/commerce/server/commerceProviderAttemptFailure.js +175 -0
- package/dist/commerce/server/commerceReturnsHandlers.d.ts +41 -0
- package/dist/commerce/server/commerceReturnsHandlers.js +100 -0
- package/dist/commerce/server/commerceRuntimePort.d.ts +16 -0
- package/dist/commerce/server/commerceRuntimePort.js +57 -0
- package/dist/commerce/server/commerceRuntimeService.d.ts +98 -0
- package/dist/commerce/server/commerceRuntimeService.js +186 -0
- package/dist/commerce/server/commerceRuntimeStartResponse.d.ts +37 -0
- package/dist/commerce/server/commerceRuntimeStartResponse.js +56 -0
- package/dist/commerce/server/commerceStarterOfferGuard.d.ts +55 -0
- package/dist/commerce/server/commerceStarterOfferGuard.js +128 -0
- package/dist/commerce/server/configuratorIntentPersistence.d.ts +47 -0
- package/dist/commerce/server/configuratorIntentPersistence.js +85 -0
- package/dist/commerce/server/configuratorIntentPersistenceHandler.d.ts +14 -0
- package/dist/commerce/server/configuratorIntentPersistenceHandler.js +42 -0
- package/dist/commerce/server/emailRuntime.d.ts +47 -0
- package/dist/commerce/server/emailRuntime.js +1 -0
- package/dist/commerce/server/handlerSupport.d.ts +68 -0
- package/dist/commerce/server/handlerSupport.js +1 -0
- package/dist/commerce/server/index.d.ts +178 -0
- package/dist/commerce/server/index.js +127 -0
- package/dist/commerce/server/offerAvailability.d.ts +21 -0
- package/dist/commerce/server/offerAvailability.js +163 -0
- package/dist/commerce/server/orderDraftRpcPayload.d.ts +20 -0
- package/dist/commerce/server/orderDraftRpcPayload.js +21 -0
- package/dist/commerce/server/orderFeedbackSubmit.d.ts +20 -0
- package/dist/commerce/server/orderFeedbackSubmit.js +16 -0
- package/dist/commerce/server/orderFeedbackTokenCheck.d.ts +17 -0
- package/dist/commerce/server/orderFeedbackTokenCheck.js +14 -0
- package/dist/commerce/server/orderReviewAdminHandlers.d.ts +47 -0
- package/dist/commerce/server/orderReviewAdminHandlers.js +41 -0
- package/dist/commerce/server/orderReviewHandlers.d.ts +114 -0
- package/dist/commerce/server/orderReviewHandlers.js +42 -0
- package/dist/commerce/server/orderReviewLifecycle.d.ts +10 -0
- package/dist/commerce/server/orderReviewLifecycle.js +121 -0
- package/dist/commerce/server/orderReviewMedia.d.ts +11 -0
- package/dist/commerce/server/orderReviewMedia.js +172 -0
- package/dist/commerce/server/orderReviewRawUploadHandler.d.ts +40 -0
- package/dist/commerce/server/orderReviewRawUploadHandler.js +316 -0
- package/dist/commerce/server/outboxCheckoutExpiredEmailHandler.d.ts +14 -0
- package/dist/commerce/server/outboxCheckoutExpiredEmailHandler.js +57 -0
- package/dist/commerce/server/outboxCheckoutRecoveryEmailHandler.d.ts +13 -0
- package/dist/commerce/server/outboxCheckoutRecoveryEmailHandler.js +150 -0
- package/dist/commerce/server/outboxDispatchRegistry.d.ts +46 -0
- package/dist/commerce/server/outboxDispatchRegistry.js +184 -0
- package/dist/commerce/server/outboxDispatchRegistryComposition.d.ts +6 -0
- package/dist/commerce/server/outboxDispatchRegistryComposition.js +23 -0
- package/dist/commerce/server/outboxOrderDraftEmailHandler.d.ts +14 -0
- package/dist/commerce/server/outboxOrderDraftEmailHandler.js +130 -0
- package/dist/commerce/server/outboxOrderPaidEmailHandler.d.ts +21 -0
- package/dist/commerce/server/outboxOrderPaidEmailHandler.js +93 -0
- package/dist/commerce/server/outboxOrderPaidFulfillmentHandler.d.ts +3 -0
- package/dist/commerce/server/outboxOrderPaidFulfillmentHandler.js +1 -0
- package/dist/commerce/server/outboxOrderPaidFulfillmentPorts.d.ts +3 -0
- package/dist/commerce/server/outboxOrderPaidFulfillmentPorts.js +1 -0
- package/dist/commerce/server/outboxOrderRefundedEmailHandler.d.ts +13 -0
- package/dist/commerce/server/outboxOrderRefundedEmailHandler.js +42 -0
- package/dist/commerce/server/outboxPaymentFailedEmailHandler.d.ts +14 -0
- package/dist/commerce/server/outboxPaymentFailedEmailHandler.js +65 -0
- package/dist/commerce/server/outboxReturnEmailHandlers.d.ts +26 -0
- package/dist/commerce/server/outboxReturnEmailHandlers.js +53 -0
- package/dist/commerce/server/outboxShipmentDeliveredEmailHandler.d.ts +17 -0
- package/dist/commerce/server/outboxShipmentDeliveredEmailHandler.js +52 -0
- package/dist/commerce/server/outboxShipmentDispatchedEmailHandler.d.ts +13 -0
- package/dist/commerce/server/outboxShipmentDispatchedEmailHandler.js +87 -0
- package/dist/commerce/server/outboxShipmentExceptionEmailHandler.d.ts +13 -0
- package/dist/commerce/server/outboxShipmentExceptionEmailHandler.js +46 -0
- package/dist/commerce/server/referenceCheckoutHandler.d.ts +48 -0
- package/dist/commerce/server/referenceCheckoutHandler.js +68 -0
- package/dist/commerce/server/reservationSweepPort.d.ts +31 -0
- package/dist/commerce/server/reservationSweepPort.js +45 -0
- package/dist/commerce/server/starterTermsPort.d.ts +22 -0
- package/dist/commerce/server/starterTermsPort.js +1 -0
- package/dist/commerce/server/supabaseCommerceReturnsPort.d.ts +13 -0
- package/dist/commerce/server/supabaseCommerceReturnsPort.js +56 -0
- package/dist/communications/consentPurposeRegistry.d.ts +1 -1
- package/dist/communications/newsletterIntegrationContracts.d.ts +5 -5
- package/dist/composition/commerceContribution.d.ts +21 -0
- package/dist/composition/commerceContribution.js +27 -0
- package/dist/composition/index.d.ts +1 -0
- package/dist/composition/index.js +1 -0
- package/dist/fulfillment/handlerSchemas.d.ts +41 -41
- package/dist/fulfillment/index.d.ts +1 -1
- package/dist/fulfillment/index.js +1 -1
- package/dist/fulfillment/paidHandoff.d.ts +12 -1
- package/dist/fulfillment/paidHandoff.js +2 -2
- package/dist/fulfillment/providerDispatchWorker.d.ts +4 -4
- package/dist/identity/customerContracts.d.ts +2 -2
- package/dist/inventory/bindings.d.ts +3 -0
- package/dist/inventory/bindings.js +10 -4
- package/dist/inventory/index.d.ts +1 -0
- package/dist/inventory/index.js +1 -0
- package/dist/inventory/managedStockAvailability.d.ts +15 -0
- package/dist/inventory/managedStockAvailability.js +16 -0
- package/dist/inventory/postgresStockAvailability.js +2 -25
- package/dist/inventory/schemas.d.ts +1 -1
- package/dist/inventory/stockReadResponse.d.ts +4 -0
- package/dist/inventory/stockReadResponse.js +27 -0
- package/dist/pricing/browser/index.d.ts +6 -0
- package/dist/pricing/browser/index.js +6 -0
- package/dist/promotions/adminPromotionsContracts.d.ts +2 -2
- package/dist/subscriptions/index.d.ts +3 -2
- package/dist/subscriptions/index.js +3 -2
- package/package.json +22 -2
- package/release-gates.json +63 -8
- package/src/commerce/adapters/managed/commerceOmsControlPlane.ts +80 -0
- package/src/commerce/adapters/managed/commerceOmsMutations.ts +145 -0
- package/src/commerce/adapters/managed/commerceOmsPort.ts +158 -0
- package/src/commerce/adapters/managed/oms/accounting.ts +18 -0
- package/src/commerce/adapters/managed/oms/fulfillmentReads.ts +82 -0
- package/src/commerce/adapters/managed/oms/inboundEvents.ts +45 -0
- package/src/commerce/adapters/managed/oms/outboxEvents.ts +30 -0
- package/src/commerce/adapters/managed/oms/paymentAttempts.ts +19 -0
- package/src/commerce/adapters/managed/oms/queueSelection.ts +132 -0
- package/src/commerce/adapters/managed/oms/readProjections.ts +22 -0
- package/src/commerce/adapters/managed/oms/readQueries.ts +292 -0
- package/src/commerce/adapters/managed/oms/types.ts +9 -0
- package/src/commerce/checkoutCommandSchemas.ts +93 -0
- package/src/commerce/checkoutHelpers.ts +47 -0
- package/src/commerce/checkoutResumeSchemas.ts +164 -0
- package/src/commerce/checkoutSchemas.ts +182 -0
- package/src/commerce/commerceReturnsPort.ts +67 -0
- package/src/commerce/configuratorIntentPersistenceSchemas.ts +26 -0
- package/src/commerce/configuratorIntentSchemas.ts +47 -0
- package/src/commerce/contractPrimitives.ts +30 -0
- package/src/commerce/contracts/availability.ts +21 -0
- package/src/commerce/contracts/fulfillmentRecovery.ts +26 -0
- package/src/commerce/contracts/index.ts +17 -0
- package/src/commerce/contracts/intent.ts +58 -0
- package/src/commerce/contracts/omsTypes.ts +1217 -0
- package/src/commerce/contracts/order.ts +44 -0
- package/src/commerce/contracts/orderMoney.ts +75 -0
- package/src/commerce/contracts/ports.ts +124 -0
- package/src/commerce/contracts/recovery.ts +24 -0
- package/src/commerce/contracts/runtimePorts.ts +201 -0
- package/src/commerce/contracts/state.ts +64 -0
- package/src/commerce/customerDefaultsSnapshotSchemas.ts +117 -0
- package/src/commerce/errors.ts +53 -0
- package/src/commerce/fulfillmentEligibility.ts +32 -0
- package/src/commerce/index.ts +82 -0
- package/src/commerce/model/customerFulfillmentRecovery.ts +185 -0
- package/src/commerce/model/fulfillmentCancellationEligibility.ts +18 -0
- package/src/commerce/model/omsAccountingVisibility.ts +135 -0
- package/src/commerce/model/omsBillingInvoiceBuyer.ts +20 -0
- package/src/commerce/model/omsCurrency.ts +8 -0
- package/src/commerce/model/omsFulfillmentDebug.ts +157 -0
- package/src/commerce/model/omsFulfillmentSummary.ts +225 -0
- package/src/commerce/model/omsListTotals.ts +38 -0
- package/src/commerce/model/omsOperationalLadder.ts +181 -0
- package/src/commerce/model/omsOrderLineMoney.ts +34 -0
- package/src/commerce/model/omsPaymentMethodSummary.ts +19 -0
- package/src/commerce/model/omsReadModel.ts +302 -0
- package/src/commerce/model/omsReadModelCommunication.ts +32 -0
- package/src/commerce/model/omsReadModelHelpers.ts +279 -0
- package/src/commerce/model/omsReadModelList.ts +90 -0
- package/src/commerce/model/omsReadModelListSummary.ts +19 -0
- package/src/commerce/model/omsReadModelPricing.ts +57 -0
- package/src/commerce/model/omsReadModelProjections.ts +1 -0
- package/src/commerce/model/omsReadModelRowCore.ts +193 -0
- package/src/commerce/model/omsReadModelRows.ts +7 -0
- package/src/commerce/offerAvailability.ts +75 -0
- package/src/commerce/offerAvailabilitySchemas.ts +56 -0
- package/src/commerce/offerEvidenceSchemas.ts +17 -0
- package/src/commerce/oms/omsContractBase.ts +92 -0
- package/src/commerce/oms/omsContractReadAuxSchemas.ts +130 -0
- package/src/commerce/oms/omsContractReadSchemas.ts +303 -0
- package/src/commerce/oms/omsContractRequests.ts +143 -0
- package/src/commerce/oms/omsContracts.ts +6 -0
- package/src/commerce/oms/omsControlPlane.ts +85 -0
- package/src/commerce/oms/omsFulfillmentContractSchemas.ts +113 -0
- package/src/commerce/oms/omsFulfillmentDebugSchemas.ts +38 -0
- package/src/commerce/oms/omsFulfillmentHealthSchemas.ts +46 -0
- package/src/commerce/oms/omsPorts.ts +165 -0
- package/src/commerce/oms/omsPrimitives.ts +3 -0
- package/src/commerce/oms/omsProviderEvidenceSchemas.ts +13 -0
- package/src/commerce/orderDraftErrors.ts +28 -0
- package/src/commerce/orderEmailEligibility.ts +131 -0
- package/src/commerce/orderEmailLines.ts +22 -0
- package/src/commerce/orderFeedbackContracts.ts +47 -0
- package/src/commerce/orderMoney.ts +207 -0
- package/src/commerce/orderReviewContracts.ts +124 -0
- package/src/commerce/orderReviewPorts.ts +94 -0
- package/src/commerce/outboxDispatchContracts.ts +30 -0
- package/src/commerce/outboxEventSchemas.ts +230 -0
- package/src/commerce/outboxOrderDraftEmailPorts.ts +241 -0
- package/src/commerce/paymentContinuation.ts +5 -0
- package/src/commerce/ports.ts +7 -0
- package/src/commerce/recoveryDestination.ts +23 -0
- package/src/commerce/runtimeErrors.ts +19 -0
- package/src/commerce/salesChannelEnvelope.ts +28 -0
- package/src/commerce/schemas.ts +104 -0
- package/src/commerce/server/checkoutCompensation.ts +49 -0
- package/src/commerce/server/checkoutConflictClassifiers.ts +53 -0
- package/src/commerce/server/checkoutExpiredRecoveryPolicy.ts +107 -0
- package/src/commerce/server/checkoutInvoiceBuyerSnapshot.ts +36 -0
- package/src/commerce/server/checkoutOfferPolicyPort.ts +60 -0
- package/src/commerce/server/checkoutPaymentContinuationCredential.ts +222 -0
- package/src/commerce/server/checkoutQuoteTypes.ts +9 -0
- package/src/commerce/server/checkoutRecoveryOrderPort.ts +40 -0
- package/src/commerce/server/checkoutRecoveryToken.ts +63 -0
- package/src/commerce/server/checkoutRefusalContinuation.ts +29 -0
- package/src/commerce/server/checkoutRuntimeTypes.ts +26 -0
- package/src/commerce/server/commerceCheckoutCommandExecution.ts +188 -0
- package/src/commerce/server/commerceCheckoutCompensation.ts +66 -0
- package/src/commerce/server/commerceCheckoutContinuationTerms.ts +87 -0
- package/src/commerce/server/commerceCheckoutCustomerDefaults.ts +24 -0
- package/src/commerce/server/commerceCheckoutFailureHandler.ts +144 -0
- package/src/commerce/server/commerceCheckoutHandler.ts +269 -0
- package/src/commerce/server/commerceCheckoutHandlerAdmission.ts +157 -0
- package/src/commerce/server/commerceCheckoutHandlerHelpers.ts +223 -0
- package/src/commerce/server/commerceCheckoutOrchestrationError.ts +15 -0
- package/src/commerce/server/commerceCheckoutPromotionPriceChange.ts +83 -0
- package/src/commerce/server/commerceCheckoutProviderPayment.ts +45 -0
- package/src/commerce/server/commerceCheckoutQuoteGuard.ts +172 -0
- package/src/commerce/server/commerceCheckoutResume.ts +132 -0
- package/src/commerce/server/commerceCheckoutResumeGuard.ts +195 -0
- package/src/commerce/server/commerceCheckoutSavedPaymentMethod.ts +85 -0
- package/src/commerce/server/commerceCheckoutStartRuntimeFailure.ts +59 -0
- package/src/commerce/server/commerceCheckoutTiming.ts +53 -0
- package/src/commerce/server/commerceDiagnostics.ts +37 -0
- package/src/commerce/server/commerceOmsCancelOrderHandler.ts +43 -0
- package/src/commerce/server/commerceOmsControlPlaneHandlers.ts +71 -0
- package/src/commerce/server/commerceOmsHandlers.ts +275 -0
- package/src/commerce/server/commerceOmsMarkRefundedHandler.ts +39 -0
- package/src/commerce/server/commerceOrderDraft.ts +131 -0
- package/src/commerce/server/commercePaidOrderOrchestration.ts +275 -0
- package/src/commerce/server/commerceProviderAttemptFailure.ts +257 -0
- package/src/commerce/server/commerceReturnsHandlers.ts +143 -0
- package/src/commerce/server/commerceRuntimePort.ts +75 -0
- package/src/commerce/server/commerceRuntimeService.ts +229 -0
- package/src/commerce/server/commerceRuntimeStartResponse.ts +76 -0
- package/src/commerce/server/commerceStarterOfferGuard.ts +200 -0
- package/src/commerce/server/configuratorIntentPersistence.ts +161 -0
- package/src/commerce/server/configuratorIntentPersistenceHandler.ts +54 -0
- package/src/commerce/server/emailRuntime.ts +30 -0
- package/src/commerce/server/handlerSupport.ts +22 -0
- package/src/commerce/server/index.ts +181 -0
- package/src/commerce/server/offerAvailability.ts +275 -0
- package/src/commerce/server/orderDraftRpcPayload.ts +39 -0
- package/src/commerce/server/orderFeedbackSubmit.ts +40 -0
- package/src/commerce/server/orderFeedbackTokenCheck.ts +28 -0
- package/src/commerce/server/orderReviewAdminHandlers.ts +43 -0
- package/src/commerce/server/orderReviewHandlers.ts +57 -0
- package/src/commerce/server/orderReviewLifecycle.ts +129 -0
- package/src/commerce/server/orderReviewMedia.ts +170 -0
- package/src/commerce/server/orderReviewRawUploadHandler.ts +300 -0
- package/src/commerce/server/outboxCheckoutExpiredEmailHandler.ts +86 -0
- package/src/commerce/server/outboxCheckoutRecoveryEmailHandler.ts +188 -0
- package/src/commerce/server/outboxDispatchRegistry.ts +269 -0
- package/src/commerce/server/outboxDispatchRegistryComposition.ts +31 -0
- package/src/commerce/server/outboxOrderDraftEmailHandler.ts +162 -0
- package/src/commerce/server/outboxOrderPaidEmailHandler.ts +147 -0
- package/src/commerce/server/outboxOrderPaidFulfillmentHandler.ts +4 -0
- package/src/commerce/server/outboxOrderPaidFulfillmentPorts.ts +3 -0
- package/src/commerce/server/outboxOrderRefundedEmailHandler.ts +58 -0
- package/src/commerce/server/outboxPaymentFailedEmailHandler.ts +99 -0
- package/src/commerce/server/outboxReturnEmailHandlers.ts +92 -0
- package/src/commerce/server/outboxShipmentDeliveredEmailHandler.ts +94 -0
- package/src/commerce/server/outboxShipmentDispatchedEmailHandler.ts +112 -0
- package/src/commerce/server/outboxShipmentExceptionEmailHandler.ts +73 -0
- package/src/commerce/server/referenceCheckoutHandler.ts +87 -0
- package/src/commerce/server/reservationSweepPort.ts +67 -0
- package/src/commerce/server/starterTermsPort.ts +22 -0
- package/src/commerce/server/supabaseCommerceReturnsPort.ts +81 -0
- package/src/composition/commerceContribution.ts +35 -0
- package/src/composition/index.ts +1 -0
- package/src/fulfillment/index.ts +1 -1
- package/src/fulfillment/paidHandoff.ts +2 -2
- package/src/inventory/bindings.ts +12 -4
- package/src/inventory/index.ts +1 -0
- package/src/inventory/managedStockAvailability.ts +23 -0
- package/src/inventory/postgresStockAvailability.ts +2 -21
- package/src/inventory/stockReadResponse.ts +25 -0
- package/src/pricing/browser/index.ts +6 -0
- package/src/subscriptions/index.ts +3 -2
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { commerceIdempotencyKeySchema } from "../contractPrimitives.js";
|
|
3
|
+
export const ORDER_DRAFT_RPC_NAME = "commerce_create_order_draft_with_outbox";
|
|
4
|
+
export function createOrderDraftRpcPayload(input) {
|
|
5
|
+
const orderDraftRpcArgsSchema = z.object({
|
|
6
|
+
p_idempotency_key: commerceIdempotencyKeySchema,
|
|
7
|
+
p_quote_snapshot: input.quoteSchema,
|
|
8
|
+
p_order_draft_snapshot: input.draftSchema,
|
|
9
|
+
// Omit the optional client for anonymous calls, preserving the three-argument RPC.
|
|
10
|
+
p_client_id: z.guid().optional(),
|
|
11
|
+
}).strict();
|
|
12
|
+
function createOrderDraftRpcArgs(request, clientId = null) {
|
|
13
|
+
const base = {
|
|
14
|
+
p_idempotency_key: request.idempotencyKey,
|
|
15
|
+
p_quote_snapshot: request.quoteSnapshot,
|
|
16
|
+
p_order_draft_snapshot: input.createSnapshot(request.quoteSnapshot),
|
|
17
|
+
};
|
|
18
|
+
return orderDraftRpcArgsSchema.parse(clientId ? { ...base, p_client_id: clientId } : base);
|
|
19
|
+
}
|
|
20
|
+
return { orderDraftRpcArgsSchema, createOrderDraftRpcArgs };
|
|
21
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ORDER_FEEDBACK_SUBMIT_RPC_NAME, type OrderFeedbackSubmitRequest } from "../orderFeedbackContracts.js";
|
|
2
|
+
interface RpcError {
|
|
3
|
+
message?: string;
|
|
4
|
+
}
|
|
5
|
+
export interface OrderFeedbackSubmitRpcClient {
|
|
6
|
+
rpc(functionName: typeof ORDER_FEEDBACK_SUBMIT_RPC_NAME, args: {
|
|
7
|
+
p_token: string;
|
|
8
|
+
p_rating: number;
|
|
9
|
+
p_comment: string | null;
|
|
10
|
+
}): PromiseLike<{
|
|
11
|
+
data: unknown;
|
|
12
|
+
error: RpcError | null;
|
|
13
|
+
}>;
|
|
14
|
+
}
|
|
15
|
+
export interface OrderFeedbackSubmitPort {
|
|
16
|
+
submit(request: OrderFeedbackSubmitRequest): Promise<unknown>;
|
|
17
|
+
}
|
|
18
|
+
/** Hosted token feedback only; the adopter must provide this RPC. Native db/platform has no binding. */
|
|
19
|
+
export declare function createSupabaseOrderFeedbackSubmitPort(client: OrderFeedbackSubmitRpcClient): OrderFeedbackSubmitPort;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ORDER_FEEDBACK_SUBMIT_RPC_NAME, } from "../orderFeedbackContracts.js";
|
|
2
|
+
/** Hosted token feedback only; the adopter must provide this RPC. Native db/platform has no binding. */
|
|
3
|
+
export function createSupabaseOrderFeedbackSubmitPort(client) {
|
|
4
|
+
return {
|
|
5
|
+
async submit(request) {
|
|
6
|
+
const { data, error } = await client.rpc(ORDER_FEEDBACK_SUBMIT_RPC_NAME, {
|
|
7
|
+
p_token: request.token,
|
|
8
|
+
p_rating: request.rating,
|
|
9
|
+
p_comment: request.comment ?? null,
|
|
10
|
+
});
|
|
11
|
+
if (error)
|
|
12
|
+
throw new Error(error.message ?? "order_feedback_submit_failed");
|
|
13
|
+
return data;
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ORDER_FEEDBACK_CHECK_RPC_NAME, type OrderFeedbackTokenCheckRequest } from "../orderFeedbackContracts.js";
|
|
2
|
+
interface RpcError {
|
|
3
|
+
message?: string;
|
|
4
|
+
}
|
|
5
|
+
export interface OrderFeedbackTokenCheckRpcClient {
|
|
6
|
+
rpc(functionName: typeof ORDER_FEEDBACK_CHECK_RPC_NAME, args: {
|
|
7
|
+
p_token: string;
|
|
8
|
+
}): PromiseLike<{
|
|
9
|
+
data: unknown;
|
|
10
|
+
error: RpcError | null;
|
|
11
|
+
}>;
|
|
12
|
+
}
|
|
13
|
+
/** Hosted token feedback only; the adopter must provide this RPC. Native db/platform has no binding. */
|
|
14
|
+
export declare function createSupabaseOrderFeedbackTokenCheckPort(client: OrderFeedbackTokenCheckRpcClient): {
|
|
15
|
+
check(request: OrderFeedbackTokenCheckRequest): Promise<unknown>;
|
|
16
|
+
};
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ORDER_FEEDBACK_CHECK_RPC_NAME, } from "../orderFeedbackContracts.js";
|
|
2
|
+
/** Hosted token feedback only; the adopter must provide this RPC. Native db/platform has no binding. */
|
|
3
|
+
export function createSupabaseOrderFeedbackTokenCheckPort(client) {
|
|
4
|
+
return {
|
|
5
|
+
async check(request) {
|
|
6
|
+
const { data, error } = await client.rpc(ORDER_FEEDBACK_CHECK_RPC_NAME, {
|
|
7
|
+
p_token: request.token,
|
|
8
|
+
});
|
|
9
|
+
if (error)
|
|
10
|
+
throw new Error(error.message ?? "order_feedback_token_check_failed");
|
|
11
|
+
return data;
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type OrderReviewFailure } from "../orderReviewContracts.js";
|
|
2
|
+
import type { OrderReviewAdminReadPort, OrderReviewLifecyclePort } from "../orderReviewPorts.js";
|
|
3
|
+
type Result<T> = {
|
|
4
|
+
ok: true;
|
|
5
|
+
value: T;
|
|
6
|
+
replayed?: boolean;
|
|
7
|
+
} | {
|
|
8
|
+
ok: false;
|
|
9
|
+
error: OrderReviewFailure;
|
|
10
|
+
};
|
|
11
|
+
/** Actor identity is supplied only by the already-authorized route composition. */
|
|
12
|
+
export declare function createOrderReviewAdminHandlers(lifecycle: OrderReviewLifecyclePort, readPort: OrderReviewAdminReadPort): {
|
|
13
|
+
list(actorRef: string, input: {
|
|
14
|
+
cursor?: string;
|
|
15
|
+
limit?: number;
|
|
16
|
+
}): Promise<Result<Awaited<ReturnType<OrderReviewAdminReadPort["list"]>>>>;
|
|
17
|
+
read(actorRef: string, reviewRef: string): Promise<Result<Awaited<ReturnType<OrderReviewAdminReadPort["read"]>>>>;
|
|
18
|
+
moderate(actorRef: string, input: unknown): Promise<{
|
|
19
|
+
ok: false;
|
|
20
|
+
error: OrderReviewFailure;
|
|
21
|
+
} | {
|
|
22
|
+
ok: true;
|
|
23
|
+
value: {
|
|
24
|
+
contractVersion: "commerce.order-review.v1";
|
|
25
|
+
reviewRef: string;
|
|
26
|
+
rating: number;
|
|
27
|
+
comment: string | null;
|
|
28
|
+
moderation: "pending" | "visible" | "hidden";
|
|
29
|
+
createdAt: string;
|
|
30
|
+
};
|
|
31
|
+
replayed: boolean | undefined;
|
|
32
|
+
}>;
|
|
33
|
+
revoke(actorRef: string, input: {
|
|
34
|
+
reviewRef?: string;
|
|
35
|
+
idempotencyKey?: string;
|
|
36
|
+
}): Promise<{
|
|
37
|
+
ok: false;
|
|
38
|
+
error: OrderReviewFailure;
|
|
39
|
+
} | {
|
|
40
|
+
ok: true;
|
|
41
|
+
value: {
|
|
42
|
+
replayed: boolean;
|
|
43
|
+
};
|
|
44
|
+
replayed: boolean | undefined;
|
|
45
|
+
}>;
|
|
46
|
+
};
|
|
47
|
+
export {};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { orderReviewAdminRevokeSchema, orderReviewReferenceSchema, orderReviewModerationSchema, } from "../orderReviewContracts.js";
|
|
2
|
+
import { runOrderReviewCommand } from "./orderReviewHandlers.js";
|
|
3
|
+
/** Actor identity is supplied only by the already-authorized route composition. */
|
|
4
|
+
export function createOrderReviewAdminHandlers(lifecycle, readPort) {
|
|
5
|
+
return {
|
|
6
|
+
async list(actorRef, input) {
|
|
7
|
+
if (!validActor(actorRef))
|
|
8
|
+
return unavailable();
|
|
9
|
+
const limit = Math.min(Math.max(input.limit ?? 25, 1), 100);
|
|
10
|
+
try {
|
|
11
|
+
return { ok: true, value: await readPort.list({ actorRef, cursor: input.cursor, limit }) };
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return unavailable();
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
async read(actorRef, reviewRef) {
|
|
18
|
+
if (!validActor(actorRef) || !orderReviewReferenceSchema.safeParse(reviewRef).success)
|
|
19
|
+
return unavailable();
|
|
20
|
+
try {
|
|
21
|
+
const review = await readPort.read({ actorRef, reviewRef });
|
|
22
|
+
return review ? { ok: true, value: review } : unavailable();
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return unavailable();
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
async moderate(actorRef, input) {
|
|
29
|
+
if (!validActor(actorRef))
|
|
30
|
+
return unavailable();
|
|
31
|
+
return runOrderReviewCommand(orderReviewModerationSchema.safeParse(input), (data) => lifecycle.moderate({ ...data, actorRef }), (result) => result.value);
|
|
32
|
+
},
|
|
33
|
+
async revoke(actorRef, input) {
|
|
34
|
+
if (!validActor(actorRef))
|
|
35
|
+
return unavailable();
|
|
36
|
+
return runOrderReviewCommand(orderReviewAdminRevokeSchema.safeParse(input), (data) => lifecycle.revoke({ ...data, actorRef }), (result) => result);
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function validActor(value) { return /^[A-Za-z0-9][A-Za-z0-9._:-]{0,255}$/.test(value); }
|
|
41
|
+
function unavailable() { return { ok: false, error: { kind: "unavailable" } }; }
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { type OrderReviewFailure, type OrderReviewReadResult } from "../orderReviewContracts.js";
|
|
2
|
+
import type { OrderReviewLifecyclePort } from "../orderReviewPorts.js";
|
|
3
|
+
type Result<T> = {
|
|
4
|
+
ok: true;
|
|
5
|
+
value: T;
|
|
6
|
+
replayed?: boolean;
|
|
7
|
+
} | {
|
|
8
|
+
ok: false;
|
|
9
|
+
error: OrderReviewFailure;
|
|
10
|
+
};
|
|
11
|
+
/** HTTP-neutral customer orchestration; route composition owns bearer extraction. */
|
|
12
|
+
export declare function createOrderReviewHandlers(port: OrderReviewLifecyclePort): {
|
|
13
|
+
read(grant: string): Promise<Result<OrderReviewReadResult>>;
|
|
14
|
+
submit(input: unknown): Promise<{
|
|
15
|
+
ok: false;
|
|
16
|
+
error: OrderReviewFailure;
|
|
17
|
+
} | {
|
|
18
|
+
ok: true;
|
|
19
|
+
value: {
|
|
20
|
+
contractVersion: "commerce.order-review.v1";
|
|
21
|
+
reviewRef: string;
|
|
22
|
+
rating: number;
|
|
23
|
+
comment: string | null;
|
|
24
|
+
moderation: "pending" | "visible" | "hidden";
|
|
25
|
+
createdAt: string;
|
|
26
|
+
};
|
|
27
|
+
replayed: boolean | undefined;
|
|
28
|
+
}>;
|
|
29
|
+
createMediaIntent(input: unknown): Promise<{
|
|
30
|
+
ok: false;
|
|
31
|
+
error: OrderReviewFailure;
|
|
32
|
+
} | {
|
|
33
|
+
ok: true;
|
|
34
|
+
value: {
|
|
35
|
+
media: {
|
|
36
|
+
state: "pending";
|
|
37
|
+
observedContentType: null;
|
|
38
|
+
observedByteLength: null;
|
|
39
|
+
observedDigest: null;
|
|
40
|
+
mediaRef: string;
|
|
41
|
+
declaredContentType: "image/png" | "image/jpeg" | "image/webp";
|
|
42
|
+
declaredByteLength: number;
|
|
43
|
+
} | {
|
|
44
|
+
state: "stored" | "confirmed";
|
|
45
|
+
observedContentType: "image/png" | "image/jpeg" | "image/webp";
|
|
46
|
+
observedByteLength: number;
|
|
47
|
+
observedDigest: string;
|
|
48
|
+
mediaRef: string;
|
|
49
|
+
declaredContentType: "image/png" | "image/jpeg" | "image/webp";
|
|
50
|
+
declaredByteLength: number;
|
|
51
|
+
} | {
|
|
52
|
+
state: "cleanup_pending" | "deleted";
|
|
53
|
+
observedContentType: "image/png" | "image/jpeg" | "image/webp" | null;
|
|
54
|
+
observedByteLength: number | null;
|
|
55
|
+
observedDigest: string | null;
|
|
56
|
+
mediaRef: string;
|
|
57
|
+
declaredContentType: "image/png" | "image/jpeg" | "image/webp";
|
|
58
|
+
declaredByteLength: number;
|
|
59
|
+
};
|
|
60
|
+
uploadExpiresAt: string;
|
|
61
|
+
replayed: boolean;
|
|
62
|
+
};
|
|
63
|
+
replayed: boolean | undefined;
|
|
64
|
+
}>;
|
|
65
|
+
confirmMedia(input: unknown): Promise<{
|
|
66
|
+
ok: false;
|
|
67
|
+
error: OrderReviewFailure;
|
|
68
|
+
} | {
|
|
69
|
+
ok: true;
|
|
70
|
+
value: {
|
|
71
|
+
state: "pending";
|
|
72
|
+
observedContentType: null;
|
|
73
|
+
observedByteLength: null;
|
|
74
|
+
observedDigest: null;
|
|
75
|
+
mediaRef: string;
|
|
76
|
+
declaredContentType: "image/png" | "image/jpeg" | "image/webp";
|
|
77
|
+
declaredByteLength: number;
|
|
78
|
+
} | {
|
|
79
|
+
state: "stored" | "confirmed";
|
|
80
|
+
observedContentType: "image/png" | "image/jpeg" | "image/webp";
|
|
81
|
+
observedByteLength: number;
|
|
82
|
+
observedDigest: string;
|
|
83
|
+
mediaRef: string;
|
|
84
|
+
declaredContentType: "image/png" | "image/jpeg" | "image/webp";
|
|
85
|
+
declaredByteLength: number;
|
|
86
|
+
} | {
|
|
87
|
+
state: "cleanup_pending" | "deleted";
|
|
88
|
+
observedContentType: "image/png" | "image/jpeg" | "image/webp" | null;
|
|
89
|
+
observedByteLength: number | null;
|
|
90
|
+
observedDigest: string | null;
|
|
91
|
+
mediaRef: string;
|
|
92
|
+
declaredContentType: "image/png" | "image/jpeg" | "image/webp";
|
|
93
|
+
declaredByteLength: number;
|
|
94
|
+
};
|
|
95
|
+
replayed: boolean | undefined;
|
|
96
|
+
}>;
|
|
97
|
+
};
|
|
98
|
+
/** Shared command scaffold: parse result, one port call, the value mapper, failure mapping. */
|
|
99
|
+
export declare function runOrderReviewCommand<D, R extends {
|
|
100
|
+
replayed?: boolean;
|
|
101
|
+
}, V>(parsed: {
|
|
102
|
+
success: true;
|
|
103
|
+
data: D;
|
|
104
|
+
} | {
|
|
105
|
+
success: false;
|
|
106
|
+
}, call: (data: D) => Promise<R>, map: (result: R) => V): Promise<{
|
|
107
|
+
ok: false;
|
|
108
|
+
error: OrderReviewFailure;
|
|
109
|
+
} | {
|
|
110
|
+
ok: true;
|
|
111
|
+
value: V;
|
|
112
|
+
replayed: boolean | undefined;
|
|
113
|
+
}>;
|
|
114
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { orderReviewFailure, orderReviewMediaConfirmSchema, orderReviewMediaIntentSchema, orderReviewSubmitSchema, } from "../orderReviewContracts.js";
|
|
2
|
+
/** HTTP-neutral customer orchestration; route composition owns bearer extraction. */
|
|
3
|
+
export function createOrderReviewHandlers(port) {
|
|
4
|
+
return {
|
|
5
|
+
async read(grant) {
|
|
6
|
+
try {
|
|
7
|
+
const result = await port.read(grant);
|
|
8
|
+
return result ? { ok: true, value: result } : { ok: false, error: { kind: "unavailable" } };
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
return { ok: false, error: orderReviewFailure(errorCode(error)) };
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
async submit(input) {
|
|
15
|
+
return runOrderReviewCommand(orderReviewSubmitSchema.safeParse(input), (data) => port.submit(data), (result) => result.value);
|
|
16
|
+
},
|
|
17
|
+
async createMediaIntent(input) {
|
|
18
|
+
return runOrderReviewCommand(orderReviewMediaIntentSchema.safeParse(input), (data) => port.createMediaIntent(data), (result) => result);
|
|
19
|
+
},
|
|
20
|
+
async confirmMedia(input) {
|
|
21
|
+
return runOrderReviewCommand(orderReviewMediaConfirmSchema.safeParse(input), (data) => port.confirmMedia(data), (result) => result.value);
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/** Shared command scaffold: parse result, one port call, the value mapper, failure mapping. */
|
|
26
|
+
export async function runOrderReviewCommand(parsed, call, map) {
|
|
27
|
+
if (parsed.success === false)
|
|
28
|
+
return invalid();
|
|
29
|
+
try {
|
|
30
|
+
const result = await call(parsed.data);
|
|
31
|
+
return { ok: true, value: map(result), replayed: result.replayed };
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
return failure(error);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function invalid() { return { ok: false, error: { kind: "invalid" } }; }
|
|
38
|
+
function failure(error) { return { ok: false, error: orderReviewFailure(errorCode(error)) }; }
|
|
39
|
+
function errorCode(error) {
|
|
40
|
+
return error && typeof error === "object" && "code" in error && typeof error.code === "string"
|
|
41
|
+
? error.code : undefined;
|
|
42
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { OrderReviewAdminReadPort, OrderReviewLifecyclePort } from "../orderReviewPorts.js";
|
|
2
|
+
type PgQueryExecutor = {
|
|
3
|
+
query(text: string, values?: unknown[]): Promise<{
|
|
4
|
+
rows: Record<string, unknown>[];
|
|
5
|
+
}>;
|
|
6
|
+
};
|
|
7
|
+
export declare function createPostgresOrderReviewLifecyclePort(executor: PgQueryExecutor): OrderReviewLifecyclePort;
|
|
8
|
+
/** Admin route composition authenticates the actor before invoking this adapter. */
|
|
9
|
+
export declare function createPostgresOrderReviewAdminReadPort(executor: PgQueryExecutor): OrderReviewAdminReadPort;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { ORDER_REVIEW_CONTRACT_VERSION, orderReviewAdminDetailSchema, orderReviewMediaSchema, orderReviewMediaIntentResultSchema, orderReviewReadResultSchema, orderReviewSchema, } from "../orderReviewContracts.js";
|
|
2
|
+
const READ = "SELECT public.order_review_read($1::text, now()) AS response";
|
|
3
|
+
const SUBMIT = "SELECT public.order_review_submit($1::text,$2::integer,$3::text,$4::text,now()) AS response";
|
|
4
|
+
const INTENT = "SELECT public.order_review_create_media_intent($1::text,$2::text,$3::integer,$4::text,$5::text,now()) AS response";
|
|
5
|
+
const CONFIRM = "SELECT public.order_review_confirm_media($1::text,$2::text,$3::text,$4::text,now()) AS response";
|
|
6
|
+
const MODERATE = "SELECT public.order_review_moderate($1::text,$2::text,$3::text,$4::text,now()) AS response";
|
|
7
|
+
const REVOKE = "SELECT public.order_review_revoke_access($1::text,$2::text,$3::text,now()) AS response";
|
|
8
|
+
const ADMIN_LIST = "SELECT public.order_review_admin_list($1::text,$2::text,$3::integer,now()) AS response";
|
|
9
|
+
const ADMIN_READ = "SELECT public.order_review_admin_read($1::text,$2::text,now()) AS response";
|
|
10
|
+
export function createPostgresOrderReviewLifecyclePort(executor) {
|
|
11
|
+
return {
|
|
12
|
+
async read(grant) {
|
|
13
|
+
const response = await call(executor, READ, [grant]);
|
|
14
|
+
if (response === null)
|
|
15
|
+
return null;
|
|
16
|
+
return readResult(response);
|
|
17
|
+
},
|
|
18
|
+
async submit(input) {
|
|
19
|
+
return replay(review(required(await call(executor, SUBMIT, [input.grant, input.rating, input.comment ?? null, input.fingerprint]))));
|
|
20
|
+
},
|
|
21
|
+
async createMediaIntent(input) {
|
|
22
|
+
return mediaIntent(required(await call(executor, INTENT, [
|
|
23
|
+
input.grant, input.contentType, input.byteLength, input.capabilityDigest, input.commandKey,
|
|
24
|
+
])));
|
|
25
|
+
},
|
|
26
|
+
async confirmMedia(input) {
|
|
27
|
+
return replay(media(required(await call(executor, CONFIRM, [input.grant, input.mediaRef, input.digest, input.commandKey]))));
|
|
28
|
+
},
|
|
29
|
+
async moderate(input) {
|
|
30
|
+
return replay(review(await call(executor, MODERATE, [
|
|
31
|
+
input.reviewRef, input.action, input.actorRef, input.idempotencyKey,
|
|
32
|
+
])));
|
|
33
|
+
},
|
|
34
|
+
async revoke(input) {
|
|
35
|
+
const response = object(await call(executor, REVOKE, [input.reviewRef, input.actorRef, input.idempotencyKey]));
|
|
36
|
+
if (!response)
|
|
37
|
+
throw invalid();
|
|
38
|
+
return { replayed: response.replayed === true };
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/** Admin route composition authenticates the actor before invoking this adapter. */
|
|
43
|
+
export function createPostgresOrderReviewAdminReadPort(executor) {
|
|
44
|
+
return {
|
|
45
|
+
async list(input) {
|
|
46
|
+
const row = object(await call(executor, ADMIN_LIST, [input.actorRef, input.cursor ?? null, input.limit]));
|
|
47
|
+
if (!row || !Array.isArray(row.items))
|
|
48
|
+
throw invalid();
|
|
49
|
+
const items = row.items.map((item) => review(item));
|
|
50
|
+
const nextCursor = row.nextCursor;
|
|
51
|
+
if (nextCursor !== undefined && typeof nextCursor !== "string")
|
|
52
|
+
throw invalid();
|
|
53
|
+
return nextCursor === undefined ? { items } : { items, nextCursor: nextCursor };
|
|
54
|
+
},
|
|
55
|
+
async read(input) {
|
|
56
|
+
const response = await call(executor, ADMIN_READ, [input.actorRef, input.reviewRef]);
|
|
57
|
+
return response === null ? null : adminDetail(response);
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
async function call(executor, sql, values) {
|
|
62
|
+
const result = await executor.query(sql, values);
|
|
63
|
+
return object(result.rows[0])?.response ?? null;
|
|
64
|
+
}
|
|
65
|
+
function replay(value) {
|
|
66
|
+
const { replayed, ...result } = value;
|
|
67
|
+
return { value: result, replayed: replayed === true };
|
|
68
|
+
}
|
|
69
|
+
function review(value) {
|
|
70
|
+
const row = object(value);
|
|
71
|
+
if (!row)
|
|
72
|
+
throw invalid();
|
|
73
|
+
const { replayed, ...payload } = row;
|
|
74
|
+
const parsed = orderReviewSchema.parse({
|
|
75
|
+
contractVersion: payload.contractVersion ?? ORDER_REVIEW_CONTRACT_VERSION,
|
|
76
|
+
...payload,
|
|
77
|
+
comment: payload.comment ?? null,
|
|
78
|
+
});
|
|
79
|
+
return { ...parsed, ...(typeof replayed === "boolean" ? { replayed } : {}) };
|
|
80
|
+
}
|
|
81
|
+
function media(value) {
|
|
82
|
+
const row = object(value);
|
|
83
|
+
if (!row)
|
|
84
|
+
throw invalid();
|
|
85
|
+
const { replayed, ...payload } = row;
|
|
86
|
+
const parsed = orderReviewMediaSchema.parse(payload);
|
|
87
|
+
return { ...parsed, ...(typeof replayed === "boolean" ? { replayed } : {}) };
|
|
88
|
+
}
|
|
89
|
+
function mediaIntent(value) {
|
|
90
|
+
const row = object(value);
|
|
91
|
+
if (!row)
|
|
92
|
+
throw invalid();
|
|
93
|
+
return orderReviewMediaIntentResultSchema.parse(row);
|
|
94
|
+
}
|
|
95
|
+
function readResult(value) {
|
|
96
|
+
const row = object(value);
|
|
97
|
+
if (!row || !Array.isArray(row.media))
|
|
98
|
+
throw invalid();
|
|
99
|
+
return orderReviewReadResultSchema.parse({
|
|
100
|
+
review: row.review === null ? null : review(row.review),
|
|
101
|
+
media: row.media.map((item) => media(item)),
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
function adminDetail(value) {
|
|
105
|
+
const row = object(value);
|
|
106
|
+
if (!row || !Array.isArray(row.media))
|
|
107
|
+
throw invalid();
|
|
108
|
+
return orderReviewAdminDetailSchema.parse({
|
|
109
|
+
review: review(row.review),
|
|
110
|
+
media: row.media.map((item) => media(item)),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
function object(value) {
|
|
114
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
115
|
+
}
|
|
116
|
+
function invalid() { return Object.assign(new Error("order_review_response_invalid"), { code: "order_review_invalid" }); }
|
|
117
|
+
function required(value) {
|
|
118
|
+
if (value === null)
|
|
119
|
+
throw Object.assign(new Error("order_review_unavailable"), { code: "order_review_unavailable" });
|
|
120
|
+
return value;
|
|
121
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { OrderReviewMediaPort } from "../orderReviewPorts.js";
|
|
2
|
+
type PgQueryExecutor = {
|
|
3
|
+
query(text: string, values?: unknown[]): Promise<{
|
|
4
|
+
rows: Record<string, unknown>[];
|
|
5
|
+
}>;
|
|
6
|
+
};
|
|
7
|
+
export interface OrderReviewMediaTransactionLane {
|
|
8
|
+
run<T>(work: (executor: PgQueryExecutor) => Promise<T>): Promise<T>;
|
|
9
|
+
}
|
|
10
|
+
export declare function createPostgresOrderReviewMediaPort(executor: PgQueryExecutor, transactionLane?: OrderReviewMediaTransactionLane): OrderReviewMediaPort;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { orderReviewMediaSchema, } from "../orderReviewContracts.js";
|
|
2
|
+
const READ = "SELECT public.order_review_read_media($1::text,$2::text,now()) AS response";
|
|
3
|
+
const ADMIT = "SELECT public.order_review_admit_media_upload($1::text,$2::text,$3::integer,$4::text,now()) AS response";
|
|
4
|
+
const LOCK_FINALIZE = "SELECT public.order_review_lock_media_finalize($1::text,$2::text,$3::bigint,now()) AS response";
|
|
5
|
+
const STORED = "SELECT public.order_review_record_media_stored($1::text,$2::text,$3::bigint,$4::text,$5::integer,now()) AS response";
|
|
6
|
+
const ABORT = "SELECT public.order_review_abort_media_upload($1::text,$2::text,$3::bigint,$4::text,now()) AS response";
|
|
7
|
+
const ADMIN_READ = "SELECT public.order_review_admin_read_media($1::text,$2::text) AS response";
|
|
8
|
+
const ADMIN_DELETE_PREPARE = "SELECT public.order_review_admin_prepare_media_delete($1::text,$2::text,$3::text,now()) AS response";
|
|
9
|
+
const ADMIN_DELETE_COMPLETE = "SELECT public.order_review_admin_complete_media_delete($1::text,$2::text,now()) AS response";
|
|
10
|
+
const CLAIM_RECONCILE = "SELECT public.order_review_claim_media_reconcile($1::integer,now()) AS response";
|
|
11
|
+
const COMPLETE_RECONCILE = "SELECT public.order_review_complete_media_reconcile($1::text,$2::text,$3::text,$4::integer,$5::text,$6::text,now()) AS response";
|
|
12
|
+
export function createPostgresOrderReviewMediaPort(executor, transactionLane) {
|
|
13
|
+
return {
|
|
14
|
+
async readAuthorized(grant, mediaRef) { return mediaObjectOrNull(await call(executor, READ, [grant, mediaRef])); },
|
|
15
|
+
async admitUpload(input) {
|
|
16
|
+
let value;
|
|
17
|
+
try {
|
|
18
|
+
value = object(await call(executor, ADMIT, [
|
|
19
|
+
input.capabilityDigest, input.declaredContentType, input.declaredByteLength, input.writerRef,
|
|
20
|
+
]));
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
const code = error && typeof error === "object" && "code" in error ? String(error.code) : "";
|
|
24
|
+
if (code === "23505" || code === "order_review_conflict")
|
|
25
|
+
return { kind: "conflict" };
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
if (!value)
|
|
29
|
+
return { kind: "unavailable" };
|
|
30
|
+
if (value.kind === "complete")
|
|
31
|
+
return { kind: "complete", media: media(value.media) };
|
|
32
|
+
if (value.kind !== undefined && value.kind !== "lease")
|
|
33
|
+
throw invalid();
|
|
34
|
+
const parsed = media(value.media);
|
|
35
|
+
const leaseVersion = value.leaseVersion;
|
|
36
|
+
const leaseExpiresAt = value.leaseExpiresAt;
|
|
37
|
+
const objectKey = value.objectKey;
|
|
38
|
+
const declaredContentType = value.declaredContentType;
|
|
39
|
+
const declaredByteLength = value.declaredByteLength;
|
|
40
|
+
if (!Number.isInteger(leaseVersion) || typeof leaseExpiresAt !== "string" || typeof objectKey !== "string"
|
|
41
|
+
|| (declaredContentType !== "image/jpeg" && declaredContentType !== "image/png" && declaredContentType !== "image/webp")
|
|
42
|
+
|| !Number.isInteger(declaredByteLength))
|
|
43
|
+
throw invalid();
|
|
44
|
+
return { kind: "lease", reservation: { media: parsed, leaseVersion: leaseVersion, leaseExpiresAt, objectKey,
|
|
45
|
+
declaredContentType, declaredByteLength: declaredByteLength } };
|
|
46
|
+
},
|
|
47
|
+
async finalizeUpload(input) {
|
|
48
|
+
if (!transactionLane)
|
|
49
|
+
throw Object.assign(new Error("order_review_finalize_lane_required"), { code: "order_review_invalid" });
|
|
50
|
+
let leased = false;
|
|
51
|
+
try {
|
|
52
|
+
return await transactionLane.run(async (transaction) => {
|
|
53
|
+
const locked = await call(transaction, LOCK_FINALIZE, [input.capabilityDigest, input.writerRef, input.leaseVersion]);
|
|
54
|
+
if (locked === null)
|
|
55
|
+
return null;
|
|
56
|
+
const lockedRow = object(locked);
|
|
57
|
+
if (!lockedRow || !lockedRow.media)
|
|
58
|
+
throw invalid();
|
|
59
|
+
media(lockedRow.media);
|
|
60
|
+
leased = true;
|
|
61
|
+
await input.promote();
|
|
62
|
+
const stored = mediaOrNull(await call(transaction, STORED, [
|
|
63
|
+
input.capabilityDigest, input.writerRef, input.leaseVersion, input.digest, input.byteLength,
|
|
64
|
+
]));
|
|
65
|
+
if (!stored)
|
|
66
|
+
throw invalid();
|
|
67
|
+
return stored;
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
// The transaction has rolled back: persist cleanup_pending outside it.
|
|
72
|
+
if (leased)
|
|
73
|
+
await call(executor, ABORT, [input.capabilityDigest, input.writerRef, input.leaseVersion, "finalize_failed"]);
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
async abortUpload(input) { await call(executor, ABORT, [input.capabilityDigest, input.writerRef, input.leaseVersion, input.reason]); },
|
|
78
|
+
async readAdmin(input) { return mediaObjectOrNull(await call(executor, ADMIN_READ, [input.actorRef, input.mediaRef])); },
|
|
79
|
+
async prepareAdminDelete(input) {
|
|
80
|
+
const value = object(await call(executor, ADMIN_DELETE_PREPARE, [input.actorRef, input.mediaRef, input.idempotencyKey]));
|
|
81
|
+
if (!value)
|
|
82
|
+
return null;
|
|
83
|
+
return cleanup(value);
|
|
84
|
+
},
|
|
85
|
+
async completeAdminDelete(input) {
|
|
86
|
+
const value = object(await call(executor, ADMIN_DELETE_COMPLETE, [input.actorRef, input.cleanupReceipt]));
|
|
87
|
+
if (!value)
|
|
88
|
+
throw invalid();
|
|
89
|
+
return { replayed: value.replayed === true };
|
|
90
|
+
},
|
|
91
|
+
async claimReconcile(limit) {
|
|
92
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > 100)
|
|
93
|
+
throw invalid();
|
|
94
|
+
const value = object(await call(executor, CLAIM_RECONCILE, [limit]));
|
|
95
|
+
if (!value || !Array.isArray(value.tasks))
|
|
96
|
+
throw invalid();
|
|
97
|
+
return value.tasks.map(reconcileTask);
|
|
98
|
+
},
|
|
99
|
+
async completeReconcile(input) {
|
|
100
|
+
const outcome = input.outcome;
|
|
101
|
+
if (!/^[-A-Za-z0-9_:]{1,512}$/.test(input.receipt))
|
|
102
|
+
throw invalid();
|
|
103
|
+
if (outcome.kind === "stored" && (!Number.isInteger(outcome.observedByteLength)
|
|
104
|
+
|| outcome.observedByteLength < 1 || outcome.observedByteLength > 20 * 1024 * 1024
|
|
105
|
+
|| !/^[a-f0-9]{64}$/.test(outcome.observedDigest)))
|
|
106
|
+
throw invalid();
|
|
107
|
+
if (outcome.kind === "retry" && (outcome.reason.length < 1 || outcome.reason.length > 128))
|
|
108
|
+
throw invalid();
|
|
109
|
+
await call(executor, COMPLETE_RECONCILE, [
|
|
110
|
+
input.receipt,
|
|
111
|
+
outcome.kind,
|
|
112
|
+
outcome.kind === "stored" ? outcome.observedContentType : null,
|
|
113
|
+
outcome.kind === "stored" ? outcome.observedByteLength : null,
|
|
114
|
+
outcome.kind === "stored" ? outcome.observedDigest : null,
|
|
115
|
+
outcome.kind === "retry" ? outcome.reason : null,
|
|
116
|
+
]);
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
async function call(executor, sql, values) {
|
|
121
|
+
const result = await executor.query(sql, values);
|
|
122
|
+
return object(result.rows[0])?.response ?? null;
|
|
123
|
+
}
|
|
124
|
+
function mediaOrNull(value) {
|
|
125
|
+
return value === null ? null : media(value);
|
|
126
|
+
}
|
|
127
|
+
function media(value) { return orderReviewMediaSchema.parse(value); }
|
|
128
|
+
function mediaObjectOrNull(value) {
|
|
129
|
+
if (value === null)
|
|
130
|
+
return null;
|
|
131
|
+
const row = object(value);
|
|
132
|
+
if (!row || typeof row.objectKey !== "string")
|
|
133
|
+
throw invalid();
|
|
134
|
+
return { media: media(row.media), objectKey: row.objectKey };
|
|
135
|
+
}
|
|
136
|
+
function cleanup(value) {
|
|
137
|
+
if (typeof value.objectKey !== "string" || typeof value.cleanupReceipt !== "string" || typeof value.replayed !== "boolean")
|
|
138
|
+
throw invalid();
|
|
139
|
+
if (value.tempKey !== undefined && value.tempKey !== null && typeof value.tempKey !== "string")
|
|
140
|
+
throw invalid();
|
|
141
|
+
return { media: media(value.media), objectKey: value.objectKey,
|
|
142
|
+
...(typeof value.tempKey === "string" ? { tempKey: value.tempKey } : {}),
|
|
143
|
+
cleanupReceipt: value.cleanupReceipt, replayed: value.replayed };
|
|
144
|
+
}
|
|
145
|
+
function reconcileTask(value) {
|
|
146
|
+
const row = object(value);
|
|
147
|
+
const expectedDeclaredByteLength = row?.expectedDeclaredByteLength;
|
|
148
|
+
const tempKey = row?.tempKey;
|
|
149
|
+
if (!row
|
|
150
|
+
|| typeof row.receipt !== "string"
|
|
151
|
+
|| (row.kind !== "finalize" && row.kind !== "delete")
|
|
152
|
+
|| typeof row.objectKey !== "string"
|
|
153
|
+
|| (tempKey !== undefined && typeof tempKey !== "string")
|
|
154
|
+
|| (row.expectedDeclaredContentType !== "image/jpeg" && row.expectedDeclaredContentType !== "image/png" && row.expectedDeclaredContentType !== "image/webp")
|
|
155
|
+
|| !Number.isInteger(expectedDeclaredByteLength)
|
|
156
|
+
|| typeof expectedDeclaredByteLength !== "number"
|
|
157
|
+
|| expectedDeclaredByteLength < 1
|
|
158
|
+
|| expectedDeclaredByteLength > 20 * 1024 * 1024)
|
|
159
|
+
throw invalid();
|
|
160
|
+
return {
|
|
161
|
+
receipt: row.receipt,
|
|
162
|
+
kind: row.kind,
|
|
163
|
+
objectKey: row.objectKey,
|
|
164
|
+
...(tempKey === undefined ? {} : { tempKey: tempKey }),
|
|
165
|
+
expectedDeclaredContentType: row.expectedDeclaredContentType,
|
|
166
|
+
expectedDeclaredByteLength,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
function object(value) {
|
|
170
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
171
|
+
}
|
|
172
|
+
function invalid() { return Object.assign(new Error("order_review_media_response_invalid"), { code: "order_review_invalid" }); }
|