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,169 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Seller
|
|
5
|
+
# Sign-in for the marketplace seller panel.
|
|
6
|
+
#
|
|
7
|
+
# Its own surface rather than a reuse of the admin one, so login policy
|
|
8
|
+
# can differ per panel: a store that requires SSO for its own staff can
|
|
9
|
+
# still let sellers sign in with a password, because the two read
|
|
10
|
+
# different strategy registries against the same user class.
|
|
11
|
+
class AuthController < Seller::BaseController
|
|
12
|
+
include Spree::Api::V3::Seller::AuthCookies
|
|
13
|
+
include Spree::Api::V3::AuthenticationStrategies
|
|
14
|
+
|
|
15
|
+
skip_scope_check!
|
|
16
|
+
|
|
17
|
+
# A distinct `name:` per declaration — without one Rails keys every
|
|
18
|
+
# counter in the controller on one cache entry, so the provider list
|
|
19
|
+
# a login page fetches on every load would spend the login budget.
|
|
20
|
+
rate_limit to: Spree::Api::Config[:rate_limit_login],
|
|
21
|
+
within: Spree::Api::Config[:rate_limit_window].seconds,
|
|
22
|
+
store: Rails.cache, only: :create, name: 'seller_login',
|
|
23
|
+
with: -> { render_rate_limited(limit: Spree::Api::Config[:rate_limit_login]) }
|
|
24
|
+
rate_limit to: Spree::Api::Config[:rate_limit_refresh],
|
|
25
|
+
within: Spree::Api::Config[:rate_limit_window].seconds,
|
|
26
|
+
store: Rails.cache, only: :providers, name: 'seller_providers',
|
|
27
|
+
with: -> { render_rate_limited(limit: Spree::Api::Config[:rate_limit_refresh]) }
|
|
28
|
+
rate_limit to: Spree::Api::Config[:rate_limit_refresh],
|
|
29
|
+
within: Spree::Api::Config[:rate_limit_window].seconds,
|
|
30
|
+
store: Rails.cache, only: [:refresh, :logout], name: 'seller_refresh',
|
|
31
|
+
with: -> { render_rate_limited(limit: Spree::Api::Config[:rate_limit_refresh]) }
|
|
32
|
+
|
|
33
|
+
# Signing in is what establishes which sellers the caller may act as,
|
|
34
|
+
# so these actions run before any seller is known.
|
|
35
|
+
skip_before_action :set_current_seller_context, only: [:create, :refresh, :logout, :providers]
|
|
36
|
+
skip_before_action :authenticate_seller!, only: [:create, :refresh, :logout, :providers]
|
|
37
|
+
|
|
38
|
+
# POST /api/v3/seller/auth/login
|
|
39
|
+
def create
|
|
40
|
+
strategy = authentication_strategy
|
|
41
|
+
return unless strategy
|
|
42
|
+
|
|
43
|
+
result = strategy.authenticate
|
|
44
|
+
return render_authentication_failed(result.error) unless result.success?
|
|
45
|
+
|
|
46
|
+
user = result.value
|
|
47
|
+
# A store's own staff share this user class, so authenticating is
|
|
48
|
+
# not enough: without a role on some seller there is no panel to
|
|
49
|
+
# sign in to, and minting a token would hand out an audience the
|
|
50
|
+
# holder can do nothing with.
|
|
51
|
+
return render_authentication_failed(Spree.t(:seller_membership_required)) unless user.seller_member?
|
|
52
|
+
|
|
53
|
+
set_refresh_cookie(
|
|
54
|
+
Spree::RefreshToken.create_for(
|
|
55
|
+
user,
|
|
56
|
+
audience: Spree::Api::V3::JwtAuthentication::JWT_AUDIENCE_SELLER,
|
|
57
|
+
request_env: request_env_for_token
|
|
58
|
+
)
|
|
59
|
+
)
|
|
60
|
+
render json: auth_response(user)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# GET /api/v3/seller/auth/providers
|
|
64
|
+
def providers
|
|
65
|
+
render json: { providers: Spree.seller_authentication_strategies.describe }
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# POST /api/v3/seller/auth/refresh
|
|
69
|
+
def refresh
|
|
70
|
+
refresh_token_value = refresh_token_from_cookie
|
|
71
|
+
|
|
72
|
+
if refresh_token_value.blank?
|
|
73
|
+
return render_error(
|
|
74
|
+
code: ErrorHandler::ERROR_CODES[:invalid_refresh_token],
|
|
75
|
+
message: 'Refresh token cookie missing',
|
|
76
|
+
status: :unauthorized
|
|
77
|
+
)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Narrowed by audience: a token minted on another surface must not
|
|
81
|
+
# be exchangeable for a seller one.
|
|
82
|
+
refresh_token = Spree::RefreshToken.active.
|
|
83
|
+
for_audience(Spree::Api::V3::JwtAuthentication::JWT_AUDIENCE_SELLER).
|
|
84
|
+
find_by(token: refresh_token_value)
|
|
85
|
+
|
|
86
|
+
if refresh_token.nil?
|
|
87
|
+
clear_refresh_cookie
|
|
88
|
+
return render_error(
|
|
89
|
+
code: ErrorHandler::ERROR_CODES[:invalid_refresh_token],
|
|
90
|
+
message: 'Invalid or expired refresh token',
|
|
91
|
+
status: :unauthorized
|
|
92
|
+
)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
user = refresh_token.user
|
|
96
|
+
# Membership can be revoked while a session is live; the refresh is
|
|
97
|
+
# where that takes effect.
|
|
98
|
+
unless user.seller_member?
|
|
99
|
+
refresh_token.destroy
|
|
100
|
+
clear_refresh_cookie
|
|
101
|
+
return render_error(
|
|
102
|
+
code: ErrorHandler::ERROR_CODES[:access_denied],
|
|
103
|
+
message: Spree.t(:seller_membership_required),
|
|
104
|
+
status: :forbidden
|
|
105
|
+
)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
set_refresh_cookie(refresh_token.rotate!(request_env: request_env_for_token))
|
|
109
|
+
render json: auth_response(user)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# POST /api/v3/seller/auth/logout
|
|
113
|
+
def logout
|
|
114
|
+
refresh_token_value = refresh_token_from_cookie
|
|
115
|
+
|
|
116
|
+
if refresh_token_value.present?
|
|
117
|
+
Spree::RefreshToken.
|
|
118
|
+
for_audience(Spree::Api::V3::JwtAuthentication::JWT_AUDIENCE_SELLER).
|
|
119
|
+
find_by(token: refresh_token_value)&.destroy
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
clear_refresh_cookie
|
|
123
|
+
head :no_content
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
private
|
|
127
|
+
|
|
128
|
+
def render_authentication_failed(message)
|
|
129
|
+
render_error(
|
|
130
|
+
code: ErrorHandler::ERROR_CODES[:authentication_failed],
|
|
131
|
+
message: message,
|
|
132
|
+
status: :unauthorized
|
|
133
|
+
)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def auth_response(user)
|
|
137
|
+
{
|
|
138
|
+
token: generate_jwt(user, audience: Spree::Api::V3::JwtAuthentication::JWT_AUDIENCE_SELLER),
|
|
139
|
+
user: Spree.api.seller_team_member_serializer.new(user, params: { store: user.sellers.first&.store }).to_h,
|
|
140
|
+
sellers: serialized_sellers(user)
|
|
141
|
+
}
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# The panel needs these to choose an X-Spree-Seller-Id before it can
|
|
145
|
+
# make any other request.
|
|
146
|
+
def serialized_sellers(user)
|
|
147
|
+
user.sellers.map { |seller| { id: seller.prefixed_id, name: seller.name, status: seller.status } }
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def authentication_strategies
|
|
151
|
+
Spree.seller_authentication_strategies
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def authentication_user_class
|
|
155
|
+
Spree.admin_user_class
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def jwt_expiration
|
|
159
|
+
Spree::Api::Config[:admin_jwt_expiration]
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def request_env_for_token
|
|
163
|
+
{ ip_address: request.remote_ip, user_agent: request.user_agent&.truncate(255) }
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Seller
|
|
5
|
+
# Where this seller stands: what they have earned, what has reached
|
|
6
|
+
# them, and what the marketplace still owes — one row per currency.
|
|
7
|
+
#
|
|
8
|
+
# A computed collection rather than a resource: nothing here is a
|
|
9
|
+
# record, so there is no id to fetch and nothing to page.
|
|
10
|
+
class BalancesController < Seller::BaseController
|
|
11
|
+
scoped_resource :seller_earnings
|
|
12
|
+
|
|
13
|
+
# GET /api/v3/seller/balances
|
|
14
|
+
def index
|
|
15
|
+
authorize! :index, :seller_earnings
|
|
16
|
+
|
|
17
|
+
render json: { data: current_seller.balances.map { |balance| serialize_balance(balance) } }
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
protected
|
|
21
|
+
|
|
22
|
+
def read_actions
|
|
23
|
+
%w[index]
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def serialize_balance(balance)
|
|
29
|
+
Spree.api.seller_balance_serializer.new(balance, params: { store: current_store }).to_h
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Seller
|
|
5
|
+
# Anchor for the marketplace seller panel.
|
|
6
|
+
#
|
|
7
|
+
# Deliberately not a subclass of the admin anchor: the admin branch
|
|
8
|
+
# resolves everything through `current_store`, and inheriting those
|
|
9
|
+
# lookups is precisely how a seller would come to read the whole
|
|
10
|
+
# store. Concerns and workflows are shared; controllers are not.
|
|
11
|
+
#
|
|
12
|
+
# Mirrors Seller::ResourceController — they anchor parallel inheritance
|
|
13
|
+
# branches, so a concern added to one must be added to the other.
|
|
14
|
+
class BaseController < Spree::Api::V3::BaseController
|
|
15
|
+
include Spree::Api::V3::Seller::SellerContext
|
|
16
|
+
include Spree::Api::V3::SellerAuthentication
|
|
17
|
+
|
|
18
|
+
before_action :authenticate_seller!
|
|
19
|
+
|
|
20
|
+
include Spree::Api::V3::ScopedAuthorization
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Seller
|
|
5
|
+
# What went wrong with a delivery.
|
|
6
|
+
class ClaimReasonsController < ReasonsController
|
|
7
|
+
protected
|
|
8
|
+
|
|
9
|
+
def model_class
|
|
10
|
+
Spree::ClaimReason
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def reasons_association
|
|
14
|
+
:claim_reasons
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Seller
|
|
5
|
+
# Countries for the panel's address forms.
|
|
6
|
+
#
|
|
7
|
+
# Public reference data — the same list the storefront and the
|
|
8
|
+
# operator's dashboard serve — so it is exempt from the key gate, as
|
|
9
|
+
# its admin twin is. A seller filling in a billing address needs every
|
|
10
|
+
# country, not the ones their marketplace happens to sell into.
|
|
11
|
+
class CountriesController < Seller::BaseController
|
|
12
|
+
skip_scope_check!
|
|
13
|
+
|
|
14
|
+
# GET /api/v3/seller/countries
|
|
15
|
+
#
|
|
16
|
+
# Unpaginated: there are ~250 countries and an address dropdown needs
|
|
17
|
+
# them all at once, which Pagy's global max_limit would prevent.
|
|
18
|
+
def index
|
|
19
|
+
countries = Spree::Country.all.sort_by(&:name)
|
|
20
|
+
|
|
21
|
+
render json: {
|
|
22
|
+
data: countries.map { |country| serialize_country(country) },
|
|
23
|
+
meta: { count: countries.size }
|
|
24
|
+
}
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
def serialize_country(country)
|
|
30
|
+
Spree.api.country_serializer.new(
|
|
31
|
+
country, params: { store: current_store, expand: ['states'] }
|
|
32
|
+
).to_h
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Seller
|
|
5
|
+
# How this seller ships: the methods they create, price and retire
|
|
6
|
+
# against the marketplace's profiles and zones
|
|
7
|
+
# (docs/plans/6.0-multi-vendor-marketplace.md, Decision 13).
|
|
8
|
+
#
|
|
9
|
+
# The listing also carries the marketplace methods the operator shares
|
|
10
|
+
# with sellers, so a seller can see what already ships their goods
|
|
11
|
+
# before adding anything. Those rows are read-only — `find_resource`
|
|
12
|
+
# roots writes in the seller's own methods, so a shared method's id is
|
|
13
|
+
# a 404 on every action but `show`.
|
|
14
|
+
#
|
|
15
|
+
# Carriers stay the marketplace's: a seller's method prices through
|
|
16
|
+
# the internal rate provider and is fulfilled by hand, which is what
|
|
17
|
+
# `Spree::DeliveryMethod` validates and why neither provider is
|
|
18
|
+
# writable here.
|
|
19
|
+
class DeliveryMethodsController < Seller::ResourceController
|
|
20
|
+
scoped_resource :delivery_methods
|
|
21
|
+
|
|
22
|
+
# GET /api/v3/seller/delivery_methods/calculators
|
|
23
|
+
# The ways a seller can price a method, with the preference schema
|
|
24
|
+
# each one's form is rendered from.
|
|
25
|
+
def calculators
|
|
26
|
+
authorize! :create, model_class
|
|
27
|
+
|
|
28
|
+
data = Spree::DeliveryMethod.calculators.map do |calculator_class|
|
|
29
|
+
{
|
|
30
|
+
type: calculator_class.api_type,
|
|
31
|
+
name: calculator_class.description,
|
|
32
|
+
preference_schema: calculator_class.respond_to?(:serialized_preference_schema) ? calculator_class.serialized_preference_schema : []
|
|
33
|
+
}
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
render json: { data: data }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# GET /api/v3/seller/delivery_methods/rule_types
|
|
40
|
+
# The conditions a seller may put on a method. A subset of the
|
|
41
|
+
# operator's: the rest either segment the marketplace's own traffic
|
|
42
|
+
# or point at catalog rows this branch does not serve.
|
|
43
|
+
def rule_types
|
|
44
|
+
authorize! :create, model_class
|
|
45
|
+
|
|
46
|
+
data = seller_rule_classes.map do |klass|
|
|
47
|
+
{
|
|
48
|
+
type: klass.api_type,
|
|
49
|
+
name: klass.human_name,
|
|
50
|
+
description: klass.human_description,
|
|
51
|
+
preference_schema: klass.serialized_preference_schema
|
|
52
|
+
}
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
render json: { data: data }
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Built off `resource_scope` rather than the inherited
|
|
59
|
+
# `build_resource`: the row is born the seller's own that way, and
|
|
60
|
+
# the payload carries calculator fields that are not columns.
|
|
61
|
+
def create
|
|
62
|
+
@resource = resource_scope.new
|
|
63
|
+
@resource.store = current_store
|
|
64
|
+
@resource.assign_attributes(assignable_params)
|
|
65
|
+
authorize_resource!(@resource, :create)
|
|
66
|
+
rederive_origin_group(@resource)
|
|
67
|
+
assign_calculator(@resource)
|
|
68
|
+
|
|
69
|
+
if @resource.errors.empty? && @resource.save
|
|
70
|
+
render json: serialize_resource(@resource), status: :created
|
|
71
|
+
else
|
|
72
|
+
render_validation_error(@resource.errors)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def update
|
|
77
|
+
@resource.assign_attributes(assignable_params)
|
|
78
|
+
rederive_origin_group(@resource)
|
|
79
|
+
assign_calculator(@resource)
|
|
80
|
+
|
|
81
|
+
if @resource.errors.empty? && @resource.save
|
|
82
|
+
render json: serialize_resource(@resource)
|
|
83
|
+
else
|
|
84
|
+
render_validation_error(@resource.errors)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
protected
|
|
89
|
+
|
|
90
|
+
def model_class
|
|
91
|
+
Spree::DeliveryMethod
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def serializer_class
|
|
95
|
+
Spree.api.seller_delivery_method_serializer
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Reading shows the seller's own methods plus the marketplace ones
|
|
99
|
+
# shared with them — the same set the estimator will quote their
|
|
100
|
+
# packages by, so the page answers "how do my goods ship" rather
|
|
101
|
+
# than only "what have I made".
|
|
102
|
+
def scope
|
|
103
|
+
current_store.delivery_methods.
|
|
104
|
+
available_to_seller(current_seller).
|
|
105
|
+
includes(*collection_includes).
|
|
106
|
+
preload_associations_lazily
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# Writes root in the seller's own methods, so a shared marketplace
|
|
110
|
+
# method cannot be edited or deleted through this branch.
|
|
111
|
+
def resource_scope
|
|
112
|
+
current_seller.delivery_methods
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def find_resource
|
|
116
|
+
action_name == 'show' ? super : resource_scope.find_by_prefix_id!(params[:id])
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# No provider fields: both are fixed for a seller's method, and
|
|
120
|
+
# permitting them would let a write fail validation for a choice the
|
|
121
|
+
# seller was never offered. No markup either — that prices a
|
|
122
|
+
# carrier's quote, and a seller has no carrier.
|
|
123
|
+
def permitted_params
|
|
124
|
+
params.permit(
|
|
125
|
+
*model_additional_permitted_attributes,
|
|
126
|
+
:name, :admin_name, :code, :storefront_visible, :tracking_url,
|
|
127
|
+
:estimated_transit_business_days_min, :estimated_transit_business_days_max,
|
|
128
|
+
:calculator_type,
|
|
129
|
+
:delivery_profile_id, :delivery_zone_id,
|
|
130
|
+
calculator_preferences: {},
|
|
131
|
+
rules: [:id, :type, :active, { preferences: {} }, *subclassed_rule_attributes]
|
|
132
|
+
)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# Association-backed config a rule declares on its own class. Empty
|
|
136
|
+
# today — the one core rule that declares any is withheld from this
|
|
137
|
+
# branch — but a seller-eligible rule that grows some would
|
|
138
|
+
# otherwise have them dropped by `permit` without a word.
|
|
139
|
+
#
|
|
140
|
+
# Read from the seller's own rule set, not every registered kind, so
|
|
141
|
+
# a withheld rule's attributes never become permitted here.
|
|
142
|
+
def subclassed_rule_attributes
|
|
143
|
+
seller_rule_classes.flat_map do |klass|
|
|
144
|
+
klass.respond_to?(:additional_permitted_attributes) ? klass.additional_permitted_attributes : []
|
|
145
|
+
end.uniq
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def collection_includes
|
|
149
|
+
[:calculator, :delivery_zone, :delivery_profile, :delivery_method_rules]
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
private
|
|
153
|
+
|
|
154
|
+
# Rule kinds this branch does not offer. Channel rules segment the
|
|
155
|
+
# marketplace's own traffic, and the excluded-products rule points at
|
|
156
|
+
# a catalog picker the seller panel does not have — a seller who will
|
|
157
|
+
# not ship something does not list it.
|
|
158
|
+
#
|
|
159
|
+
# Matched by name rather than by class identity: in development the
|
|
160
|
+
# registry holds classes from an earlier reload, so comparing
|
|
161
|
+
# constants silently matches nothing and every kind stays on offer.
|
|
162
|
+
WITHHELD_RULE_TYPES = %w[
|
|
163
|
+
Spree::DeliveryMethodRules::ChannelRule
|
|
164
|
+
Spree::DeliveryMethodRules::ExcludedProductsRule
|
|
165
|
+
].freeze
|
|
166
|
+
|
|
167
|
+
# The rule kinds a seller may put on their own method.
|
|
168
|
+
def seller_rule_classes
|
|
169
|
+
Spree.delivery_method_rules.reject { |klass| WITHHELD_RULE_TYPES.include?(klass.to_s) }
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
# Resolves the marketplace vocabulary a seller picks from, through
|
|
173
|
+
# the store: a profile or zone that is not this store's is a 404
|
|
174
|
+
# rather than a validation error, matching how the product form
|
|
175
|
+
# resolves its own pickers.
|
|
176
|
+
def assignable_params
|
|
177
|
+
attributes = permitted_params.except(
|
|
178
|
+
:delivery_profile_id, :delivery_zone_id, :calculator_type, :calculator_preferences, :rules
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
if params.key?(:delivery_profile_id)
|
|
182
|
+
attributes[:delivery_profile] = current_store.delivery_profiles.find_by_prefix_id!(params[:delivery_profile_id])
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
if params.key?(:delivery_zone_id)
|
|
186
|
+
attributes[:delivery_zone] =
|
|
187
|
+
params[:delivery_zone_id].present? ? current_store.delivery_zones.find_by_prefix_id!(params[:delivery_zone_id]) : nil
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
attributes[:rules] = permitted_rule_rows if params.key?(:rules)
|
|
191
|
+
attributes
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
# The origin group is derived, never chosen: a seller picks the kind
|
|
195
|
+
# of goods and where it ships, and which warehouses offer the method
|
|
196
|
+
# follows from those. The model derives it only on create, so a
|
|
197
|
+
# profile or zone change here has to re-derive it — otherwise the
|
|
198
|
+
# row keeps a group the new zone contradicts, and the composition
|
|
199
|
+
# validation refuses the save.
|
|
200
|
+
def rederive_origin_group(delivery_method)
|
|
201
|
+
return unless delivery_method.delivery_profile_id_changed? || delivery_method.delivery_zone_id_changed?
|
|
202
|
+
|
|
203
|
+
delivery_method.delivery_origin_group =
|
|
204
|
+
delivery_method.delivery_zone&.delivery_origin_group ||
|
|
205
|
+
delivery_method.delivery_profile&.default_origin_group
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
# A rule kind this branch does not offer is refused rather than
|
|
209
|
+
# dropped: silently ignoring it would report a save the seller can
|
|
210
|
+
# see did not take.
|
|
211
|
+
def permitted_rule_rows
|
|
212
|
+
allowed = seller_rule_classes.map(&:api_type)
|
|
213
|
+
|
|
214
|
+
Array(permitted_params[:rules]).map do |row|
|
|
215
|
+
row = row.to_h
|
|
216
|
+
raise ActiveRecord::RecordNotFound unless allowed.include?(row['type'].to_s)
|
|
217
|
+
|
|
218
|
+
row
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def assign_calculator(delivery_method)
|
|
223
|
+
calculator_type = permitted_params[:calculator_type]
|
|
224
|
+
preferences = permitted_params[:calculator_preferences]
|
|
225
|
+
|
|
226
|
+
if calculator_type.present? && delivery_method.calculator&.class&.api_type != calculator_type
|
|
227
|
+
registered = Spree::DeliveryMethod.calculators.find do |klass|
|
|
228
|
+
klass.api_type == calculator_type
|
|
229
|
+
end
|
|
230
|
+
unless registered
|
|
231
|
+
delivery_method.errors.add(:calculator_type, :invalid)
|
|
232
|
+
return
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
# Resolved from the registry entry's OWN name, never the
|
|
236
|
+
# request's: nothing user-supplied reaches `constantize`. Going
|
|
237
|
+
# back through the name rather than instantiating `registered`
|
|
238
|
+
# directly is what survives a reload — in development the
|
|
239
|
+
# registry holds a class from an earlier one, and an instance of
|
|
240
|
+
# it fails the association's type check.
|
|
241
|
+
delivery_method.calculator = registered.to_s.constantize.new
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
return if preferences.blank?
|
|
245
|
+
|
|
246
|
+
# A payload may carry preferences without naming a calculator —
|
|
247
|
+
# editing the amount on a method that already has one, or creating
|
|
248
|
+
# with the default. The model only builds the default calculator
|
|
249
|
+
# at validation, so without this the preferences land on nothing
|
|
250
|
+
# and the amount the merchant typed is silently replaced by a free
|
|
251
|
+
# rate.
|
|
252
|
+
delivery_method.ensure_calculator
|
|
253
|
+
return if delivery_method.calculator.nil?
|
|
254
|
+
|
|
255
|
+
preferences.each do |key, value|
|
|
256
|
+
next unless delivery_method.calculator.has_preference?(key)
|
|
257
|
+
|
|
258
|
+
delivery_method.calculator.set_preference(key, value)
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
end
|
|
265
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Seller
|
|
5
|
+
# The marketplace's delivery profiles — what kind of goods a product
|
|
6
|
+
# is (parcel, digital, pallet), which decides how it can be shipped.
|
|
7
|
+
#
|
|
8
|
+
# Read only: a seller assigns a profile to their product and never
|
|
9
|
+
# defines one, since the profile is the vocabulary the marketplace's
|
|
10
|
+
# zones and methods hang off
|
|
11
|
+
# (docs/plans/6.0-multi-vendor-marketplace.md, Decision 13).
|
|
12
|
+
#
|
|
13
|
+
# Gated on `read_products` rather than the operator's `settings` key,
|
|
14
|
+
# which a seller must never hold: this list exists for the product
|
|
15
|
+
# form's picker, so a key that may read products may read the
|
|
16
|
+
# vocabulary that form fills in.
|
|
17
|
+
#
|
|
18
|
+
# It backs the delivery-method form's picker too, so `delivery_methods`
|
|
19
|
+
# opens it as well — a member granted only that key would otherwise
|
|
20
|
+
# load the page and find an empty "kind of goods" list with no way to
|
|
21
|
+
# create a method.
|
|
22
|
+
class DeliveryProfilesController < Seller::ResourceController
|
|
23
|
+
scoped_resource :products
|
|
24
|
+
|
|
25
|
+
protected
|
|
26
|
+
|
|
27
|
+
# Either key reads this vocabulary. Answers whichever the caller
|
|
28
|
+
# actually holds so the gate passes for both surfaces; the declared
|
|
29
|
+
# resource stands as the default, which keeps the fail-closed
|
|
30
|
+
# behaviour when neither is held.
|
|
31
|
+
def scoped_resource_name
|
|
32
|
+
reads_through_delivery_methods? ? :delivery_methods : super
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Checked against whichever principal is on the request — a secret
|
|
36
|
+
# key answers by its scopes, a signed-in member by their role's keys.
|
|
37
|
+
def reads_through_delivery_methods?
|
|
38
|
+
return false if holds_key?('read_products')
|
|
39
|
+
|
|
40
|
+
holds_key?('read_delivery_methods')
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def holds_key?(key)
|
|
44
|
+
return current_api_key.has_scope?(key) if current_api_key.present?
|
|
45
|
+
|
|
46
|
+
ability = current_ability
|
|
47
|
+
ability.respond_to?(:permission_keys) && ability.permission_keys.include?(key)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def model_class
|
|
51
|
+
Spree::DeliveryProfile
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def serializer_class
|
|
55
|
+
Spree.api.seller_delivery_profile_serializer
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def scope
|
|
59
|
+
current_store.delivery_profiles
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Seller
|
|
5
|
+
# The marketplace's delivery zones — where its methods may ship to.
|
|
6
|
+
#
|
|
7
|
+
# Read only: a seller narrows their own method to one of these and
|
|
8
|
+
# never draws one, because where the marketplace ships is its own
|
|
9
|
+
# decision (docs/plans/6.0-multi-vendor-marketplace.md, Decision 13).
|
|
10
|
+
#
|
|
11
|
+
# Filtered by profile through the usual Ransack parameters, so the
|
|
12
|
+
# panel asks for the zones under the profile a method belongs to.
|
|
13
|
+
class DeliveryZonesController < Seller::ResourceController
|
|
14
|
+
scoped_resource :delivery_methods
|
|
15
|
+
|
|
16
|
+
protected
|
|
17
|
+
|
|
18
|
+
def model_class
|
|
19
|
+
Spree::DeliveryZone
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def serializer_class
|
|
23
|
+
Spree.api.seller_delivery_zone_serializer
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# `delivery_profile_id` is an explicit filter rather than a Ransack
|
|
27
|
+
# predicate: a zone only means something under its profile, so the
|
|
28
|
+
# picker asks for one profile's zones and an id from another store
|
|
29
|
+
# is a 404 rather than an empty list.
|
|
30
|
+
def scope
|
|
31
|
+
zones = current_store.delivery_zones.includes(:delivery_profile)
|
|
32
|
+
return zones if params[:delivery_profile_id].blank?
|
|
33
|
+
|
|
34
|
+
profile = current_store.delivery_profiles.find_by_prefix_id!(params[:delivery_profile_id])
|
|
35
|
+
zones.where(delivery_profile_id: profile.id)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Seller
|
|
5
|
+
# Presigning for a seller's own uploads — today the documents their
|
|
6
|
+
# onboarding asks for.
|
|
7
|
+
#
|
|
8
|
+
# A blob created here is not attached to anything yet: it becomes a
|
|
9
|
+
# submission only when the seller posts its signed id, and that
|
|
10
|
+
# endpoint is the one that checks the requirement is theirs. So the
|
|
11
|
+
# narrowest meaningful gate is the seller's own profile, which every
|
|
12
|
+
# member of a seller's team holds.
|
|
13
|
+
class DirectUploadsController < Seller::BaseController
|
|
14
|
+
include Spree::Api::V3::DirectUploads
|
|
15
|
+
|
|
16
|
+
scoped_resource :seller_profile
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|