@aglyn/plugins-commerce 1.0.0-beta.230 → 1.0.0-beta.232
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/package.json +13 -13
- package/src/index.d.ts +0 -1
- package/src/index.js +0 -1
- package/src/index.js.map +1 -1
- package/src/lib/barcode/barcode-decode.d.ts +71 -0
- package/src/lib/barcode/barcode-decode.js +498 -0
- package/src/lib/barcode/barcode-decode.js.map +1 -0
- package/src/lib/barcode/barcode-encode.d.ts +44 -0
- package/src/lib/barcode/barcode-encode.js +138 -0
- package/src/lib/barcode/barcode-encode.js.map +1 -0
- package/src/lib/barcode/barcode-scanner.component.d.ts +23 -0
- package/src/lib/barcode/barcode-scanner.component.js +260 -0
- package/src/lib/barcode/barcode-scanner.component.js.map +1 -0
- package/src/lib/barcode/scan-button.component.d.ts +10 -0
- package/src/lib/barcode/scan-button.component.js +62 -0
- package/src/lib/barcode/scan-button.component.js.map +1 -0
- package/src/lib/barcode/scanner-wedge.d.ts +35 -0
- package/src/lib/barcode/scanner-wedge.js +108 -0
- package/src/lib/barcode/scanner-wedge.js.map +1 -0
- package/src/lib/components/account.js +10 -1
- package/src/lib/components/account.js.map +1 -1
- package/src/lib/components/cart-extras.d.ts +45 -0
- package/src/lib/components/cart-extras.js +127 -0
- package/src/lib/components/cart-extras.js.map +1 -0
- package/src/lib/components/cart.js +82 -15
- package/src/lib/components/cart.js.map +1 -1
- package/src/lib/components/checkout-return-notice.d.ts +26 -0
- package/src/lib/components/checkout-return-notice.js +48 -0
- package/src/lib/components/checkout-return-notice.js.map +1 -0
- package/src/lib/components/commerce-console-page.js +124 -0
- package/src/lib/components/commerce-console-page.js.map +1 -1
- package/src/lib/components/commerce-console-sections.d.ts +1 -1
- package/src/lib/components/commerce-console-sections.js +4 -0
- package/src/lib/components/commerce-console-sections.js.map +1 -1
- package/src/lib/components/console/bulk-fulfill.d.ts +44 -0
- package/src/lib/components/console/bulk-fulfill.js +84 -0
- package/src/lib/components/console/bulk-fulfill.js.map +1 -0
- package/src/lib/components/console/catalog-organization-card.component.js +1 -0
- package/src/lib/components/console/catalog-organization-card.component.js.map +1 -1
- package/src/lib/components/console/customer-notifications-card.component.d.ts +19 -0
- package/src/lib/components/console/customer-notifications-card.component.js +149 -0
- package/src/lib/components/console/customer-notifications-card.component.js.map +1 -0
- package/src/lib/components/console/host-orders-card.component.js +88 -6
- package/src/lib/components/console/host-orders-card.component.js.map +1 -1
- package/src/lib/components/console/locations-card.component.js +164 -57
- package/src/lib/components/console/locations-card.component.js.map +1 -1
- package/src/lib/components/console/order-detail-dialog.component.js +209 -61
- package/src/lib/components/console/order-detail-dialog.component.js.map +1 -1
- package/src/lib/components/console/order-fulfillment-panel.component.d.ts +48 -0
- package/src/lib/components/console/order-fulfillment-panel.component.js +542 -0
- package/src/lib/components/console/order-fulfillment-panel.component.js.map +1 -0
- package/src/lib/components/console/order-invoice.component.d.ts +33 -0
- package/src/lib/components/console/order-invoice.component.js +81 -0
- package/src/lib/components/console/order-invoice.component.js.map +1 -0
- package/src/lib/components/console/order-receipt-resend.component.d.ts +21 -0
- package/src/lib/components/console/order-receipt-resend.component.js +203 -0
- package/src/lib/components/console/order-receipt-resend.component.js.map +1 -0
- package/src/lib/components/console/order-returns.component.d.ts +36 -0
- package/src/lib/components/console/order-returns.component.js +142 -0
- package/src/lib/components/console/order-returns.component.js.map +1 -0
- package/src/lib/components/console/order-shipping-actions.component.d.ts +54 -0
- package/src/lib/components/console/order-shipping-actions.component.js +149 -0
- package/src/lib/components/console/order-shipping-actions.component.js.map +1 -0
- package/src/lib/components/console/order-webhooks-card.component.d.ts +50 -0
- package/src/lib/components/console/order-webhooks-card.component.js +623 -0
- package/src/lib/components/console/order-webhooks-card.component.js.map +1 -0
- package/src/lib/components/console/order-zones.d.ts +155 -0
- package/src/lib/components/console/order-zones.js +40 -0
- package/src/lib/components/console/order-zones.js.map +1 -0
- package/src/lib/components/console/payment-methods-card.component.d.ts +67 -0
- package/src/lib/components/console/payment-methods-card.component.js +395 -0
- package/src/lib/components/console/payment-methods-card.component.js.map +1 -0
- package/src/lib/components/console/pos/pos-api.d.ts +124 -0
- package/src/lib/components/console/pos/pos-api.js +101 -0
- package/src/lib/components/console/pos/pos-api.js.map +1 -0
- package/src/lib/components/console/pos/pos-cart-panel.component.d.ts +36 -0
- package/src/lib/components/console/pos/pos-cart-panel.component.js +160 -0
- package/src/lib/components/console/pos/pos-cart-panel.component.js.map +1 -0
- package/src/lib/components/console/pos/pos-item-dialog.component.d.ts +39 -0
- package/src/lib/components/console/pos/pos-item-dialog.component.js +352 -0
- package/src/lib/components/console/pos/pos-item-dialog.component.js.map +1 -0
- package/src/lib/components/console/pos/pos-product-grid.component.d.ts +47 -0
- package/src/lib/components/console/pos/pos-product-grid.component.js +272 -0
- package/src/lib/components/console/pos/pos-product-grid.component.js.map +1 -0
- package/src/lib/components/console/pos/pos-receipt-panel.component.d.ts +27 -0
- package/src/lib/components/console/pos/pos-receipt-panel.component.js +282 -0
- package/src/lib/components/console/pos/pos-receipt-panel.component.js.map +1 -0
- package/src/lib/components/console/pos/pos-tender-dialogs.component.d.ts +53 -0
- package/src/lib/components/console/pos/pos-tender-dialogs.component.js +445 -0
- package/src/lib/components/console/pos/pos-tender-dialogs.component.js.map +1 -0
- package/src/lib/components/console/pos/pos-tender-panel.component.d.ts +31 -0
- package/src/lib/components/console/pos/pos-tender-panel.component.js +640 -0
- package/src/lib/components/console/pos/pos-tender-panel.component.js.map +1 -0
- package/src/lib/components/console/pos/use-pos-display.d.ts +43 -0
- package/src/lib/components/console/pos/use-pos-display.js +161 -0
- package/src/lib/components/console/pos/use-pos-display.js.map +1 -0
- package/src/lib/components/console/pos-devices-card.component.d.ts +14 -0
- package/src/lib/components/console/pos-devices-card.component.js +546 -0
- package/src/lib/components/console/pos-devices-card.component.js.map +1 -0
- package/src/lib/components/console/pos-display/brand-screen.d.ts +33 -0
- package/src/lib/components/console/pos-display/brand-screen.js +85 -0
- package/src/lib/components/console/pos-display/brand-screen.js.map +1 -0
- package/src/lib/components/console/pos-display/cart-screen.d.ts +29 -0
- package/src/lib/components/console/pos-display/cart-screen.js +166 -0
- package/src/lib/components/console/pos-display/cart-screen.js.map +1 -0
- package/src/lib/components/console/pos-display/pairing-screen.d.ts +24 -0
- package/src/lib/components/console/pos-display/pairing-screen.js +127 -0
- package/src/lib/components/console/pos-display/pairing-screen.js.map +1 -0
- package/src/lib/components/console/pos-display/pos-display-api.d.ts +90 -0
- package/src/lib/components/console/pos-display/pos-display-api.js +140 -0
- package/src/lib/components/console/pos-display/pos-display-api.js.map +1 -0
- package/src/lib/components/console/pos-display/receipt-screen.d.ts +35 -0
- package/src/lib/components/console/pos-display/receipt-screen.js +200 -0
- package/src/lib/components/console/pos-display/receipt-screen.js.map +1 -0
- package/src/lib/components/console/pos-display/tip-screen.d.ts +36 -0
- package/src/lib/components/console/pos-display/tip-screen.js +211 -0
- package/src/lib/components/console/pos-display/tip-screen.js.map +1 -0
- package/src/lib/components/console/pos-display-page.component.d.ts +16 -0
- package/src/lib/components/console/pos-display-page.component.js +407 -0
- package/src/lib/components/console/pos-display-page.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-customer-lookup.component.d.ts +40 -0
- package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js +289 -0
- package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-last-receipt.component.d.ts +34 -0
- package/src/lib/components/console/pos-ops/pos-last-receipt.component.js +61 -0
- package/src/lib/components/console/pos-ops/pos-last-receipt.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-operations-bar.component.d.ts +38 -0
- package/src/lib/components/console/pos-ops/pos-operations-bar.component.js +129 -0
- package/src/lib/components/console/pos-ops/pos-operations-bar.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-ops-api.d.ts +37 -0
- package/src/lib/components/console/pos-ops/pos-ops-api.js +60 -0
- package/src/lib/components/console/pos-ops/pos-ops-api.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-pin-pad.component.d.ts +48 -0
- package/src/lib/components/console/pos-ops/pos-pin-pad.component.js +220 -0
- package/src/lib/components/console/pos-ops/pos-pin-pad.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-receipt-actions.component.d.ts +63 -0
- package/src/lib/components/console/pos-ops/pos-receipt-actions.component.js +186 -0
- package/src/lib/components/console/pos-ops/pos-receipt-actions.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-receipt.d.ts +39 -0
- package/src/lib/components/console/pos-ops/pos-receipt.js +182 -0
- package/src/lib/components/console/pos-ops/pos-receipt.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-return-dialog.component.d.ts +40 -0
- package/src/lib/components/console/pos-ops/pos-return-dialog.component.js +465 -0
- package/src/lib/components/console/pos-ops/pos-return-dialog.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-shift-history-card.component.d.ts +29 -0
- package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js +253 -0
- package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-shift-panel.component.d.ts +34 -0
- package/src/lib/components/console/pos-ops/pos-shift-panel.component.js +494 -0
- package/src/lib/components/console/pos-ops/pos-shift-panel.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-shift-report.component.d.ts +37 -0
- package/src/lib/components/console/pos-ops/pos-shift-report.component.js +102 -0
- package/src/lib/components/console/pos-ops/pos-shift-report.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.d.ts +30 -0
- package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.js +277 -0
- package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/register-ops.d.ts +28 -0
- package/src/lib/components/console/pos-ops/register-ops.js +28 -0
- package/src/lib/components/console/pos-ops/register-ops.js.map +1 -0
- package/src/lib/components/console/pos-ops/use-pos-cashier.d.ts +46 -0
- package/src/lib/components/console/pos-ops/use-pos-cashier.js +128 -0
- package/src/lib/components/console/pos-ops/use-pos-cashier.js.map +1 -0
- package/src/lib/components/console/pos-ops/use-pos-sale-receipt.d.ts +36 -0
- package/src/lib/components/console/pos-ops/use-pos-sale-receipt.js +64 -0
- package/src/lib/components/console/pos-ops/use-pos-sale-receipt.js.map +1 -0
- package/src/lib/components/console/pos-page.component.d.ts +13 -5
- package/src/lib/components/console/pos-page.component.js +756 -654
- package/src/lib/components/console/pos-page.component.js.map +1 -1
- package/src/lib/components/console/pos-zones.d.ts +23 -0
- package/src/lib/components/console/pos-zones.js +31 -0
- package/src/lib/components/console/pos-zones.js.map +1 -0
- package/src/lib/components/console/product-editor-dialog.component.js +61 -71
- package/src/lib/components/console/product-editor-dialog.component.js.map +1 -1
- package/src/lib/components/console/product-labels-dialog.component.d.ts +13 -0
- package/src/lib/components/console/product-labels-dialog.component.js +197 -0
- package/src/lib/components/console/product-labels-dialog.component.js.map +1 -0
- package/src/lib/components/console/product-register-fields.component.d.ts +19 -0
- package/src/lib/components/console/product-register-fields.component.js +241 -0
- package/src/lib/components/console/product-register-fields.component.js.map +1 -0
- package/src/lib/components/console/product-zones.d.ts +44 -0
- package/src/lib/components/console/product-zones.js.map +1 -1
- package/src/lib/components/console/products-hub-card.component.js +23 -20
- package/src/lib/components/console/products-hub-card.component.js.map +1 -1
- package/src/lib/components/console/register-hardware-card.component.d.ts +33 -0
- package/src/lib/components/console/register-hardware-card.component.js +826 -0
- package/src/lib/components/console/register-hardware-card.component.js.map +1 -0
- package/src/lib/components/console/registers-card.component.js +24 -5
- package/src/lib/components/console/registers-card.component.js.map +1 -1
- package/src/lib/components/console/return-actions.d.ts +38 -0
- package/src/lib/components/console/return-actions.js +76 -0
- package/src/lib/components/console/return-actions.js.map +1 -0
- package/src/lib/components/console/return-detail-dialog.component.d.ts +34 -0
- package/src/lib/components/console/return-detail-dialog.component.js +718 -0
- package/src/lib/components/console/return-detail-dialog.component.js.map +1 -0
- package/src/lib/components/console/return-settings-card.component.d.ts +34 -0
- package/src/lib/components/console/return-settings-card.component.js +195 -0
- package/src/lib/components/console/return-settings-card.component.js.map +1 -0
- package/src/lib/components/console/return-zones.d.ts +87 -0
- package/src/lib/components/console/return-zones.js +31 -0
- package/src/lib/components/console/return-zones.js.map +1 -0
- package/src/lib/components/console/returns-card.component.d.ts +45 -0
- package/src/lib/components/console/returns-card.component.js +159 -0
- package/src/lib/components/console/returns-card.component.js.map +1 -0
- package/src/lib/components/console/shipping-settings-card.component.js +161 -5
- package/src/lib/components/console/shipping-settings-card.component.js.map +1 -1
- package/src/lib/components/console/shippingeasy-card.component.d.ts +59 -0
- package/src/lib/components/console/shippingeasy-card.component.js +378 -0
- package/src/lib/components/console/shippingeasy-card.component.js.map +1 -0
- package/src/lib/components/console/shipstation-card.component.d.ts +35 -0
- package/src/lib/components/console/shipstation-card.component.js +345 -0
- package/src/lib/components/console/shipstation-card.component.js.map +1 -0
- package/src/lib/components/console/start-return-dialog.component.d.ts +40 -0
- package/src/lib/components/console/start-return-dialog.component.js +243 -0
- package/src/lib/components/console/start-return-dialog.component.js.map +1 -0
- package/src/lib/components/console/stock-movements-card.component.js +2 -1
- package/src/lib/components/console/stock-movements-card.component.js.map +1 -1
- package/src/lib/components/console/store-settings-card.component.js +2 -66
- package/src/lib/components/console/store-settings-card.component.js.map +1 -1
- package/src/lib/components/console/store-zones.d.ts +42 -0
- package/src/lib/components/console/store-zones.js +39 -0
- package/src/lib/components/console/store-zones.js.map +1 -0
- package/src/lib/components/console/storefront-tax-summary-card.component.js +1 -0
- package/src/lib/components/console/storefront-tax-summary-card.component.js.map +1 -1
- package/src/lib/components/order-status.d.ts +36 -0
- package/src/lib/components/order-status.js +502 -0
- package/src/lib/components/order-status.js.map +1 -0
- package/src/lib/components/product-detail.js +41 -2
- package/src/lib/components/product-detail.js.map +1 -1
- package/src/lib/components/return-request.d.ts +32 -0
- package/src/lib/components/return-request.js +576 -0
- package/src/lib/components/return-request.js.map +1 -0
- package/src/lib/components/storefront-payment-appearance.d.ts +32 -0
- package/src/lib/components/storefront-payment-appearance.js +114 -0
- package/src/lib/components/storefront-payment-appearance.js.map +1 -0
- package/src/lib/components/storefront-payment-element.d.ts +57 -1
- package/src/lib/components/storefront-payment-element.js +332 -33
- package/src/lib/components/storefront-payment-element.js.map +1 -1
- package/src/lib/constants/order-status.d.ts +22 -0
- package/src/lib/constants/order-status.js +22 -0
- package/src/lib/constants/order-status.js.map +1 -0
- package/src/lib/constants/return-request.d.ts +27 -0
- package/src/lib/constants/return-request.js +32 -0
- package/src/lib/constants/return-request.js.map +1 -0
- package/src/lib/constants/stock-movement-query.js +2 -1
- package/src/lib/constants/stock-movement-query.js.map +1 -1
- package/src/lib/declarations.console-server.js +9 -0
- package/src/lib/declarations.console-server.js.map +1 -1
- package/src/lib/declarations.server.d.ts +2 -1
- package/src/lib/declarations.server.js +68 -1
- package/src/lib/declarations.server.js.map +1 -1
- package/src/lib/model/buyer-notifications.d.ts +59 -0
- package/src/lib/model/buyer-notifications.js +97 -0
- package/src/lib/model/buyer-notifications.js.map +1 -0
- package/src/lib/model/commerce-orders.d.ts +171 -2
- package/src/lib/model/commerce-orders.js +26 -16
- package/src/lib/model/commerce-orders.js.map +1 -1
- package/src/lib/model/commerce-payment-methods.d.ts +146 -0
- package/src/lib/model/commerce-payment-methods.js +247 -0
- package/src/lib/model/commerce-payment-methods.js.map +1 -0
- package/src/lib/model/commerce-pos-ops.d.ts +437 -0
- package/src/lib/model/commerce-pos-ops.js +721 -0
- package/src/lib/model/commerce-pos-ops.js.map +1 -0
- package/src/lib/model/commerce-pos.d.ts +263 -0
- package/src/lib/model/commerce-pos.js +375 -0
- package/src/lib/model/commerce-pos.js.map +1 -0
- package/src/lib/model/commerce-printers.d.ts +211 -0
- package/src/lib/model/commerce-printers.js +181 -0
- package/src/lib/model/commerce-printers.js.map +1 -0
- package/src/lib/model/commerce-receipt.d.ts +97 -0
- package/src/lib/model/commerce-receipt.js +180 -0
- package/src/lib/model/commerce-receipt.js.map +1 -0
- package/src/lib/model/commerce-returns.d.ts +207 -0
- package/src/lib/model/commerce-returns.js +300 -0
- package/src/lib/model/commerce-returns.js.map +1 -0
- package/src/lib/model/commerce-shipping.d.ts +44 -1
- package/src/lib/model/commerce-shipping.js +53 -9
- package/src/lib/model/commerce-shipping.js.map +1 -1
- package/src/lib/model/commerce-tax-engine.d.ts +90 -0
- package/src/lib/model/commerce-tax-engine.js +129 -0
- package/src/lib/model/commerce-tax-engine.js.map +1 -0
- package/src/lib/model/commerce.d.ts +91 -2
- package/src/lib/model/commerce.js +89 -1
- package/src/lib/model/commerce.js.map +1 -1
- package/src/lib/model/index.d.ts +16 -0
- package/src/lib/model/index.js +16 -0
- package/src/lib/model/index.js.map +1 -1
- package/src/lib/model/order-events.d.ts +154 -0
- package/src/lib/model/order-events.js +153 -0
- package/src/lib/model/order-events.js.map +1 -0
- package/src/lib/model/order-fulfillment.d.ts +117 -0
- package/src/lib/model/order-fulfillment.js +217 -0
- package/src/lib/model/order-fulfillment.js.map +1 -0
- package/src/lib/model/order-history.d.ts +58 -0
- package/src/lib/model/order-history.js +22 -0
- package/src/lib/model/order-history.js.map +1 -0
- package/src/lib/model/order-list-fields.d.ts +9 -1
- package/src/lib/model/order-list-fields.js +7 -1
- package/src/lib/model/order-list-fields.js.map +1 -1
- package/src/lib/model/order-shipping-export.d.ts +91 -0
- package/src/lib/model/order-shipping-export.js +192 -0
- package/src/lib/model/order-shipping-export.js.map +1 -0
- package/src/lib/model/order-status-view.d.ts +103 -0
- package/src/lib/model/order-status-view.js +156 -0
- package/src/lib/model/order-status-view.js.map +1 -0
- package/src/lib/model/order-webhooks.d.ts +142 -0
- package/src/lib/model/order-webhooks.js +91 -0
- package/src/lib/model/order-webhooks.js.map +1 -0
- package/src/lib/model/product-channel.d.ts +56 -0
- package/src/lib/model/product-channel.js +86 -0
- package/src/lib/model/product-channel.js.map +1 -0
- package/src/lib/model/product-modifiers.d.ts +80 -0
- package/src/lib/model/product-modifiers.js +140 -0
- package/src/lib/model/product-modifiers.js.map +1 -0
- package/src/lib/model/product-write.d.ts +186 -0
- package/src/lib/model/product-write.js +116 -0
- package/src/lib/model/product-write.js.map +1 -0
- package/src/lib/model/shippingeasy.d.ts +94 -0
- package/src/lib/model/shippingeasy.js +267 -0
- package/src/lib/model/shippingeasy.js.map +1 -0
- package/src/lib/model/shipstation.d.ts +125 -0
- package/src/lib/model/shipstation.js +399 -0
- package/src/lib/model/shipstation.js.map +1 -0
- package/src/lib/model/smart-collection-reads.d.ts +32 -0
- package/src/lib/model/smart-collection-reads.js +63 -0
- package/src/lib/model/smart-collection-reads.js.map +1 -0
- package/src/lib/model/tracking-url.d.ts +74 -0
- package/src/lib/model/tracking-url.js +159 -0
- package/src/lib/model/tracking-url.js.map +1 -0
- package/src/lib/plugin-config.d.ts +13 -0
- package/src/lib/plugin-config.js +77 -5
- package/src/lib/plugin-config.js.map +1 -1
- package/src/lib/plugin.js +26 -0
- package/src/lib/plugin.js.map +1 -1
- package/src/lib/pos-ops-config.d.ts +39 -0
- package/src/lib/pos-ops-config.js +88 -0
- package/src/lib/pos-ops-config.js.map +1 -0
- package/src/lib/printing/print-document.d.ts +106 -0
- package/src/lib/printing/print-document.js +464 -0
- package/src/lib/printing/print-document.js.map +1 -0
- package/src/lib/printing/product-labels.d.ts +58 -0
- package/src/lib/printing/product-labels.js +116 -0
- package/src/lib/printing/product-labels.js.map +1 -0
- package/src/lib/printing/render-epson.d.ts +57 -0
- package/src/lib/printing/render-epson.js +135 -0
- package/src/lib/printing/render-epson.js.map +1 -0
- package/src/lib/printing/render-star.d.ts +45 -0
- package/src/lib/printing/render-star.js +100 -0
- package/src/lib/printing/render-star.js.map +1 -0
- package/src/lib/printing/render-text.d.ts +25 -0
- package/src/lib/printing/render-text.js +53 -0
- package/src/lib/printing/render-text.js.map +1 -0
- package/src/lib/server/api-v1/openapi.js +27 -4
- package/src/lib/server/api-v1/openapi.js.map +1 -1
- package/src/lib/server/api-v1/order-view.d.ts +67 -0
- package/src/lib/server/api-v1/order-view.js +120 -0
- package/src/lib/server/api-v1/order-view.js.map +1 -0
- package/src/lib/server/api-v1/orders-and-products.js +58 -65
- package/src/lib/server/api-v1/orders-and-products.js.map +1 -1
- package/src/lib/server/billing-webhook.js +135 -28
- package/src/lib/server/billing-webhook.js.map +1 -1
- package/src/lib/server/cancel-order.js +29 -0
- package/src/lib/server/cancel-order.js.map +1 -1
- package/src/lib/server/carrier-rates-availability.d.ts +26 -0
- package/src/lib/server/carrier-rates-availability.js +76 -0
- package/src/lib/server/carrier-rates-availability.js.map +1 -0
- package/src/lib/server/carrier-shipping.d.ts +84 -0
- package/src/lib/server/carrier-shipping.js +135 -0
- package/src/lib/server/carrier-shipping.js.map +1 -0
- package/src/lib/server/cart-checkout.d.ts +2 -0
- package/src/lib/server/cart-checkout.js +226 -22
- package/src/lib/server/cart-checkout.js.map +1 -1
- package/src/lib/server/channel-order-updates.d.ts +50 -0
- package/src/lib/server/channel-order-updates.js +290 -0
- package/src/lib/server/channel-order-updates.js.map +1 -0
- package/src/lib/server/channel-orders.d.ts +85 -0
- package/src/lib/server/channel-orders.js +543 -0
- package/src/lib/server/channel-orders.js.map +1 -0
- package/src/lib/server/checkout-extras.d.ts +64 -0
- package/src/lib/server/checkout-extras.js +157 -0
- package/src/lib/server/checkout-extras.js.map +1 -0
- package/src/lib/server/{feed.d.ts → checkout-status.d.ts} +2 -7
- package/src/lib/server/checkout-status.js +111 -0
- package/src/lib/server/checkout-status.js.map +1 -0
- package/src/lib/server/checkout.js +86 -9
- package/src/lib/server/checkout.js.map +1 -1
- package/src/lib/server/draft-order.js +34 -5
- package/src/lib/server/draft-order.js.map +1 -1
- package/src/lib/server/fulfill-order.d.ts +127 -10
- package/src/lib/server/fulfill-order.js +451 -49
- package/src/lib/server/fulfill-order.js.map +1 -1
- package/src/lib/server/legacy-feed.d.ts +28 -0
- package/src/lib/server/legacy-feed.js +52 -0
- package/src/lib/server/legacy-feed.js.map +1 -0
- package/src/lib/server/native-checkout.d.ts +34 -15
- package/src/lib/server/native-checkout.js +32 -17
- package/src/lib/server/native-checkout.js.map +1 -1
- package/src/lib/server/order-event-host-emit.d.ts +23 -0
- package/src/lib/server/order-event-host-emit.js +30 -0
- package/src/lib/server/order-event-host-emit.js.map +1 -0
- package/src/lib/server/order-event-triggers.d.ts +37 -0
- package/src/lib/server/order-event-triggers.js +119 -0
- package/src/lib/server/order-event-triggers.js.map +1 -0
- package/src/lib/server/order-events.d.ts +62 -0
- package/src/lib/server/order-events.js +109 -0
- package/src/lib/server/order-events.js.map +1 -0
- package/src/lib/server/order-history.d.ts +23 -0
- package/src/lib/server/order-history.js +65 -0
- package/src/lib/server/order-history.js.map +1 -0
- package/src/lib/server/order-notifications.d.ts +185 -0
- package/src/lib/server/order-notifications.js +567 -0
- package/src/lib/server/order-notifications.js.map +1 -0
- package/src/lib/server/order-receipt-send.d.ts +39 -0
- package/src/lib/server/order-receipt-send.js +151 -0
- package/src/lib/server/order-receipt-send.js.map +1 -0
- package/src/lib/server/order-status-token.d.ts +31 -0
- package/src/lib/server/order-status-token.js +75 -0
- package/src/lib/server/order-status-token.js.map +1 -0
- package/src/lib/server/order-status.d.ts +58 -0
- package/src/lib/server/order-status.js +141 -0
- package/src/lib/server/order-status.js.map +1 -0
- package/src/lib/server/order-webhooks.d.ts +108 -0
- package/src/lib/server/order-webhooks.js +622 -0
- package/src/lib/server/order-webhooks.js.map +1 -0
- package/src/lib/server/orders-shipping-prepare.d.ts +26 -0
- package/src/lib/server/orders-shipping-prepare.js +121 -0
- package/src/lib/server/orders-shipping-prepare.js.map +1 -0
- package/src/lib/server/payment-method-domains.d.ts +209 -0
- package/src/lib/server/payment-method-domains.js +444 -0
- package/src/lib/server/payment-method-domains.js.map +1 -0
- package/src/lib/server/payment-methods.d.ts +77 -0
- package/src/lib/server/payment-methods.js +284 -0
- package/src/lib/server/payment-methods.js.map +1 -0
- package/src/lib/server/pos-auth.d.ts +50 -0
- package/src/lib/server/pos-auth.js +121 -0
- package/src/lib/server/pos-auth.js.map +1 -0
- package/src/lib/server/pos-customer.d.ts +49 -0
- package/src/lib/server/pos-customer.js +257 -0
- package/src/lib/server/pos-customer.js.map +1 -0
- package/src/lib/server/pos-display.d.ts +57 -0
- package/src/lib/server/pos-display.js +419 -0
- package/src/lib/server/pos-display.js.map +1 -0
- package/src/lib/server/pos-fee-month.d.ts +34 -0
- package/src/lib/server/pos-fee-month.js +36 -0
- package/src/lib/server/pos-fee-month.js.map +1 -0
- package/src/lib/server/pos-ops-gate.d.ts +161 -0
- package/src/lib/server/pos-ops-gate.js +295 -0
- package/src/lib/server/pos-ops-gate.js.map +1 -0
- package/src/lib/server/pos-ops-routes.d.ts +22 -0
- package/src/lib/server/pos-ops-routes.js +36 -0
- package/src/lib/server/pos-ops-routes.js.map +1 -0
- package/src/lib/server/pos-order.d.ts +1 -18
- package/src/lib/server/pos-order.js +222 -42
- package/src/lib/server/pos-order.js.map +1 -1
- package/src/lib/server/pos-payment.d.ts +39 -0
- package/src/lib/server/pos-payment.js +922 -0
- package/src/lib/server/pos-payment.js.map +1 -0
- package/src/lib/server/pos-print.d.ts +82 -0
- package/src/lib/server/pos-print.js +193 -0
- package/src/lib/server/pos-print.js.map +1 -0
- package/src/lib/server/pos-readers.d.ts +27 -0
- package/src/lib/server/pos-readers.js +276 -0
- package/src/lib/server/pos-readers.js.map +1 -0
- package/src/lib/server/pos-refund-authority.d.ts +60 -0
- package/src/lib/server/pos-refund-authority.js +72 -0
- package/src/lib/server/pos-refund-authority.js.map +1 -0
- package/src/lib/server/pos-return.d.ts +58 -0
- package/src/lib/server/pos-return.js +891 -0
- package/src/lib/server/pos-return.js.map +1 -0
- package/src/lib/server/pos-sale-stamp.d.ts +66 -0
- package/src/lib/server/pos-sale-stamp.js +84 -0
- package/src/lib/server/pos-sale-stamp.js.map +1 -0
- package/src/lib/server/pos-sale.d.ts +170 -0
- package/src/lib/server/pos-sale.js +461 -0
- package/src/lib/server/pos-sale.js.map +1 -0
- package/src/lib/server/pos-shift.d.ts +45 -0
- package/src/lib/server/pos-shift.js +484 -0
- package/src/lib/server/pos-shift.js.map +1 -0
- package/src/lib/server/pos-staff-pin.d.ts +26 -0
- package/src/lib/server/pos-staff-pin.js +339 -0
- package/src/lib/server/pos-staff-pin.js.map +1 -0
- package/src/lib/server/pos-stripe.d.ts +91 -0
- package/src/lib/server/pos-stripe.js +129 -0
- package/src/lib/server/pos-stripe.js.map +1 -0
- package/src/lib/server/pos-terminal-connection-token.d.ts +48 -0
- package/src/lib/server/pos-terminal-connection-token.js +166 -0
- package/src/lib/server/pos-terminal-connection-token.js.map +1 -0
- package/src/lib/server/pos-terminal.d.ts +218 -0
- package/src/lib/server/pos-terminal.js +1014 -0
- package/src/lib/server/pos-terminal.js.map +1 -0
- package/src/lib/server/print-queue.d.ts +124 -0
- package/src/lib/server/print-queue.js +301 -0
- package/src/lib/server/print-queue.js.map +1 -0
- package/src/lib/server/printer-poll.d.ts +75 -0
- package/src/lib/server/printer-poll.js +325 -0
- package/src/lib/server/printer-poll.js.map +1 -0
- package/src/lib/server/printer-secret.d.ts +39 -0
- package/src/lib/server/printer-secret.js +56 -0
- package/src/lib/server/printer-secret.js.map +1 -0
- package/src/lib/server/printers.d.ts +114 -0
- package/src/lib/server/printers.js +546 -0
- package/src/lib/server/printers.js.map +1 -0
- package/src/lib/server/product-catalog.d.ts +42 -0
- package/src/lib/server/product-catalog.js +309 -0
- package/src/lib/server/product-catalog.js.map +1 -0
- package/src/lib/server/product-drafts.d.ts +5 -1
- package/src/lib/server/product-drafts.js +3 -3
- package/src/lib/server/product-drafts.js.map +1 -1
- package/src/lib/server/product-writer.d.ts +19 -0
- package/src/lib/server/product-writer.js +261 -0
- package/src/lib/server/product-writer.js.map +1 -0
- package/src/lib/server/products-write.d.ts +61 -0
- package/src/lib/server/products-write.js +375 -0
- package/src/lib/server/products-write.js.map +1 -0
- package/src/lib/server/refund.js +110 -45
- package/src/lib/server/refund.js.map +1 -1
- package/src/lib/server/reserve.js +2 -0
- package/src/lib/server/reserve.js.map +1 -1
- package/src/lib/server/return-status-action.d.ts +37 -0
- package/src/lib/server/return-status-action.js +57 -0
- package/src/lib/server/return-status-action.js.map +1 -0
- package/src/lib/server/returns.d.ts +119 -0
- package/src/lib/server/returns.js +938 -0
- package/src/lib/server/returns.js.map +1 -0
- package/src/lib/server/shipment-records.d.ts +36 -0
- package/src/lib/server/shipment-records.js +289 -0
- package/src/lib/server/shipment-records.js.map +1 -0
- package/src/lib/server/shipping-connector-gates.d.ts +40 -0
- package/src/lib/server/shipping-connector-gates.js +97 -0
- package/src/lib/server/shipping-connector-gates.js.map +1 -0
- package/src/lib/server/shipping-connectors.d.ts +29 -0
- package/src/lib/server/shipping-connectors.js +236 -0
- package/src/lib/server/shipping-connectors.js.map +1 -0
- package/src/lib/server/shippingeasy.d.ts +238 -0
- package/src/lib/server/shippingeasy.js +787 -0
- package/src/lib/server/shippingeasy.js.map +1 -0
- package/src/lib/server/shipstation.d.ts +129 -0
- package/src/lib/server/shipstation.js +483 -0
- package/src/lib/server/shipstation.js.map +1 -0
- package/src/lib/server/site-page-resolver.d.ts +5 -0
- package/src/lib/server/site-page-resolver.js +156 -1
- package/src/lib/server/site-page-resolver.js.map +1 -1
- package/src/lib/server/stock-levels.d.ts +21 -0
- package/src/lib/server/stock-levels.js +263 -0
- package/src/lib/server/stock-levels.js.map +1 -0
- package/src/lib/server/stripe-refund.d.ts +47 -0
- package/src/lib/server/stripe-refund.js +87 -0
- package/src/lib/server/stripe-refund.js.map +1 -0
- package/src/lib/server/supplier-update.js +46 -5
- package/src/lib/server/supplier-update.js.map +1 -1
- package/src/lib/server/tax-engine-quote.d.ts +47 -0
- package/src/lib/server/tax-engine-quote.js +105 -0
- package/src/lib/server/tax-engine-quote.js.map +1 -0
- package/src/lib/server.js +143 -2
- package/src/lib/server.js.map +1 -1
- package/src/lib/site.js +12 -0
- package/src/lib/site.js.map +1 -1
- package/src/lib/subprocessors.d.ts +26 -0
- package/src/lib/subprocessors.js +50 -0
- package/src/lib/subprocessors.js.map +1 -0
- package/src/lib/tenant-emails.js +461 -3
- package/src/lib/tenant-emails.js.map +1 -1
- package/src/lib/testing/fake-firestore.d.ts +45 -0
- package/src/lib/testing/fake-firestore.js +189 -0
- package/src/lib/testing/fake-firestore.js.map +1 -0
- package/src/lib/testing/memory-firestore.d.ts +136 -0
- package/src/lib/testing/memory-firestore.js +282 -0
- package/src/lib/testing/memory-firestore.js.map +1 -0
- package/src/lib/testing/pos-ops-harness.d.ts +50 -0
- package/src/lib/testing/pos-ops-harness.js +184 -0
- package/src/lib/testing/pos-ops-harness.js.map +1 -0
- package/src/lib/testing/pos-ops-memory-firestore.d.ts +55 -0
- package/src/lib/testing/pos-ops-memory-firestore.js +376 -0
- package/src/lib/testing/pos-ops-memory-firestore.js.map +1 -0
- package/src/lib/transfer/products.server.d.ts +5 -0
- package/src/lib/transfer/products.server.js +2 -2
- package/src/lib/transfer/products.server.js.map +1 -1
- package/src/lib/transfer/records-transfer.d.ts +11 -1
- package/src/lib/transfer/records-transfer.js +127 -5
- package/src/lib/transfer/records-transfer.js.map +1 -1
- package/src/lib/transfer/records.server.d.ts +9 -2
- package/src/lib/transfer/records.server.js +58 -7
- package/src/lib/transfer/records.server.js.map +1 -1
- package/src/lib/transfer/register-transfer-resources.js +40 -1
- package/src/lib/transfer/register-transfer-resources.js.map +1 -1
- package/src/lib/transfer/register-transfer-ui.js +4 -1
- package/src/lib/transfer/register-transfer-ui.js.map +1 -1
- package/src/lib/transfer/shipping-presets.d.ts +23 -0
- package/src/lib/transfer/shipping-presets.js +156 -0
- package/src/lib/transfer/shipping-presets.js.map +1 -0
- package/src/lib/transfer/tracking-transfer.d.ts +101 -0
- package/src/lib/transfer/tracking-transfer.js +546 -0
- package/src/lib/transfer/tracking-transfer.js.map +1 -0
- package/src/lib/transfer/tracking.server.d.ts +37 -0
- package/src/lib/transfer/tracking.server.js +393 -0
- package/src/lib/transfer/tracking.server.js.map +1 -0
- package/src/lib/transfer/transfer-keys.d.ts +2 -1
- package/src/lib/transfer/transfer-keys.js +6 -2
- package/src/lib/transfer/transfer-keys.js.map +1 -1
- package/src/lib/utils/code128.d.ts +37 -0
- package/src/lib/utils/code128.js +199 -0
- package/src/lib/utils/code128.js.map +1 -0
- package/src/lib/utils/order-invoice.d.ts +55 -0
- package/src/lib/utils/order-invoice.js +127 -0
- package/src/lib/utils/order-invoice.js.map +1 -0
- package/src/lib/utils/use-checkout-return-notice.d.ts +34 -0
- package/src/lib/utils/use-checkout-return-notice.js +78 -0
- package/src/lib/utils/use-checkout-return-notice.js.map +1 -0
- package/src/lib/server/feed.js +0 -69
- package/src/lib/server/feed.js.map +0 -1
|
@@ -0,0 +1,622 @@
|
|
|
1
|
+
import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright 2026 Aglyn LLC
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/ import { createResourceUid } from "@aglyn/aglyn/app-utils/create-resource-uid";
|
|
18
|
+
import { PLATFORM_BRAND_NAME } from "@aglyn/aglyn/app-utils/platform-brand";
|
|
19
|
+
import { describeConfiguredUrlRefusal, configuredUrlRefusal, fetchConfiguredPublicUrl, firebaseAdmin, notifyHostManagers } from "@aglyn/tenant-data-admin";
|
|
20
|
+
import { PLUGIN_EVENT_MAX_ATTEMPTS } from "@aglyn/tenant-data-admin/server/plugin-event-outbox";
|
|
21
|
+
import { resolveOrgPermissions } from "@aglyn/tenant-runtime/org-permissions";
|
|
22
|
+
import { createSecretBoxKey, openSecret, parseSecretBoxKeyring, sealSecret, SECRET_BOX_KEY_BYTES } from "@aglyn/shared-util-tools/secret-box";
|
|
23
|
+
import { createHmac, hkdfSync, randomBytes } from "node:crypto";
|
|
24
|
+
import { COMMERCE_EVENT_DECLARATIONS } from "../model/order-events.js";
|
|
25
|
+
import * as Webhooks from "../model/order-webhooks.js";
|
|
26
|
+
/**
|
|
27
|
+
* Merchant order webhooks (AGL-3611): the console's door and the delivery
|
|
28
|
+
* behind it. The model (`model/order-webhooks.ts`) says what is stored where.
|
|
29
|
+
*
|
|
30
|
+
* DELIVERY RIDES THE PLUGIN EVENT OUTBOX. Commerce subscribes to its own
|
|
31
|
+
* order and return events under the name `webhooks`; the subscriber posts the
|
|
32
|
+
* event to every endpoint that takes it and records each attempt in the
|
|
33
|
+
* delivery log. An endpoint that already took an event is not posted it
|
|
34
|
+
* again, so when one of three endpoints fails, the subscriber throws, the
|
|
35
|
+
* outbox retries it with its backoff (30s, 2m, 10m, 30m, 1h, 6h, 12h), and
|
|
36
|
+
* only the failing endpoint is called again. On the last attempt the delivery
|
|
37
|
+
* is marked failed and the site's managers are told.
|
|
38
|
+
*
|
|
39
|
+
* EVERY CALL GOES THROUGH `fetchConfiguredPublicUrl`: https on the default
|
|
40
|
+
* port, a public address pinned at connect time, no redirect followed. A
|
|
41
|
+
* merchant's endpoint is a stranger's server to us.
|
|
42
|
+
*
|
|
43
|
+
* THE SECRET IS SEALED with the shared secret box, under the keyring
|
|
44
|
+
* `readCommerceSecretKeyring` answers, bound to its endpoint by the seal's
|
|
45
|
+
* context. The plaintext leaves the server once, in the answer to the request
|
|
46
|
+
* that made or rolled it.
|
|
47
|
+
*/ export const COMMERCE_SECRET_KEY_ENV = 'COMMERCE_SECRET_KEY';
|
|
48
|
+
const SECRETS = 'orderWebhookSecrets';
|
|
49
|
+
/** Delivery rows live this long, then Firestore's TTL removes them. */ export const ORDER_WEBHOOK_LOG_RETENTION_MS = 30 * 86400000;
|
|
50
|
+
/** The id of the key derived from `TOKEN_SIGNING_SECRET`. */ export const DERIVED_COMMERCE_KEY_ID = 'tss1';
|
|
51
|
+
/**
|
|
52
|
+
* A secret-box key derived from `TOKEN_SIGNING_SECRET` with HKDF, under its
|
|
53
|
+
* own label, so the commerce tokens and the sealed secrets never share key
|
|
54
|
+
* material. `null` when that secret is unset.
|
|
55
|
+
*/ function derivedCommerceKey() {
|
|
56
|
+
var _process_env_TOKEN_SIGNING_SECRET;
|
|
57
|
+
const base = String((_process_env_TOKEN_SIGNING_SECRET = process.env['TOKEN_SIGNING_SECRET']) != null ? _process_env_TOKEN_SIGNING_SECRET : '');
|
|
58
|
+
if (!base) return null;
|
|
59
|
+
const material = new Uint8Array(hkdfSync('sha256', base, 'aglyn-commerce', 'secret-box:v1', SECRET_BOX_KEY_BYTES));
|
|
60
|
+
return createSecretBoxKey(material, DERIVED_COMMERCE_KEY_ID);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* The keyring commerce seals its stored secrets with. `COMMERCE_SECRET_KEY`
|
|
64
|
+
* (a secret-box keyring) when it is set, its first key sealing; otherwise the
|
|
65
|
+
* key derived from `TOKEN_SIGNING_SECRET`, which every deployment that sells
|
|
66
|
+
* already has. The derived key stays in the ring after a dedicated key is
|
|
67
|
+
* configured, so what it sealed still opens. `null` when neither is usable.
|
|
68
|
+
* Never throws.
|
|
69
|
+
*/ export function readCommerceSecretKeyring() {
|
|
70
|
+
var _process_env_COMMERCE_SECRET_KEY_ENV;
|
|
71
|
+
let derived = null;
|
|
72
|
+
try {
|
|
73
|
+
derived = derivedCommerceKey();
|
|
74
|
+
} catch (unused) {
|
|
75
|
+
derived = null;
|
|
76
|
+
}
|
|
77
|
+
const raw = String((_process_env_COMMERCE_SECRET_KEY_ENV = process.env[COMMERCE_SECRET_KEY_ENV]) != null ? _process_env_COMMERCE_SECRET_KEY_ENV : '').trim();
|
|
78
|
+
if (raw) {
|
|
79
|
+
try {
|
|
80
|
+
const ring = parseSecretBoxKeyring(raw);
|
|
81
|
+
const keys = derived && !ring.keys.some((key)=>key.id === derived.id) ? [
|
|
82
|
+
...ring.keys,
|
|
83
|
+
derived
|
|
84
|
+
] : ring.keys;
|
|
85
|
+
return {
|
|
86
|
+
current: ring.current,
|
|
87
|
+
keys
|
|
88
|
+
};
|
|
89
|
+
} catch (unused) {
|
|
90
|
+
// An unusable dedicated key falls back to the derived one rather than
|
|
91
|
+
// sealing nothing.
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return derived ? {
|
|
95
|
+
current: derived,
|
|
96
|
+
keys: [
|
|
97
|
+
derived
|
|
98
|
+
]
|
|
99
|
+
} : null;
|
|
100
|
+
}
|
|
101
|
+
/** Whether this deployment can sign webhooks at all. */ export function orderWebhooksConfigured() {
|
|
102
|
+
return readCommerceSecretKeyring() !== null;
|
|
103
|
+
}
|
|
104
|
+
const sealContext = (hostId, endpointId)=>`hosts/${hostId}/${SECRETS}/${endpointId}#secret`;
|
|
105
|
+
/** A fresh signing secret: `whsec_` and 32 random bytes. */ export function mintOrderWebhookSecret() {
|
|
106
|
+
return `whsec_${randomBytes(32).toString('base64url')}`;
|
|
107
|
+
}
|
|
108
|
+
/** The HMAC-SHA256 of `{t}.{body}` under the secret, as hex. */ export function signOrderWebhook(secret, timestampSeconds, body) {
|
|
109
|
+
return createHmac('sha256', secret).update(Webhooks.orderWebhookSignedPayload(timestampSeconds, body)).digest('hex');
|
|
110
|
+
}
|
|
111
|
+
const hostRefFor = (firestore, hostId)=>firestore.collection('hosts').doc(hostId);
|
|
112
|
+
async function readSecret(firestore, hostId, endpointId, keyring) {
|
|
113
|
+
var _snapshot_get;
|
|
114
|
+
const hostRef = hostRefFor(firestore, hostId);
|
|
115
|
+
const snapshot = await hostRef.collection('orderWebhookSecrets').doc(endpointId).get();
|
|
116
|
+
const sealed = String((_snapshot_get = snapshot.get('sealedSecret')) != null ? _snapshot_get : '');
|
|
117
|
+
if (!sealed) throw new Error('This endpoint has no signing secret');
|
|
118
|
+
return openSecret(sealed, keyring, {
|
|
119
|
+
context: sealContext(hostId, endpointId)
|
|
120
|
+
}).plaintext;
|
|
121
|
+
}
|
|
122
|
+
function sealedSecretRecord(hostId, endpointId, secret, keyring, now) {
|
|
123
|
+
return {
|
|
124
|
+
sealedSecret: sealSecret(secret, keyring.current, {
|
|
125
|
+
context: sealContext(hostId, endpointId)
|
|
126
|
+
}),
|
|
127
|
+
secretKeyId: keyring.current.id,
|
|
128
|
+
updatedAtMs: now
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Posts one body to one endpoint, signed. Never throws: a refusal, a timeout
|
|
133
|
+
* or a reset is an attempt that failed, with the reason in words.
|
|
134
|
+
*/ export async function postOrderWebhook(input) {
|
|
135
|
+
var _input_now;
|
|
136
|
+
const clock = (_input_now = input.now) != null ? _input_now : Date.now;
|
|
137
|
+
const startedAt = clock();
|
|
138
|
+
const timestamp = Math.floor(startedAt / 1000);
|
|
139
|
+
const signature = Webhooks.formatOrderWebhookSignature(timestamp, signOrderWebhook(input.secret, timestamp, input.body));
|
|
140
|
+
let httpStatus = null;
|
|
141
|
+
let error;
|
|
142
|
+
try {
|
|
143
|
+
var _input_fetchImpl;
|
|
144
|
+
const result = await ((_input_fetchImpl = input.fetchImpl) != null ? _input_fetchImpl : fetchConfiguredPublicUrl)(input.url, {
|
|
145
|
+
method: 'POST',
|
|
146
|
+
headers: {
|
|
147
|
+
'content-type': 'application/json',
|
|
148
|
+
'user-agent': 'Aglyn-Webhooks/1.0',
|
|
149
|
+
[Webhooks.ORDER_WEBHOOK_SIGNATURE_HEADER]: signature,
|
|
150
|
+
[Webhooks.ORDER_WEBHOOK_EVENT_HEADER]: input.event,
|
|
151
|
+
[Webhooks.ORDER_WEBHOOK_EVENT_ID_HEADER]: input.eventId
|
|
152
|
+
},
|
|
153
|
+
body: input.body,
|
|
154
|
+
signal: AbortSignal.timeout(Webhooks.ORDER_WEBHOOK_TIMEOUT_MS)
|
|
155
|
+
});
|
|
156
|
+
if ('refusal' in result) {
|
|
157
|
+
error = `Not sent: ${describeConfiguredUrlRefusal(result.refusal)}`;
|
|
158
|
+
} else {
|
|
159
|
+
httpStatus = result.status;
|
|
160
|
+
if (!Webhooks.orderWebhookAccepted(httpStatus)) {
|
|
161
|
+
error = httpStatus >= 300 && httpStatus < 400 ? `The endpoint answered ${httpStatus}, a redirect; redirects are not followed` : `The endpoint answered ${httpStatus}`;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
} catch (caught) {
|
|
165
|
+
var _ref;
|
|
166
|
+
const name = caught == null ? void 0 : caught.name;
|
|
167
|
+
error = name === 'TimeoutError' || name === 'AbortError' ? `No answer within ${Webhooks.ORDER_WEBHOOK_TIMEOUT_MS / 1000} seconds` : `The connection failed: ${String((_ref = caught == null ? void 0 : caught.message) != null ? _ref : caught).slice(0, 200)}`;
|
|
168
|
+
}
|
|
169
|
+
const attempt = _extends({
|
|
170
|
+
atMs: startedAt,
|
|
171
|
+
httpStatus
|
|
172
|
+
}, error ? {
|
|
173
|
+
error
|
|
174
|
+
} : {}, {
|
|
175
|
+
durationMs: Math.max(0, clock() - startedAt)
|
|
176
|
+
});
|
|
177
|
+
return {
|
|
178
|
+
attempt,
|
|
179
|
+
delivered: !error
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
function expiresAt(now) {
|
|
183
|
+
return firebaseAdmin.firestore.Timestamp.fromMillis(now + ORDER_WEBHOOK_LOG_RETENTION_MS);
|
|
184
|
+
}
|
|
185
|
+
/** Records an attempt on the delivery row and on the endpoint's summary. */ async function recordAttempt(firestore, hostId, endpointId, delivery, result, status, now) {
|
|
186
|
+
var _ref;
|
|
187
|
+
var _delivery_prior, _delivery_prior1;
|
|
188
|
+
const hostRef = hostRefFor(firestore, hostId);
|
|
189
|
+
const row = _extends({
|
|
190
|
+
endpointId,
|
|
191
|
+
eventId: delivery.eventId,
|
|
192
|
+
event: delivery.event,
|
|
193
|
+
orderId: delivery.orderId,
|
|
194
|
+
status,
|
|
195
|
+
attempts: Webhooks.appendOrderWebhookAttempt((_delivery_prior = delivery.prior) == null ? void 0 : _delivery_prior.attempts, result.attempt),
|
|
196
|
+
body: delivery.body.slice(0, Webhooks.ORDER_WEBHOOK_BODY_MAX)
|
|
197
|
+
}, delivery.test ? {
|
|
198
|
+
test: true
|
|
199
|
+
} : {}, {
|
|
200
|
+
createdAtMs: (_ref = (_delivery_prior1 = delivery.prior) == null ? void 0 : _delivery_prior1.createdAtMs) != null ? _ref : now,
|
|
201
|
+
updatedAtMs: now,
|
|
202
|
+
expiresAt: expiresAt(now)
|
|
203
|
+
});
|
|
204
|
+
await hostRef.collection('orderWebhookDeliveries').doc(delivery.id).set(row);
|
|
205
|
+
await hostRef.collection('orderWebhooks').doc(endpointId).update({
|
|
206
|
+
lastDeliveryAtMs: now,
|
|
207
|
+
lastDeliveryStatus: status,
|
|
208
|
+
consecutiveFailures: result.delivered ? 0 : firebaseAdmin.firestore.FieldValue.increment(1)
|
|
209
|
+
}).catch(()=>undefined);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* The subscriber: posts one event to every endpoint of the site that takes
|
|
213
|
+
* it and has not taken it already. Throws when any endpoint still owes it, so
|
|
214
|
+
* the outbox retries; on the outbox's last attempt it records the failure and
|
|
215
|
+
* tells the site's managers instead.
|
|
216
|
+
*/ export async function deliverOrderEventToWebhooks(envelope, deps = {}) {
|
|
217
|
+
var _deps_now, _ref, _envelope_payload;
|
|
218
|
+
var _order;
|
|
219
|
+
const firestore = firebaseAdmin.app().firestore();
|
|
220
|
+
const hostRef = hostRefFor(firestore, envelope.hostId);
|
|
221
|
+
const endpoints = await hostRef.collection('orderWebhooks').where('enabled', '==', true).get();
|
|
222
|
+
const taking = endpoints.docs.filter((doc)=>Webhooks.orderWebhookTakes(doc.data(), envelope.event, envelope.occurredAtMs));
|
|
223
|
+
if (taking.length === 0) return {
|
|
224
|
+
delivered: 0,
|
|
225
|
+
failed: 0
|
|
226
|
+
};
|
|
227
|
+
const keyring = readCommerceSecretKeyring();
|
|
228
|
+
const clock = (_deps_now = deps.now) != null ? _deps_now : Date.now;
|
|
229
|
+
const final = envelope.attempt >= PLUGIN_EVENT_MAX_ATTEMPTS;
|
|
230
|
+
const body = Webhooks.orderWebhookBody({
|
|
231
|
+
eventId: envelope.id,
|
|
232
|
+
event: envelope.event,
|
|
233
|
+
occurredAtMs: envelope.occurredAtMs,
|
|
234
|
+
hostId: envelope.hostId,
|
|
235
|
+
payload: envelope.payload
|
|
236
|
+
});
|
|
237
|
+
const orderId = String((_ref = (_order = ((_envelope_payload = envelope.payload) != null ? _envelope_payload : {}).order) == null ? void 0 : _order.id) != null ? _ref : '') || null;
|
|
238
|
+
const outcomes = await Promise.all(taking.map(async (doc)=>{
|
|
239
|
+
const endpoint = doc.data();
|
|
240
|
+
const deliveryId = Webhooks.orderWebhookDeliveryId(envelope.id, doc.id);
|
|
241
|
+
const priorSnapshot = await hostRef.collection('orderWebhookDeliveries').doc(deliveryId).get();
|
|
242
|
+
const prior = priorSnapshot.exists ? priorSnapshot.data() : null;
|
|
243
|
+
// Taken already, on an earlier pass or by a resend from the console.
|
|
244
|
+
if ((prior == null ? void 0 : prior.status) === 'delivered') return 'delivered';
|
|
245
|
+
const settled = await attemptEndpoint({
|
|
246
|
+
firestore,
|
|
247
|
+
hostId: envelope.hostId,
|
|
248
|
+
endpointId: doc.id,
|
|
249
|
+
url: endpoint.url,
|
|
250
|
+
keyring,
|
|
251
|
+
event: envelope.event,
|
|
252
|
+
eventId: envelope.id,
|
|
253
|
+
body,
|
|
254
|
+
clock,
|
|
255
|
+
fetchImpl: deps.fetchImpl
|
|
256
|
+
});
|
|
257
|
+
const status = settled.delivered ? 'delivered' : final ? 'failed' : 'retrying';
|
|
258
|
+
await recordAttempt(firestore, envelope.hostId, doc.id, {
|
|
259
|
+
id: deliveryId,
|
|
260
|
+
eventId: envelope.id,
|
|
261
|
+
event: envelope.event,
|
|
262
|
+
orderId,
|
|
263
|
+
body,
|
|
264
|
+
prior
|
|
265
|
+
}, settled, status, clock());
|
|
266
|
+
if (status === 'failed') {
|
|
267
|
+
var _settled_attempt_error;
|
|
268
|
+
await notifyHostManagers(envelope.hostId, {
|
|
269
|
+
type: 'content.order',
|
|
270
|
+
title: 'An order webhook could not be delivered',
|
|
271
|
+
body: `${envelope.event} never reached ${safeHost(endpoint.url)} on {site} after ` + `${envelope.attempt} attempts (${(_settled_attempt_error = settled.attempt.error) != null ? _settled_attempt_error : 'no answer'}). ` + 'Resend it from the delivery log once the endpoint is fixed.',
|
|
272
|
+
link: `/${envelope.hostId}/products/settings`
|
|
273
|
+
}).catch(()=>undefined);
|
|
274
|
+
}
|
|
275
|
+
return status;
|
|
276
|
+
}));
|
|
277
|
+
const delivered = outcomes.filter((status)=>status === 'delivered').length;
|
|
278
|
+
const failed = outcomes.length - delivered;
|
|
279
|
+
if (failed > 0 && !final) {
|
|
280
|
+
throw new Error(`${failed} of ${outcomes.length} order webhook endpoints did not take ${envelope.event}`);
|
|
281
|
+
}
|
|
282
|
+
return {
|
|
283
|
+
delivered,
|
|
284
|
+
failed
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
/** One signed attempt at one endpoint; a missing key or secret is a failed attempt. */ async function attemptEndpoint(input) {
|
|
288
|
+
const failed = (error)=>({
|
|
289
|
+
delivered: false,
|
|
290
|
+
attempt: {
|
|
291
|
+
atMs: input.clock(),
|
|
292
|
+
httpStatus: null,
|
|
293
|
+
error,
|
|
294
|
+
durationMs: 0
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
if (!input.keyring) return failed('Webhook signing is not configured');
|
|
298
|
+
let secret;
|
|
299
|
+
try {
|
|
300
|
+
secret = await readSecret(input.firestore, input.hostId, input.endpointId, input.keyring);
|
|
301
|
+
} catch (error) {
|
|
302
|
+
var _ref;
|
|
303
|
+
return failed(`The signing secret could not be read: ${String((_ref = error == null ? void 0 : error.message) != null ? _ref : error).slice(0, 120)}`);
|
|
304
|
+
}
|
|
305
|
+
return postOrderWebhook({
|
|
306
|
+
url: input.url,
|
|
307
|
+
secret,
|
|
308
|
+
event: input.event,
|
|
309
|
+
eventId: input.eventId,
|
|
310
|
+
body: input.body,
|
|
311
|
+
fetchImpl: input.fetchImpl,
|
|
312
|
+
now: input.clock
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
function safeHost(url) {
|
|
316
|
+
try {
|
|
317
|
+
return new URL(url).hostname;
|
|
318
|
+
} catch (unused) {
|
|
319
|
+
return 'the endpoint';
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
// ---------------------------------------------------------------------------
|
|
323
|
+
// The console's door
|
|
324
|
+
// ---------------------------------------------------------------------------
|
|
325
|
+
const ACTIONS = [
|
|
326
|
+
'status',
|
|
327
|
+
'create',
|
|
328
|
+
'update',
|
|
329
|
+
'roll-secret',
|
|
330
|
+
'delete',
|
|
331
|
+
'test',
|
|
332
|
+
'resend'
|
|
333
|
+
];
|
|
334
|
+
const isId = (value)=>Boolean(value) && value.length <= 1500 && !/^__.*__$/.test(value) && !value.includes('/');
|
|
335
|
+
function cleanUrl(raw) {
|
|
336
|
+
const url = String(raw != null ? raw : '').trim();
|
|
337
|
+
if (!url) return {
|
|
338
|
+
error: 'Enter the endpoint’s address'
|
|
339
|
+
};
|
|
340
|
+
if (url.length > 2048) return {
|
|
341
|
+
error: 'That address is too long'
|
|
342
|
+
};
|
|
343
|
+
const refusal = configuredUrlRefusal(url);
|
|
344
|
+
if (refusal) return {
|
|
345
|
+
error: `This endpoint cannot be used: ${describeConfiguredUrlRefusal(refusal)}`
|
|
346
|
+
};
|
|
347
|
+
return {
|
|
348
|
+
url
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
const cleanDescription = (raw)=>String(raw != null ? raw : '').trim().slice(0, 120);
|
|
352
|
+
/**
|
|
353
|
+
* `POST /api/commerce/order-webhooks` with `{ hostId, action, … }`. Endpoints
|
|
354
|
+
* post the order book to an outside server, so only an admin of the whole
|
|
355
|
+
* workspace manages them — the bar a refund sets.
|
|
356
|
+
*
|
|
357
|
+
* - `status` → `{ configured, events: [{ event, label, description }] }`
|
|
358
|
+
* - `create` `{ url, events, description? }` → `{ id, secret }` (shown once)
|
|
359
|
+
* - `update` `{ endpointId, url?, events?, enabled?, description? }`
|
|
360
|
+
* - `roll-secret` `{ endpointId }` → `{ secret }`
|
|
361
|
+
* - `delete` `{ endpointId }`; the delivery log stays until it expires
|
|
362
|
+
* - `test` `{ endpointId }` → posts a `webhook.test` event now
|
|
363
|
+
* - `resend` `{ deliveryId }` → posts a logged delivery again now
|
|
364
|
+
*/ export const orderWebhooksHandler = async (req, res)=>{
|
|
365
|
+
var _req_headers_authorization, _body_hostId, _body_action;
|
|
366
|
+
if (req.method !== 'POST') return res.status(405).json({
|
|
367
|
+
error: 'Method not allowed'
|
|
368
|
+
});
|
|
369
|
+
const authorization = String((_req_headers_authorization = req.headers.authorization) != null ? _req_headers_authorization : '');
|
|
370
|
+
const idToken = authorization.startsWith('Bearer ') ? authorization.slice('Bearer '.length) : undefined;
|
|
371
|
+
if (!idToken) return res.status(401).json({
|
|
372
|
+
error: 'Unauthenticated'
|
|
373
|
+
});
|
|
374
|
+
let body;
|
|
375
|
+
try {
|
|
376
|
+
var _ref;
|
|
377
|
+
body = (_ref = typeof req.body === 'string' ? JSON.parse(req.body) : req.body) != null ? _ref : {};
|
|
378
|
+
} catch (unused) {
|
|
379
|
+
return res.status(400).json({
|
|
380
|
+
error: 'Invalid JSON'
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
const hostId = String((_body_hostId = body.hostId) != null ? _body_hostId : '');
|
|
384
|
+
const action = String((_body_action = body.action) != null ? _body_action : '');
|
|
385
|
+
if (!isId(hostId)) return res.status(400).json({
|
|
386
|
+
error: 'Missing hostId'
|
|
387
|
+
});
|
|
388
|
+
if (!ACTIONS.includes(action)) return res.status(400).json({
|
|
389
|
+
error: 'Unknown action'
|
|
390
|
+
});
|
|
391
|
+
try {
|
|
392
|
+
var _hostSnapshot_get, _body_endpointId;
|
|
393
|
+
const decoded = await firebaseAdmin.app().auth().verifyIdToken(idToken);
|
|
394
|
+
const firestore = firebaseAdmin.app().firestore();
|
|
395
|
+
const hostRef = hostRefFor(firestore, hostId);
|
|
396
|
+
const hostSnapshot = await hostRef.get();
|
|
397
|
+
if (!hostSnapshot.exists) return res.status(404).json({
|
|
398
|
+
error: 'Unknown site'
|
|
399
|
+
});
|
|
400
|
+
if (((_hostSnapshot_get = hostSnapshot.get('memberRoles')) != null ? _hostSnapshot_get : {})[decoded.uid] !== 'admin') {
|
|
401
|
+
return res.status(403).json({
|
|
402
|
+
error: 'Webhooks are managed by a site admin'
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
const membership = await resolveOrgPermissions(decoded.uid, {
|
|
406
|
+
hostId
|
|
407
|
+
});
|
|
408
|
+
if (!membership.orgWide || membership.hostRole !== 'admin') {
|
|
409
|
+
return res.status(403).json({
|
|
410
|
+
error: 'Webhooks are managed by an admin of the whole workspace'
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
const keyring = readCommerceSecretKeyring();
|
|
414
|
+
if (action === 'status') {
|
|
415
|
+
return res.status(200).json({
|
|
416
|
+
configured: Boolean(keyring),
|
|
417
|
+
maxEndpoints: Webhooks.ORDER_WEBHOOK_MAX_ENDPOINTS,
|
|
418
|
+
events: COMMERCE_EVENT_DECLARATIONS.map((entry)=>({
|
|
419
|
+
event: entry.event.id,
|
|
420
|
+
label: entry.label,
|
|
421
|
+
description: entry.description
|
|
422
|
+
}))
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
if (!keyring) {
|
|
426
|
+
return res.status(503).json({
|
|
427
|
+
error: 'Order webhooks are not configured on this deployment'
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
const now = Date.now();
|
|
431
|
+
const endpoints = hostRef.collection('orderWebhooks');
|
|
432
|
+
if (action === 'create') {
|
|
433
|
+
const url = cleanUrl(body.url);
|
|
434
|
+
if ('error' in url) return res.status(400).json({
|
|
435
|
+
error: url.error
|
|
436
|
+
});
|
|
437
|
+
const events = Webhooks.normalizeOrderWebhookEvents(body.events);
|
|
438
|
+
if (events.length === 0) return res.status(400).json({
|
|
439
|
+
error: 'Choose at least one event'
|
|
440
|
+
});
|
|
441
|
+
const secret = mintOrderWebhookSecret();
|
|
442
|
+
const ref = endpoints.doc(createResourceUid());
|
|
443
|
+
const created = await firestore.runTransaction(async (transaction)=>{
|
|
444
|
+
const existing = await transaction.get(endpoints.limit(Webhooks.ORDER_WEBHOOK_MAX_ENDPOINTS));
|
|
445
|
+
if (existing.size >= Webhooks.ORDER_WEBHOOK_MAX_ENDPOINTS) return false;
|
|
446
|
+
const endpoint = _extends({
|
|
447
|
+
url: url.url,
|
|
448
|
+
events,
|
|
449
|
+
enabled: true
|
|
450
|
+
}, cleanDescription(body.description) ? {
|
|
451
|
+
description: cleanDescription(body.description)
|
|
452
|
+
} : {}, {
|
|
453
|
+
secretHint: secret.slice(-4),
|
|
454
|
+
consecutiveFailures: 0,
|
|
455
|
+
createdAtMs: now,
|
|
456
|
+
updatedAtMs: now,
|
|
457
|
+
createdBy: decoded.uid
|
|
458
|
+
});
|
|
459
|
+
transaction.create(ref, endpoint);
|
|
460
|
+
transaction.create(hostRef.collection('orderWebhookSecrets').doc(ref.id), sealedSecretRecord(hostId, ref.id, secret, keyring, now));
|
|
461
|
+
return true;
|
|
462
|
+
});
|
|
463
|
+
if (!created) {
|
|
464
|
+
return res.status(409).json({
|
|
465
|
+
error: `A store can keep ${Webhooks.ORDER_WEBHOOK_MAX_ENDPOINTS} webhook endpoints`
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
return res.status(200).json({
|
|
469
|
+
ok: true,
|
|
470
|
+
id: ref.id,
|
|
471
|
+
secret
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
if (action === 'resend') {
|
|
475
|
+
var _body_deliveryId;
|
|
476
|
+
const deliveryId = String((_body_deliveryId = body.deliveryId) != null ? _body_deliveryId : '');
|
|
477
|
+
if (!isId(deliveryId)) return res.status(400).json({
|
|
478
|
+
error: 'Missing deliveryId'
|
|
479
|
+
});
|
|
480
|
+
const deliveryRef = hostRef.collection('orderWebhookDeliveries').doc(deliveryId);
|
|
481
|
+
const deliverySnapshot = await deliveryRef.get();
|
|
482
|
+
if (!deliverySnapshot.exists) return res.status(404).json({
|
|
483
|
+
error: 'Unknown delivery'
|
|
484
|
+
});
|
|
485
|
+
const delivery = deliverySnapshot.data();
|
|
486
|
+
const endpointSnapshot = await endpoints.doc(delivery.endpointId).get();
|
|
487
|
+
if (!endpointSnapshot.exists) return res.status(404).json({
|
|
488
|
+
error: 'That endpoint was deleted'
|
|
489
|
+
});
|
|
490
|
+
if (delivery.body.length >= Webhooks.ORDER_WEBHOOK_BODY_MAX) {
|
|
491
|
+
return res.status(409).json({
|
|
492
|
+
error: 'This delivery was too large to keep, so it cannot be resent'
|
|
493
|
+
});
|
|
494
|
+
}
|
|
495
|
+
const endpoint = endpointSnapshot.data();
|
|
496
|
+
const secret = await readSecret(firestore, hostId, delivery.endpointId, keyring);
|
|
497
|
+
const result = await postOrderWebhook({
|
|
498
|
+
url: endpoint.url,
|
|
499
|
+
secret,
|
|
500
|
+
event: delivery.event,
|
|
501
|
+
eventId: delivery.eventId,
|
|
502
|
+
body: delivery.body
|
|
503
|
+
});
|
|
504
|
+
const status = result.delivered ? 'delivered' : delivery.status === 'delivered' ? 'delivered' : delivery.status;
|
|
505
|
+
await recordAttempt(firestore, hostId, delivery.endpointId, {
|
|
506
|
+
id: deliveryId,
|
|
507
|
+
eventId: delivery.eventId,
|
|
508
|
+
event: delivery.event,
|
|
509
|
+
orderId: delivery.orderId,
|
|
510
|
+
body: delivery.body,
|
|
511
|
+
test: delivery.test,
|
|
512
|
+
prior: delivery
|
|
513
|
+
}, result, status, Date.now());
|
|
514
|
+
return res.status(200).json({
|
|
515
|
+
ok: true,
|
|
516
|
+
delivered: result.delivered,
|
|
517
|
+
attempt: result.attempt
|
|
518
|
+
});
|
|
519
|
+
}
|
|
520
|
+
const endpointId = String((_body_endpointId = body.endpointId) != null ? _body_endpointId : '');
|
|
521
|
+
if (!isId(endpointId)) return res.status(400).json({
|
|
522
|
+
error: 'Missing endpointId'
|
|
523
|
+
});
|
|
524
|
+
const endpointRef = endpoints.doc(endpointId);
|
|
525
|
+
const endpointSnapshot = await endpointRef.get();
|
|
526
|
+
if (!endpointSnapshot.exists) return res.status(404).json({
|
|
527
|
+
error: 'Unknown endpoint'
|
|
528
|
+
});
|
|
529
|
+
const endpoint = endpointSnapshot.data();
|
|
530
|
+
if (action === 'update') {
|
|
531
|
+
const patch = {
|
|
532
|
+
updatedAtMs: now
|
|
533
|
+
};
|
|
534
|
+
if (body.url !== undefined) {
|
|
535
|
+
const url = cleanUrl(body.url);
|
|
536
|
+
if ('error' in url) return res.status(400).json({
|
|
537
|
+
error: url.error
|
|
538
|
+
});
|
|
539
|
+
patch.url = url.url;
|
|
540
|
+
}
|
|
541
|
+
if (body.events !== undefined) {
|
|
542
|
+
const events = Webhooks.normalizeOrderWebhookEvents(body.events);
|
|
543
|
+
if (events.length === 0) return res.status(400).json({
|
|
544
|
+
error: 'Choose at least one event'
|
|
545
|
+
});
|
|
546
|
+
patch.events = events;
|
|
547
|
+
}
|
|
548
|
+
if (body.enabled !== undefined) {
|
|
549
|
+
patch.enabled = Boolean(body.enabled);
|
|
550
|
+
if (patch.enabled) patch.consecutiveFailures = 0;
|
|
551
|
+
}
|
|
552
|
+
if (body.description !== undefined) patch.description = cleanDescription(body.description);
|
|
553
|
+
await endpointRef.update(patch);
|
|
554
|
+
return res.status(200).json({
|
|
555
|
+
ok: true
|
|
556
|
+
});
|
|
557
|
+
}
|
|
558
|
+
if (action === 'roll-secret') {
|
|
559
|
+
const secret = mintOrderWebhookSecret();
|
|
560
|
+
const batch = firestore.batch();
|
|
561
|
+
batch.set(hostRef.collection('orderWebhookSecrets').doc(endpointId), sealedSecretRecord(hostId, endpointId, secret, keyring, now));
|
|
562
|
+
batch.update(endpointRef, {
|
|
563
|
+
secretHint: secret.slice(-4),
|
|
564
|
+
updatedAtMs: now
|
|
565
|
+
});
|
|
566
|
+
await batch.commit();
|
|
567
|
+
return res.status(200).json({
|
|
568
|
+
ok: true,
|
|
569
|
+
secret
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
if (action === 'delete') {
|
|
573
|
+
const batch = firestore.batch();
|
|
574
|
+
batch.delete(endpointRef);
|
|
575
|
+
batch.delete(hostRef.collection('orderWebhookSecrets').doc(endpointId));
|
|
576
|
+
await batch.commit();
|
|
577
|
+
return res.status(200).json({
|
|
578
|
+
ok: true
|
|
579
|
+
});
|
|
580
|
+
}
|
|
581
|
+
// test
|
|
582
|
+
const eventId = `test_${randomBytes(9).toString('base64url')}`;
|
|
583
|
+
const testBody = Webhooks.orderWebhookBody({
|
|
584
|
+
eventId,
|
|
585
|
+
event: Webhooks.ORDER_WEBHOOK_TEST_EVENT,
|
|
586
|
+
occurredAtMs: now,
|
|
587
|
+
hostId,
|
|
588
|
+
payload: {
|
|
589
|
+
message: `A test event from ${PLATFORM_BRAND_NAME}. Answer with any 2xx status.`
|
|
590
|
+
}
|
|
591
|
+
});
|
|
592
|
+
const secret = await readSecret(firestore, hostId, endpointId, keyring);
|
|
593
|
+
const result = await postOrderWebhook({
|
|
594
|
+
url: endpoint.url,
|
|
595
|
+
secret,
|
|
596
|
+
event: Webhooks.ORDER_WEBHOOK_TEST_EVENT,
|
|
597
|
+
eventId,
|
|
598
|
+
body: testBody
|
|
599
|
+
});
|
|
600
|
+
await recordAttempt(firestore, hostId, endpointId, {
|
|
601
|
+
id: Webhooks.orderWebhookDeliveryId(eventId, endpointId),
|
|
602
|
+
eventId,
|
|
603
|
+
event: Webhooks.ORDER_WEBHOOK_TEST_EVENT,
|
|
604
|
+
orderId: null,
|
|
605
|
+
body: testBody,
|
|
606
|
+
test: true,
|
|
607
|
+
prior: null
|
|
608
|
+
}, result, result.delivered ? 'delivered' : 'failed', Date.now());
|
|
609
|
+
return res.status(200).json({
|
|
610
|
+
ok: true,
|
|
611
|
+
delivered: result.delivered,
|
|
612
|
+
attempt: result.attempt
|
|
613
|
+
});
|
|
614
|
+
} catch (error) {
|
|
615
|
+
console.error('order webhooks action failed', action, error);
|
|
616
|
+
return res.status(500).json({
|
|
617
|
+
error: 'The webhook could not be updated. Please try again.'
|
|
618
|
+
});
|
|
619
|
+
}
|
|
620
|
+
};
|
|
621
|
+
|
|
622
|
+
//# sourceMappingURL=order-webhooks.js.map
|