spree_api 5.6.1 → 6.0.0.beta2
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 +20 -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 +18 -9
- 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 +164 -33
- 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 +239 -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 +66 -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 +74 -16
- data/app/controllers/spree/api/v3/resource_controller.rb +170 -39
- 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/actor_serializer.rb +28 -0
- 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 +15 -2
- 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 +28 -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 +34 -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 +46 -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 +126 -31
- 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 +6 -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 +58 -0
- data/app/serializers/spree/api/v3/admin/role_serializer.rb +24 -6
- data/app/serializers/spree/api/v3/admin/saved_report_serializer.rb +32 -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 +48 -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 +65 -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 +61 -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 +19 -19
- data/lib/spree/api/dependencies.rb +174 -227
- data/lib/spree/api/engine.rb +6 -0
- 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 +342 -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,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
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Orders
|
|
5
|
+
# What every post-sale record on an order has in common: it is opened
|
|
6
|
+
# against the order, and then moved through its statuses one named
|
|
7
|
+
# action at a time.
|
|
8
|
+
#
|
|
9
|
+
# Shared by the operator's branch and the seller's, which run the same
|
|
10
|
+
# workflows with the same arguments. What differs between them is only
|
|
11
|
+
# *whose records a payload may name*, and that stays in the including
|
|
12
|
+
# controller: this concern never fetches an order, a variant or a
|
|
13
|
+
# stock location, so including it cannot widen what a caller reaches.
|
|
14
|
+
# `@order` and `@resource` arrive already fetched and authorized —
|
|
15
|
+
# through `current_store` on one branch, `current_seller_orders` on
|
|
16
|
+
# the other — and this code never learns which.
|
|
17
|
+
module PostSaleActions
|
|
18
|
+
extend ActiveSupport::Concern
|
|
19
|
+
include Spree::Api::V3::ItemsPayload
|
|
20
|
+
|
|
21
|
+
protected
|
|
22
|
+
|
|
23
|
+
# Runs one of the record's status workflows and renders the result.
|
|
24
|
+
#
|
|
25
|
+
# The keyword the workflow expects for the record itself differs per
|
|
26
|
+
# entity (+return_record:+, +exchange:+, +claim:+), so each concern
|
|
27
|
+
# names its own.
|
|
28
|
+
def run_workflow(workflow, **arguments)
|
|
29
|
+
result = workflow.call(workflow_record_key => @resource, **arguments)
|
|
30
|
+
|
|
31
|
+
if result.success?
|
|
32
|
+
render json: serialize_resource(result.value)
|
|
33
|
+
else
|
|
34
|
+
render_result_error(result)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# @return [Symbol] the keyword this entity's workflows take it under
|
|
39
|
+
def workflow_record_key
|
|
40
|
+
raise NotImplementedError, "#{self.class} must implement #workflow_record_key"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# The units a receive request named, or nil when it named none.
|
|
44
|
+
# See {Spree::Api::V3::ItemsPayload} for what omitted and empty mean.
|
|
45
|
+
#
|
|
46
|
+
# @param keys [Array<Symbol>] the per-item keys to permit
|
|
47
|
+
# @return [Array<ActionController::Parameters>, nil]
|
|
48
|
+
def received_items(keys)
|
|
49
|
+
items_payload(keys)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Opens the record against the order, through the entity's create
|
|
53
|
+
# workflow.
|
|
54
|
+
def create_post_sale_record(workflow, subject, **arguments)
|
|
55
|
+
authorize!(:create, subject)
|
|
56
|
+
|
|
57
|
+
result = workflow.call(
|
|
58
|
+
order: @order,
|
|
59
|
+
items: items_for_create,
|
|
60
|
+
reason: reason_for_create,
|
|
61
|
+
memo: create_params[:memo],
|
|
62
|
+
created_by: current_actor,
|
|
63
|
+
**arguments
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
if result.success?
|
|
67
|
+
render json: serialize_resource(result.value), status: :created
|
|
68
|
+
else
|
|
69
|
+
render_result_error(result)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Orders
|
|
5
|
+
# Goods coming back on an order: opening the return, and the four
|
|
6
|
+
# 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 ReturnActions
|
|
11
|
+
extend ActiveSupport::Concern
|
|
12
|
+
include PostSaleActions
|
|
13
|
+
|
|
14
|
+
# POST .../returns
|
|
15
|
+
def create
|
|
16
|
+
create_post_sale_record(
|
|
17
|
+
Spree.return_create_workflow, Spree::Return,
|
|
18
|
+
stock_location: stock_location_for_create
|
|
19
|
+
)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# PATCH .../returns/:id/approve
|
|
23
|
+
def approve
|
|
24
|
+
run_workflow(Spree.return_approve_workflow, approver: current_actor)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# PATCH .../returns/:id/receive — what the warehouse actually counted.
|
|
28
|
+
def receive
|
|
29
|
+
run_workflow(Spree.return_receive_workflow,
|
|
30
|
+
items: items_for_receive,
|
|
31
|
+
received_by: current_actor)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# PATCH .../returns/:id/refund
|
|
35
|
+
def refund
|
|
36
|
+
run_workflow(Spree.return_refund_workflow,
|
|
37
|
+
amount: params[:amount],
|
|
38
|
+
refund_method: params[:refund_method] || 'original_payment',
|
|
39
|
+
refunder: current_actor)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# PATCH .../returns/:id/cancel
|
|
43
|
+
def cancel
|
|
44
|
+
run_workflow(Spree.return_cancel_workflow, reason: params[:reason])
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
protected
|
|
48
|
+
|
|
49
|
+
def model_class
|
|
50
|
+
Spree::Return
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def parent_association
|
|
54
|
+
:returns
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def workflow_record_key
|
|
58
|
+
:return_record
|
|
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, :quantity]
|
|
67
|
+
)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# The units coming back, resolved through the order itself, so a
|
|
71
|
+
# fulfillment item from another order cannot be returned against
|
|
72
|
+
# this one.
|
|
73
|
+
def items_for_create
|
|
74
|
+
Array(create_params[:items]).map do |item|
|
|
75
|
+
{
|
|
76
|
+
fulfillment_item: @order.fulfillment_items.find_by_prefix_id!(item[:fulfillment_item_id]),
|
|
77
|
+
quantity: item[:quantity].to_i
|
|
78
|
+
}
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# What the warehouse counted, resolved through the return itself.
|
|
83
|
+
def items_for_receive
|
|
84
|
+
sent = received_items([:return_line_item_id, :quantity, :resellable])
|
|
85
|
+
return nil if sent.nil?
|
|
86
|
+
|
|
87
|
+
sent.map do |item|
|
|
88
|
+
{
|
|
89
|
+
return_line_item: @resource.return_line_items.find_by_prefix_id!(item[:return_line_item_id]),
|
|
90
|
+
quantity: item[:quantity].to_i,
|
|
91
|
+
resellable: item.key?(:resellable) ? item[:resellable].to_b : true
|
|
92
|
+
}
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# The merchant's own vocabulary either way: a seller picks a reason,
|
|
97
|
+
# the operator decides what the reasons are.
|
|
98
|
+
def reason_for_create
|
|
99
|
+
return nil if create_params[:reason_id].blank?
|
|
100
|
+
|
|
101
|
+
current_store.return_reasons.find_by_prefix_id!(create_params[:reason_id])
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# The shelf the goods go back to — the store's warehouses for an
|
|
105
|
+
# operator, only their own for a seller. Left to the including
|
|
106
|
+
# controller because it decides whose stock this restocks.
|
|
107
|
+
#
|
|
108
|
+
# @return [Spree::StockLocation, nil]
|
|
109
|
+
def stock_location_for_create
|
|
110
|
+
raise NotImplementedError, "#{self.class} must implement #stock_location_for_create"
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Orders
|
|
5
|
+
# The postage on a parcel: recording a label, printing it back, and
|
|
6
|
+
# removing one that was uploaded by mistake.
|
|
7
|
+
#
|
|
8
|
+
# Shared by the operator's branch and the seller's. Buying a label is
|
|
9
|
+
# NOT here: it needs a carrier account, which is the operator's, so
|
|
10
|
+
# that action lives on the admin controller alone.
|
|
11
|
+
#
|
|
12
|
+
# `@parent` (the label's owner) and `@resource` arrive already fetched
|
|
13
|
+
# and authorized, so including this concern cannot widen what a caller
|
|
14
|
+
# reaches.
|
|
15
|
+
module ShippingLabelActions
|
|
16
|
+
extend ActiveSupport::Concern
|
|
17
|
+
|
|
18
|
+
included do
|
|
19
|
+
include ActiveStorage::SetCurrent
|
|
20
|
+
include Spree::Api::V3::StreamsShippingLabel
|
|
21
|
+
|
|
22
|
+
rescue_from ActiveSupport::MessageVerifier::InvalidSignature,
|
|
23
|
+
with: :render_invalid_signature
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# GET .../labels/:id/download
|
|
27
|
+
#
|
|
28
|
+
# Streamed rather than redirected to storage, so the credentials
|
|
29
|
+
# that reached the action are what protects the file.
|
|
30
|
+
def download
|
|
31
|
+
stream_shipping_label(@resource) do
|
|
32
|
+
render_error(
|
|
33
|
+
code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:validation_error],
|
|
34
|
+
message: Spree.t('shipping_labels.errors.no_file_url'),
|
|
35
|
+
status: :unprocessable_content
|
|
36
|
+
)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# DELETE .../labels/:id
|
|
41
|
+
#
|
|
42
|
+
# Only an uploaded label: a purchased one has postage to refund, so
|
|
43
|
+
# it goes through the refund action instead.
|
|
44
|
+
def destroy
|
|
45
|
+
unless @resource.uploaded?
|
|
46
|
+
return render_error(
|
|
47
|
+
code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:validation_error],
|
|
48
|
+
message: Spree.t('shipping_labels.errors.purchased_not_deletable'),
|
|
49
|
+
status: :unprocessable_content
|
|
50
|
+
)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
with_order_lock do
|
|
54
|
+
# The consignment goes with the label only while the parcel
|
|
55
|
+
# never moved — a journey that happened is a fact. Once it has,
|
|
56
|
+
# the delivery stays and is simply unlinked, so a wrong PDF can
|
|
57
|
+
# still be removed and replaced.
|
|
58
|
+
@resource.release_unmoved_delivery
|
|
59
|
+
@resource.destroy!
|
|
60
|
+
head :no_content
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
protected
|
|
65
|
+
|
|
66
|
+
def model_class
|
|
67
|
+
Spree::ShippingLabel
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def parent_association
|
|
71
|
+
:shipping_labels
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def collection_includes
|
|
75
|
+
[{ file_attachment: :blob }]
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Downloading is reading, so it must not demand write access to the
|
|
79
|
+
# parcel the label belongs to.
|
|
80
|
+
def read_actions
|
|
81
|
+
%w[index show download]
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
private
|
|
85
|
+
|
|
86
|
+
def label_permitted_keys
|
|
87
|
+
[:file, :tracking_number, :carrier, :service,
|
|
88
|
+
:cost, :currency, :file_format, :tracking_url]
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def label_params
|
|
92
|
+
@label_params ||= params.permit(*label_permitted_keys)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Records a label bought outside Spree.
|
|
96
|
+
#
|
|
97
|
+
# Every key is passed whether or not the request carried it, so the
|
|
98
|
+
# workflow sees a missing tracking number as a blank one to reject
|
|
99
|
+
# rather than a keyword it was never given.
|
|
100
|
+
def record_uploaded_label
|
|
101
|
+
with_order_lock do
|
|
102
|
+
result = Spree.shipping_label_record_workflow.call(
|
|
103
|
+
owner: @parent,
|
|
104
|
+
**label_permitted_keys.index_with { |key| label_params[key] }
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
if result.success?
|
|
108
|
+
render json: serialize_resource(result.value), status: :created
|
|
109
|
+
else
|
|
110
|
+
render_result_error(result)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# A tampered or expired direct-upload signature is a bad parameter,
|
|
116
|
+
# not a server fault.
|
|
117
|
+
def render_invalid_signature
|
|
118
|
+
render_error(
|
|
119
|
+
code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:parameter_invalid],
|
|
120
|
+
message: Spree.t('shipping_labels.errors.file_required'),
|
|
121
|
+
status: :unprocessable_content
|
|
122
|
+
)
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
@@ -6,12 +6,15 @@ module Spree
|
|
|
6
6
|
# 1. **Prefixed ID resolution** — decodes Stripe-style prefixed IDs (e.g. "prod_86Rf07xd4z")
|
|
7
7
|
# to integer primary keys for any param ending in `_id` or `_ids`.
|
|
8
8
|
#
|
|
9
|
-
# 2. **Nested attributes normalization** — converts flat arrays (e.g. `
|
|
10
|
-
# to Rails `_attributes` format (e.g. `
|
|
9
|
+
# 2. **Nested attributes normalization** — converts flat arrays (e.g. `variants: [...]`)
|
|
10
|
+
# to Rails `_attributes` format (e.g. `variants_attributes: [...]`) based on
|
|
11
11
|
# the model's `accepts_nested_attributes_for` declarations.
|
|
12
12
|
#
|
|
13
|
-
#
|
|
14
|
-
#
|
|
13
|
+
# `normalize_params` is called explicitly by a controller's
|
|
14
|
+
# `permitted_params`. It is deliberately NOT applied to every write: it
|
|
15
|
+
# recurses into nested hashes decoding anything shaped like a prefixed ID,
|
|
16
|
+
# which would corrupt opaque provider values (see
|
|
17
|
+
# Admin::PaymentMethodsController).
|
|
15
18
|
module ParamsNormalizer
|
|
16
19
|
extend ActiveSupport::Concern
|
|
17
20
|
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
# Turns a CanCanCan ability into the flat, JSON-safe shape the panels'
|
|
5
|
+
# `<Can>` reads. Shared by every `/me` endpoint — the admin and seller
|
|
6
|
+
# branches answer different audiences, but the frontend permission model
|
|
7
|
+
# is one implementation, so its input has to be too.
|
|
8
|
+
#
|
|
9
|
+
# - Rule order is preserved so the frontend matcher can apply
|
|
10
|
+
# CanCanCan's "last matching rule wins" semantics.
|
|
11
|
+
# - Per-record conditions are NOT serialized (they often reference
|
|
12
|
+
# scopes or blocks that don't translate to JSON). The frontend
|
|
13
|
+
# receives `has_conditions: true` as a hint that the action might be
|
|
14
|
+
# denied at the per-record level — in practice the SPA shows the
|
|
15
|
+
# action optimistically and handles 403 from the API.
|
|
16
|
+
module PermissionSerialization
|
|
17
|
+
extend ActiveSupport::Concern
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def serialize_permissions(ability)
|
|
22
|
+
ability.send(:rules).map do |rule|
|
|
23
|
+
{
|
|
24
|
+
allow: rule.base_behavior,
|
|
25
|
+
actions: Array(rule.actions).map(&:to_s),
|
|
26
|
+
subjects: Array(rule.subjects).map { |subject| subject.is_a?(Class) ? subject.name : subject.to_s },
|
|
27
|
+
has_conditions: rule_has_conditions?(rule)
|
|
28
|
+
}
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def serialize_permission_keys(ability)
|
|
33
|
+
ability.respond_to?(:permission_keys) ? ability.permission_keys : []
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def rule_has_conditions?(rule)
|
|
37
|
+
rule.block.present? || rule.conditions.present?
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -1,22 +1,56 @@
|
|
|
1
1
|
module Spree
|
|
2
2
|
module Api
|
|
3
3
|
module V3
|
|
4
|
-
#
|
|
5
|
-
#
|
|
6
|
-
#
|
|
4
|
+
# Owns the request-throttling identity shared by the `rate_limit`
|
|
5
|
+
# declarations in BaseController and the X-RateLimit-Limit /
|
|
6
|
+
# X-RateLimit-Remaining / Retry-After headers set on every v3 response:
|
|
7
|
+
# which bucket a request counts against and which ceiling applies.
|
|
8
|
+
#
|
|
9
|
+
# Secret keys (sk_*) are single server-to-server callers, so each key
|
|
10
|
+
# gets one bucket across the whole API. Publishable keys (pk_*) are
|
|
11
|
+
# shared by every storefront visitor, so their bucket includes the
|
|
12
|
+
# client IP — the limit is per visitor, never per storefront. Requests
|
|
13
|
+
# without an API key (admin JWT traffic) fall back to the client IP.
|
|
7
14
|
module RateLimitHeaders
|
|
8
15
|
extend ActiveSupport::Concern
|
|
9
16
|
|
|
17
|
+
# Shared `scope:` for the API-wide throttle — one bucket per caller
|
|
18
|
+
# across all v3 controllers, instead of Rails' default of one bucket
|
|
19
|
+
# per controller.
|
|
20
|
+
RATE_LIMIT_SCOPE = 'api_v3'.freeze
|
|
21
|
+
|
|
10
22
|
included do
|
|
11
23
|
after_action :set_rate_limit_headers
|
|
12
24
|
end
|
|
13
25
|
|
|
14
26
|
private
|
|
15
27
|
|
|
28
|
+
def rate_limit_ceiling
|
|
29
|
+
if secret_key_request?
|
|
30
|
+
Spree::Api::Config[:rate_limit_per_secret_key]
|
|
31
|
+
else
|
|
32
|
+
Spree::Api::Config[:rate_limit_per_key]
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Secret tokens are digested first — plaintext secrets must never
|
|
37
|
+
# become cache keys (Solid Cache persists them to the database, while
|
|
38
|
+
# the model itself stores only +token_digest+).
|
|
39
|
+
def rate_limit_bucket
|
|
40
|
+
api_key = extract_api_key
|
|
41
|
+
|
|
42
|
+
if secret_key_request?
|
|
43
|
+
Spree::ApiKey.compute_token_digest(api_key)
|
|
44
|
+
elsif api_key
|
|
45
|
+
"#{api_key}:#{request.remote_ip}"
|
|
46
|
+
else
|
|
47
|
+
request.remote_ip
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
16
51
|
def set_rate_limit_headers
|
|
17
|
-
limit =
|
|
18
|
-
|
|
19
|
-
cache_key = ['rate-limit', controller_path, by].compact.join(':')
|
|
52
|
+
limit = rate_limit_ceiling
|
|
53
|
+
cache_key = ['rate-limit', RATE_LIMIT_SCOPE, rate_limit_bucket].join(':')
|
|
20
54
|
count = Rails.cache.read(cache_key)
|
|
21
55
|
|
|
22
56
|
return if count.nil?
|