spree_api 5.6.1 → 6.0.0.beta1
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.
- checksums.yaml +4 -4
- data/LICENSE +28 -0
- data/Rakefile +1 -1
- data/app/controllers/concerns/spree/api/v3/address_params.rb +17 -0
- data/app/controllers/concerns/spree/api/v3/admin/product_listing.rb +46 -0
- data/app/controllers/concerns/spree/api/v3/admin/product_membership.rb +110 -0
- data/app/controllers/concerns/spree/api/v3/admin/receivable_actions.rb +68 -0
- data/app/controllers/concerns/spree/api/v3/admin/reporting_authorization.rb +27 -0
- data/app/controllers/concerns/spree/api/v3/admin/role_grant_guard.rb +69 -33
- data/app/controllers/concerns/spree/api/v3/admin/stock_receipt_actions.rb +86 -0
- data/app/controllers/concerns/spree/api/v3/admin/store_context.rb +97 -0
- data/app/controllers/concerns/spree/api/v3/admin/subclassed_resource.rb +12 -6
- data/app/controllers/concerns/spree/api/v3/admin/validation_details.rb +91 -0
- data/app/controllers/concerns/spree/api/v3/admin_authentication.rb +9 -5
- data/app/controllers/concerns/spree/api/v3/api_key_authentication.rb +41 -5
- data/app/controllers/concerns/spree/api/v3/authentication_strategies.rb +48 -0
- data/app/controllers/concerns/spree/api/v3/bulk_operations.rb +4 -6
- data/app/controllers/concerns/spree/api/v3/cart_resolvable.rb +52 -16
- data/app/controllers/concerns/spree/api/v3/company_address_writes.rb +37 -0
- data/app/controllers/concerns/spree/api/v3/current_password_confirmation.rb +41 -0
- data/app/controllers/concerns/spree/api/v3/direct_uploads.rb +35 -0
- data/app/controllers/concerns/spree/api/v3/error_handler.rb +53 -11
- data/app/controllers/concerns/spree/api/v3/idempotent.rb +10 -4
- data/app/controllers/concerns/spree/api/v3/items_payload.rb +54 -0
- data/app/controllers/concerns/spree/api/v3/jwt_authentication.rb +23 -3
- data/app/controllers/concerns/spree/api/v3/key_store_context.rb +31 -0
- data/app/controllers/concerns/spree/api/v3/locale_and_currency.rb +3 -3
- data/app/controllers/concerns/spree/api/v3/order_lock.rb +22 -3
- data/app/controllers/concerns/spree/api/v3/orders/claim_actions.rb +112 -0
- data/app/controllers/concerns/spree/api/v3/orders/delivery_actions.rb +105 -0
- data/app/controllers/concerns/spree/api/v3/orders/exchange_actions.rb +117 -0
- data/app/controllers/concerns/spree/api/v3/orders/fulfillment_actions.rb +157 -0
- data/app/controllers/concerns/spree/api/v3/orders/post_sale_actions.rb +76 -0
- data/app/controllers/concerns/spree/api/v3/orders/return_actions.rb +116 -0
- data/app/controllers/concerns/spree/api/v3/orders/shipping_label_actions.rb +128 -0
- data/app/controllers/concerns/spree/api/v3/params_normalizer.rb +7 -4
- data/app/controllers/concerns/spree/api/v3/permission_serialization.rb +42 -0
- data/app/controllers/concerns/spree/api/v3/rate_limit_headers.rb +40 -6
- data/app/controllers/concerns/spree/api/v3/scoped_authorization.rb +80 -26
- data/app/controllers/concerns/spree/api/v3/seller/auth_cookies.rb +62 -0
- data/app/controllers/concerns/spree/api/v3/seller/seller_context.rb +127 -0
- data/app/controllers/concerns/spree/api/v3/seller_authentication.rb +40 -0
- data/app/controllers/concerns/spree/api/v3/storefront_access.rb +38 -0
- data/app/controllers/concerns/spree/api/v3/streams_shipping_label.rb +37 -0
- data/app/controllers/concerns/spree/api/v3/tax_identifier_validation.rb +41 -0
- data/app/controllers/spree/api/v3/admin/admin_users_controller.rb +11 -14
- data/app/controllers/spree/api/v3/admin/allowed_origins_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/api_keys_controller.rb +16 -7
- data/app/controllers/spree/api/v3/admin/auth_controller.rb +138 -22
- data/app/controllers/spree/api/v3/admin/base_controller.rb +2 -0
- data/app/controllers/spree/api/v3/admin/catalog_assignments_controller.rb +27 -0
- data/app/controllers/spree/api/v3/admin/catalogs/base_controller.rb +29 -0
- data/app/controllers/spree/api/v3/admin/catalogs/order_minimums_controller.rb +40 -0
- data/app/controllers/spree/api/v3/admin/catalogs/products_controller.rb +107 -0
- data/app/controllers/spree/api/v3/admin/catalogs/quantity_rules_controller.rb +75 -0
- data/app/controllers/spree/api/v3/admin/catalogs_controller.rb +191 -0
- data/app/controllers/spree/api/v3/admin/categories/products_controller.rb +28 -41
- data/app/controllers/spree/api/v3/admin/categories_controller.rb +16 -7
- data/app/controllers/spree/api/v3/admin/channels_controller.rb +50 -2
- data/app/controllers/spree/api/v3/admin/claim_reasons_controller.rb +25 -0
- data/app/controllers/spree/api/v3/admin/claims_controller.rb +31 -0
- data/app/controllers/spree/api/v3/admin/collection_rules_controller.rb +40 -0
- data/app/controllers/spree/api/v3/admin/collections/products_controller.rb +101 -0
- data/app/controllers/spree/api/v3/admin/collections_controller.rb +56 -0
- data/app/controllers/spree/api/v3/admin/commission_lines_controller.rb +39 -0
- data/app/controllers/spree/api/v3/admin/commission_rates_controller.rb +174 -0
- data/app/controllers/spree/api/v3/admin/companies/addresses_controller.rb +65 -0
- data/app/controllers/spree/api/v3/admin/companies/base_controller.rb +29 -0
- data/app/controllers/spree/api/v3/admin/companies/invitations_controller.rb +56 -0
- data/app/controllers/spree/api/v3/admin/companies/memberships_controller.rb +66 -0
- data/app/controllers/spree/api/v3/admin/companies/tax_exemption_certificates_controller.rb +137 -0
- data/app/controllers/spree/api/v3/admin/companies/tax_identifiers_controller.rb +46 -0
- data/app/controllers/spree/api/v3/admin/companies_controller.rb +59 -0
- data/app/controllers/spree/api/v3/admin/concerns/external_references.rb +166 -0
- data/app/controllers/spree/api/v3/admin/consent_records_controller.rb +31 -0
- data/app/controllers/spree/api/v3/admin/countries_controller.rb +12 -4
- data/app/controllers/spree/api/v3/admin/custom_field_definitions_controller.rb +19 -4
- data/app/controllers/spree/api/v3/admin/custom_fields_controller.rb +5 -5
- data/app/controllers/spree/api/v3/admin/customer_groups_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/customers/addresses_controller.rb +4 -4
- data/app/controllers/spree/api/v3/admin/customers/base_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/customers/store_credits_controller.rb +2 -3
- data/app/controllers/spree/api/v3/admin/customers/tax_identifiers_controller.rb +43 -0
- data/app/controllers/spree/api/v3/admin/customers_controller.rb +190 -11
- data/app/controllers/spree/api/v3/admin/dashboard_controller.rb +24 -20
- data/app/controllers/spree/api/v3/admin/data_requests_controller.rb +60 -0
- data/app/controllers/spree/api/v3/admin/delivery_method_rules_controller.rb +54 -0
- data/app/controllers/spree/api/v3/admin/delivery_methods/rules_controller.rb +114 -0
- data/app/controllers/spree/api/v3/admin/delivery_methods_controller.rb +243 -0
- data/app/controllers/spree/api/v3/admin/delivery_profiles/origin_groups_controller.rb +80 -0
- data/app/controllers/spree/api/v3/admin/delivery_profiles_controller.rb +107 -0
- data/app/controllers/spree/api/v3/admin/delivery_zones_controller.rb +116 -0
- data/app/controllers/spree/api/v3/admin/digital_links_controller.rb +48 -0
- data/app/controllers/spree/api/v3/admin/direct_uploads_controller.rb +17 -3
- data/app/controllers/spree/api/v3/admin/exchanges_controller.rb +31 -0
- data/app/controllers/spree/api/v3/admin/exports_controller.rb +2 -2
- data/app/controllers/spree/api/v3/admin/gift_card_batches_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/gift_cards_controller.rb +3 -2
- data/app/controllers/spree/api/v3/admin/imports_controller.rb +71 -8
- data/app/controllers/spree/api/v3/admin/integrations_controller.rb +67 -0
- data/app/controllers/spree/api/v3/admin/invitation_acceptances_controller.rb +5 -5
- data/app/controllers/spree/api/v3/admin/invitations_controller.rb +5 -1
- data/app/controllers/spree/api/v3/admin/locales_controller.rb +3 -1
- data/app/controllers/spree/api/v3/admin/markets_controller.rb +9 -5
- data/app/controllers/spree/api/v3/admin/me_controller.rb +4 -30
- data/app/controllers/spree/api/v3/admin/media_controller.rb +88 -38
- data/app/controllers/spree/api/v3/admin/media_library_controller.rb +156 -0
- data/app/controllers/spree/api/v3/admin/option_types_controller.rb +1 -0
- data/app/controllers/spree/api/v3/admin/order_cancellation_reasons_controller.rb +25 -0
- data/app/controllers/spree/api/v3/admin/order_groups_controller.rb +43 -0
- data/app/controllers/spree/api/v3/admin/order_routing_rules_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/orders/claims_controller.rb +56 -0
- data/app/controllers/spree/api/v3/admin/orders/deliveries_controller.rb +66 -0
- data/app/controllers/spree/api/v3/admin/orders/discount_codes_controller.rb +86 -0
- data/app/controllers/spree/api/v3/admin/orders/discounts_controller.rb +99 -0
- data/app/controllers/spree/api/v3/admin/orders/exchanges_controller.rb +62 -0
- data/app/controllers/spree/api/v3/admin/orders/fees_controller.rb +83 -0
- data/app/controllers/spree/api/v3/admin/orders/fulfillments_controller.rb +45 -67
- data/app/controllers/spree/api/v3/admin/orders/items_controller.rb +40 -22
- data/app/controllers/spree/api/v3/admin/orders/labels_controller.rb +75 -0
- data/app/controllers/spree/api/v3/admin/orders/payments_controller.rb +36 -18
- data/app/controllers/spree/api/v3/admin/orders/refunds_controller.rb +39 -18
- data/app/controllers/spree/api/v3/admin/orders/returns_controller.rb +70 -0
- data/app/controllers/spree/api/v3/admin/orders/store_credits_controller.rb +2 -2
- data/app/controllers/spree/api/v3/admin/orders/tax_identifiers_controller.rb +41 -0
- data/app/controllers/spree/api/v3/admin/orders/tax_lines_controller.rb +32 -0
- data/app/controllers/spree/api/v3/admin/orders_controller.rb +157 -32
- data/app/controllers/spree/api/v3/admin/package_types_controller.rb +39 -0
- data/app/controllers/spree/api/v3/admin/password_resets_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/payment_methods_controller.rb +15 -4
- data/app/controllers/spree/api/v3/admin/payout_providers_controller.rb +27 -0
- data/app/controllers/spree/api/v3/admin/permissions_controller.rb +30 -0
- data/app/controllers/spree/api/v3/admin/policies_controller.rb +42 -0
- data/app/controllers/spree/api/v3/admin/price_lists/products_controller.rb +93 -0
- data/app/controllers/spree/api/v3/admin/price_lists_controller.rb +43 -29
- data/app/controllers/spree/api/v3/admin/prices_controller.rb +41 -4
- data/app/controllers/spree/api/v3/admin/product_types_controller.rb +93 -0
- data/app/controllers/spree/api/v3/admin/products/digital_assets_controller.rb +148 -0
- data/app/controllers/spree/api/v3/admin/products/variants_controller.rb +24 -3
- data/app/controllers/spree/api/v3/admin/products_controller.rb +149 -33
- data/app/controllers/spree/api/v3/admin/promotion_actions_controller.rb +6 -2
- data/app/controllers/spree/api/v3/admin/promotion_rules_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/promotions_controller.rb +1 -5
- data/app/controllers/spree/api/v3/admin/purchase_orders/stock_receipts_controller.rb +32 -0
- data/app/controllers/spree/api/v3/admin/purchase_orders_controller.rb +161 -0
- data/app/controllers/spree/api/v3/admin/refund_reasons_controller.rb +25 -0
- data/app/controllers/spree/api/v3/admin/reporting/saved_reports_controller.rb +45 -0
- data/app/controllers/spree/api/v3/admin/reporting_controller.rb +95 -0
- data/app/controllers/spree/api/v3/admin/resource_controller.rb +27 -10
- data/app/controllers/spree/api/v3/admin/return_reasons_controller.rb +25 -0
- data/app/controllers/spree/api/v3/admin/returns_controller.rb +31 -0
- data/app/controllers/spree/api/v3/admin/roles_controller.rb +50 -6
- data/app/controllers/spree/api/v3/admin/seller_payouts_controller.rb +83 -0
- data/app/controllers/spree/api/v3/admin/seller_requirement_submissions_controller.rb +139 -0
- data/app/controllers/spree/api/v3/admin/seller_requirements_controller.rb +115 -0
- data/app/controllers/spree/api/v3/admin/seller_transfers_controller.rb +36 -0
- data/app/controllers/spree/api/v3/admin/sellers/balances_controller.rb +44 -0
- data/app/controllers/spree/api/v3/admin/sellers/invitations_controller.rb +77 -0
- data/app/controllers/spree/api/v3/admin/sellers/payouts_controller.rb +107 -0
- data/app/controllers/spree/api/v3/admin/sellers/team_controller.rb +64 -0
- data/app/controllers/spree/api/v3/admin/sellers_controller.rb +197 -0
- data/app/controllers/spree/api/v3/admin/setup_controller.rb +231 -0
- data/app/controllers/spree/api/v3/admin/stock_levels_controller.rb +172 -0
- data/app/controllers/spree/api/v3/admin/stock_locations_controller.rb +3 -2
- data/app/controllers/spree/api/v3/admin/stock_movements_controller.rb +37 -0
- data/app/controllers/spree/api/v3/admin/stock_reservations_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/stock_transfers/stock_receipts_controller.rb +31 -0
- data/app/controllers/spree/api/v3/admin/stock_transfers_controller.rb +134 -38
- data/app/controllers/spree/api/v3/admin/store_controller.rb +65 -0
- data/app/controllers/spree/api/v3/admin/store_credits/events_controller.rb +47 -0
- data/app/controllers/spree/api/v3/admin/store_credits_controller.rb +87 -0
- data/app/controllers/spree/api/v3/admin/suppliers_controller.rb +30 -0
- data/app/controllers/spree/api/v3/admin/tags_controller.rb +2 -2
- data/app/controllers/spree/api/v3/admin/tax_categories_controller.rb +4 -0
- data/app/controllers/spree/api/v3/admin/tax_providers_controller.rb +25 -0
- data/app/controllers/spree/api/v3/admin/tax_rates_controller.rb +33 -0
- data/app/controllers/spree/api/v3/admin/tracking_carriers_controller.rb +33 -0
- data/app/controllers/spree/api/v3/admin/translatable_resources_controller.rb +37 -9
- data/app/controllers/spree/api/v3/admin/translations_controller.rb +10 -5
- data/app/controllers/spree/api/v3/admin/translations_coverage_controller.rb +150 -0
- data/app/controllers/spree/api/v3/admin/variants_controller.rb +11 -4
- data/app/controllers/spree/api/v3/admin/webhook_endpoints_controller.rb +1 -1
- data/app/controllers/spree/api/v3/base_controller.rb +59 -16
- data/app/controllers/spree/api/v3/resource_controller.rb +154 -38
- data/app/controllers/spree/api/v3/seller/auth_controller.rb +169 -0
- data/app/controllers/spree/api/v3/seller/balances_controller.rb +35 -0
- data/app/controllers/spree/api/v3/seller/base_controller.rb +25 -0
- data/app/controllers/spree/api/v3/seller/claim_reasons_controller.rb +20 -0
- data/app/controllers/spree/api/v3/seller/countries_controller.rb +38 -0
- data/app/controllers/spree/api/v3/seller/delivery_methods_controller.rb +265 -0
- data/app/controllers/spree/api/v3/seller/delivery_profiles_controller.rb +65 -0
- data/app/controllers/spree/api/v3/seller/delivery_zones_controller.rb +41 -0
- data/app/controllers/spree/api/v3/seller/direct_uploads_controller.rb +21 -0
- data/app/controllers/spree/api/v3/seller/exports_controller.rb +195 -0
- data/app/controllers/spree/api/v3/seller/import_rows_controller.rb +49 -0
- data/app/controllers/spree/api/v3/seller/imports_controller.rb +317 -0
- data/app/controllers/spree/api/v3/seller/invitation_acceptances_controller.rb +152 -0
- data/app/controllers/spree/api/v3/seller/invitations_controller.rb +71 -0
- data/app/controllers/spree/api/v3/seller/me_controller.rb +72 -0
- data/app/controllers/spree/api/v3/seller/onboarding_controller.rb +111 -0
- data/app/controllers/spree/api/v3/seller/order_cancellation_reasons_controller.rb +25 -0
- data/app/controllers/spree/api/v3/seller/orders/base_controller.rb +44 -0
- data/app/controllers/spree/api/v3/seller/orders/claims_controller.rb +45 -0
- data/app/controllers/spree/api/v3/seller/orders/deliveries_controller.rb +38 -0
- data/app/controllers/spree/api/v3/seller/orders/exchanges_controller.rb +50 -0
- data/app/controllers/spree/api/v3/seller/orders/fulfillments_controller.rb +79 -0
- data/app/controllers/spree/api/v3/seller/orders/labels_controller.rb +55 -0
- data/app/controllers/spree/api/v3/seller/orders/notes_controller.rb +82 -0
- data/app/controllers/spree/api/v3/seller/orders/returns_controller.rb +44 -0
- data/app/controllers/spree/api/v3/seller/orders_controller.rb +199 -0
- data/app/controllers/spree/api/v3/seller/package_types_controller.rb +100 -0
- data/app/controllers/spree/api/v3/seller/password_resets_controller.rb +155 -0
- data/app/controllers/spree/api/v3/seller/payouts_controller.rb +47 -0
- data/app/controllers/spree/api/v3/seller/policies_controller.rb +57 -0
- data/app/controllers/spree/api/v3/seller/product_types_controller.rb +35 -0
- data/app/controllers/spree/api/v3/seller/products_controller.rb +394 -0
- data/app/controllers/spree/api/v3/seller/profile_controller.rb +137 -0
- data/app/controllers/spree/api/v3/seller/reasons_controller.rb +45 -0
- data/app/controllers/spree/api/v3/seller/requirement_submissions_controller.rb +95 -0
- data/app/controllers/spree/api/v3/seller/resource_controller.rb +75 -0
- data/app/controllers/spree/api/v3/seller/return_reasons_controller.rb +20 -0
- data/app/controllers/spree/api/v3/seller/stock_locations_controller.rb +56 -0
- data/app/controllers/spree/api/v3/seller/tax_identifiers_controller.rb +48 -0
- data/app/controllers/spree/api/v3/seller/team_controller.rb +103 -0
- data/app/controllers/spree/api/v3/seller/tracking_carriers_controller.rb +35 -0
- data/app/controllers/spree/api/v3/seller/transfers_controller.rb +43 -0
- data/app/controllers/spree/api/v3/store/account/companies_controller.rb +42 -0
- data/app/controllers/spree/api/v3/store/auth_controller.rb +21 -34
- data/app/controllers/spree/api/v3/store/base_controller.rb +4 -0
- data/app/controllers/spree/api/v3/store/carts/discount_codes_controller.rb +24 -2
- data/app/controllers/spree/api/v3/store/carts/fulfillments_controller.rb +41 -15
- data/app/controllers/spree/api/v3/store/carts/items_controller.rb +53 -20
- data/app/controllers/spree/api/v3/store/carts/payment_sessions_controller.rb +36 -20
- data/app/controllers/spree/api/v3/store/carts/po_documents_controller.rb +111 -0
- data/app/controllers/spree/api/v3/store/carts/store_credits_controller.rb +2 -2
- data/app/controllers/spree/api/v3/store/carts/tax_identifiers_controller.rb +96 -0
- data/app/controllers/spree/api/v3/store/carts_controller.rb +57 -12
- data/app/controllers/spree/api/v3/store/categories_controller.rb +6 -3
- data/app/controllers/spree/api/v3/store/collections/products_controller.rb +59 -0
- data/app/controllers/spree/api/v3/store/collections_controller.rb +36 -0
- data/app/controllers/spree/api/v3/store/companies/addresses_controller.rb +81 -0
- data/app/controllers/spree/api/v3/store/companies/base_controller.rb +24 -0
- data/app/controllers/spree/api/v3/store/companies/invitations_controller.rb +50 -0
- data/app/controllers/spree/api/v3/store/companies/members_controller.rb +66 -0
- data/app/controllers/spree/api/v3/store/companies/orders_controller.rb +28 -0
- data/app/controllers/spree/api/v3/store/companies_controller.rb +47 -0
- data/app/controllers/spree/api/v3/store/company_invitations_controller.rb +90 -0
- data/app/controllers/spree/api/v3/store/countries_controller.rb +8 -6
- data/app/controllers/spree/api/v3/store/customer/addresses_controller.rb +3 -1
- data/app/controllers/spree/api/v3/store/customer/data_requests_controller.rb +78 -0
- data/app/controllers/spree/api/v3/store/customer/digital_links_controller.rb +52 -0
- data/app/controllers/spree/api/v3/store/customer/orders_controller.rb +6 -0
- data/app/controllers/spree/api/v3/store/customer/password_resets_controller.rb +7 -3
- data/app/controllers/spree/api/v3/store/customer/payment_setup_sessions_controller.rb +3 -3
- data/app/controllers/spree/api/v3/store/customer/store_credits_controller.rb +0 -3
- data/app/controllers/spree/api/v3/store/customer/tax_identifiers_controller.rb +91 -0
- data/app/controllers/spree/api/v3/store/customers_controller.rb +26 -31
- data/app/controllers/spree/api/v3/store/data_feeds_controller.rb +11 -0
- data/app/controllers/spree/api/v3/store/data_request_downloads_controller.rb +58 -0
- data/app/controllers/spree/api/v3/store/delivery_methods_controller.rb +108 -0
- data/app/controllers/spree/api/v3/store/digital_links_controller.rb +105 -0
- data/app/controllers/spree/api/v3/store/markets/countries_controller.rb +5 -9
- data/app/controllers/spree/api/v3/store/markets_controller.rb +4 -4
- data/app/controllers/spree/api/v3/store/newsletter_subscribers_controller.rb +8 -9
- data/app/controllers/spree/api/v3/store/orders/claims_controller.rb +94 -0
- data/app/controllers/spree/api/v3/store/orders/returns_controller.rb +116 -0
- data/app/controllers/spree/api/v3/store/orders/tax_identifiers_controller.rb +46 -0
- data/app/controllers/spree/api/v3/store/orders_controller.rb +12 -15
- data/app/controllers/spree/api/v3/store/products/filters_controller.rb +10 -3
- data/app/controllers/spree/api/v3/store/products_controller.rb +25 -6
- data/app/controllers/spree/api/v3/store/resource_controller.rb +2 -0
- data/app/controllers/spree/api/v3/store/sellers_controller.rb +43 -0
- data/app/controllers/spree/api/v3/store/wishlist_items_controller.rb +9 -6
- data/app/controllers/spree/api/v3/store/wishlists_controller.rb +3 -3
- data/app/controllers/spree/api/v3/webhooks/fulfillments_controller.rb +88 -0
- data/app/controllers/spree/api/v3/webhooks/payments_controller.rb +5 -2
- data/app/controllers/spree/api/v3/webhooks/payouts_controller.rb +61 -0
- data/app/models/spree/api/data_request_urls.rb +25 -0
- data/app/models/spree/api/digital_link_urls.rb +26 -0
- data/app/serializers/spree/api/v3/address_serializer.rb +17 -5
- data/app/serializers/spree/api/v3/admin/address_serializer.rb +27 -4
- data/app/serializers/spree/api/v3/admin/admin_user_serializer.rb +13 -10
- data/app/serializers/spree/api/v3/admin/api_key_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/admin/applied_promotion_serializer.rb +15 -0
- data/app/serializers/spree/api/v3/admin/cart_serializer.rb +34 -0
- data/app/serializers/spree/api/v3/admin/catalog_assignment_serializer.rb +32 -0
- data/app/serializers/spree/api/v3/admin/catalog_order_minimum_serializer.rb +23 -0
- data/app/serializers/spree/api/v3/admin/catalog_price_serializer.rb +48 -0
- data/app/serializers/spree/api/v3/admin/catalog_price_tier_serializer.rb +23 -0
- data/app/serializers/spree/api/v3/admin/catalog_product_serializer.rb +57 -0
- data/app/serializers/spree/api/v3/admin/catalog_product_term_serializer.rb +38 -0
- data/app/serializers/spree/api/v3/admin/catalog_quantity_rule_serializer.rb +37 -0
- data/app/serializers/spree/api/v3/admin/catalog_serializer.rb +46 -0
- data/app/serializers/spree/api/v3/admin/category_serializer.rb +3 -2
- data/app/serializers/spree/api/v3/admin/channel_serializer.rb +15 -1
- data/app/serializers/spree/api/v3/admin/claim_line_item_serializer.rb +16 -0
- data/app/serializers/spree/api/v3/admin/claim_reason_serializer.rb +21 -0
- data/app/serializers/spree/api/v3/admin/claim_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/admin/collection_rule_serializer.rb +22 -0
- data/app/serializers/spree/api/v3/admin/collection_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/admin/commission_line_serializer.rb +67 -0
- data/app/serializers/spree/api/v3/admin/commission_rate_serializer.rb +69 -0
- data/app/serializers/spree/api/v3/admin/commission_rule_serializer.rb +61 -0
- data/app/serializers/spree/api/v3/admin/company_invitation_serializer.rb +15 -0
- data/app/serializers/spree/api/v3/admin/company_membership_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/admin/company_serializer.rb +37 -0
- data/app/serializers/spree/api/v3/admin/concerns/external_references_attribute.rb +33 -0
- data/app/serializers/spree/api/v3/admin/consent_record_serializer.rb +28 -0
- data/app/serializers/spree/api/v3/admin/country_serializer.rb +2 -2
- data/app/serializers/spree/api/v3/admin/credit_card_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/admin/custom_field_definition_serializer.rb +2 -2
- data/app/serializers/spree/api/v3/admin/custom_field_serializer.rb +2 -2
- data/app/serializers/spree/api/v3/admin/customer_serializer.rb +23 -22
- data/app/serializers/spree/api/v3/admin/dashboard_counter_serializer.rb +24 -0
- data/app/serializers/spree/api/v3/admin/data_request_serializer.rb +36 -0
- data/app/serializers/spree/api/v3/admin/delivery_method_rule_serializer.rb +32 -0
- data/app/serializers/spree/api/v3/admin/delivery_method_serializer.rb +66 -1
- data/app/serializers/spree/api/v3/admin/delivery_method_service_serializer.rb +15 -0
- data/app/serializers/spree/api/v3/admin/delivery_origin_group_serializer.rb +34 -0
- data/app/serializers/spree/api/v3/admin/delivery_profile_serializer.rb +65 -0
- data/app/serializers/spree/api/v3/admin/delivery_rate_serializer.rb +10 -1
- data/app/serializers/spree/api/v3/admin/delivery_serializer.rb +20 -0
- data/app/serializers/spree/api/v3/admin/delivery_zone_member_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/admin/delivery_zone_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/admin/digital_asset_serializer.rb +59 -0
- data/app/serializers/spree/api/v3/admin/discount_serializer.rb +3 -4
- data/app/serializers/spree/api/v3/admin/exchange_line_item_serializer.rb +16 -0
- data/app/serializers/spree/api/v3/admin/exchange_serializer.rb +35 -0
- data/app/serializers/spree/api/v3/admin/export_serializer.rb +20 -1
- data/app/serializers/spree/api/v3/admin/fee_serializer.rb +14 -0
- data/app/serializers/spree/api/v3/admin/freight_summary_line_serializer.rb +46 -0
- data/app/serializers/spree/api/v3/admin/freight_summary_serializer.rb +16 -0
- data/app/serializers/spree/api/v3/admin/fulfillment_item_serializer.rb +39 -0
- data/app/serializers/spree/api/v3/admin/fulfillment_serializer.rb +31 -9
- data/app/serializers/spree/api/v3/admin/gift_card_serializer.rb +2 -3
- data/app/serializers/spree/api/v3/admin/import_serializer.rb +15 -2
- data/app/serializers/spree/api/v3/admin/integration_serializer.rb +32 -0
- data/app/serializers/spree/api/v3/admin/invitation_serializer.rb +4 -4
- data/app/serializers/spree/api/v3/admin/line_item_serializer.rb +19 -5
- data/app/serializers/spree/api/v3/admin/market_serializer.rb +5 -1
- data/app/serializers/spree/api/v3/admin/media_serializer.rb +50 -2
- data/app/serializers/spree/api/v3/admin/membership_product_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/admin/order_cancellation_reason_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/admin/order_group_serializer.rb +50 -0
- data/app/serializers/spree/api/v3/admin/order_routing_rule_serializer.rb +2 -6
- data/app/serializers/spree/api/v3/admin/order_serializer.rb +131 -19
- data/app/serializers/spree/api/v3/admin/package_type_serializer.rb +53 -0
- data/app/serializers/spree/api/v3/admin/payment_method_serializer.rb +8 -2
- data/app/serializers/spree/api/v3/admin/payment_serializer.rb +6 -0
- data/app/serializers/spree/api/v3/admin/payment_split_serializer.rb +41 -0
- data/app/serializers/spree/api/v3/admin/permission_serializer.rb +39 -0
- data/app/serializers/spree/api/v3/admin/policy_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/admin/price_adjustment_tier_serializer.rb +22 -0
- data/app/serializers/spree/api/v3/admin/price_list_product_serializer.rb +32 -0
- data/app/serializers/spree/api/v3/admin/price_list_serializer.rb +20 -8
- data/app/serializers/spree/api/v3/admin/price_rule_serializer.rb +2 -12
- data/app/serializers/spree/api/v3/admin/price_serializer.rb +3 -0
- data/app/serializers/spree/api/v3/admin/product_serializer.rb +54 -8
- data/app/serializers/spree/api/v3/admin/product_submission_serializer.rb +39 -0
- data/app/serializers/spree/api/v3/admin/product_type_custom_field_definition_serializer.rb +44 -0
- data/app/serializers/spree/api/v3/admin/product_type_serializer.rb +34 -0
- data/app/serializers/spree/api/v3/admin/promotion_action_serializer.rb +6 -12
- data/app/serializers/spree/api/v3/admin/promotion_rule_serializer.rb +17 -15
- data/app/serializers/spree/api/v3/admin/purchase_order_item_serializer.rb +80 -0
- data/app/serializers/spree/api/v3/admin/purchase_order_serializer.rb +94 -0
- data/app/serializers/spree/api/v3/admin/refund_reason_serializer.rb +27 -0
- data/app/serializers/spree/api/v3/admin/refund_serializer.rb +0 -5
- data/app/serializers/spree/api/v3/admin/reporting_result_serializer.rb +72 -0
- data/app/serializers/spree/api/v3/admin/return_line_item_serializer.rb +16 -0
- data/app/serializers/spree/api/v3/admin/return_reason_serializer.rb +21 -0
- data/app/serializers/spree/api/v3/admin/return_serializer.rb +59 -0
- data/app/serializers/spree/api/v3/admin/role_serializer.rb +24 -6
- data/app/serializers/spree/api/v3/admin/saved_report_serializer.rb +33 -0
- data/app/serializers/spree/api/v3/admin/seller_balance_serializer.rb +37 -0
- data/app/serializers/spree/api/v3/admin/seller_payout_serializer.rb +46 -0
- data/app/serializers/spree/api/v3/admin/seller_requirement_serializer.rb +68 -0
- data/app/serializers/spree/api/v3/admin/seller_requirement_status_serializer.rb +48 -0
- data/app/serializers/spree/api/v3/admin/seller_requirement_submission_serializer.rb +57 -0
- data/app/serializers/spree/api/v3/admin/seller_serializer.rb +92 -0
- data/app/serializers/spree/api/v3/admin/seller_team_member_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/admin/seller_transfer_serializer.rb +53 -0
- data/app/serializers/spree/api/v3/admin/shipping_label_serializer.rb +82 -0
- data/app/serializers/spree/api/v3/admin/state_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/admin/stock_level_serializer.rb +65 -0
- data/app/serializers/spree/api/v3/admin/stock_location_serializer.rb +20 -4
- data/app/serializers/spree/api/v3/admin/stock_movement_serializer.rb +116 -0
- data/app/serializers/spree/api/v3/admin/stock_receipt_item_serializer.rb +57 -0
- data/app/serializers/spree/api/v3/admin/stock_receipt_serializer.rb +49 -0
- data/app/serializers/spree/api/v3/admin/stock_reservation_serializer.rb +5 -5
- data/app/serializers/spree/api/v3/admin/stock_transfer_item_serializer.rb +57 -0
- data/app/serializers/spree/api/v3/admin/stock_transfer_serializer.rb +36 -16
- data/app/serializers/spree/api/v3/admin/store_credit_event_serializer.rb +32 -0
- data/app/serializers/spree/api/v3/admin/store_credit_serializer.rb +42 -7
- data/app/serializers/spree/api/v3/admin/store_serializer.rb +63 -1
- data/app/serializers/spree/api/v3/admin/supplier_serializer.rb +39 -0
- data/app/serializers/spree/api/v3/admin/tax_exemption_certificate_serializer.rb +67 -0
- data/app/serializers/spree/api/v3/admin/tax_identifier_serializer.rb +43 -0
- data/app/serializers/spree/api/v3/admin/tax_line_serializer.rb +21 -0
- data/app/serializers/spree/api/v3/admin/tax_rate_serializer.rb +49 -0
- data/app/serializers/spree/api/v3/admin/variant_serializer.rb +49 -8
- data/app/serializers/spree/api/v3/applied_promotion_serializer.rb +23 -0
- data/app/serializers/spree/api/v3/base_serializer.rb +39 -2
- data/app/serializers/spree/api/v3/cart_serializer.rb +90 -12
- data/app/serializers/spree/api/v3/category_serializer.rb +3 -3
- data/app/serializers/spree/api/v3/claim_line_item_serializer.rb +50 -0
- data/app/serializers/spree/api/v3/claim_reason_serializer.rb +20 -0
- data/app/serializers/spree/api/v3/claim_serializer.rb +62 -0
- data/app/serializers/spree/api/v3/collection_serializer.rb +41 -0
- data/app/serializers/spree/api/v3/company_invitation_serializer.rb +28 -0
- data/app/serializers/spree/api/v3/company_membership_serializer.rb +28 -0
- data/app/serializers/spree/api/v3/company_serializer.rb +33 -0
- data/app/serializers/spree/api/v3/custom_field_serializer.rb +2 -2
- data/app/serializers/spree/api/v3/customer_serializer.rb +9 -1
- data/app/serializers/spree/api/v3/data_request_event_serializer.rb +30 -0
- data/app/serializers/spree/api/v3/data_request_serializer.rb +40 -0
- data/app/serializers/spree/api/v3/delivery_method_serializer.rb +12 -2
- data/app/serializers/spree/api/v3/delivery_rate_serializer.rb +34 -17
- data/app/serializers/spree/api/v3/delivery_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/delivery_zone_member_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/delivery_zone_serializer.rb +13 -0
- data/app/serializers/spree/api/v3/digital_asset_serializer.rb +23 -0
- data/app/serializers/spree/api/v3/digital_link_serializer.rb +6 -2
- data/app/serializers/spree/api/v3/discount_serializer.rb +21 -7
- data/app/serializers/spree/api/v3/exchange_line_item_serializer.rb +53 -0
- data/app/serializers/spree/api/v3/exchange_serializer.rb +61 -0
- data/app/serializers/spree/api/v3/fee_serializer.rb +27 -0
- data/app/serializers/spree/api/v3/freight_summary_serializer.rb +38 -0
- data/app/serializers/spree/api/v3/fulfillment_serializer.rb +28 -15
- data/app/serializers/spree/api/v3/gift_card_serializer.rb +2 -2
- data/app/serializers/spree/api/v3/import_row_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/import_serializer.rb +18 -4
- data/app/serializers/spree/api/v3/invitation_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/line_item_serializer.rb +18 -1
- data/app/serializers/spree/api/v3/market_serializer.rb +2 -2
- data/app/serializers/spree/api/v3/{asset_serializer.rb → media_event_serializer.rb} +4 -4
- data/app/serializers/spree/api/v3/media_serializer.rb +48 -7
- data/app/serializers/spree/api/v3/newsletter_subscriber_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/option_type_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/order_group_serializer.rb +60 -0
- data/app/serializers/spree/api/v3/order_serializer.rb +58 -6
- data/app/serializers/spree/api/v3/payment_method_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/payment_serializer.rb +2 -6
- data/app/serializers/spree/api/v3/payment_session_serializer.rb +10 -3
- data/app/serializers/spree/api/v3/payment_setup_session_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/policy_serializer.rb +7 -2
- data/app/serializers/spree/api/v3/product_filter_option_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/product_serializer.rb +42 -10
- data/app/serializers/spree/api/v3/product_type_serializer.rb +17 -0
- data/app/serializers/spree/api/v3/purchase_order_event_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/refund_serializer.rb +9 -3
- data/app/serializers/spree/api/v3/return_line_item_serializer.rb +42 -0
- data/app/serializers/spree/api/v3/return_reason_serializer.rb +20 -0
- data/app/serializers/spree/api/v3/return_serializer.rb +62 -0
- data/app/serializers/spree/api/v3/seller/balance_serializer.rb +35 -0
- data/app/serializers/spree/api/v3/seller/claim_line_item_serializer.rb +21 -0
- data/app/serializers/spree/api/v3/seller/claim_serializer.rb +25 -0
- data/app/serializers/spree/api/v3/seller/delivery_method_rule_serializer.rb +32 -0
- data/app/serializers/spree/api/v3/seller/delivery_method_serializer.rb +59 -0
- data/app/serializers/spree/api/v3/seller/delivery_profile_serializer.rb +26 -0
- data/app/serializers/spree/api/v3/seller/delivery_rate_serializer.rb +35 -0
- data/app/serializers/spree/api/v3/seller/delivery_serializer.rb +17 -0
- data/app/serializers/spree/api/v3/seller/delivery_zone_serializer.rb +26 -0
- data/app/serializers/spree/api/v3/seller/exchange_line_item_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/seller/exchange_serializer.rb +30 -0
- data/app/serializers/spree/api/v3/seller/export_serializer.rb +44 -0
- data/app/serializers/spree/api/v3/seller/fulfillment_item_serializer.rb +43 -0
- data/app/serializers/spree/api/v3/seller/fulfillment_serializer.rb +76 -0
- data/app/serializers/spree/api/v3/seller/import_mapping_serializer.rb +20 -0
- data/app/serializers/spree/api/v3/seller/import_row_serializer.rb +17 -0
- data/app/serializers/spree/api/v3/seller/import_serializer.rb +77 -0
- data/app/serializers/spree/api/v3/seller/invitation_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/seller/media_serializer.rb +26 -0
- data/app/serializers/spree/api/v3/seller/order_line_item_serializer.rb +44 -0
- data/app/serializers/spree/api/v3/seller/order_serializer.rb +119 -0
- data/app/serializers/spree/api/v3/seller/package_type_serializer.rb +52 -0
- data/app/serializers/spree/api/v3/seller/payment_split_serializer.rb +34 -0
- data/app/serializers/spree/api/v3/seller/payout_serializer.rb +36 -0
- data/app/serializers/spree/api/v3/seller/policy_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/seller/product_serializer.rb +60 -0
- data/app/serializers/spree/api/v3/seller/product_submission_serializer.rb +30 -0
- data/app/serializers/spree/api/v3/seller/product_type_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/seller/profile_serializer.rb +77 -0
- data/app/serializers/spree/api/v3/seller/reason_serializer.rb +24 -0
- data/app/serializers/spree/api/v3/seller/requirement_custom_field_serializer.rb +36 -0
- data/app/serializers/spree/api/v3/seller/requirement_status_serializer.rb +62 -0
- data/app/serializers/spree/api/v3/seller/requirement_submission_serializer.rb +33 -0
- data/app/serializers/spree/api/v3/seller/return_line_item_serializer.rb +24 -0
- data/app/serializers/spree/api/v3/seller/return_serializer.rb +51 -0
- data/app/serializers/spree/api/v3/seller/shipping_label_serializer.rb +23 -0
- data/app/serializers/spree/api/v3/seller/stock_level_serializer.rb +27 -0
- data/app/serializers/spree/api/v3/seller/stock_location_serializer.rb +17 -0
- data/app/serializers/spree/api/v3/seller/tax_identifier_serializer.rb +15 -0
- data/app/serializers/spree/api/v3/seller/team_member_serializer.rb +22 -0
- data/app/serializers/spree/api/v3/seller/transfer_serializer.rb +49 -0
- data/app/serializers/spree/api/v3/seller/variant_serializer.rb +71 -0
- data/app/serializers/spree/api/v3/seller_serializer.rb +50 -0
- data/app/serializers/spree/api/v3/shipping_label_event_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/{stock_item_serializer.rb → stock_level_serializer.rb} +5 -5
- data/app/serializers/spree/api/v3/stock_location_serializer.rb +11 -7
- data/app/serializers/spree/api/v3/stock_movement_serializer.rb +8 -15
- data/app/serializers/spree/api/v3/stock_receipt_event_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/stock_transfer_serializer.rb +6 -6
- data/app/serializers/spree/api/v3/store_credit_event_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/supplier_event_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/tax_identifier_serializer.rb +15 -0
- data/app/serializers/spree/api/v3/tax_line_serializer.rb +37 -0
- data/app/serializers/spree/api/v3/variant_serializer.rb +52 -2
- data/app/serializers/spree/api/v3/wishlist_item_serializer.rb +6 -6
- data/app/serializers/spree/api/v3/wishlist_serializer.rb +1 -1
- data/app/services/spree/api/v3/filters_aggregator.rb +14 -12
- data/app/services/spree/webhooks/deliver_webhook.rb +62 -26
- data/app/subscribers/spree/webhook_event_subscriber.rb +9 -5
- data/config/brakeman.ignore +1 -1
- data/config/initializers/typelizer.rb +51 -4
- data/config/locales/en.yml +5 -0
- data/config/routes.rb +730 -22
- data/lib/spree/api/configuration.rb +2 -7
- data/lib/spree/api/dependencies.rb +173 -227
- data/lib/spree/api/openapi/schema_helper.rb +179 -13
- data/lib/spree/api/testing_support/v3/base.rb +45 -15
- data/lib/spree/api.rb +10 -4
- data/lib/typelizer/open_enums.rb +35 -0
- metadata +341 -27
- data/app/controllers/spree/api/v3/admin/orders/adjustments_controller.rb +0 -25
- data/app/controllers/spree/api/v3/admin/stock_items_controller.rb +0 -42
- data/app/controllers/spree/api/v3/admin/store_credit_categories_controller.rb +0 -21
- data/app/controllers/spree/api/v3/store/digitals_controller.rb +0 -38
- data/app/serializers/spree/api/v3/admin/adjustment_serializer.rb +0 -24
- data/app/serializers/spree/api/v3/admin/dashboard_analytics_serializer.rb +0 -143
- data/app/serializers/spree/api/v3/admin/reimbursement_serializer.rb +0 -15
- data/app/serializers/spree/api/v3/admin/return_authorization_serializer.rb +0 -19
- data/app/serializers/spree/api/v3/admin/stock_item_serializer.rb +0 -34
- data/app/serializers/spree/api/v3/admin/store_credit_category_serializer.rb +0 -19
- data/app/serializers/spree/api/v3/customer_return_serializer.rb +0 -17
- data/app/serializers/spree/api/v3/digital_serializer.rb +0 -17
- data/app/serializers/spree/api/v3/reimbursement_serializer.rb +0 -27
- data/app/serializers/spree/api/v3/report_serializer.rb +0 -34
- data/app/serializers/spree/api/v3/return_authorization_serializer.rb +0 -31
- data/app/serializers/spree/api/v3/return_item_serializer.rb +0 -53
- data/app/serializers/spree/api/v3/shipping_category_serializer.rb +0 -11
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
# The `items` list a request names, for the endpoints that take one:
|
|
5
|
+
# receiving a return, an exchange, a claim, a stock transfer or a
|
|
6
|
+
# purchase order, and opening any of them.
|
|
7
|
+
#
|
|
8
|
+
# The distinction all of them need is between *omitted* and *empty*. An
|
|
9
|
+
# omitted `items` means "all of it, as recorded" — receive the whole
|
|
10
|
+
# return, the whole delivery. An empty list, or an explicit `null`, means
|
|
11
|
+
# the caller named nothing, and must not fall through to that default.
|
|
12
|
+
module ItemsPayload
|
|
13
|
+
extend ActiveSupport::Concern
|
|
14
|
+
|
|
15
|
+
# A payload whose `items` is not a list. Raised out of the params
|
|
16
|
+
# helper so it cannot be mistaken for a workflow rejection, and
|
|
17
|
+
# answered as the client mistake it is rather than a 500.
|
|
18
|
+
class InvalidItems < StandardError; end
|
|
19
|
+
|
|
20
|
+
included do
|
|
21
|
+
rescue_from InvalidItems, with: :render_invalid_items
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
protected
|
|
25
|
+
|
|
26
|
+
# @param keys [Array<Symbol>] the per-item keys to permit
|
|
27
|
+
# @return [Array<ActionController::Parameters>, nil] nil when the
|
|
28
|
+
# payload said nothing about items
|
|
29
|
+
def items_payload(keys)
|
|
30
|
+
return nil unless params.key?(:items)
|
|
31
|
+
|
|
32
|
+
raw = params[:items]
|
|
33
|
+
return [] if raw.nil?
|
|
34
|
+
# Checked before `permit`, which silently drops a scalar `items` —
|
|
35
|
+
# leaving a client typo indistinguishable from "named nothing".
|
|
36
|
+
raise InvalidItems unless raw.is_a?(Array)
|
|
37
|
+
|
|
38
|
+
params.permit(items: keys)[:items] || []
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Reported against `:base`, not `:items`. The payload is malformed
|
|
42
|
+
# rather than a field being wrong, and ActiveModel reads the named
|
|
43
|
+
# attribute off the record to interpolate a message — which raises for
|
|
44
|
+
# every record whose lines are not called `items` (a return's are
|
|
45
|
+
# `return_line_items`).
|
|
46
|
+
def render_invalid_items
|
|
47
|
+
errors = ActiveModel::Errors.new(@resource || model_class.new)
|
|
48
|
+
errors.add(:base, :invalid_items, message: Spree.t('errors.messages.items_not_a_list'))
|
|
49
|
+
render_validation_error(errors)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -11,6 +11,11 @@ module Spree
|
|
|
11
11
|
|
|
12
12
|
JWT_AUDIENCE_STORE = 'store_api'.freeze
|
|
13
13
|
JWT_AUDIENCE_ADMIN = 'admin_api'.freeze
|
|
14
|
+
# Marketplace sellers share the admin user class, so the audience — not
|
|
15
|
+
# the principal — is what keeps a seller's token off the admin API and
|
|
16
|
+
# an admin's off the seller panel. Enforced at decode, before any store
|
|
17
|
+
# or seller is resolved.
|
|
18
|
+
JWT_AUDIENCE_SELLER = 'seller_api'.freeze
|
|
14
19
|
JWT_ISSUER = 'spree'.freeze
|
|
15
20
|
|
|
16
21
|
included do
|
|
@@ -67,8 +72,12 @@ module Spree
|
|
|
67
72
|
header = request.headers['Authorization']
|
|
68
73
|
return header.split(' ').last if header.present? && header.start_with?('Bearer ')
|
|
69
74
|
|
|
70
|
-
# Restricted fallback: only
|
|
71
|
-
|
|
75
|
+
# Restricted fallback: only the storefront tokenized download
|
|
76
|
+
# endpoint, which carries its link token in the query string. The
|
|
77
|
+
# customer library and admin grant endpoints share the controller
|
|
78
|
+
# name but authenticate by header, so matching on the name alone
|
|
79
|
+
# would let their bearer JWTs travel in the URL (logs, history).
|
|
80
|
+
params[:token] if controller_path == 'spree/api/v3/store/digital_links'
|
|
72
81
|
end
|
|
73
82
|
|
|
74
83
|
def decode_jwt(token)
|
|
@@ -104,10 +113,21 @@ module Spree
|
|
|
104
113
|
when USER_TYPE_ADMIN
|
|
105
114
|
Spree.admin_user_class.find(user_id)
|
|
106
115
|
else
|
|
107
|
-
|
|
116
|
+
customer_from(user_id)
|
|
108
117
|
end
|
|
109
118
|
end
|
|
110
119
|
|
|
120
|
+
# An erased account stops answering to its old tokens. Clearing the
|
|
121
|
+
# password blocks a fresh sign-in, but a JWT issued before the erasure
|
|
122
|
+
# would otherwise keep working until it expired — long enough to write
|
|
123
|
+
# a name and phone back onto the record, after which a second erasure
|
|
124
|
+
# is refused as already done.
|
|
125
|
+
def customer_from(user_id)
|
|
126
|
+
customer = Spree.customer_class.find(user_id)
|
|
127
|
+
|
|
128
|
+
customer.respond_to?(:anonymized?) && customer.anonymized? ? nil : customer
|
|
129
|
+
end
|
|
130
|
+
|
|
111
131
|
def determine_user_type(user)
|
|
112
132
|
if user.is_a?(Spree.admin_user_class)
|
|
113
133
|
USER_TYPE_ADMIN
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
# Store API store context: the publishable key selects the store (the
|
|
5
|
+
# key belongs to exactly one store) — the request host is never
|
|
6
|
+
# consulted. See docs/plans/6.0-store-context-and-first-run-setup.md.
|
|
7
|
+
#
|
|
8
|
+
# Included in both Store API branch anchors (Store::BaseController and
|
|
9
|
+
# Store::ResourceController) alongside ApiKeyAuthentication, whose
|
|
10
|
+
# memoized +publishable_api_key+ lookup this reads — pre-authentication
|
|
11
|
+
# callbacks (channel resolution, locale fallbacks) resolve the same key
|
|
12
|
+
# row authentication later verifies.
|
|
13
|
+
module KeyStoreContext
|
|
14
|
+
extend ActiveSupport::Concern
|
|
15
|
+
|
|
16
|
+
included do
|
|
17
|
+
# An invalid or missing key must render 401 from
|
|
18
|
+
# +authenticate_api_key!+ — without this skip the store-presence
|
|
19
|
+
# guard would 404 first on the ResourceController branch, where it
|
|
20
|
+
# runs ahead of authentication.
|
|
21
|
+
skip_before_action :raise_record_not_found_if_store_is_not_found
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# @return [Spree::Store, nil]
|
|
25
|
+
def current_store
|
|
26
|
+
@current_store ||= publishable_api_key&.store
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -171,10 +171,10 @@ module Spree
|
|
|
171
171
|
# When a matching market is found, it is set on +Spree::Current.market+,
|
|
172
172
|
# which influences the default locale and currency fallbacks.
|
|
173
173
|
def set_market_from_country
|
|
174
|
-
|
|
175
|
-
return unless
|
|
174
|
+
country_code = request.headers['x-spree-country'].presence || params[:country].presence
|
|
175
|
+
return unless country_code
|
|
176
176
|
|
|
177
|
-
country = Spree::Country.
|
|
177
|
+
country = Spree::Country.by_iso(country_code)
|
|
178
178
|
return unless country
|
|
179
179
|
|
|
180
180
|
market = current_store&.market_for_country(country)
|
|
@@ -15,15 +15,34 @@ module Spree
|
|
|
15
15
|
order = @order || @parent || @cart
|
|
16
16
|
|
|
17
17
|
order.with_lock do
|
|
18
|
+
# Completed carts are readonly — nothing left to version-bump;
|
|
19
|
+
# the row lock alone still serializes the idempotent paths.
|
|
20
|
+
next yield if order.readonly?
|
|
21
|
+
|
|
22
|
+
# A completion attempt fixed this cart's totals under the lock and
|
|
23
|
+
# is now off at the gateway — mutating the cart mid-window would
|
|
24
|
+
# complete it with different totals than the ones being charged.
|
|
25
|
+
# The completion claim excludes mutations for exactly that window;
|
|
26
|
+
# checked after acquiring the lock so it cannot race the claim
|
|
27
|
+
# being written. The TTL matches guard_concurrent_completion — a
|
|
28
|
+
# crashed completion must not brick its cart.
|
|
29
|
+
if order.is_a?(Spree::Cart) && order.completion_claimed?
|
|
30
|
+
next render_error(
|
|
31
|
+
code: 'completion_in_progress',
|
|
32
|
+
message: Spree.t(:cart_completion_in_progress),
|
|
33
|
+
status: :conflict
|
|
34
|
+
)
|
|
35
|
+
end
|
|
36
|
+
|
|
18
37
|
# Persist increment within the transaction so reloads inside yield see the new version
|
|
19
|
-
new_version = order.
|
|
20
|
-
order.update_column(:
|
|
38
|
+
new_version = order.lock_version + 1
|
|
39
|
+
order.update_column(:lock_version, new_version)
|
|
21
40
|
|
|
22
41
|
yield
|
|
23
42
|
|
|
24
43
|
if performed? && response.status >= 400
|
|
25
44
|
# Operation failed — revert the increment
|
|
26
|
-
order.update_column(:
|
|
45
|
+
order.update_column(:lock_version, new_version - 1)
|
|
27
46
|
end
|
|
28
47
|
end
|
|
29
48
|
end
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Orders
|
|
5
|
+
# Something went wrong with a delivery, and the merchant makes it
|
|
6
|
+
# right — money back, a replacement, or both — without necessarily
|
|
7
|
+
# asking for the goods back.
|
|
8
|
+
#
|
|
9
|
+
# See {PostSaleActions} for why the lookups a payload's ids resolve
|
|
10
|
+
# through are deliberately left to the including controller.
|
|
11
|
+
module ClaimActions
|
|
12
|
+
extend ActiveSupport::Concern
|
|
13
|
+
include PostSaleActions
|
|
14
|
+
|
|
15
|
+
# POST .../claims
|
|
16
|
+
def create
|
|
17
|
+
create_post_sale_record(Spree.claim_create_workflow, Spree::Claim)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# PATCH .../claims/:id/approve
|
|
21
|
+
def approve
|
|
22
|
+
run_workflow(Spree.claim_approve_workflow, approver: try_spree_current_user)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# PATCH .../claims/:id/resolve — a refund, a replacement, or both.
|
|
26
|
+
def resolve
|
|
27
|
+
run_workflow(Spree.claim_resolve_workflow,
|
|
28
|
+
resolution: params[:resolution],
|
|
29
|
+
refund_method: params[:refund_method] || 'store_credit',
|
|
30
|
+
amount: params[:amount],
|
|
31
|
+
replacement_line_item_ids: replacement_line_item_ids,
|
|
32
|
+
resolver: try_spree_current_user)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# PATCH .../claims/:id/deny
|
|
36
|
+
def deny
|
|
37
|
+
run_workflow(Spree.claim_deny_workflow, reason: params[:reason])
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# PATCH .../claims/:id/cancel
|
|
41
|
+
def cancel
|
|
42
|
+
run_workflow(Spree.claim_cancel_workflow, reason: params[:reason])
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
protected
|
|
46
|
+
|
|
47
|
+
def model_class
|
|
48
|
+
Spree::Claim
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def parent_association
|
|
52
|
+
:claims
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def workflow_record_key
|
|
56
|
+
:claim
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
private
|
|
60
|
+
|
|
61
|
+
def create_params
|
|
62
|
+
@create_params ||= params.permit(
|
|
63
|
+
:memo, :reason_id,
|
|
64
|
+
items: [:line_item_id, :quantity, :description, :send_replacement,
|
|
65
|
+
:replacement_variant_id, :refund_amount]
|
|
66
|
+
)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Every claimed line is resolved through the order itself, so a line
|
|
70
|
+
# item from another order cannot be claimed against this one.
|
|
71
|
+
def items_for_create
|
|
72
|
+
Array(create_params[:items]).map do |item|
|
|
73
|
+
{
|
|
74
|
+
line_item: @order.line_items.find_by_prefix_id!(item[:line_item_id]),
|
|
75
|
+
quantity: item[:quantity].to_i,
|
|
76
|
+
description: item[:description],
|
|
77
|
+
send_replacement: item[:send_replacement].to_b,
|
|
78
|
+
replacement_variant: replacement_variant_for(item[:replacement_variant_id]),
|
|
79
|
+
refund_amount: item[:refund_amount]
|
|
80
|
+
}
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Which lines to replace, decided at resolution time. Absent means
|
|
85
|
+
# "leave whatever the claim was opened with".
|
|
86
|
+
def replacement_line_item_ids
|
|
87
|
+
return nil unless params.key?(:replacement_line_item_ids)
|
|
88
|
+
|
|
89
|
+
Array(params[:replacement_line_item_ids]).map do |id|
|
|
90
|
+
@resource.claim_line_items.find_by_prefix_id!(id).id
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def reason_for_create
|
|
95
|
+
return nil if create_params[:reason_id].blank?
|
|
96
|
+
|
|
97
|
+
current_store.claim_reasons.find_by_prefix_id!(create_params[:reason_id])
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# The catalogue a replacement may be promised from. Left to the
|
|
101
|
+
# including controller precisely because getting it wrong would let
|
|
102
|
+
# one seller ship another's stock.
|
|
103
|
+
#
|
|
104
|
+
# @return [Spree::Variant, nil]
|
|
105
|
+
def replacement_variant_for(_variant_id)
|
|
106
|
+
raise NotImplementedError, "#{self.class} must implement #replacement_variant_for"
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Orders
|
|
5
|
+
# The consignments of one fulfillment — a parcel each, or a freight
|
|
6
|
+
# PRO number covering several pallets.
|
|
7
|
+
#
|
|
8
|
+
# A delivery is born when a tracking number is attached, days before
|
|
9
|
+
# anything arrives, so POST means "this went out as another
|
|
10
|
+
# consignment"; arrival is a transition on an existing row.
|
|
11
|
+
#
|
|
12
|
+
# Shared by the operator's branch and the seller's. `@parent` (the
|
|
13
|
+
# fulfillment) and `@resource` arrive already fetched and authorized,
|
|
14
|
+
# so including this concern cannot widen what a caller reaches.
|
|
15
|
+
module DeliveryActions
|
|
16
|
+
extend ActiveSupport::Concern
|
|
17
|
+
|
|
18
|
+
# POST .../deliveries
|
|
19
|
+
def create
|
|
20
|
+
authorize!(:create, Spree::Delivery)
|
|
21
|
+
|
|
22
|
+
with_order_lock do
|
|
23
|
+
# Every key is passed whether or not the request carried it, so
|
|
24
|
+
# the service sees a missing tracking number as a blank one to
|
|
25
|
+
# reject rather than a keyword it was never given.
|
|
26
|
+
result = Spree.delivery_create_service.call(
|
|
27
|
+
owner: @parent,
|
|
28
|
+
**resource_permitted_attributes.index_with { |key| delivery_params[key] }
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
if result.success?
|
|
32
|
+
render json: serialize_resource(result.value), status: :created
|
|
33
|
+
else
|
|
34
|
+
render_result_error(result)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# PATCH .../deliveries/:id — correcting the number, carrier or link.
|
|
40
|
+
#
|
|
41
|
+
# A corrected number is a different parcel as far as the carrier is
|
|
42
|
+
# concerned: its journey starts over, and the carrier and link that
|
|
43
|
+
# belonged to the old number go with it unless this request supplies
|
|
44
|
+
# new ones. A consignment that started over may also have been the
|
|
45
|
+
# one holding the fulfillment at delivered.
|
|
46
|
+
def update
|
|
47
|
+
with_order_lock do
|
|
48
|
+
if @resource.update(@resource.correction_attributes(delivery_params.to_h))
|
|
49
|
+
recalculate_fulfillment_delivery
|
|
50
|
+
render json: serialize_resource(@resource.reload)
|
|
51
|
+
else
|
|
52
|
+
render_validation_error(@resource.errors)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# DELETE .../deliveries/:id — 422 when a label minted it.
|
|
58
|
+
def destroy
|
|
59
|
+
with_order_lock do
|
|
60
|
+
result = Spree.delivery_destroy_service.call(delivery: @resource)
|
|
61
|
+
|
|
62
|
+
if result.success?
|
|
63
|
+
head :no_content
|
|
64
|
+
else
|
|
65
|
+
render_result_error(result)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
protected
|
|
71
|
+
|
|
72
|
+
def model_class
|
|
73
|
+
Spree::Delivery
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def parent_association
|
|
77
|
+
:deliveries
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def collection_includes
|
|
81
|
+
[:shipping_label]
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def resource_permitted_attributes
|
|
85
|
+
[:tracking_number, :carrier, :service, :tracking_url]
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
private
|
|
89
|
+
|
|
90
|
+
def delivery_params
|
|
91
|
+
@delivery_params ||= params.permit(*resource_permitted_attributes)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Deliveries can hang off something other than a fulfillment, which
|
|
95
|
+
# has no delivered state to roll up.
|
|
96
|
+
def recalculate_fulfillment_delivery
|
|
97
|
+
return unless @parent.is_a?(Spree::Fulfillment)
|
|
98
|
+
|
|
99
|
+
Spree.fulfillment_recalculate_delivery_service.call(fulfillment: @parent)
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Orders
|
|
5
|
+
# Swapping goods on an order — a different size, colour or product —
|
|
6
|
+
# and the four moves that settle it.
|
|
7
|
+
#
|
|
8
|
+
# See {PostSaleActions} for why the lookups a payload's ids resolve
|
|
9
|
+
# through are deliberately left to the including controller.
|
|
10
|
+
module ExchangeActions
|
|
11
|
+
extend ActiveSupport::Concern
|
|
12
|
+
include PostSaleActions
|
|
13
|
+
|
|
14
|
+
# POST .../exchanges
|
|
15
|
+
def create
|
|
16
|
+
create_post_sale_record(
|
|
17
|
+
Spree.exchange_create_workflow, Spree::Exchange,
|
|
18
|
+
stock_location: stock_location_for_create
|
|
19
|
+
)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# PATCH .../exchanges/:id/approve
|
|
23
|
+
def approve
|
|
24
|
+
run_workflow(Spree.exchange_approve_workflow, approver: try_spree_current_user)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# PATCH .../exchanges/:id/receive
|
|
28
|
+
def receive
|
|
29
|
+
run_workflow(Spree.exchange_receive_workflow,
|
|
30
|
+
items: items_for_receive,
|
|
31
|
+
received_by: try_spree_current_user)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# PATCH .../exchanges/:id/fulfill — sends the replacement, settling
|
|
35
|
+
# any price difference, which is why it takes a refund method.
|
|
36
|
+
def fulfill
|
|
37
|
+
run_workflow(Spree.exchange_fulfill_workflow,
|
|
38
|
+
refund_method: params[:refund_method] || 'store_credit',
|
|
39
|
+
refunder: try_spree_current_user)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# PATCH .../exchanges/:id/cancel
|
|
43
|
+
def cancel
|
|
44
|
+
run_workflow(Spree.exchange_cancel_workflow, reason: params[:reason])
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
protected
|
|
48
|
+
|
|
49
|
+
def model_class
|
|
50
|
+
Spree::Exchange
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def parent_association
|
|
54
|
+
:exchanges
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def workflow_record_key
|
|
58
|
+
:exchange
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
private
|
|
62
|
+
|
|
63
|
+
def create_params
|
|
64
|
+
@create_params ||= params.permit(
|
|
65
|
+
:memo, :reason_id, :stock_location_id,
|
|
66
|
+
items: [:fulfillment_item_id, :new_variant_id, :quantity]
|
|
67
|
+
)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# The units going back are resolved through the order; what comes
|
|
71
|
+
# out instead is resolved through {#replacement_variant_for}.
|
|
72
|
+
def items_for_create
|
|
73
|
+
Array(create_params[:items]).map do |item|
|
|
74
|
+
{
|
|
75
|
+
fulfillment_item: @order.fulfillment_items.find_by_prefix_id!(item[:fulfillment_item_id]),
|
|
76
|
+
new_variant: replacement_variant_for(item[:new_variant_id]),
|
|
77
|
+
quantity: item[:quantity].to_i
|
|
78
|
+
}
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def items_for_receive
|
|
83
|
+
sent = received_items([:exchange_line_item_id, :quantity, :resellable])
|
|
84
|
+
return nil if sent.nil?
|
|
85
|
+
|
|
86
|
+
sent.map do |item|
|
|
87
|
+
{
|
|
88
|
+
exchange_line_item: @resource.exchange_line_items.find_by_prefix_id!(item[:exchange_line_item_id]),
|
|
89
|
+
quantity: item[:quantity].to_i,
|
|
90
|
+
resellable: item.key?(:resellable) ? item[:resellable].to_b : true
|
|
91
|
+
}
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def reason_for_create
|
|
96
|
+
return nil if create_params[:reason_id].blank?
|
|
97
|
+
|
|
98
|
+
current_store.return_reasons.find_by_prefix_id!(create_params[:reason_id])
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# The catalogue the replacement comes out of, and the shelf the
|
|
102
|
+
# returned goods go back to. Both are left to the including
|
|
103
|
+
# controller: an operator exchanges into the whole store, a seller
|
|
104
|
+
# only into their own goods, and getting this wrong would put one
|
|
105
|
+
# seller's stock on another's order.
|
|
106
|
+
def replacement_variant_for(_variant_id)
|
|
107
|
+
raise NotImplementedError, "#{self.class} must implement #replacement_variant_for"
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def stock_location_for_create
|
|
111
|
+
raise NotImplementedError, "#{self.class} must implement #stock_location_for_create"
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Orders
|
|
5
|
+
# Dispatching what is owed on an order: shipping a parcel, cancelling
|
|
6
|
+
# one, and splitting goods that leave separately.
|
|
7
|
+
#
|
|
8
|
+
# Shared by the operator's branch and the seller's, which run the same
|
|
9
|
+
# workflows. What differs is only *whose records a payload may name*,
|
|
10
|
+
# and that stays in the including controller: this concern never
|
|
11
|
+
# fetches an order, a variant or a stock location. `@order` and
|
|
12
|
+
# `@resource` arrive already fetched and authorized — through
|
|
13
|
+
# `current_store` on one branch, `current_seller_orders` on the other
|
|
14
|
+
# — and this code never learns which.
|
|
15
|
+
module FulfillmentActions
|
|
16
|
+
extend ActiveSupport::Concern
|
|
17
|
+
|
|
18
|
+
# PATCH .../fulfillments/:id
|
|
19
|
+
def update
|
|
20
|
+
with_order_lock do
|
|
21
|
+
result = Spree.fulfillment_update_workflow.call(
|
|
22
|
+
fulfillment: @resource, fulfillment_attributes: update_attributes
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
if result.success?
|
|
26
|
+
render json: serialize_resource(@resource.reload)
|
|
27
|
+
else
|
|
28
|
+
render_result_error(result)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# PATCH .../fulfillments/:id/fulfill
|
|
34
|
+
#
|
|
35
|
+
# Ships the parcel. `items` narrows it to part of what the
|
|
36
|
+
# fulfillment holds, which splits the rest onto a new one.
|
|
37
|
+
def fulfill
|
|
38
|
+
with_order_lock do
|
|
39
|
+
result = Spree.fulfillment_fulfill_workflow.call(
|
|
40
|
+
fulfillment: @resource,
|
|
41
|
+
items: items_for_fulfill,
|
|
42
|
+
tracking: fulfill_params[:tracking],
|
|
43
|
+
tracking_carrier: fulfill_params[:tracking_carrier],
|
|
44
|
+
notify_customer: notify_customer?(fulfill_params[:notify_customer]),
|
|
45
|
+
**fulfill_workflow_options
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
if result.success?
|
|
49
|
+
render json: serialize_resource(result.value)
|
|
50
|
+
else
|
|
51
|
+
render_result_error(result)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# PATCH .../fulfillments/:id/cancel
|
|
57
|
+
#
|
|
58
|
+
# Restocking and standing the carrier down happen in the workflow.
|
|
59
|
+
def cancel
|
|
60
|
+
with_order_lock do
|
|
61
|
+
result = Spree.fulfillment_cancel_workflow.call(fulfillment: @resource)
|
|
62
|
+
|
|
63
|
+
if result.success?
|
|
64
|
+
render json: serialize_resource(result.value)
|
|
65
|
+
else
|
|
66
|
+
render_result_error(result)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# PATCH .../fulfillments/:id/split
|
|
72
|
+
#
|
|
73
|
+
# Moves part of what this parcel holds onto one of its own, for
|
|
74
|
+
# goods leaving separately. Answers with every fulfillment on the
|
|
75
|
+
# order, since splitting rewrites more than one.
|
|
76
|
+
def split
|
|
77
|
+
with_order_lock do
|
|
78
|
+
changer = @resource.transfer_to_location(
|
|
79
|
+
variant_for_split, params[:quantity].to_i, stock_location_for_split
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
if changer.run!
|
|
83
|
+
render json: {
|
|
84
|
+
data: @order.reload.fulfillments.map { |fulfillment| serialize_resource(fulfillment) }
|
|
85
|
+
}
|
|
86
|
+
else
|
|
87
|
+
render_validation_error(changer.errors)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
protected
|
|
93
|
+
|
|
94
|
+
def model_class
|
|
95
|
+
Spree::Fulfillment
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def parent_association
|
|
99
|
+
:fulfillments
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
private
|
|
103
|
+
|
|
104
|
+
def fulfill_params
|
|
105
|
+
@fulfill_params ||= params.permit(*fulfill_permitted_keys)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def fulfill_permitted_keys
|
|
109
|
+
[:tracking, :tracking_carrier, :notify_customer, { items: [:item_id, :quantity] }]
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Extra keywords the branch's own fulfil accepts — forcing past a
|
|
113
|
+
# guard is the operator's call, so the seller adds nothing.
|
|
114
|
+
def fulfill_workflow_options
|
|
115
|
+
{}
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# The workflow addresses what to ship by line item, and the lookup
|
|
119
|
+
# runs through the order so an id from elsewhere cannot be shipped.
|
|
120
|
+
def items_for_fulfill
|
|
121
|
+
return if fulfill_params[:items].nil?
|
|
122
|
+
|
|
123
|
+
fulfill_params[:items].map do |item|
|
|
124
|
+
{
|
|
125
|
+
line_item: @order.line_items.find_by_prefix_id!(item[:item_id]),
|
|
126
|
+
quantity: Integer(item[:quantity].to_s, exception: false)
|
|
127
|
+
}
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# Only an explicit false suppresses the email; an omitted flag keeps
|
|
132
|
+
# sending it.
|
|
133
|
+
def notify_customer?(value)
|
|
134
|
+
!ActiveModel::Type::Boolean.new.cast(value).equal?(false)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# The attributes handed to the update workflow. The workflow assigns
|
|
138
|
+
# ids raw, so a branch that must narrow one resolves it here first.
|
|
139
|
+
def update_attributes
|
|
140
|
+
permitted_params.to_h
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
# What may be split out of this parcel, and where the split half
|
|
144
|
+
# ships from. Both are left to the including controller: they decide
|
|
145
|
+
# whose catalogue and whose shelves are reachable.
|
|
146
|
+
def variant_for_split
|
|
147
|
+
raise NotImplementedError, "#{self.class} must implement #variant_for_split"
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def stock_location_for_split
|
|
151
|
+
raise NotImplementedError, "#{self.class} must implement #stock_location_for_split"
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|