spree_api 5.6.1 → 6.0.0.beta2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE +28 -0
- data/Rakefile +1 -1
- data/app/controllers/concerns/spree/api/v3/address_params.rb +17 -0
- data/app/controllers/concerns/spree/api/v3/admin/product_listing.rb +46 -0
- data/app/controllers/concerns/spree/api/v3/admin/product_membership.rb +110 -0
- data/app/controllers/concerns/spree/api/v3/admin/receivable_actions.rb +68 -0
- data/app/controllers/concerns/spree/api/v3/admin/reporting_authorization.rb +27 -0
- data/app/controllers/concerns/spree/api/v3/admin/role_grant_guard.rb +69 -33
- data/app/controllers/concerns/spree/api/v3/admin/stock_receipt_actions.rb +86 -0
- data/app/controllers/concerns/spree/api/v3/admin/store_context.rb +97 -0
- data/app/controllers/concerns/spree/api/v3/admin/subclassed_resource.rb +12 -6
- data/app/controllers/concerns/spree/api/v3/admin/validation_details.rb +91 -0
- data/app/controllers/concerns/spree/api/v3/admin_authentication.rb +20 -5
- data/app/controllers/concerns/spree/api/v3/api_key_authentication.rb +41 -5
- data/app/controllers/concerns/spree/api/v3/authentication_strategies.rb +48 -0
- data/app/controllers/concerns/spree/api/v3/bulk_operations.rb +4 -6
- data/app/controllers/concerns/spree/api/v3/cart_resolvable.rb +52 -16
- data/app/controllers/concerns/spree/api/v3/company_address_writes.rb +37 -0
- data/app/controllers/concerns/spree/api/v3/current_password_confirmation.rb +41 -0
- data/app/controllers/concerns/spree/api/v3/direct_uploads.rb +35 -0
- data/app/controllers/concerns/spree/api/v3/error_handler.rb +53 -11
- data/app/controllers/concerns/spree/api/v3/idempotent.rb +10 -4
- data/app/controllers/concerns/spree/api/v3/items_payload.rb +54 -0
- data/app/controllers/concerns/spree/api/v3/jwt_authentication.rb +23 -3
- data/app/controllers/concerns/spree/api/v3/key_store_context.rb +31 -0
- data/app/controllers/concerns/spree/api/v3/locale_and_currency.rb +3 -3
- data/app/controllers/concerns/spree/api/v3/order_lock.rb +22 -3
- data/app/controllers/concerns/spree/api/v3/orders/claim_actions.rb +112 -0
- data/app/controllers/concerns/spree/api/v3/orders/delivery_actions.rb +105 -0
- data/app/controllers/concerns/spree/api/v3/orders/exchange_actions.rb +117 -0
- data/app/controllers/concerns/spree/api/v3/orders/fulfillment_actions.rb +157 -0
- data/app/controllers/concerns/spree/api/v3/orders/post_sale_actions.rb +76 -0
- data/app/controllers/concerns/spree/api/v3/orders/return_actions.rb +116 -0
- data/app/controllers/concerns/spree/api/v3/orders/shipping_label_actions.rb +128 -0
- data/app/controllers/concerns/spree/api/v3/params_normalizer.rb +7 -4
- data/app/controllers/concerns/spree/api/v3/permission_serialization.rb +42 -0
- data/app/controllers/concerns/spree/api/v3/rate_limit_headers.rb +40 -6
- data/app/controllers/concerns/spree/api/v3/scoped_authorization.rb +80 -26
- data/app/controllers/concerns/spree/api/v3/seller/auth_cookies.rb +62 -0
- data/app/controllers/concerns/spree/api/v3/seller/seller_context.rb +127 -0
- data/app/controllers/concerns/spree/api/v3/seller_authentication.rb +40 -0
- data/app/controllers/concerns/spree/api/v3/storefront_access.rb +38 -0
- data/app/controllers/concerns/spree/api/v3/streams_shipping_label.rb +37 -0
- data/app/controllers/concerns/spree/api/v3/tax_identifier_validation.rb +41 -0
- data/app/controllers/spree/api/v3/admin/admin_users_controller.rb +11 -14
- data/app/controllers/spree/api/v3/admin/allowed_origins_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/api_keys_controller.rb +18 -9
- data/app/controllers/spree/api/v3/admin/auth_controller.rb +138 -22
- data/app/controllers/spree/api/v3/admin/base_controller.rb +2 -0
- data/app/controllers/spree/api/v3/admin/catalog_assignments_controller.rb +27 -0
- data/app/controllers/spree/api/v3/admin/catalogs/base_controller.rb +29 -0
- data/app/controllers/spree/api/v3/admin/catalogs/order_minimums_controller.rb +40 -0
- data/app/controllers/spree/api/v3/admin/catalogs/products_controller.rb +107 -0
- data/app/controllers/spree/api/v3/admin/catalogs/quantity_rules_controller.rb +75 -0
- data/app/controllers/spree/api/v3/admin/catalogs_controller.rb +191 -0
- data/app/controllers/spree/api/v3/admin/categories/products_controller.rb +28 -41
- data/app/controllers/spree/api/v3/admin/categories_controller.rb +16 -7
- data/app/controllers/spree/api/v3/admin/channels_controller.rb +50 -2
- data/app/controllers/spree/api/v3/admin/claim_reasons_controller.rb +25 -0
- data/app/controllers/spree/api/v3/admin/claims_controller.rb +31 -0
- data/app/controllers/spree/api/v3/admin/collection_rules_controller.rb +40 -0
- data/app/controllers/spree/api/v3/admin/collections/products_controller.rb +101 -0
- data/app/controllers/spree/api/v3/admin/collections_controller.rb +56 -0
- data/app/controllers/spree/api/v3/admin/commission_lines_controller.rb +39 -0
- data/app/controllers/spree/api/v3/admin/commission_rates_controller.rb +174 -0
- data/app/controllers/spree/api/v3/admin/companies/addresses_controller.rb +65 -0
- data/app/controllers/spree/api/v3/admin/companies/base_controller.rb +29 -0
- data/app/controllers/spree/api/v3/admin/companies/invitations_controller.rb +56 -0
- data/app/controllers/spree/api/v3/admin/companies/memberships_controller.rb +66 -0
- data/app/controllers/spree/api/v3/admin/companies/tax_exemption_certificates_controller.rb +137 -0
- data/app/controllers/spree/api/v3/admin/companies/tax_identifiers_controller.rb +46 -0
- data/app/controllers/spree/api/v3/admin/companies_controller.rb +59 -0
- data/app/controllers/spree/api/v3/admin/concerns/external_references.rb +166 -0
- data/app/controllers/spree/api/v3/admin/consent_records_controller.rb +31 -0
- data/app/controllers/spree/api/v3/admin/countries_controller.rb +12 -4
- data/app/controllers/spree/api/v3/admin/custom_field_definitions_controller.rb +19 -4
- data/app/controllers/spree/api/v3/admin/custom_fields_controller.rb +5 -5
- data/app/controllers/spree/api/v3/admin/customer_groups_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/customers/addresses_controller.rb +4 -4
- data/app/controllers/spree/api/v3/admin/customers/base_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/customers/store_credits_controller.rb +2 -3
- data/app/controllers/spree/api/v3/admin/customers/tax_identifiers_controller.rb +43 -0
- data/app/controllers/spree/api/v3/admin/customers_controller.rb +190 -11
- data/app/controllers/spree/api/v3/admin/dashboard_controller.rb +24 -20
- data/app/controllers/spree/api/v3/admin/data_requests_controller.rb +60 -0
- data/app/controllers/spree/api/v3/admin/delivery_method_rules_controller.rb +54 -0
- data/app/controllers/spree/api/v3/admin/delivery_methods/rules_controller.rb +114 -0
- data/app/controllers/spree/api/v3/admin/delivery_methods_controller.rb +243 -0
- data/app/controllers/spree/api/v3/admin/delivery_profiles/origin_groups_controller.rb +80 -0
- data/app/controllers/spree/api/v3/admin/delivery_profiles_controller.rb +107 -0
- data/app/controllers/spree/api/v3/admin/delivery_zones_controller.rb +116 -0
- data/app/controllers/spree/api/v3/admin/digital_links_controller.rb +48 -0
- data/app/controllers/spree/api/v3/admin/direct_uploads_controller.rb +17 -3
- data/app/controllers/spree/api/v3/admin/exchanges_controller.rb +31 -0
- data/app/controllers/spree/api/v3/admin/exports_controller.rb +2 -2
- data/app/controllers/spree/api/v3/admin/gift_card_batches_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/gift_cards_controller.rb +3 -2
- data/app/controllers/spree/api/v3/admin/imports_controller.rb +71 -8
- data/app/controllers/spree/api/v3/admin/integrations_controller.rb +67 -0
- data/app/controllers/spree/api/v3/admin/invitation_acceptances_controller.rb +5 -5
- data/app/controllers/spree/api/v3/admin/invitations_controller.rb +5 -1
- data/app/controllers/spree/api/v3/admin/locales_controller.rb +3 -1
- data/app/controllers/spree/api/v3/admin/markets_controller.rb +9 -5
- data/app/controllers/spree/api/v3/admin/me_controller.rb +4 -30
- data/app/controllers/spree/api/v3/admin/media_controller.rb +88 -38
- data/app/controllers/spree/api/v3/admin/media_library_controller.rb +156 -0
- data/app/controllers/spree/api/v3/admin/option_types_controller.rb +1 -0
- data/app/controllers/spree/api/v3/admin/order_cancellation_reasons_controller.rb +25 -0
- data/app/controllers/spree/api/v3/admin/order_groups_controller.rb +43 -0
- data/app/controllers/spree/api/v3/admin/order_routing_rules_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/orders/claims_controller.rb +56 -0
- data/app/controllers/spree/api/v3/admin/orders/deliveries_controller.rb +66 -0
- data/app/controllers/spree/api/v3/admin/orders/discount_codes_controller.rb +86 -0
- data/app/controllers/spree/api/v3/admin/orders/discounts_controller.rb +99 -0
- data/app/controllers/spree/api/v3/admin/orders/exchanges_controller.rb +62 -0
- data/app/controllers/spree/api/v3/admin/orders/fees_controller.rb +83 -0
- data/app/controllers/spree/api/v3/admin/orders/fulfillments_controller.rb +45 -67
- data/app/controllers/spree/api/v3/admin/orders/items_controller.rb +40 -22
- data/app/controllers/spree/api/v3/admin/orders/labels_controller.rb +75 -0
- data/app/controllers/spree/api/v3/admin/orders/payments_controller.rb +36 -18
- data/app/controllers/spree/api/v3/admin/orders/refunds_controller.rb +39 -18
- data/app/controllers/spree/api/v3/admin/orders/returns_controller.rb +70 -0
- data/app/controllers/spree/api/v3/admin/orders/store_credits_controller.rb +2 -2
- data/app/controllers/spree/api/v3/admin/orders/tax_identifiers_controller.rb +41 -0
- data/app/controllers/spree/api/v3/admin/orders/tax_lines_controller.rb +32 -0
- data/app/controllers/spree/api/v3/admin/orders_controller.rb +164 -33
- data/app/controllers/spree/api/v3/admin/package_types_controller.rb +39 -0
- data/app/controllers/spree/api/v3/admin/password_resets_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/payment_methods_controller.rb +15 -4
- data/app/controllers/spree/api/v3/admin/payout_providers_controller.rb +27 -0
- data/app/controllers/spree/api/v3/admin/permissions_controller.rb +30 -0
- data/app/controllers/spree/api/v3/admin/policies_controller.rb +42 -0
- data/app/controllers/spree/api/v3/admin/price_lists/products_controller.rb +93 -0
- data/app/controllers/spree/api/v3/admin/price_lists_controller.rb +43 -29
- data/app/controllers/spree/api/v3/admin/prices_controller.rb +41 -4
- data/app/controllers/spree/api/v3/admin/product_types_controller.rb +93 -0
- data/app/controllers/spree/api/v3/admin/products/digital_assets_controller.rb +148 -0
- data/app/controllers/spree/api/v3/admin/products/variants_controller.rb +24 -3
- data/app/controllers/spree/api/v3/admin/products_controller.rb +149 -33
- data/app/controllers/spree/api/v3/admin/promotion_actions_controller.rb +6 -2
- data/app/controllers/spree/api/v3/admin/promotion_rules_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/promotions_controller.rb +1 -5
- data/app/controllers/spree/api/v3/admin/purchase_orders/stock_receipts_controller.rb +32 -0
- data/app/controllers/spree/api/v3/admin/purchase_orders_controller.rb +161 -0
- data/app/controllers/spree/api/v3/admin/refund_reasons_controller.rb +25 -0
- data/app/controllers/spree/api/v3/admin/reporting/saved_reports_controller.rb +45 -0
- data/app/controllers/spree/api/v3/admin/reporting_controller.rb +95 -0
- data/app/controllers/spree/api/v3/admin/resource_controller.rb +27 -10
- data/app/controllers/spree/api/v3/admin/return_reasons_controller.rb +25 -0
- data/app/controllers/spree/api/v3/admin/returns_controller.rb +31 -0
- data/app/controllers/spree/api/v3/admin/roles_controller.rb +50 -6
- data/app/controllers/spree/api/v3/admin/seller_payouts_controller.rb +83 -0
- data/app/controllers/spree/api/v3/admin/seller_requirement_submissions_controller.rb +139 -0
- data/app/controllers/spree/api/v3/admin/seller_requirements_controller.rb +115 -0
- data/app/controllers/spree/api/v3/admin/seller_transfers_controller.rb +36 -0
- data/app/controllers/spree/api/v3/admin/sellers/balances_controller.rb +44 -0
- data/app/controllers/spree/api/v3/admin/sellers/invitations_controller.rb +77 -0
- data/app/controllers/spree/api/v3/admin/sellers/payouts_controller.rb +107 -0
- data/app/controllers/spree/api/v3/admin/sellers/team_controller.rb +64 -0
- data/app/controllers/spree/api/v3/admin/sellers_controller.rb +197 -0
- data/app/controllers/spree/api/v3/admin/setup_controller.rb +239 -0
- data/app/controllers/spree/api/v3/admin/stock_levels_controller.rb +172 -0
- data/app/controllers/spree/api/v3/admin/stock_locations_controller.rb +3 -2
- data/app/controllers/spree/api/v3/admin/stock_movements_controller.rb +37 -0
- data/app/controllers/spree/api/v3/admin/stock_reservations_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/stock_transfers/stock_receipts_controller.rb +31 -0
- data/app/controllers/spree/api/v3/admin/stock_transfers_controller.rb +134 -38
- data/app/controllers/spree/api/v3/admin/store_controller.rb +66 -0
- data/app/controllers/spree/api/v3/admin/store_credits/events_controller.rb +47 -0
- data/app/controllers/spree/api/v3/admin/store_credits_controller.rb +87 -0
- data/app/controllers/spree/api/v3/admin/suppliers_controller.rb +30 -0
- data/app/controllers/spree/api/v3/admin/tags_controller.rb +2 -2
- data/app/controllers/spree/api/v3/admin/tax_categories_controller.rb +4 -0
- data/app/controllers/spree/api/v3/admin/tax_providers_controller.rb +25 -0
- data/app/controllers/spree/api/v3/admin/tax_rates_controller.rb +33 -0
- data/app/controllers/spree/api/v3/admin/tracking_carriers_controller.rb +33 -0
- data/app/controllers/spree/api/v3/admin/translatable_resources_controller.rb +37 -9
- data/app/controllers/spree/api/v3/admin/translations_controller.rb +10 -5
- data/app/controllers/spree/api/v3/admin/translations_coverage_controller.rb +150 -0
- data/app/controllers/spree/api/v3/admin/variants_controller.rb +11 -4
- data/app/controllers/spree/api/v3/admin/webhook_endpoints_controller.rb +1 -1
- data/app/controllers/spree/api/v3/base_controller.rb +74 -16
- data/app/controllers/spree/api/v3/resource_controller.rb +170 -39
- data/app/controllers/spree/api/v3/seller/auth_controller.rb +169 -0
- data/app/controllers/spree/api/v3/seller/balances_controller.rb +35 -0
- data/app/controllers/spree/api/v3/seller/base_controller.rb +25 -0
- data/app/controllers/spree/api/v3/seller/claim_reasons_controller.rb +20 -0
- data/app/controllers/spree/api/v3/seller/countries_controller.rb +38 -0
- data/app/controllers/spree/api/v3/seller/delivery_methods_controller.rb +265 -0
- data/app/controllers/spree/api/v3/seller/delivery_profiles_controller.rb +65 -0
- data/app/controllers/spree/api/v3/seller/delivery_zones_controller.rb +41 -0
- data/app/controllers/spree/api/v3/seller/direct_uploads_controller.rb +21 -0
- data/app/controllers/spree/api/v3/seller/exports_controller.rb +195 -0
- data/app/controllers/spree/api/v3/seller/import_rows_controller.rb +49 -0
- data/app/controllers/spree/api/v3/seller/imports_controller.rb +317 -0
- data/app/controllers/spree/api/v3/seller/invitation_acceptances_controller.rb +152 -0
- data/app/controllers/spree/api/v3/seller/invitations_controller.rb +71 -0
- data/app/controllers/spree/api/v3/seller/me_controller.rb +72 -0
- data/app/controllers/spree/api/v3/seller/onboarding_controller.rb +111 -0
- data/app/controllers/spree/api/v3/seller/order_cancellation_reasons_controller.rb +25 -0
- data/app/controllers/spree/api/v3/seller/orders/base_controller.rb +44 -0
- data/app/controllers/spree/api/v3/seller/orders/claims_controller.rb +45 -0
- data/app/controllers/spree/api/v3/seller/orders/deliveries_controller.rb +38 -0
- data/app/controllers/spree/api/v3/seller/orders/exchanges_controller.rb +50 -0
- data/app/controllers/spree/api/v3/seller/orders/fulfillments_controller.rb +79 -0
- data/app/controllers/spree/api/v3/seller/orders/labels_controller.rb +55 -0
- data/app/controllers/spree/api/v3/seller/orders/notes_controller.rb +82 -0
- data/app/controllers/spree/api/v3/seller/orders/returns_controller.rb +44 -0
- data/app/controllers/spree/api/v3/seller/orders_controller.rb +199 -0
- data/app/controllers/spree/api/v3/seller/package_types_controller.rb +100 -0
- data/app/controllers/spree/api/v3/seller/password_resets_controller.rb +155 -0
- data/app/controllers/spree/api/v3/seller/payouts_controller.rb +47 -0
- data/app/controllers/spree/api/v3/seller/policies_controller.rb +57 -0
- data/app/controllers/spree/api/v3/seller/product_types_controller.rb +35 -0
- data/app/controllers/spree/api/v3/seller/products_controller.rb +394 -0
- data/app/controllers/spree/api/v3/seller/profile_controller.rb +137 -0
- data/app/controllers/spree/api/v3/seller/reasons_controller.rb +45 -0
- data/app/controllers/spree/api/v3/seller/requirement_submissions_controller.rb +95 -0
- data/app/controllers/spree/api/v3/seller/resource_controller.rb +75 -0
- data/app/controllers/spree/api/v3/seller/return_reasons_controller.rb +20 -0
- data/app/controllers/spree/api/v3/seller/stock_locations_controller.rb +56 -0
- data/app/controllers/spree/api/v3/seller/tax_identifiers_controller.rb +48 -0
- data/app/controllers/spree/api/v3/seller/team_controller.rb +103 -0
- data/app/controllers/spree/api/v3/seller/tracking_carriers_controller.rb +35 -0
- data/app/controllers/spree/api/v3/seller/transfers_controller.rb +43 -0
- data/app/controllers/spree/api/v3/store/account/companies_controller.rb +42 -0
- data/app/controllers/spree/api/v3/store/auth_controller.rb +21 -34
- data/app/controllers/spree/api/v3/store/base_controller.rb +4 -0
- data/app/controllers/spree/api/v3/store/carts/discount_codes_controller.rb +24 -2
- data/app/controllers/spree/api/v3/store/carts/fulfillments_controller.rb +41 -15
- data/app/controllers/spree/api/v3/store/carts/items_controller.rb +53 -20
- data/app/controllers/spree/api/v3/store/carts/payment_sessions_controller.rb +36 -20
- data/app/controllers/spree/api/v3/store/carts/po_documents_controller.rb +111 -0
- data/app/controllers/spree/api/v3/store/carts/store_credits_controller.rb +2 -2
- data/app/controllers/spree/api/v3/store/carts/tax_identifiers_controller.rb +96 -0
- data/app/controllers/spree/api/v3/store/carts_controller.rb +57 -12
- data/app/controllers/spree/api/v3/store/categories_controller.rb +6 -3
- data/app/controllers/spree/api/v3/store/collections/products_controller.rb +59 -0
- data/app/controllers/spree/api/v3/store/collections_controller.rb +36 -0
- data/app/controllers/spree/api/v3/store/companies/addresses_controller.rb +81 -0
- data/app/controllers/spree/api/v3/store/companies/base_controller.rb +24 -0
- data/app/controllers/spree/api/v3/store/companies/invitations_controller.rb +50 -0
- data/app/controllers/spree/api/v3/store/companies/members_controller.rb +66 -0
- data/app/controllers/spree/api/v3/store/companies/orders_controller.rb +28 -0
- data/app/controllers/spree/api/v3/store/companies_controller.rb +47 -0
- data/app/controllers/spree/api/v3/store/company_invitations_controller.rb +90 -0
- data/app/controllers/spree/api/v3/store/countries_controller.rb +8 -6
- data/app/controllers/spree/api/v3/store/customer/addresses_controller.rb +3 -1
- data/app/controllers/spree/api/v3/store/customer/data_requests_controller.rb +78 -0
- data/app/controllers/spree/api/v3/store/customer/digital_links_controller.rb +52 -0
- data/app/controllers/spree/api/v3/store/customer/orders_controller.rb +6 -0
- data/app/controllers/spree/api/v3/store/customer/password_resets_controller.rb +7 -3
- data/app/controllers/spree/api/v3/store/customer/payment_setup_sessions_controller.rb +3 -3
- data/app/controllers/spree/api/v3/store/customer/store_credits_controller.rb +0 -3
- data/app/controllers/spree/api/v3/store/customer/tax_identifiers_controller.rb +91 -0
- data/app/controllers/spree/api/v3/store/customers_controller.rb +26 -31
- data/app/controllers/spree/api/v3/store/data_feeds_controller.rb +11 -0
- data/app/controllers/spree/api/v3/store/data_request_downloads_controller.rb +58 -0
- data/app/controllers/spree/api/v3/store/delivery_methods_controller.rb +108 -0
- data/app/controllers/spree/api/v3/store/digital_links_controller.rb +105 -0
- data/app/controllers/spree/api/v3/store/markets/countries_controller.rb +5 -9
- data/app/controllers/spree/api/v3/store/markets_controller.rb +4 -4
- data/app/controllers/spree/api/v3/store/newsletter_subscribers_controller.rb +8 -9
- data/app/controllers/spree/api/v3/store/orders/claims_controller.rb +94 -0
- data/app/controllers/spree/api/v3/store/orders/returns_controller.rb +116 -0
- data/app/controllers/spree/api/v3/store/orders/tax_identifiers_controller.rb +46 -0
- data/app/controllers/spree/api/v3/store/orders_controller.rb +12 -15
- data/app/controllers/spree/api/v3/store/products/filters_controller.rb +10 -3
- data/app/controllers/spree/api/v3/store/products_controller.rb +25 -6
- data/app/controllers/spree/api/v3/store/resource_controller.rb +2 -0
- data/app/controllers/spree/api/v3/store/sellers_controller.rb +43 -0
- data/app/controllers/spree/api/v3/store/wishlist_items_controller.rb +9 -6
- data/app/controllers/spree/api/v3/store/wishlists_controller.rb +3 -3
- data/app/controllers/spree/api/v3/webhooks/fulfillments_controller.rb +88 -0
- data/app/controllers/spree/api/v3/webhooks/payments_controller.rb +5 -2
- data/app/controllers/spree/api/v3/webhooks/payouts_controller.rb +61 -0
- data/app/models/spree/api/data_request_urls.rb +25 -0
- data/app/models/spree/api/digital_link_urls.rb +26 -0
- data/app/serializers/spree/api/v3/address_serializer.rb +17 -5
- data/app/serializers/spree/api/v3/admin/actor_serializer.rb +28 -0
- data/app/serializers/spree/api/v3/admin/address_serializer.rb +27 -4
- data/app/serializers/spree/api/v3/admin/admin_user_serializer.rb +13 -10
- data/app/serializers/spree/api/v3/admin/api_key_serializer.rb +15 -2
- data/app/serializers/spree/api/v3/admin/applied_promotion_serializer.rb +15 -0
- data/app/serializers/spree/api/v3/admin/cart_serializer.rb +34 -0
- data/app/serializers/spree/api/v3/admin/catalog_assignment_serializer.rb +32 -0
- data/app/serializers/spree/api/v3/admin/catalog_order_minimum_serializer.rb +23 -0
- data/app/serializers/spree/api/v3/admin/catalog_price_serializer.rb +48 -0
- data/app/serializers/spree/api/v3/admin/catalog_price_tier_serializer.rb +23 -0
- data/app/serializers/spree/api/v3/admin/catalog_product_serializer.rb +57 -0
- data/app/serializers/spree/api/v3/admin/catalog_product_term_serializer.rb +38 -0
- data/app/serializers/spree/api/v3/admin/catalog_quantity_rule_serializer.rb +37 -0
- data/app/serializers/spree/api/v3/admin/catalog_serializer.rb +46 -0
- data/app/serializers/spree/api/v3/admin/category_serializer.rb +3 -2
- data/app/serializers/spree/api/v3/admin/channel_serializer.rb +15 -1
- data/app/serializers/spree/api/v3/admin/claim_line_item_serializer.rb +16 -0
- data/app/serializers/spree/api/v3/admin/claim_reason_serializer.rb +21 -0
- data/app/serializers/spree/api/v3/admin/claim_serializer.rb +28 -0
- data/app/serializers/spree/api/v3/admin/collection_rule_serializer.rb +22 -0
- data/app/serializers/spree/api/v3/admin/collection_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/admin/commission_line_serializer.rb +67 -0
- data/app/serializers/spree/api/v3/admin/commission_rate_serializer.rb +69 -0
- data/app/serializers/spree/api/v3/admin/commission_rule_serializer.rb +61 -0
- data/app/serializers/spree/api/v3/admin/company_invitation_serializer.rb +15 -0
- data/app/serializers/spree/api/v3/admin/company_membership_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/admin/company_serializer.rb +37 -0
- data/app/serializers/spree/api/v3/admin/concerns/external_references_attribute.rb +33 -0
- data/app/serializers/spree/api/v3/admin/consent_record_serializer.rb +28 -0
- data/app/serializers/spree/api/v3/admin/country_serializer.rb +2 -2
- data/app/serializers/spree/api/v3/admin/credit_card_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/admin/custom_field_definition_serializer.rb +2 -2
- data/app/serializers/spree/api/v3/admin/custom_field_serializer.rb +2 -2
- data/app/serializers/spree/api/v3/admin/customer_serializer.rb +23 -22
- data/app/serializers/spree/api/v3/admin/dashboard_counter_serializer.rb +24 -0
- data/app/serializers/spree/api/v3/admin/data_request_serializer.rb +36 -0
- data/app/serializers/spree/api/v3/admin/delivery_method_rule_serializer.rb +32 -0
- data/app/serializers/spree/api/v3/admin/delivery_method_serializer.rb +66 -1
- data/app/serializers/spree/api/v3/admin/delivery_method_service_serializer.rb +15 -0
- data/app/serializers/spree/api/v3/admin/delivery_origin_group_serializer.rb +34 -0
- data/app/serializers/spree/api/v3/admin/delivery_profile_serializer.rb +65 -0
- data/app/serializers/spree/api/v3/admin/delivery_rate_serializer.rb +10 -1
- data/app/serializers/spree/api/v3/admin/delivery_serializer.rb +20 -0
- data/app/serializers/spree/api/v3/admin/delivery_zone_member_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/admin/delivery_zone_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/admin/digital_asset_serializer.rb +59 -0
- data/app/serializers/spree/api/v3/admin/discount_serializer.rb +3 -4
- data/app/serializers/spree/api/v3/admin/exchange_line_item_serializer.rb +16 -0
- data/app/serializers/spree/api/v3/admin/exchange_serializer.rb +34 -0
- data/app/serializers/spree/api/v3/admin/export_serializer.rb +20 -1
- data/app/serializers/spree/api/v3/admin/fee_serializer.rb +14 -0
- data/app/serializers/spree/api/v3/admin/freight_summary_line_serializer.rb +46 -0
- data/app/serializers/spree/api/v3/admin/freight_summary_serializer.rb +16 -0
- data/app/serializers/spree/api/v3/admin/fulfillment_item_serializer.rb +39 -0
- data/app/serializers/spree/api/v3/admin/fulfillment_serializer.rb +31 -9
- data/app/serializers/spree/api/v3/admin/gift_card_serializer.rb +2 -3
- data/app/serializers/spree/api/v3/admin/import_serializer.rb +15 -2
- data/app/serializers/spree/api/v3/admin/integration_serializer.rb +32 -0
- data/app/serializers/spree/api/v3/admin/invitation_serializer.rb +4 -4
- data/app/serializers/spree/api/v3/admin/line_item_serializer.rb +46 -5
- data/app/serializers/spree/api/v3/admin/market_serializer.rb +5 -1
- data/app/serializers/spree/api/v3/admin/media_serializer.rb +50 -2
- data/app/serializers/spree/api/v3/admin/membership_product_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/admin/order_cancellation_reason_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/admin/order_group_serializer.rb +50 -0
- data/app/serializers/spree/api/v3/admin/order_routing_rule_serializer.rb +2 -6
- data/app/serializers/spree/api/v3/admin/order_serializer.rb +126 -31
- data/app/serializers/spree/api/v3/admin/package_type_serializer.rb +53 -0
- data/app/serializers/spree/api/v3/admin/payment_method_serializer.rb +8 -2
- data/app/serializers/spree/api/v3/admin/payment_serializer.rb +6 -0
- data/app/serializers/spree/api/v3/admin/payment_split_serializer.rb +41 -0
- data/app/serializers/spree/api/v3/admin/permission_serializer.rb +39 -0
- data/app/serializers/spree/api/v3/admin/policy_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/admin/price_adjustment_tier_serializer.rb +22 -0
- data/app/serializers/spree/api/v3/admin/price_list_product_serializer.rb +32 -0
- data/app/serializers/spree/api/v3/admin/price_list_serializer.rb +20 -8
- data/app/serializers/spree/api/v3/admin/price_rule_serializer.rb +2 -12
- data/app/serializers/spree/api/v3/admin/price_serializer.rb +3 -0
- data/app/serializers/spree/api/v3/admin/product_serializer.rb +54 -8
- data/app/serializers/spree/api/v3/admin/product_submission_serializer.rb +39 -0
- data/app/serializers/spree/api/v3/admin/product_type_custom_field_definition_serializer.rb +44 -0
- data/app/serializers/spree/api/v3/admin/product_type_serializer.rb +34 -0
- data/app/serializers/spree/api/v3/admin/promotion_action_serializer.rb +6 -12
- data/app/serializers/spree/api/v3/admin/promotion_rule_serializer.rb +17 -15
- data/app/serializers/spree/api/v3/admin/purchase_order_item_serializer.rb +80 -0
- data/app/serializers/spree/api/v3/admin/purchase_order_serializer.rb +94 -0
- data/app/serializers/spree/api/v3/admin/refund_reason_serializer.rb +27 -0
- data/app/serializers/spree/api/v3/admin/refund_serializer.rb +6 -5
- data/app/serializers/spree/api/v3/admin/reporting_result_serializer.rb +72 -0
- data/app/serializers/spree/api/v3/admin/return_line_item_serializer.rb +16 -0
- data/app/serializers/spree/api/v3/admin/return_reason_serializer.rb +21 -0
- data/app/serializers/spree/api/v3/admin/return_serializer.rb +58 -0
- data/app/serializers/spree/api/v3/admin/role_serializer.rb +24 -6
- data/app/serializers/spree/api/v3/admin/saved_report_serializer.rb +32 -0
- data/app/serializers/spree/api/v3/admin/seller_balance_serializer.rb +37 -0
- data/app/serializers/spree/api/v3/admin/seller_payout_serializer.rb +46 -0
- data/app/serializers/spree/api/v3/admin/seller_requirement_serializer.rb +68 -0
- data/app/serializers/spree/api/v3/admin/seller_requirement_status_serializer.rb +48 -0
- data/app/serializers/spree/api/v3/admin/seller_requirement_submission_serializer.rb +57 -0
- data/app/serializers/spree/api/v3/admin/seller_serializer.rb +92 -0
- data/app/serializers/spree/api/v3/admin/seller_team_member_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/admin/seller_transfer_serializer.rb +53 -0
- data/app/serializers/spree/api/v3/admin/shipping_label_serializer.rb +82 -0
- data/app/serializers/spree/api/v3/admin/state_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/admin/stock_level_serializer.rb +65 -0
- data/app/serializers/spree/api/v3/admin/stock_location_serializer.rb +20 -4
- data/app/serializers/spree/api/v3/admin/stock_movement_serializer.rb +116 -0
- data/app/serializers/spree/api/v3/admin/stock_receipt_item_serializer.rb +57 -0
- data/app/serializers/spree/api/v3/admin/stock_receipt_serializer.rb +48 -0
- data/app/serializers/spree/api/v3/admin/stock_reservation_serializer.rb +5 -5
- data/app/serializers/spree/api/v3/admin/stock_transfer_item_serializer.rb +57 -0
- data/app/serializers/spree/api/v3/admin/stock_transfer_serializer.rb +36 -16
- data/app/serializers/spree/api/v3/admin/store_credit_event_serializer.rb +32 -0
- data/app/serializers/spree/api/v3/admin/store_credit_serializer.rb +42 -7
- data/app/serializers/spree/api/v3/admin/store_serializer.rb +65 -1
- data/app/serializers/spree/api/v3/admin/supplier_serializer.rb +39 -0
- data/app/serializers/spree/api/v3/admin/tax_exemption_certificate_serializer.rb +67 -0
- data/app/serializers/spree/api/v3/admin/tax_identifier_serializer.rb +43 -0
- data/app/serializers/spree/api/v3/admin/tax_line_serializer.rb +21 -0
- data/app/serializers/spree/api/v3/admin/tax_rate_serializer.rb +49 -0
- data/app/serializers/spree/api/v3/admin/variant_serializer.rb +49 -8
- data/app/serializers/spree/api/v3/applied_promotion_serializer.rb +23 -0
- data/app/serializers/spree/api/v3/base_serializer.rb +61 -2
- data/app/serializers/spree/api/v3/cart_serializer.rb +90 -12
- data/app/serializers/spree/api/v3/category_serializer.rb +3 -3
- data/app/serializers/spree/api/v3/claim_line_item_serializer.rb +50 -0
- data/app/serializers/spree/api/v3/claim_reason_serializer.rb +20 -0
- data/app/serializers/spree/api/v3/claim_serializer.rb +62 -0
- data/app/serializers/spree/api/v3/collection_serializer.rb +41 -0
- data/app/serializers/spree/api/v3/company_invitation_serializer.rb +28 -0
- data/app/serializers/spree/api/v3/company_membership_serializer.rb +28 -0
- data/app/serializers/spree/api/v3/company_serializer.rb +33 -0
- data/app/serializers/spree/api/v3/custom_field_serializer.rb +2 -2
- data/app/serializers/spree/api/v3/customer_serializer.rb +9 -1
- data/app/serializers/spree/api/v3/data_request_event_serializer.rb +30 -0
- data/app/serializers/spree/api/v3/data_request_serializer.rb +40 -0
- data/app/serializers/spree/api/v3/delivery_method_serializer.rb +12 -2
- data/app/serializers/spree/api/v3/delivery_rate_serializer.rb +34 -17
- data/app/serializers/spree/api/v3/delivery_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/delivery_zone_member_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/delivery_zone_serializer.rb +13 -0
- data/app/serializers/spree/api/v3/digital_asset_serializer.rb +23 -0
- data/app/serializers/spree/api/v3/digital_link_serializer.rb +6 -2
- data/app/serializers/spree/api/v3/discount_serializer.rb +21 -7
- data/app/serializers/spree/api/v3/exchange_line_item_serializer.rb +53 -0
- data/app/serializers/spree/api/v3/exchange_serializer.rb +61 -0
- data/app/serializers/spree/api/v3/fee_serializer.rb +27 -0
- data/app/serializers/spree/api/v3/freight_summary_serializer.rb +38 -0
- data/app/serializers/spree/api/v3/fulfillment_serializer.rb +28 -15
- data/app/serializers/spree/api/v3/gift_card_serializer.rb +2 -2
- data/app/serializers/spree/api/v3/import_row_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/import_serializer.rb +18 -4
- data/app/serializers/spree/api/v3/invitation_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/line_item_serializer.rb +18 -1
- data/app/serializers/spree/api/v3/market_serializer.rb +2 -2
- data/app/serializers/spree/api/v3/{asset_serializer.rb → media_event_serializer.rb} +4 -4
- data/app/serializers/spree/api/v3/media_serializer.rb +48 -7
- data/app/serializers/spree/api/v3/newsletter_subscriber_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/option_type_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/order_group_serializer.rb +60 -0
- data/app/serializers/spree/api/v3/order_serializer.rb +58 -6
- data/app/serializers/spree/api/v3/payment_method_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/payment_serializer.rb +2 -6
- data/app/serializers/spree/api/v3/payment_session_serializer.rb +10 -3
- data/app/serializers/spree/api/v3/payment_setup_session_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/policy_serializer.rb +7 -2
- data/app/serializers/spree/api/v3/product_filter_option_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/product_serializer.rb +42 -10
- data/app/serializers/spree/api/v3/product_type_serializer.rb +17 -0
- data/app/serializers/spree/api/v3/purchase_order_event_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/refund_serializer.rb +9 -3
- data/app/serializers/spree/api/v3/return_line_item_serializer.rb +42 -0
- data/app/serializers/spree/api/v3/return_reason_serializer.rb +20 -0
- data/app/serializers/spree/api/v3/return_serializer.rb +62 -0
- data/app/serializers/spree/api/v3/seller/balance_serializer.rb +35 -0
- data/app/serializers/spree/api/v3/seller/claim_line_item_serializer.rb +21 -0
- data/app/serializers/spree/api/v3/seller/claim_serializer.rb +25 -0
- data/app/serializers/spree/api/v3/seller/delivery_method_rule_serializer.rb +32 -0
- data/app/serializers/spree/api/v3/seller/delivery_method_serializer.rb +59 -0
- data/app/serializers/spree/api/v3/seller/delivery_profile_serializer.rb +26 -0
- data/app/serializers/spree/api/v3/seller/delivery_rate_serializer.rb +35 -0
- data/app/serializers/spree/api/v3/seller/delivery_serializer.rb +17 -0
- data/app/serializers/spree/api/v3/seller/delivery_zone_serializer.rb +26 -0
- data/app/serializers/spree/api/v3/seller/exchange_line_item_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/seller/exchange_serializer.rb +30 -0
- data/app/serializers/spree/api/v3/seller/export_serializer.rb +44 -0
- data/app/serializers/spree/api/v3/seller/fulfillment_item_serializer.rb +43 -0
- data/app/serializers/spree/api/v3/seller/fulfillment_serializer.rb +76 -0
- data/app/serializers/spree/api/v3/seller/import_mapping_serializer.rb +20 -0
- data/app/serializers/spree/api/v3/seller/import_row_serializer.rb +17 -0
- data/app/serializers/spree/api/v3/seller/import_serializer.rb +77 -0
- data/app/serializers/spree/api/v3/seller/invitation_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/seller/media_serializer.rb +26 -0
- data/app/serializers/spree/api/v3/seller/order_line_item_serializer.rb +44 -0
- data/app/serializers/spree/api/v3/seller/order_serializer.rb +119 -0
- data/app/serializers/spree/api/v3/seller/package_type_serializer.rb +52 -0
- data/app/serializers/spree/api/v3/seller/payment_split_serializer.rb +34 -0
- data/app/serializers/spree/api/v3/seller/payout_serializer.rb +36 -0
- data/app/serializers/spree/api/v3/seller/policy_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/seller/product_serializer.rb +60 -0
- data/app/serializers/spree/api/v3/seller/product_submission_serializer.rb +30 -0
- data/app/serializers/spree/api/v3/seller/product_type_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/seller/profile_serializer.rb +77 -0
- data/app/serializers/spree/api/v3/seller/reason_serializer.rb +24 -0
- data/app/serializers/spree/api/v3/seller/requirement_custom_field_serializer.rb +36 -0
- data/app/serializers/spree/api/v3/seller/requirement_status_serializer.rb +62 -0
- data/app/serializers/spree/api/v3/seller/requirement_submission_serializer.rb +33 -0
- data/app/serializers/spree/api/v3/seller/return_line_item_serializer.rb +24 -0
- data/app/serializers/spree/api/v3/seller/return_serializer.rb +51 -0
- data/app/serializers/spree/api/v3/seller/shipping_label_serializer.rb +23 -0
- data/app/serializers/spree/api/v3/seller/stock_level_serializer.rb +27 -0
- data/app/serializers/spree/api/v3/seller/stock_location_serializer.rb +17 -0
- data/app/serializers/spree/api/v3/seller/tax_identifier_serializer.rb +15 -0
- data/app/serializers/spree/api/v3/seller/team_member_serializer.rb +22 -0
- data/app/serializers/spree/api/v3/seller/transfer_serializer.rb +49 -0
- data/app/serializers/spree/api/v3/seller/variant_serializer.rb +71 -0
- data/app/serializers/spree/api/v3/seller_serializer.rb +50 -0
- data/app/serializers/spree/api/v3/shipping_label_event_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/{stock_item_serializer.rb → stock_level_serializer.rb} +5 -5
- data/app/serializers/spree/api/v3/stock_location_serializer.rb +11 -7
- data/app/serializers/spree/api/v3/stock_movement_serializer.rb +8 -15
- data/app/serializers/spree/api/v3/stock_receipt_event_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/stock_transfer_serializer.rb +6 -6
- data/app/serializers/spree/api/v3/store_credit_event_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/supplier_event_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/tax_identifier_serializer.rb +15 -0
- data/app/serializers/spree/api/v3/tax_line_serializer.rb +37 -0
- data/app/serializers/spree/api/v3/variant_serializer.rb +52 -2
- data/app/serializers/spree/api/v3/wishlist_item_serializer.rb +6 -6
- data/app/serializers/spree/api/v3/wishlist_serializer.rb +1 -1
- data/app/services/spree/api/v3/filters_aggregator.rb +14 -12
- data/app/services/spree/webhooks/deliver_webhook.rb +62 -26
- data/app/subscribers/spree/webhook_event_subscriber.rb +9 -5
- data/config/brakeman.ignore +1 -1
- data/config/initializers/typelizer.rb +51 -4
- data/config/locales/en.yml +5 -0
- data/config/routes.rb +730 -22
- data/lib/spree/api/configuration.rb +19 -19
- data/lib/spree/api/dependencies.rb +174 -227
- data/lib/spree/api/engine.rb +6 -0
- data/lib/spree/api/openapi/schema_helper.rb +179 -13
- data/lib/spree/api/testing_support/v3/base.rb +45 -15
- data/lib/spree/api.rb +10 -4
- data/lib/typelizer/open_enums.rb +35 -0
- metadata +342 -27
- data/app/controllers/spree/api/v3/admin/orders/adjustments_controller.rb +0 -25
- data/app/controllers/spree/api/v3/admin/stock_items_controller.rb +0 -42
- data/app/controllers/spree/api/v3/admin/store_credit_categories_controller.rb +0 -21
- data/app/controllers/spree/api/v3/store/digitals_controller.rb +0 -38
- data/app/serializers/spree/api/v3/admin/adjustment_serializer.rb +0 -24
- data/app/serializers/spree/api/v3/admin/dashboard_analytics_serializer.rb +0 -143
- data/app/serializers/spree/api/v3/admin/reimbursement_serializer.rb +0 -15
- data/app/serializers/spree/api/v3/admin/return_authorization_serializer.rb +0 -19
- data/app/serializers/spree/api/v3/admin/stock_item_serializer.rb +0 -34
- data/app/serializers/spree/api/v3/admin/store_credit_category_serializer.rb +0 -19
- data/app/serializers/spree/api/v3/customer_return_serializer.rb +0 -17
- data/app/serializers/spree/api/v3/digital_serializer.rb +0 -17
- data/app/serializers/spree/api/v3/reimbursement_serializer.rb +0 -27
- data/app/serializers/spree/api/v3/report_serializer.rb +0 -34
- data/app/serializers/spree/api/v3/return_authorization_serializer.rb +0 -31
- data/app/serializers/spree/api/v3/return_item_serializer.rb +0 -53
- data/app/serializers/spree/api/v3/shipping_category_serializer.rb +0 -11
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
# Fulfillment profiles — the grouping that decides how a set of
|
|
6
|
+
# products ships (origins, zones, methods). Stock-location membership
|
|
7
|
+
# is managed atomically through the profile: `stock_location_ids`
|
|
8
|
+
# replaces the full set; an empty array means every store location.
|
|
9
|
+
class DeliveryProfilesController < ResourceController
|
|
10
|
+
scoped_resource :settings
|
|
11
|
+
|
|
12
|
+
# GET /api/v3/admin/delivery_profiles/kinds
|
|
13
|
+
# Registered profile kinds, so admin UIs offer extension-added
|
|
14
|
+
# kinds without hardcoding the built-ins.
|
|
15
|
+
def kinds
|
|
16
|
+
authorize! :create, model_class
|
|
17
|
+
|
|
18
|
+
data = Spree.delivery_profile_types.map do |profile_class|
|
|
19
|
+
{
|
|
20
|
+
type: profile_class.to_s,
|
|
21
|
+
kind: profile_class.api_type
|
|
22
|
+
}
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
render json: { data: data }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def create
|
|
29
|
+
@resource = model_class.new(assignable_params)
|
|
30
|
+
authorize_resource!(@resource, :create)
|
|
31
|
+
|
|
32
|
+
if @resource.save
|
|
33
|
+
apply_default_group_locations(@resource)
|
|
34
|
+
render json: serialize_resource(@resource), status: :created
|
|
35
|
+
else
|
|
36
|
+
render_validation_error(@resource.errors)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def update
|
|
41
|
+
@resource.assign_attributes(assignable_params)
|
|
42
|
+
|
|
43
|
+
if @resource.save
|
|
44
|
+
apply_default_group_locations(@resource)
|
|
45
|
+
render json: serialize_resource(@resource)
|
|
46
|
+
else
|
|
47
|
+
render_validation_error(@resource.errors)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
protected
|
|
52
|
+
|
|
53
|
+
def model_class
|
|
54
|
+
Spree::DeliveryProfile
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def serializer_class
|
|
58
|
+
Spree.api.admin_delivery_profile_serializer
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def scope
|
|
62
|
+
super.order_default
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def permitted_params
|
|
66
|
+
params.permit(*model_additional_permitted_attributes, :name, :default, :position, :kind, stock_location_ids: [])
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def collection_includes
|
|
70
|
+
[delivery_origin_groups: :stock_locations]
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
private
|
|
74
|
+
|
|
75
|
+
def assignable_params
|
|
76
|
+
attributes = permitted_params.except(:kind, :stock_location_ids)
|
|
77
|
+
|
|
78
|
+
if @resource.nil?
|
|
79
|
+
attributes[:type] = params.key?(:kind) ? resolve_kind(params[:kind]).to_s : Spree::DeliveryProfiles::Shipping.to_s
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
attributes
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# The profile-level shorthand writes the default origin group's
|
|
86
|
+
# membership — one call keeps working for single-group stores;
|
|
87
|
+
# multi-group stores manage members through the nested endpoint.
|
|
88
|
+
def apply_default_group_locations(profile)
|
|
89
|
+
return unless params.key?(:stock_location_ids)
|
|
90
|
+
|
|
91
|
+
locations = Array(params[:stock_location_ids]).map do |id|
|
|
92
|
+
current_store.stock_locations.accessible_by(current_ability, :show).find_by_prefix_id!(id)
|
|
93
|
+
end
|
|
94
|
+
profile.default_origin_group&.stock_locations = locations
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# The wire kind (`shipping`, `digital`) resolves against the
|
|
98
|
+
# registry; an unknown kind is a client error, not a constantize.
|
|
99
|
+
def resolve_kind(kind)
|
|
100
|
+
Spree.delivery_profile_types.find { |klass| klass.api_type == kind.to_s } ||
|
|
101
|
+
raise(ActiveRecord::RecordNotFound)
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
# Delivery zones with typed members (country / state / postal_code).
|
|
6
|
+
# Members are managed atomically through the zone: `members` in the
|
|
7
|
+
# payload replaces the full member set.
|
|
8
|
+
class DeliveryZonesController < ResourceController
|
|
9
|
+
scoped_resource :settings
|
|
10
|
+
|
|
11
|
+
def create
|
|
12
|
+
@resource = model_class.new(zone_params)
|
|
13
|
+
authorize_resource!(@resource, :create)
|
|
14
|
+
|
|
15
|
+
build_members(@resource) if params.key?(:members)
|
|
16
|
+
|
|
17
|
+
if @resource.save
|
|
18
|
+
render json: serialize_resource(@resource), status: :created
|
|
19
|
+
else
|
|
20
|
+
render_validation_error(@resource.errors)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def update
|
|
25
|
+
@resource.assign_attributes(zone_params)
|
|
26
|
+
|
|
27
|
+
model_class.transaction do
|
|
28
|
+
if params.key?(:members)
|
|
29
|
+
@resource.members.destroy_all
|
|
30
|
+
build_members(@resource)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
if @resource.save
|
|
34
|
+
render json: serialize_resource(@resource)
|
|
35
|
+
else
|
|
36
|
+
render_validation_error(@resource.errors)
|
|
37
|
+
raise ActiveRecord::Rollback
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
protected
|
|
43
|
+
|
|
44
|
+
def model_class
|
|
45
|
+
Spree::DeliveryZone
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def serializer_class
|
|
49
|
+
Spree.api.admin_delivery_zone_serializer
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def permitted_params
|
|
53
|
+
params.permit(
|
|
54
|
+
*model_additional_permitted_attributes,
|
|
55
|
+
:name, :description, :delivery_profile_id, :delivery_origin_group_id,
|
|
56
|
+
members: [:member_type, :country_code, :state_code, :postal_code_prefix, :postal_code_from, :postal_code_to]
|
|
57
|
+
)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def collection_includes
|
|
61
|
+
[:members]
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
private
|
|
65
|
+
|
|
66
|
+
# A zone always lives inside a profile; absent an explicit one it
|
|
67
|
+
# joins the store default.
|
|
68
|
+
def zone_params
|
|
69
|
+
attributes = permitted_params.except(:members, :delivery_profile_id, :delivery_origin_group_id)
|
|
70
|
+
if params.key?(:delivery_profile_id) && params[:delivery_profile_id].present?
|
|
71
|
+
attributes[:delivery_profile] = current_store.delivery_profiles.accessible_by(current_ability, :show).find_by_prefix_id!(params[:delivery_profile_id])
|
|
72
|
+
end
|
|
73
|
+
if params.key?(:delivery_origin_group_id) && params[:delivery_origin_group_id].present?
|
|
74
|
+
attributes[:delivery_origin_group] = current_store.delivery_origin_groups.accessible_by(current_ability, :show).find_by_prefix_id!(params[:delivery_origin_group_id])
|
|
75
|
+
end
|
|
76
|
+
attributes
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Members are stored as codes. A subdivision may be given by code or
|
|
80
|
+
# by name, and a state member without a country has its country
|
|
81
|
+
# inferred — a code alone is ambiguous ("CA" is California and
|
|
82
|
+
# several other places), so an inference matching more than one
|
|
83
|
+
# country is rejected rather than guessed at.
|
|
84
|
+
def build_members(zone)
|
|
85
|
+
Array(permitted_params[:members]).each do |member|
|
|
86
|
+
attributes = member.to_h.symbolize_keys
|
|
87
|
+
country_code = attributes[:country_code].presence&.to_s&.upcase
|
|
88
|
+
state_value = attributes[:state_code].presence
|
|
89
|
+
|
|
90
|
+
if state_value.present?
|
|
91
|
+
country_code ||= infer_country_code_for_state(state_value)
|
|
92
|
+
attributes[:state_code] = Spree::IsoData.subdivision_code(country_code, state_value) if country_code
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
attributes[:country_code] = country_code
|
|
96
|
+
zone.members.build(attributes)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Returns nil when the code is ambiguous, which leaves the member
|
|
101
|
+
# without a country for its presence validation to reject — better
|
|
102
|
+
# than silently picking one of several matching countries.
|
|
103
|
+
#
|
|
104
|
+
# @return [String, nil] the only country whose subdivisions match, if exactly one does
|
|
105
|
+
def infer_country_code_for_state(state_value)
|
|
106
|
+
matches = Spree::IsoData.countries.map(&:alpha2).select do |iso|
|
|
107
|
+
Spree::IsoData.subdivision_code(iso, state_value).present?
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
matches.one? ? matches.first : nil
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
class DigitalLinksController < ResourceController
|
|
6
|
+
scoped_resource :orders
|
|
7
|
+
|
|
8
|
+
before_action :set_resource, only: [:reset]
|
|
9
|
+
|
|
10
|
+
# PATCH /api/v3/admin/digital_links/:id/reset
|
|
11
|
+
#
|
|
12
|
+
# Gives the customer their download allowance back and restarts the
|
|
13
|
+
# expiry clock — the remedy when a download failed or a file was
|
|
14
|
+
# replaced after they had used up their attempts.
|
|
15
|
+
def reset
|
|
16
|
+
@resource.reset!
|
|
17
|
+
|
|
18
|
+
render json: serialize_resource(@resource)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
protected
|
|
22
|
+
|
|
23
|
+
def model_class
|
|
24
|
+
Spree::DigitalLink
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def serializer_class
|
|
28
|
+
Spree.api.admin_digital_link_serializer
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# `digital_links` reaches links through line items, so the query
|
|
32
|
+
# carries a DISTINCT and inherits an ORDER BY on the line items'
|
|
33
|
+
# table. PostgreSQL rejects DISTINCT combined with an ORDER BY column
|
|
34
|
+
# outside the select list, so reorder by the links' own table —
|
|
35
|
+
# SQLite tolerates the inherited order, so this only surfaces on a
|
|
36
|
+
# real deployment.
|
|
37
|
+
def scope
|
|
38
|
+
current_store.digital_links.reorder("#{Spree::DigitalLink.table_name}.created_at": :desc)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def scope_includes
|
|
42
|
+
[:line_item, digital_asset: { attachment_attachment: :blob }]
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -3,6 +3,8 @@ module Spree
|
|
|
3
3
|
module V3
|
|
4
4
|
module Admin
|
|
5
5
|
class DirectUploadsController < Admin::BaseController
|
|
6
|
+
include Spree::Api::V3::DirectUploads
|
|
7
|
+
|
|
6
8
|
# Direct uploads is a write-adjacent presigning helper: callers exchange
|
|
7
9
|
# blob metadata for an upload URL, then reference the resulting
|
|
8
10
|
# signed_id when creating/updating a resource (product media, customer
|
|
@@ -16,8 +18,12 @@ module Spree
|
|
|
16
18
|
skip_before_action :authenticate_user
|
|
17
19
|
|
|
18
20
|
# POST /api/v3/admin/direct_uploads
|
|
21
|
+
#
|
|
22
|
+
# Overrides the shared concern's create to select the storage service:
|
|
23
|
+
# digital assets must land on private storage up front, since attaching
|
|
24
|
+
# a signed id never moves a blob between services.
|
|
19
25
|
def create
|
|
20
|
-
blob = ActiveStorage::Blob.create_before_direct_upload!(**blob_params)
|
|
26
|
+
blob = ActiveStorage::Blob.create_before_direct_upload!(service_name: storage_service_name, **blob_params)
|
|
21
27
|
|
|
22
28
|
render json: {
|
|
23
29
|
direct_upload: {
|
|
@@ -30,8 +36,16 @@ module Spree
|
|
|
30
36
|
|
|
31
37
|
private
|
|
32
38
|
|
|
33
|
-
|
|
34
|
-
|
|
39
|
+
# Attaching a signed id never moves the blob between services, so a
|
|
40
|
+
# file destined for a private attachment has to be uploaded to the
|
|
41
|
+
# private service up front. `private: true` asks for that; everything
|
|
42
|
+
# else keeps landing on the public service as before.
|
|
43
|
+
def storage_service_name
|
|
44
|
+
if params[:private].to_b
|
|
45
|
+
Spree.private_storage_service_name
|
|
46
|
+
else
|
|
47
|
+
Spree.public_storage_service_name
|
|
48
|
+
end
|
|
35
49
|
end
|
|
36
50
|
end
|
|
37
51
|
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
# Cross-order listing of exchanges — "what is awaiting fulfillment
|
|
6
|
+
# across the whole store". Read-only by route: opening an exchange
|
|
7
|
+
# needs an order, so creation and the status transitions stay on the
|
|
8
|
+
# nested Orders::ExchangesController.
|
|
9
|
+
class ExchangesController < ResourceController
|
|
10
|
+
# Post-sale records are order data: a key that may read orders may
|
|
11
|
+
# read these, and nothing here writes.
|
|
12
|
+
scoped_resource :orders
|
|
13
|
+
|
|
14
|
+
protected
|
|
15
|
+
|
|
16
|
+
def model_class
|
|
17
|
+
Spree::Exchange
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def serializer_class
|
|
21
|
+
Spree.api.admin_exchange_serializer
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def collection_includes
|
|
25
|
+
[:order, :reason, :stock_location, { exchange_line_items: [:original_variant, :new_variant] }]
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -98,7 +98,7 @@ module Spree
|
|
|
98
98
|
# is intentionally dropped — only CSV is supported and Rails' request
|
|
99
99
|
# format would otherwise overwrite the model's enum.
|
|
100
100
|
def permitted_params
|
|
101
|
-
attrs = params.permit(:type, :record_selection, :results_url)
|
|
101
|
+
attrs = params.permit(*model_additional_permitted_attributes, :type, :record_selection, :results_url)
|
|
102
102
|
raw = params[:search_params]
|
|
103
103
|
attrs[:search_params] = raw.respond_to?(:to_unsafe_h) ? raw.to_unsafe_h : raw if raw.present?
|
|
104
104
|
attrs
|
|
@@ -118,7 +118,7 @@ module Spree
|
|
|
118
118
|
return nil if name.blank?
|
|
119
119
|
|
|
120
120
|
name = name.to_s
|
|
121
|
-
Spree::Export.available_types.find { |type| type.api_type == name
|
|
121
|
+
Spree::Export.available_types.find { |type| type.api_type == name }
|
|
122
122
|
end
|
|
123
123
|
|
|
124
124
|
private
|
|
@@ -9,7 +9,7 @@ module Spree
|
|
|
9
9
|
# `store` and `created_by` are auto-stamped by `build_resource` in
|
|
10
10
|
# `Spree::Api::V3::ResourceController`, so create requests only need
|
|
11
11
|
# to include user-facing attributes (amount, currency, expires_at,
|
|
12
|
-
# optional code, optional
|
|
12
|
+
# optional code, optional customer_id).
|
|
13
13
|
class GiftCardsController < ResourceController
|
|
14
14
|
scoped_resource :gift_cards
|
|
15
15
|
|
|
@@ -24,7 +24,8 @@ module Spree
|
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
def permitted_params
|
|
27
|
-
params.permit(:code, :amount, :expires_at,
|
|
27
|
+
params.permit(*model_additional_permitted_attributes, :code, :amount, :expires_at,
|
|
28
|
+
:customer_id, :currency)
|
|
28
29
|
end
|
|
29
30
|
end
|
|
30
31
|
end
|
|
@@ -26,10 +26,15 @@ module Spree
|
|
|
26
26
|
def create
|
|
27
27
|
@resource = build_resource
|
|
28
28
|
authorize_resource!(@resource, :create)
|
|
29
|
+
# After authorization: a 404 for an unknown list must not tell a
|
|
30
|
+
# caller without import rights whether the id exists.
|
|
31
|
+
assign_price_list(@resource)
|
|
29
32
|
|
|
30
33
|
if @resource.save
|
|
31
34
|
begin
|
|
32
|
-
@resource
|
|
35
|
+
result = Spree.import_start_mapping_workflow.call(import: @resource)
|
|
36
|
+
|
|
37
|
+
return render_service_error(result.error) unless result.success?
|
|
33
38
|
rescue ::CSV::MalformedCSVError, EncodingError => e
|
|
34
39
|
@resource.update_columns(status: 'failed', processing_errors: e.message, updated_at: Time.current)
|
|
35
40
|
return render_error(
|
|
@@ -72,7 +77,10 @@ module Spree
|
|
|
72
77
|
apply_mappings!(@resource)
|
|
73
78
|
|
|
74
79
|
if @resource.mapping_done?
|
|
75
|
-
@resource
|
|
80
|
+
result = Spree.import_complete_mapping_workflow.call(import: @resource)
|
|
81
|
+
|
|
82
|
+
return render_service_error(result.error) unless result.success?
|
|
83
|
+
|
|
76
84
|
render json: serialize_resource(@resource)
|
|
77
85
|
else
|
|
78
86
|
missing = @resource.required_fields - @resource.mappings.mapped.pluck(:schema_field)
|
|
@@ -96,7 +104,11 @@ module Spree
|
|
|
96
104
|
@resource = find_resource
|
|
97
105
|
authorize_resource!(@resource, :update)
|
|
98
106
|
|
|
99
|
-
if
|
|
107
|
+
return if refuse_seller_owned!
|
|
108
|
+
|
|
109
|
+
result = Spree.import_retry_failed_rows_workflow.call(import: @resource)
|
|
110
|
+
|
|
111
|
+
if result.success?
|
|
100
112
|
render json: serialize_resource(@resource)
|
|
101
113
|
else
|
|
102
114
|
render_error(
|
|
@@ -136,7 +148,7 @@ module Spree
|
|
|
136
148
|
|
|
137
149
|
# GET /api/v3/admin/imports/template?type=Spree::Imports::Products
|
|
138
150
|
#
|
|
139
|
-
# CSV header row for the type's schema (including the
|
|
151
|
+
# CSV header row for the type's schema (including the custom_field
|
|
140
152
|
# columns available for the model) — the "Download template" link
|
|
141
153
|
# in the admin dashboard.
|
|
142
154
|
def template
|
|
@@ -181,6 +193,19 @@ module Spree
|
|
|
181
193
|
redirect_to url, allow_other_host: true, status: :found
|
|
182
194
|
end
|
|
183
195
|
|
|
196
|
+
# DELETE /api/v3/admin/imports/:id
|
|
197
|
+
#
|
|
198
|
+
# An operator deletes their own imports. A seller's is theirs to
|
|
199
|
+
# remove — see `refuse_seller_owned!`.
|
|
200
|
+
def destroy
|
|
201
|
+
@resource = find_resource
|
|
202
|
+
authorize_resource!(@resource, :destroy)
|
|
203
|
+
|
|
204
|
+
return if refuse_seller_owned!
|
|
205
|
+
|
|
206
|
+
super
|
|
207
|
+
end
|
|
208
|
+
|
|
184
209
|
protected
|
|
185
210
|
|
|
186
211
|
def model_class
|
|
@@ -224,8 +249,8 @@ module Spree
|
|
|
224
249
|
|
|
225
250
|
def build_resource
|
|
226
251
|
klass = resolve_import_type(permitted_params[:type]) || Spree::Import
|
|
227
|
-
attrs = permitted_params.except(:type).merge(
|
|
228
|
-
|
|
252
|
+
attrs = permitted_params.except(:type, :price_list_id).merge(
|
|
253
|
+
store: current_store,
|
|
229
254
|
user: acting_admin_user
|
|
230
255
|
)
|
|
231
256
|
# The done email links back to results_url — allowed origins only.
|
|
@@ -234,7 +259,21 @@ module Spree
|
|
|
234
259
|
end
|
|
235
260
|
|
|
236
261
|
def permitted_params
|
|
237
|
-
params.permit(:type, :attachment, :preferred_delimiter, :results_url)
|
|
262
|
+
params.permit(*model_additional_permitted_attributes, :type, :attachment, :preferred_delimiter, :results_url, :price_list_id)
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
# A price-list import writes into one list, named by its prefixed id.
|
|
266
|
+
# Resolved through the current store, so another store's list is a
|
|
267
|
+
# 404 rather than a write into it; a type without a list ignores the
|
|
268
|
+
# parameter. `permitted_params` does not normalize, so the raw
|
|
269
|
+
# prefixed id is what arrives here.
|
|
270
|
+
def assign_price_list(import)
|
|
271
|
+
return unless import.respond_to?(:price_list=)
|
|
272
|
+
|
|
273
|
+
prefixed_id = permitted_params[:price_list_id]
|
|
274
|
+
return if prefixed_id.blank?
|
|
275
|
+
|
|
276
|
+
import.price_list = current_store.price_lists.find_by_prefix_id!(prefixed_id)
|
|
238
277
|
end
|
|
239
278
|
|
|
240
279
|
# Returns the registered Import subclass matching `name`, or nil.
|
|
@@ -251,11 +290,35 @@ module Spree
|
|
|
251
290
|
return nil if name.blank?
|
|
252
291
|
|
|
253
292
|
name = name.to_s
|
|
254
|
-
Spree::Import.available_types.find { |type| type.api_type == name
|
|
293
|
+
Spree::Import.available_types.find { |type| type.api_type == name }
|
|
255
294
|
end
|
|
256
295
|
|
|
257
296
|
private
|
|
258
297
|
|
|
298
|
+
# Refuses a write against an import one of this store's sellers ran,
|
|
299
|
+
# rendering 422 and answering true so the caller returns.
|
|
300
|
+
#
|
|
301
|
+
# An operator can see every import in their marketplace — that is the
|
|
302
|
+
# point of the store-scoped list, and it is what makes a seller's
|
|
303
|
+
# failed rows debuggable. Acting on one is different: a retry re-runs
|
|
304
|
+
# writes into the seller's own catalog, and nothing on the import
|
|
305
|
+
# would record that the operator, rather than the seller, caused
|
|
306
|
+
# them. So reads span the store and writes stay with whoever owns the
|
|
307
|
+
# row.
|
|
308
|
+
#
|
|
309
|
+
# @return [Boolean]
|
|
310
|
+
def refuse_seller_owned!
|
|
311
|
+
return false if @resource.seller_id.blank?
|
|
312
|
+
|
|
313
|
+
render_error(
|
|
314
|
+
code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:validation_error],
|
|
315
|
+
message: Spree.t(:cannot_modify_seller_import, scope: 'api',
|
|
316
|
+
default: "This import belongs to a seller. It can be viewed here, but only the seller can retry or delete it."),
|
|
317
|
+
status: :unprocessable_content
|
|
318
|
+
)
|
|
319
|
+
true
|
|
320
|
+
end
|
|
321
|
+
|
|
259
322
|
# Imports require a user: row processors resolve records through
|
|
260
323
|
# `import.current_ability`. JWT requests use the signed-in admin;
|
|
261
324
|
# API-key requests attribute to the key's creator when that is an
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
# Credential records for provider gems (delivery rates, tax, ...) —
|
|
6
|
+
# one per (store, type). The types endpoint is the dashboard's
|
|
7
|
+
# gallery source; activation is verified by the model
|
|
8
|
+
# (verify-before-activate), so a failed connection surfaces as a
|
|
9
|
+
# plain 422 on `active`.
|
|
10
|
+
class IntegrationsController < ResourceController
|
|
11
|
+
include Spree::Api::V3::Admin::SubclassedResource
|
|
12
|
+
|
|
13
|
+
scoped_resource :integrations
|
|
14
|
+
|
|
15
|
+
subclassed_via -> { Spree::Integration.registered_classes },
|
|
16
|
+
unknown_type_error: 'unknown_integration_type'
|
|
17
|
+
|
|
18
|
+
# GET /api/v3/admin/integrations/types
|
|
19
|
+
# Pure registry discovery — which integrations are installed and how
|
|
20
|
+
# they're configured. Deliberately carries no per-store connected
|
|
21
|
+
# state: clients cache this long-lived and read live connection
|
|
22
|
+
# state from the integrations list instead.
|
|
23
|
+
def types
|
|
24
|
+
authorize! :create, model_class
|
|
25
|
+
|
|
26
|
+
render json: { data: Spree::Integration.discovery_entries }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# POST /api/v3/admin/integrations/:id/test
|
|
30
|
+
# Live connection check; nothing is persisted.
|
|
31
|
+
def test
|
|
32
|
+
@resource = find_resource
|
|
33
|
+
authorize_resource!(@resource, :update)
|
|
34
|
+
|
|
35
|
+
connected = @resource.can_connect?
|
|
36
|
+
render json: { connected: connected, error_message: connected ? nil : @resource.connection_error_message }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
protected
|
|
40
|
+
|
|
41
|
+
def model_class
|
|
42
|
+
Spree::Integration
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def serializer_class
|
|
46
|
+
Spree.api.admin_integration_serializer
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def permitted_params
|
|
50
|
+
params.permit(*model_additional_permitted_attributes, :type, :active, preferences: {})
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# `types` is read-only discovery — maps to the read scope.
|
|
54
|
+
def read_actions
|
|
55
|
+
super + %w[types]
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
private
|
|
59
|
+
|
|
60
|
+
def build_subclassed_resource(klass, attrs)
|
|
61
|
+
current_store.integrations.build(attrs.merge(type: klass.sti_name))
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -14,7 +14,7 @@ module Spree
|
|
|
14
14
|
within: Spree::Api::Config[:rate_limit_window].seconds,
|
|
15
15
|
store: Rails.cache,
|
|
16
16
|
only: [:lookup, :accept],
|
|
17
|
-
with:
|
|
17
|
+
with: -> { render_rate_limited(limit: Spree::Api::Config[:rate_limit_login]) }
|
|
18
18
|
|
|
19
19
|
# GET /api/v3/admin/auth/invitations/:id/lookup?token=:token
|
|
20
20
|
def lookup
|
|
@@ -32,13 +32,13 @@ module Spree
|
|
|
32
32
|
return if performed?
|
|
33
33
|
|
|
34
34
|
@invitation.invitee = user
|
|
35
|
-
@invitation
|
|
35
|
+
result = Spree.invitation_accept_workflow.call(invitation: @invitation)
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
return render_service_error(result.error) unless result.success?
|
|
38
|
+
|
|
39
|
+
refresh_token = Spree::RefreshToken.create_for(user, audience: JWT_AUDIENCE_ADMIN, request_env: request_env_for_token)
|
|
38
40
|
set_refresh_cookie(refresh_token)
|
|
39
41
|
render json: auth_response(user)
|
|
40
|
-
rescue ActiveRecord::RecordInvalid => e
|
|
41
|
-
render_validation_error(e.record.errors)
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
private
|
|
@@ -9,7 +9,9 @@ module Spree
|
|
|
9
9
|
class InvitationsController < ResourceController
|
|
10
10
|
include Spree::Api::V3::Admin::RoleGrantGuard
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
# Staff management is the escalation path — its own scope pair,
|
|
13
|
+
# grantable separately from store configuration (6.0-admin-rbac.md).
|
|
14
|
+
scoped_resource :staff
|
|
13
15
|
|
|
14
16
|
# POST /api/v3/admin/invitations
|
|
15
17
|
# Guards against inviting a new staff member straight into the admin
|
|
@@ -67,6 +69,8 @@ module Spree
|
|
|
67
69
|
end
|
|
68
70
|
|
|
69
71
|
# `email` and `role_id` are flat — `role_id` accepts a prefixed ID.
|
|
72
|
+
# No extension union: an invitation carries only the role grant, which is
|
|
73
|
+
# the authorization surface itself, not extensible resource data.
|
|
70
74
|
def permitted_params
|
|
71
75
|
attrs = params.permit(:email, :role_id)
|
|
72
76
|
if attrs[:role_id].present? && Spree::PrefixedId.prefixed_id?(attrs[:role_id])
|
|
@@ -6,7 +6,9 @@ module Spree
|
|
|
6
6
|
# current store (its supported_locales_list), so the dashboard's locale
|
|
7
7
|
# switcher enumerates locales instead of hardcoding them.
|
|
8
8
|
class LocalesController < Admin::BaseController
|
|
9
|
-
|
|
9
|
+
# Reference data the dashboard shell needs regardless of the caller's
|
|
10
|
+
# grant — exempt from the key gate like `/tags` and `/countries`.
|
|
11
|
+
skip_scope_check!
|
|
10
12
|
|
|
11
13
|
# GET /api/v3/admin/locales
|
|
12
14
|
def index
|