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,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
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
class ClaimReasonsController < ResourceController
|
|
6
|
+
scoped_resource :settings
|
|
7
|
+
|
|
8
|
+
protected
|
|
9
|
+
|
|
10
|
+
def model_class
|
|
11
|
+
Spree::ClaimReason
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def serializer_class
|
|
15
|
+
Spree.api.admin_claim_reason_serializer
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def permitted_params
|
|
19
|
+
params.permit(*model_additional_permitted_attributes, :name, :active)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
# Cross-order listing of claims — "what is awaiting resolution across
|
|
6
|
+
# the whole store". Read-only by route: opening a claim needs an
|
|
7
|
+
# order, so creation and the status transitions stay on the nested
|
|
8
|
+
# Orders::ClaimsController.
|
|
9
|
+
class ClaimsController < 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::Claim
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def serializer_class
|
|
21
|
+
Spree.api.admin_claim_serializer
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def collection_includes
|
|
25
|
+
[:order, :reason, { claim_line_items: :variant }]
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
# Discovery for `Spree::CollectionRule` STI subclasses, so the dashboard
|
|
6
|
+
# can offer every registered rule kind — including ones a plugin adds to
|
|
7
|
+
# `config.spree.collection_rules` — without hard-coding the list.
|
|
8
|
+
#
|
|
9
|
+
# Read-only by design: rules are written through the owning collection's
|
|
10
|
+
# `rules` sync setter (PATCH /collections/:id), not as a nested resource.
|
|
11
|
+
class CollectionRulesController < ResourceController
|
|
12
|
+
# Rule kinds are part of the collections surface — a key that can read
|
|
13
|
+
# collections can discover the rules it may configure on them.
|
|
14
|
+
scoped_resource :collections
|
|
15
|
+
|
|
16
|
+
def types
|
|
17
|
+
authorize! :read, model_class
|
|
18
|
+
|
|
19
|
+
render json: { data: model_class.subclasses_with_preference_schema }
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
protected
|
|
23
|
+
|
|
24
|
+
def model_class
|
|
25
|
+
Spree::CollectionRule
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def serializer_class
|
|
29
|
+
Spree.api.admin_collection_rule_serializer
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# `types` is read-only discovery — maps to the read scope + :show ability.
|
|
33
|
+
def read_actions
|
|
34
|
+
super + %w[types]
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
module Collections
|
|
6
|
+
# The products curated under a collection — the uniform nested
|
|
7
|
+
# membership surface (see Spree::Api::V3::Admin::ProductMembership),
|
|
8
|
+
# plus per-member reposition: listing is ordered by the
|
|
9
|
+
# ProductCollection position so the merchant's manual ordering
|
|
10
|
+
# round-trips. Automatic (rule-based) membership is materialized by
|
|
11
|
+
# the rules, not managed here.
|
|
12
|
+
class ProductsController < ResourceController
|
|
13
|
+
include Spree::Api::V3::Admin::ProductMembership
|
|
14
|
+
|
|
15
|
+
scoped_resource :products
|
|
16
|
+
|
|
17
|
+
before_action :ensure_manual_collection, only: [:create, :destroy, :reposition]
|
|
18
|
+
before_action :set_product, only: [:reposition]
|
|
19
|
+
|
|
20
|
+
# PATCH /api/v3/admin/collections/:collection_id/products/:id/reposition
|
|
21
|
+
# Body: { new_position: 0 } — 0-based index among the collection's products.
|
|
22
|
+
# @product is already constrained to the collection's scope, so a
|
|
23
|
+
# ProductCollection always exists.
|
|
24
|
+
def reposition
|
|
25
|
+
position = integer_param(:new_position)
|
|
26
|
+
return render_invalid_position if position.nil?
|
|
27
|
+
|
|
28
|
+
product_collection_for(@product).insert_at(position + 1)
|
|
29
|
+
# insert_at shifts sibling positions, so refresh every product in the
|
|
30
|
+
# collection (manual sort reads position from the search index).
|
|
31
|
+
@parent_collection.products.find_each(&:enqueue_search_index)
|
|
32
|
+
head :no_content
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
protected
|
|
36
|
+
|
|
37
|
+
# The collection's products, ordered by membership position.
|
|
38
|
+
def scope
|
|
39
|
+
product_scope.
|
|
40
|
+
joins(:product_collections).
|
|
41
|
+
where(Spree::ProductCollection.table_name => { collection_id: @parent_collection.id }).
|
|
42
|
+
order(Spree::ProductCollection.table_name => { position: :asc })
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# A product is curated at most once per collection (unique
|
|
46
|
+
# [collection_id, product_id]), so the join can't duplicate rows —
|
|
47
|
+
# DISTINCT is unnecessary and breaks Postgres ordering by position.
|
|
48
|
+
def collection_distinct?
|
|
49
|
+
false
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def add_member_products(products)
|
|
53
|
+
Spree::Collections::AddProducts.call(collections: [@parent_collection], products: products)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def remove_member_products(products)
|
|
57
|
+
Spree::Collections::RemoveProducts.call(collections: [@parent_collection], products: products)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Loads the parent collection (runs before the base set_resource).
|
|
61
|
+
# Any collection resolves — listing (index) an automatic collection's
|
|
62
|
+
# rule-materialized membership is valid. Manual-only curation is enforced
|
|
63
|
+
# separately by +ensure_manual_collection+ on the write actions.
|
|
64
|
+
def set_parent
|
|
65
|
+
@parent_collection = Spree::Collection.
|
|
66
|
+
accessible_by(current_ability, parent_ability_action).
|
|
67
|
+
for_store(current_store).
|
|
68
|
+
find_by_prefix_id!(params[:collection_id])
|
|
69
|
+
authorize_parent!(@parent_collection)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
private
|
|
73
|
+
|
|
74
|
+
# Manual curation (add/remove/reposition) is invalid on automatic
|
|
75
|
+
# collections: their membership is materialized from rules by
|
|
76
|
+
# RegenerateProducts, so a manual change would be wiped on the next
|
|
77
|
+
# regeneration. Listing (index) the materialized membership is fine.
|
|
78
|
+
def ensure_manual_collection
|
|
79
|
+
return if @parent_collection.manual?
|
|
80
|
+
|
|
81
|
+
render_error(
|
|
82
|
+
code: ERROR_CODES[:validation_error],
|
|
83
|
+
message: Spree.t('api.errors.automatic_collection_curation',
|
|
84
|
+
default: "Products of an automatic collection are managed by its rules and can't be curated manually"),
|
|
85
|
+
status: :unprocessable_content
|
|
86
|
+
)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def set_product
|
|
90
|
+
@product = scope.find_by_prefix_id!(params[:id])
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def product_collection_for(product)
|
|
94
|
+
Spree::ProductCollection.find_by(collection_id: @parent_collection.id, product_id: product.id)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
# Admin CRUD for collections — the flat, merchandising half of today's
|
|
6
|
+
# dual-purpose Taxon. Both manual and automatic (rule-based) collections
|
|
7
|
+
# live here. Reordering is a plain +position+ update (acts_as_list
|
|
8
|
+
# reorders siblings on save), matching the SPA ResourceTable reorder
|
|
9
|
+
# convention, so there is no dedicated reposition action.
|
|
10
|
+
class CollectionsController < ResourceController
|
|
11
|
+
scoped_resource :collections
|
|
12
|
+
|
|
13
|
+
protected
|
|
14
|
+
|
|
15
|
+
def model_class
|
|
16
|
+
Spree::Collection
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def serializer_class
|
|
20
|
+
Spree.api.admin_collection_serializer
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# The serializer always renders the rule set — eager load it.
|
|
24
|
+
# Eager-loaded unconditionally (as PromotionsController does for its
|
|
25
|
+
# own rules): the write path reads the association through the `rules=`
|
|
26
|
+
# sync setter regardless of what the response expands.
|
|
27
|
+
def scope_includes
|
|
28
|
+
[:rules]
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def scope
|
|
32
|
+
super.ordered
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Flat params. +rules+ is applied by the model's sync setter
|
|
36
|
+
# (Spree::Collection#rules=): the full desired rule set, prefixed
|
|
37
|
+
# +crule_+ ids update, missing ids build, omitted rules are removed —
|
|
38
|
+
# so normalize_params is deliberately NOT called (that would rewrite
|
|
39
|
+
# +rules+ to +rules_attributes+ and route past the setter).
|
|
40
|
+
def permitted_params
|
|
41
|
+
params.permit(
|
|
42
|
+
:name, :description, :permalink, :position,
|
|
43
|
+
:meta_title, :meta_description, :meta_keywords,
|
|
44
|
+
:image, :square_image,
|
|
45
|
+
:automatic, :rules_match_policy, :sort_order,
|
|
46
|
+
rules: [:id, :type, :value, :match_policy],
|
|
47
|
+
# Inline custom field values keyed by definition id (see
|
|
48
|
+
# CategoriesController#permitted_params for the value shapes).
|
|
49
|
+
custom_fields: [:id, :custom_field_definition_id, :value, { value: [] }, { value: {} }]
|
|
50
|
+
)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|