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,29 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
module Catalogs
|
|
6
|
+
# Anything nested under a catalog. The parent resolves through the
|
|
7
|
+
# store, so a catalog belonging to another tenant is a 404 rather
|
|
8
|
+
# than a readable record.
|
|
9
|
+
class BaseController < ResourceController
|
|
10
|
+
scoped_resource :products
|
|
11
|
+
|
|
12
|
+
protected
|
|
13
|
+
|
|
14
|
+
def set_parent
|
|
15
|
+
@parent = current_store.catalogs.
|
|
16
|
+
accessible_by(current_ability, parent_ability_action).
|
|
17
|
+
find_by_prefix_id!(params[:catalog_id])
|
|
18
|
+
@catalog = @parent
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def authorize_parent_access!
|
|
22
|
+
authorize_parent!(@parent)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
module Catalogs
|
|
6
|
+
# The least a whole order must come to under a catalog's agreement.
|
|
7
|
+
# One row per currency — never one amount with a currency beside
|
|
8
|
+
# it, because Spree holds no exchange rates.
|
|
9
|
+
class OrderMinimumsController < BaseController
|
|
10
|
+
before_action :authorize_parent_access!
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
protected
|
|
14
|
+
|
|
15
|
+
def model_class
|
|
16
|
+
Spree::CatalogOrderMinimum
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def serializer_class
|
|
20
|
+
Spree.api.admin_catalog_order_minimum_serializer
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def scope
|
|
24
|
+
@parent.order_minimums
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def parent_association
|
|
28
|
+
:order_minimums
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def permitted_params
|
|
32
|
+
params.permit(:currency, :amount)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
module Catalogs
|
|
6
|
+
# The products curated into a catalog's assortment — the uniform
|
|
7
|
+
# nested membership surface (see
|
|
8
|
+
# Spree::Api::V3::Admin::ProductMembership). A catalog decides what
|
|
9
|
+
# a buyer sees, never the order they see it in, so membership
|
|
10
|
+
# carries no position and listing is ordered by name.
|
|
11
|
+
class ProductsController < BaseController
|
|
12
|
+
include Spree::Api::V3::Admin::ProductMembership
|
|
13
|
+
|
|
14
|
+
before_action :authorize_parent_access!
|
|
15
|
+
|
|
16
|
+
protected
|
|
17
|
+
|
|
18
|
+
def serializer_class
|
|
19
|
+
Spree.api.admin_catalog_product_serializer
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# The resolver rides along in the serializer params, preloaded
|
|
23
|
+
# with this page's variants: resolving row by row would be a query
|
|
24
|
+
# per product, and the answer is the same for every row on the
|
|
25
|
+
# page.
|
|
26
|
+
# `expanded_keys` is the same dot-notation matching the serializer's
|
|
27
|
+
# own `expand?` does, so the attribute never renders without the
|
|
28
|
+
# resolver that fills it.
|
|
29
|
+
def serializer_params
|
|
30
|
+
params = super
|
|
31
|
+
params = params.merge(catalog_price_resolver: catalog_price_resolver) if expanded_keys.include?('catalog_price')
|
|
32
|
+
params = params.merge(catalog_quantity_rules: quantity_rules_by_product) if expanded_keys.include?('quantity_rule')
|
|
33
|
+
params
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# The page's quantity rules in one query, keyed by product. The
|
|
37
|
+
# rows are stored per variant and read per product, which is the
|
|
38
|
+
# roll-up the serializer does — on variants this page has already
|
|
39
|
+
# loaded (docs/plans/6.0-volume-pricing.md).
|
|
40
|
+
def quantity_rules_by_product
|
|
41
|
+
@quantity_rules_by_product ||= begin
|
|
42
|
+
variant_ids = priced_variants.map(&:id)
|
|
43
|
+
rules = variant_ids.any? ? @catalog.quantity_rules.where(variant_id: variant_ids).to_a : []
|
|
44
|
+
product_by_variant = priced_variants.to_h { |variant| [variant.id, variant.product_id] }
|
|
45
|
+
|
|
46
|
+
rules.group_by { |rule| product_by_variant[rule.variant_id] }
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Preloaded with every variant the page renders — each row now
|
|
51
|
+
# prices its variants individually, so preloading only the buy-box
|
|
52
|
+
# winner would leave the rest falling through to a query apiece
|
|
53
|
+
# (docs/plans/6.0-volume-pricing.md).
|
|
54
|
+
def catalog_price_resolver
|
|
55
|
+
@catalog_price_resolver ||=
|
|
56
|
+
Spree::Catalogs::ResolvePrices.new(catalog: @catalog, currency: current_currency).
|
|
57
|
+
tap { |resolver| resolver.preload(priced_variants) }
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def priced_variants
|
|
61
|
+
Array(@collection).flat_map { |product| product.variants.to_a }
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Only what this page reads: the card's thumbnail, and every
|
|
65
|
+
# variant with the rows and option values the resolver and the
|
|
66
|
+
# variant rows need. `default_variant` is deliberately absent —
|
|
67
|
+
# it is a separate `belongs_to` with a cache of its own, so
|
|
68
|
+
# reading it here would re-query option values per row. Publications, stock levels and the default
|
|
69
|
+
# variant's own prices are deliberately absent — this endpoint
|
|
70
|
+
# serializes the membership shape, not a full admin product
|
|
71
|
+
# (docs/plans/6.0-volume-pricing.md).
|
|
72
|
+
def collection_includes
|
|
73
|
+
[
|
|
74
|
+
:primary_media,
|
|
75
|
+
{ variants: [:prices, { option_values: :option_type }] }
|
|
76
|
+
]
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def scope
|
|
80
|
+
product_scope.
|
|
81
|
+
joins(:catalog_products).
|
|
82
|
+
where(Spree::CatalogProduct.table_name => { catalog_id: @catalog.id }).
|
|
83
|
+
order(:name)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# A product is curated at most once per catalog (unique
|
|
87
|
+
# [catalog_id, product_id]), so the join can't duplicate rows and
|
|
88
|
+
# DISTINCT is unnecessary.
|
|
89
|
+
def collection_distinct?
|
|
90
|
+
false
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def add_member_products(products)
|
|
94
|
+
@catalog.add_products(products.map(&:id))
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Through the model, so an owned price list drops the rows it
|
|
98
|
+
# held for these products along with them.
|
|
99
|
+
def remove_member_products(products)
|
|
100
|
+
@catalog.remove_products(products.map(&:id))
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
module Catalogs
|
|
6
|
+
# A catalog's quantity terms — the narrowest of the three levels a
|
|
7
|
+
# buyer's rules resolve through. The catalog-wide default is a pair
|
|
8
|
+
# of fields on the catalog itself, so this surface is strictly the
|
|
9
|
+
# overrides.
|
|
10
|
+
#
|
|
11
|
+
# Rows are stored per variant and written as a whole set, because
|
|
12
|
+
# that is the grain a merchant states them at ("minimum 48 of this
|
|
13
|
+
# product") and the dashboard stages every edit behind the catalog's
|
|
14
|
+
# Save — a partial application would leave an agreement half-changed.
|
|
15
|
+
#
|
|
16
|
+
# There is no read action: the rules are read back on the assortment
|
|
17
|
+
# rows (`expand=quantity_rule` on this catalog's products), which
|
|
18
|
+
# already hold the variants they roll up
|
|
19
|
+
# (docs/plans/6.0-volume-pricing.md).
|
|
20
|
+
class QuantityRulesController < BaseController
|
|
21
|
+
before_action :authorize_parent_access!
|
|
22
|
+
|
|
23
|
+
# PUT /api/v3/admin/catalogs/:catalog_id/quantity_rules
|
|
24
|
+
#
|
|
25
|
+
# { terms: { "prod_abc": { minimum_order_quantity: 48,
|
|
26
|
+
# order_multiple: 24 } } }
|
|
27
|
+
#
|
|
28
|
+
# A product whose pair is both null has its terms cleared.
|
|
29
|
+
def upsert
|
|
30
|
+
authorize! :update, @catalog
|
|
31
|
+
|
|
32
|
+
result = Spree::Catalogs::SetProductTerms.call(catalog: @catalog, terms: resolved_terms)
|
|
33
|
+
|
|
34
|
+
if result.success?
|
|
35
|
+
head :no_content
|
|
36
|
+
else
|
|
37
|
+
render_service_error(result)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
protected
|
|
42
|
+
|
|
43
|
+
def model_class
|
|
44
|
+
Spree::CatalogQuantityRule
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def serializer_class
|
|
48
|
+
Spree.api.admin_catalog_quantity_rule_serializer
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def scope
|
|
52
|
+
@catalog.quantity_rules
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def parent_association
|
|
56
|
+
:quantity_rules
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
private
|
|
60
|
+
|
|
61
|
+
# Products resolve through this store, so an id belonging to
|
|
62
|
+
# another tenant is a 404 rather than a term written against a
|
|
63
|
+
# product the merchant does not sell.
|
|
64
|
+
def resolved_terms
|
|
65
|
+
params.require(:terms).to_unsafe_h.to_h do |product_id, values|
|
|
66
|
+
product = current_store.products.find_by_prefix_id!(product_id)
|
|
67
|
+
[product, values.to_h.symbolize_keys.slice(:minimum_order_quantity, :order_multiple)]
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
# Catalogs — assortment + optional price list, shown to an audience
|
|
6
|
+
# through assignments. Merchandising data, so it answers to the
|
|
7
|
+
# products scopes.
|
|
8
|
+
class CatalogsController < ResourceController
|
|
9
|
+
scoped_resource :products
|
|
10
|
+
|
|
11
|
+
before_action :set_resource,
|
|
12
|
+
only: [:show, :update, :destroy, :assign, :import_products,
|
|
13
|
+
:activate, :deactivate]
|
|
14
|
+
|
|
15
|
+
# POST /api/v3/admin/catalogs/:id/import_products — copies the
|
|
16
|
+
# attached price list's products into the assortment. Explicit by
|
|
17
|
+
# design: an empty assortment is a pricing-only overlay, so making
|
|
18
|
+
# a catalog restrictive is a deliberate act.
|
|
19
|
+
def import_products
|
|
20
|
+
authorize! :update, @resource
|
|
21
|
+
|
|
22
|
+
if @resource.price_list.nil?
|
|
23
|
+
return render_error(
|
|
24
|
+
code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:validation_error],
|
|
25
|
+
message: Spree.t('catalogs.no_price_list_to_import'),
|
|
26
|
+
status: :unprocessable_content
|
|
27
|
+
)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
render json: { added_count: @resource.import_products_from_price_list }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# POST /api/v3/admin/catalogs/:id/assign — { assignable_type, assignable_id }
|
|
34
|
+
def assign
|
|
35
|
+
authorize! :update, @resource
|
|
36
|
+
|
|
37
|
+
assignment = @resource.catalog_assignments.new(assignable: find_assignable)
|
|
38
|
+
|
|
39
|
+
if assignment.save
|
|
40
|
+
render json: Spree.api.admin_catalog_assignment_serializer.new(
|
|
41
|
+
assignment, params: serializer_params
|
|
42
|
+
).to_h, status: :created
|
|
43
|
+
else
|
|
44
|
+
render_validation_error(assignment.errors)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# PATCH /api/v3/admin/catalogs/:id/activate
|
|
49
|
+
def activate
|
|
50
|
+
run_status_workflow(Spree.catalog_activate_workflow)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# PATCH /api/v3/admin/catalogs/:id/deactivate
|
|
54
|
+
def deactivate
|
|
55
|
+
run_status_workflow(Spree.catalog_deactivate_workflow)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
protected
|
|
59
|
+
|
|
60
|
+
def model_class
|
|
61
|
+
Spree::Catalog
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def serializer_class
|
|
65
|
+
Spree.api.admin_catalog_serializer
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def scope
|
|
69
|
+
super.ordered
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def collection_includes
|
|
73
|
+
# The serializer reads each catalog's pricing strategy, which asks
|
|
74
|
+
# its list whether it carries bands — preloaded so an index does
|
|
75
|
+
# not pay a query per row.
|
|
76
|
+
[:catalog_products, :order_minimums, { price_list: :price_adjustment_tiers }]
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def create_workflow
|
|
80
|
+
Spree.catalog_create_workflow
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def update_workflow
|
|
84
|
+
Spree.catalog_update_workflow
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def run_status_workflow(workflow)
|
|
88
|
+
authorize! :update, @resource
|
|
89
|
+
|
|
90
|
+
result = workflow.call(catalog: @resource)
|
|
91
|
+
|
|
92
|
+
if result.success?
|
|
93
|
+
render json: serialize_resource(@resource.reload)
|
|
94
|
+
else
|
|
95
|
+
render_service_error(result.error)
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# `price_list` is an inline payload rather than a reference: a
|
|
100
|
+
# catalog and the list it prices through are stood up in one
|
|
101
|
+
# request (docs/plans/6.0-catalog-agreement-rework.md). Sending it
|
|
102
|
+
# as `null` detaches the list the catalog owns; omitting the key
|
|
103
|
+
# leaves it alone.
|
|
104
|
+
def permitted_params
|
|
105
|
+
permitted = params.permit(*model_additional_permitted_attributes,
|
|
106
|
+
:name, :description, :active, :position,
|
|
107
|
+
:minimum_order_quantity, :order_multiple,
|
|
108
|
+
metadata: {},
|
|
109
|
+
# Small bounded sets, saved with the
|
|
110
|
+
# catalog so the whole agreement lands
|
|
111
|
+
# in one transaction. Per-product terms
|
|
112
|
+
# stay their own endpoint — an
|
|
113
|
+
# agreement may name thousands of them.
|
|
114
|
+
assignments: [:assignable_type, :assignable_id],
|
|
115
|
+
order_minimums: [:currency, :amount],
|
|
116
|
+
price_list: [
|
|
117
|
+
:name, :description, :status, :match_policy,
|
|
118
|
+
:starts_at, :ends_at,
|
|
119
|
+
:price_adjustment_percentage, :adjust_compare_at,
|
|
120
|
+
# Contextual rules only in practice — a
|
|
121
|
+
# VolumeRule is what turns a percentage
|
|
122
|
+
# into automatic volume pricing. Audience
|
|
123
|
+
# rules on an owned list are inert, since
|
|
124
|
+
# the catalog assignment already decided
|
|
125
|
+
# the audience.
|
|
126
|
+
{ rules: [:id, :type, { preferences: {} }] },
|
|
127
|
+
# An empty array clears the hand-entered
|
|
128
|
+
# amounts — what switching to a
|
|
129
|
+
# percentage sends.
|
|
130
|
+
{ prices: [:id, :variant_id, :currency, :min_quantity,
|
|
131
|
+
:amount, :compare_at_amount] },
|
|
132
|
+
# Quantity bands on the percentage. The
|
|
133
|
+
# payload is the whole ladder, so an
|
|
134
|
+
# empty array clears it.
|
|
135
|
+
{ price_adjustment_tiers: [:min_quantity, :percentage] }
|
|
136
|
+
])
|
|
137
|
+
# `permit` drops an explicit null, but detaching has to be
|
|
138
|
+
# distinguishable from saying nothing.
|
|
139
|
+
permitted[:price_list] = nil if params.key?(:price_list) && params[:price_list].nil?
|
|
140
|
+
|
|
141
|
+
# Resolved here rather than in the workflow: each audience goes
|
|
142
|
+
# through the store AND through what this caller may see, so a
|
|
143
|
+
# nested write cannot reach one the dedicated endpoint could not.
|
|
144
|
+
if permitted.key?(:assignments)
|
|
145
|
+
permitted[:assignables] = requested_assignables
|
|
146
|
+
permitted.delete(:assignments)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
permitted
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
private
|
|
153
|
+
|
|
154
|
+
# The audience vocabulary is closed; each type resolves through the
|
|
155
|
+
# store so another tenant's record is a 404, never an assignment.
|
|
156
|
+
ASSIGNABLE_SCOPES = {
|
|
157
|
+
'company' => ->(store) { store.companies },
|
|
158
|
+
'customer_group' => ->(store) { Spree::CustomerGroup.for_store(store) }
|
|
159
|
+
}.freeze
|
|
160
|
+
|
|
161
|
+
# Scoped by the store AND by what this caller may see: a role that
|
|
162
|
+
# reaches only some companies must not be able to assign a catalog
|
|
163
|
+
# to one it cannot read, and an unreadable record is not-found
|
|
164
|
+
# rather than refused so its existence does not leak.
|
|
165
|
+
def find_assignable
|
|
166
|
+
resolve_assignable(params.require(:assignable_type), params.require(:assignable_id))
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
# Each entry resolves the same way a single assign does — through
|
|
170
|
+
# the store AND through what this caller may see — so a set write
|
|
171
|
+
# cannot reach an audience the one-at-a-time path could not.
|
|
172
|
+
def requested_assignables
|
|
173
|
+
Array(params[:assignments]).map do |entry|
|
|
174
|
+
permitted = entry.permit(:assignable_type, :assignable_id)
|
|
175
|
+
resolve_assignable(permitted.require(:assignable_type), permitted.require(:assignable_id))
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
def resolve_assignable(type, id)
|
|
180
|
+
scope_builder = ASSIGNABLE_SCOPES[type.to_s]
|
|
181
|
+
raise ActiveRecord::RecordNotFound if scope_builder.nil?
|
|
182
|
+
|
|
183
|
+
scope_builder.call(current_store).
|
|
184
|
+
accessible_by(current_ability, :show).
|
|
185
|
+
find_by_prefix_id!(id)
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
end
|
|
@@ -3,33 +3,17 @@ module Spree
|
|
|
3
3
|
module V3
|
|
4
4
|
module Admin
|
|
5
5
|
module Categories
|
|
6
|
-
#
|
|
7
|
-
# membership
|
|
8
|
-
#
|
|
9
|
-
#
|
|
6
|
+
# The products classified under a category — the uniform nested
|
|
7
|
+
# membership surface (see Spree::Api::V3::Admin::ProductMembership),
|
|
8
|
+
# plus per-member reposition: listing is ordered by the
|
|
9
|
+
# classification position so the merchant's manual ordering
|
|
10
|
+
# round-trips.
|
|
10
11
|
class ProductsController < ResourceController
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
# Skip the base single-resource load — membership actions resolve
|
|
14
|
-
# the product against the category's scope themselves (set_product).
|
|
15
|
-
skip_before_action :set_resource
|
|
16
|
-
before_action :set_product, only: [:destroy, :reposition]
|
|
12
|
+
include Spree::Api::V3::Admin::ProductMembership
|
|
17
13
|
|
|
18
|
-
|
|
19
|
-
# Body: { product_id: 'prod_…' }
|
|
20
|
-
def create
|
|
21
|
-
product = product_scope.find_by_prefix_id!(params[:product_id])
|
|
22
|
-
Spree::Taxons::AddProducts.call(taxons: [@category], products: [product])
|
|
23
|
-
render json: serialize_resource(product), status: :created
|
|
24
|
-
end
|
|
14
|
+
scoped_resource :products
|
|
25
15
|
|
|
26
|
-
|
|
27
|
-
# Bulk removal goes through the existing
|
|
28
|
-
# POST /products/bulk_remove_from_categories ({ ids, category_ids }).
|
|
29
|
-
def destroy
|
|
30
|
-
Spree::Taxons::RemoveProducts.call(taxons: [@category], products: [@product])
|
|
31
|
-
head :no_content
|
|
32
|
-
end
|
|
16
|
+
before_action :set_product, only: [:reposition]
|
|
33
17
|
|
|
34
18
|
# PATCH /api/v3/admin/categories/:category_id/products/:id/reposition
|
|
35
19
|
# Body: { new_position: 0 } — 0-based index among the category's products.
|
|
@@ -40,25 +24,20 @@ module Spree
|
|
|
40
24
|
return render_invalid_position if position.nil?
|
|
41
25
|
|
|
42
26
|
classification_for(@product).insert_at(position + 1)
|
|
27
|
+
# insert_at shifts sibling positions, so refresh every product in the
|
|
28
|
+
# category (manual sort reads position from the search index).
|
|
29
|
+
@category.products.find_each(&:enqueue_search_index)
|
|
43
30
|
head :no_content
|
|
44
31
|
end
|
|
45
32
|
|
|
46
33
|
protected
|
|
47
34
|
|
|
48
|
-
def model_class
|
|
49
|
-
Spree::Product
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def serializer_class
|
|
53
|
-
Spree.api.admin_product_serializer
|
|
54
|
-
end
|
|
55
|
-
|
|
56
35
|
# The category's products, ordered by classification position.
|
|
57
36
|
def scope
|
|
58
37
|
product_scope.
|
|
59
|
-
joins(:
|
|
60
|
-
where(Spree::
|
|
61
|
-
order(Spree::
|
|
38
|
+
joins(:product_categories).
|
|
39
|
+
where(Spree::ProductCategory.table_name => { category_id: @category.id }).
|
|
40
|
+
order(Spree::ProductCategory.table_name => { position: :asc })
|
|
62
41
|
end
|
|
63
42
|
|
|
64
43
|
# A product is classified at most once per taxon (unique [taxon_id,
|
|
@@ -69,9 +48,21 @@ module Spree
|
|
|
69
48
|
false
|
|
70
49
|
end
|
|
71
50
|
|
|
51
|
+
def add_member_products(products)
|
|
52
|
+
Spree::Categories::AddProducts.call(categories: [@category], products: products)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def remove_member_products(products)
|
|
56
|
+
Spree::Categories::RemoveProducts.call(categories: [@category], products: products)
|
|
57
|
+
end
|
|
58
|
+
|
|
72
59
|
# Loads the parent category (runs before the base set_resource).
|
|
60
|
+
# Scoped to +manual+ so automatic (rule-based) rows — hidden by the
|
|
61
|
+
# categories CRUD controller and migrating to Spree::Collection — can't
|
|
62
|
+
# have their membership listed or mutated through this endpoint.
|
|
73
63
|
def set_parent
|
|
74
|
-
@category = Spree::Category.
|
|
64
|
+
@category = Spree::Category.manual.
|
|
65
|
+
accessible_by(current_ability, parent_ability_action).
|
|
75
66
|
for_store(current_store).
|
|
76
67
|
find_by_prefix_id!(params[:category_id])
|
|
77
68
|
authorize_parent!(@category)
|
|
@@ -83,12 +74,8 @@ module Spree
|
|
|
83
74
|
@product = scope.find_by_prefix_id!(params[:id])
|
|
84
75
|
end
|
|
85
76
|
|
|
86
|
-
def product_scope
|
|
87
|
-
current_store.products.accessible_by(current_ability, :show)
|
|
88
|
-
end
|
|
89
|
-
|
|
90
77
|
def classification_for(product)
|
|
91
|
-
Spree::
|
|
78
|
+
Spree::ProductCategory.find_by(category_id: @category.id, product_id: product.id)
|
|
92
79
|
end
|
|
93
80
|
end
|
|
94
81
|
end
|
|
@@ -52,6 +52,13 @@ module Spree
|
|
|
52
52
|
Spree.api.admin_category_serializer
|
|
53
53
|
end
|
|
54
54
|
|
|
55
|
+
# Categories exclude automatic (rule-based) rows, which still live in
|
|
56
|
+
# spree_categories until the Phase 4 migration moves them to Collections.
|
|
57
|
+
# No-op after migration; the .manual scope is removed in 6.1.
|
|
58
|
+
def scope
|
|
59
|
+
super.manual
|
|
60
|
+
end
|
|
61
|
+
|
|
55
62
|
# Category-half attributes only. Deliberately excludes the
|
|
56
63
|
# collection-bound fields (automatic, sort_order, rules_match_policy,
|
|
57
64
|
# taxon_rules) and taxonomy_id — those belong to Spree::Collection
|
|
@@ -60,13 +67,14 @@ module Spree
|
|
|
60
67
|
# can't be targeted).
|
|
61
68
|
def permitted_params
|
|
62
69
|
permitted = params.permit(
|
|
70
|
+
*model_additional_permitted_attributes,
|
|
63
71
|
:name, :description, :permalink,
|
|
64
72
|
:meta_title, :meta_description, :meta_keywords,
|
|
65
|
-
:
|
|
73
|
+
:image, :square_image,
|
|
66
74
|
# Inline custom field values keyed by definition id. The model
|
|
67
|
-
# setter (Spree::
|
|
75
|
+
# setter (Spree::HasCustomFields#custom_fields=) validates each entry
|
|
68
76
|
# against its definition. `value` is permitted as a scalar AND as
|
|
69
|
-
# `value: []` / `value: {}` so JSON
|
|
77
|
+
# `value: []` / `value: {}` so JSON custom_fields round-trip whether
|
|
70
78
|
# the parsed payload is an array or an object, while
|
|
71
79
|
# text/number/boolean ship scalars.
|
|
72
80
|
custom_fields: [:id, :custom_field_definition_id, :value, { value: [] }, { value: {} }]
|
|
@@ -103,10 +111,11 @@ module Spree
|
|
|
103
111
|
end
|
|
104
112
|
|
|
105
113
|
# Positions the node at +index+ among the store's root categories.
|
|
106
|
-
#
|
|
107
|
-
#
|
|
108
|
-
# stores
|
|
109
|
-
#
|
|
114
|
+
# Deliberately not move_to_child_with_index(:root, ...): that indexes
|
|
115
|
+
# into awesome_nested_set's class-level +roots+, which stays global
|
|
116
|
+
# across stores even though the set is scoped per store. Positioning
|
|
117
|
+
# relative to the target sibling keeps the index meaning what the
|
|
118
|
+
# caller computed it from — this store's roots.
|
|
110
119
|
def move_to_root_at_index(node, index)
|
|
111
120
|
others = scope.where(parent_id: nil).where.not(id: node.id).order(:lft).to_a
|
|
112
121
|
target = others[index]
|
|
@@ -29,6 +29,27 @@ module Spree
|
|
|
29
29
|
render json: { product_count: removed }
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
+
def create
|
|
33
|
+
@resource = model_class.new(assignable_params.merge(store: current_store))
|
|
34
|
+
authorize_resource!(@resource, :create)
|
|
35
|
+
|
|
36
|
+
if @resource.save
|
|
37
|
+
render json: serialize_resource(@resource), status: :created
|
|
38
|
+
else
|
|
39
|
+
render_validation_error(@resource.errors)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def update
|
|
44
|
+
@resource.assign_attributes(assignable_params)
|
|
45
|
+
|
|
46
|
+
if @resource.save
|
|
47
|
+
render json: serialize_resource(@resource)
|
|
48
|
+
else
|
|
49
|
+
render_validation_error(@resource.errors)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
32
53
|
protected
|
|
33
54
|
|
|
34
55
|
def model_class
|
|
@@ -44,8 +65,35 @@ module Spree
|
|
|
44
65
|
end
|
|
45
66
|
|
|
46
67
|
def permitted_params
|
|
47
|
-
params.permit(:name, :code, :active, :default, :preferred_order_routing_strategy,
|
|
48
|
-
:preferred_storefront_access, :preferred_guest_checkout
|
|
68
|
+
params.permit(*model_additional_permitted_attributes, :name, :code, :active, :default, :preferred_order_routing_strategy,
|
|
69
|
+
:preferred_storefront_access, :preferred_guest_checkout,
|
|
70
|
+
:default_catalog_id,
|
|
71
|
+
stock_location_ids: [])
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# `stock_location_ids` replaces the channel's fulfillment-origin
|
|
75
|
+
# allowlist; empty clears it (= every location). Store-scoped
|
|
76
|
+
# resolution: a foreign location 404s.
|
|
77
|
+
def assignable_params
|
|
78
|
+
attributes = permitted_params.except(:stock_location_ids)
|
|
79
|
+
|
|
80
|
+
# An incidental lookup like any other: a foreign catalog 404s.
|
|
81
|
+
if attributes.key?(:default_catalog_id)
|
|
82
|
+
attributes[:default_catalog_id] =
|
|
83
|
+
if attributes[:default_catalog_id].present?
|
|
84
|
+
current_store.catalogs.find_by_prefix_id!(attributes[:default_catalog_id]).id
|
|
85
|
+
else
|
|
86
|
+
nil
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
if params.key?(:stock_location_ids)
|
|
91
|
+
attributes[:stock_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
|
+
end
|
|
95
|
+
|
|
96
|
+
attributes
|
|
49
97
|
end
|
|
50
98
|
|
|
51
99
|
private
|