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,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: try_spree_current_user,
|
|
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: try_spree_current_user)
|
|
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: try_spree_current_user)
|
|
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: try_spree_current_user)
|
|
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?
|
|
@@ -37,7 +37,15 @@ module Spree
|
|
|
37
37
|
# tags, etc.) or for specific actions (`only: :index`) when an
|
|
38
38
|
# action authorizes another way, e.g. by filtering its collection
|
|
39
39
|
# per-type (exports).
|
|
40
|
-
|
|
40
|
+
#
|
|
41
|
+
# `jwt_only: true` narrows the exemption to JWT staff: secret API
|
|
42
|
+
# keys still have their scope enforced. Use it for shell data a
|
|
43
|
+
# signed-in staff member reads to render the dashboard (the store
|
|
44
|
+
# itself) but which a scope-limited integration key has no business
|
|
45
|
+
# reading outside its granted scope.
|
|
46
|
+
def skip_scope_check!(only: nil, jwt_only: false)
|
|
47
|
+
self._scope_check_skip_jwt_only = jwt_only
|
|
48
|
+
|
|
41
49
|
if only
|
|
42
50
|
self._scope_check_skipped_actions = Array(only).map(&:to_s)
|
|
43
51
|
else
|
|
@@ -50,6 +58,7 @@ module Spree
|
|
|
50
58
|
class_attribute :_scoped_resource, instance_accessor: false
|
|
51
59
|
class_attribute :_scope_check_skipped, instance_accessor: false, default: false
|
|
52
60
|
class_attribute :_scope_check_skipped_actions, instance_accessor: false
|
|
61
|
+
class_attribute :_scope_check_skip_jwt_only, instance_accessor: false, default: false
|
|
53
62
|
before_action :authorize_api_key_scope!
|
|
54
63
|
end
|
|
55
64
|
|
|
@@ -58,9 +67,12 @@ module Spree
|
|
|
58
67
|
def authorize_api_key_scope!
|
|
59
68
|
# Endpoints explicitly exempt from the scope mechanism (auth, me, public
|
|
60
69
|
# invitation acceptance, per-type-filtered exports, etc.) opt out first,
|
|
61
|
-
# before any key resolution or enforcement.
|
|
62
|
-
|
|
63
|
-
|
|
70
|
+
# before any key resolution or enforcement. A `jwt_only` skip is the
|
|
71
|
+
# exception: it exempts JWT staff but still enforces scope for secret
|
|
72
|
+
# keys, so it must fall through to key resolution below.
|
|
73
|
+
if scope_check_skipped_for_action? && !self.class._scope_check_skip_jwt_only
|
|
74
|
+
return
|
|
75
|
+
end
|
|
64
76
|
|
|
65
77
|
# Fail CLOSED, not open. A nil `current_api_key` legitimately means a
|
|
66
78
|
# non-secret-key request (JWT admin / publishable) authorized by other
|
|
@@ -73,15 +85,25 @@ module Spree
|
|
|
73
85
|
resolve_current_api_key_for_scope_check!
|
|
74
86
|
|
|
75
87
|
unless current_api_key
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
88
|
+
if secret_key_request?
|
|
89
|
+
# A secret-key token was presented but did not resolve to a live key
|
|
90
|
+
# for this store — reject rather than silently skip the scope check.
|
|
91
|
+
return render_error(
|
|
92
|
+
code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:invalid_token],
|
|
93
|
+
message: 'Valid secret API key required',
|
|
94
|
+
status: :unauthorized
|
|
95
|
+
)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# A `jwt_only` skip exempts the JWT/publishable principal we now know
|
|
99
|
+
# this is (no secret key resolved) — shell data the dashboard reads
|
|
100
|
+
# without a specific scope.
|
|
101
|
+
return if scope_check_skipped_for_action? && self.class._scope_check_skip_jwt_only
|
|
102
|
+
|
|
103
|
+
# JWT staff pass through the same key gate as secret keys: their
|
|
104
|
+
# roles' catalog keys play the role scopes play for keys, so both
|
|
105
|
+
# principals share one enforcement contract per controller.
|
|
106
|
+
return authorize_staff_permission!
|
|
85
107
|
end
|
|
86
108
|
|
|
87
109
|
resource = scoped_resource_name
|
|
@@ -101,27 +123,59 @@ module Spree
|
|
|
101
123
|
)
|
|
102
124
|
end
|
|
103
125
|
|
|
104
|
-
#
|
|
105
|
-
#
|
|
106
|
-
#
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
126
|
+
# The JWT half of the key gate. The staffer's expanded role keys come
|
|
127
|
+
# from Spree::Ability#permission_keys; a custom ability class without
|
|
128
|
+
# that method falls back to plain CanCanCan `authorize!` enforcement.
|
|
129
|
+
def authorize_staff_permission!
|
|
130
|
+
return unless current_user
|
|
131
|
+
|
|
132
|
+
resource = scoped_resource_name
|
|
133
|
+
# Fail closed, mirroring the secret-key path: admin controllers must
|
|
134
|
+
# declare their scope (or skip explicitly).
|
|
135
|
+
raise MissingScopedResource, self.class unless resource
|
|
136
|
+
|
|
137
|
+
ability = current_ability
|
|
138
|
+
return unless ability.respond_to?(:permission_keys)
|
|
139
|
+
|
|
140
|
+
required = "#{action_kind}_#{resource}"
|
|
141
|
+
# Scope names outside the catalog (the exports/imports `:all`
|
|
142
|
+
# fallback, host-registered types) defer to CanCanCan's `authorize!`
|
|
143
|
+
# — the caller stays gated per subject, just not by key.
|
|
144
|
+
return unless Spree.permissions.key?(required)
|
|
145
|
+
return if ability.permission_keys.include?(required)
|
|
146
|
+
|
|
147
|
+
Rails.logger.info do
|
|
148
|
+
"[Spree] Access denied: user=#{current_user.id} required=#{required} " \
|
|
149
|
+
"held=#{ability.permission_keys.join(',')}"
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
render_error(
|
|
153
|
+
code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:access_denied],
|
|
154
|
+
message: "Missing permission: #{required}",
|
|
155
|
+
status: :forbidden,
|
|
156
|
+
details: { required_permission: required }
|
|
157
|
+
)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# Whether the current action opted out of scope checks via
|
|
161
|
+
# `skip_scope_check!` (whole-controller or `only:`). Independent of the
|
|
162
|
+
# `jwt_only` qualifier, which the caller weighs separately.
|
|
163
|
+
def scope_check_skipped_for_action?
|
|
164
|
+
self.class._scope_check_skipped ||
|
|
165
|
+
self.class._scope_check_skipped_actions&.include?(action_name) || false
|
|
111
166
|
end
|
|
112
167
|
|
|
113
168
|
# Resolves the request's secret API key into `@current_api_key` if a
|
|
114
169
|
# secret-key token is present and it hasn't been resolved yet, so the scope
|
|
115
|
-
# check does not depend on `authenticate_admin!` having already run.
|
|
116
|
-
# the
|
|
117
|
-
#
|
|
118
|
-
# nothing.
|
|
170
|
+
# check does not depend on `authenticate_admin!` having already run. Uses
|
|
171
|
+
# the same memoized lookup as AdminAuthentication (the key selects the
|
|
172
|
+
# request's store — see Admin::StoreContext), and is idempotent: when the
|
|
173
|
+
# key is already loaded (guard runs after auth) it does nothing.
|
|
119
174
|
def resolve_current_api_key_for_scope_check!
|
|
120
175
|
return if @current_api_key
|
|
121
176
|
return unless secret_key_request?
|
|
122
177
|
|
|
123
|
-
|
|
124
|
-
@current_api_key = key if key && key.store_id == current_store.id
|
|
178
|
+
@current_api_key = secret_api_key
|
|
125
179
|
end
|
|
126
180
|
|
|
127
181
|
# The resource name used in scope strings (`read_<name>` / `write_<name>`).
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Seller
|
|
5
|
+
# Cookie-based delivery for seller refresh tokens.
|
|
6
|
+
#
|
|
7
|
+
# Both the name and the path differ from the admin cookie, and both
|
|
8
|
+
# matter: a shared name would let one browser's admin session be
|
|
9
|
+
# redeemed on the seller panel, and the path is what stops each
|
|
10
|
+
# surface's cookie being sent to the other's endpoints. Together with
|
|
11
|
+
# the audience stamped on the token itself, a session belongs to
|
|
12
|
+
# exactly one surface.
|
|
13
|
+
#
|
|
14
|
+
# The CSRF reasoning is the admin concern's, unchanged: SameSite plus
|
|
15
|
+
# the Spree::AllowedOrigin allowlist. A seller dashboard served from an
|
|
16
|
+
# origin outside that allowlist would need its own answer.
|
|
17
|
+
module AuthCookies
|
|
18
|
+
extend ActiveSupport::Concern
|
|
19
|
+
|
|
20
|
+
# ActionController::API drops Cookies — re-include it on the auth
|
|
21
|
+
# controller only; the rest of the branch stays stateless.
|
|
22
|
+
included do
|
|
23
|
+
include ActionController::Cookies
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
REFRESH_COOKIE_NAME = :spree_seller_refresh_token
|
|
27
|
+
COOKIE_PATH = '/api/v3/seller/auth'.freeze
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
|
|
31
|
+
def set_refresh_cookie(refresh_token)
|
|
32
|
+
cookies.signed[REFRESH_COOKIE_NAME] = base_cookie_attributes.merge(
|
|
33
|
+
value: refresh_token.token,
|
|
34
|
+
expires: refresh_token.expires_at,
|
|
35
|
+
path: COOKIE_PATH,
|
|
36
|
+
httponly: true
|
|
37
|
+
)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def clear_refresh_cookie
|
|
41
|
+
cookies.delete(REFRESH_COOKIE_NAME, path: COOKIE_PATH)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def refresh_token_from_cookie
|
|
45
|
+
cookies.signed[REFRESH_COOKIE_NAME].presence
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Keyed off the request scheme, not the Rails env: Rails silently
|
|
49
|
+
# refuses to write a Secure cookie on a non-SSL request, so an app
|
|
50
|
+
# served over plain http would never receive one at all.
|
|
51
|
+
def base_cookie_attributes
|
|
52
|
+
if request.ssl?
|
|
53
|
+
{ secure: true, same_site: :none }
|
|
54
|
+
else
|
|
55
|
+
{ secure: false, same_site: :lax }
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|