spree_api 5.6.0 → 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 -1
- 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 +21 -5
- 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 +11 -9
- 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 +107 -16
- 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/credit_cards_controller.rb +7 -0
- 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 +11 -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 +20 -4
- 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 +7 -3
- 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 +56 -3
- 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/export_serializer.rb +9 -1
- 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 +7 -2
- data/app/serializers/spree/api/v3/import_serializer.rb +27 -4
- data/app/serializers/spree/api/v3/invitation_serializer.rb +15 -2
- 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/media_event_serializer.rb +28 -0
- 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_filter_sort_option_serializer.rb +2 -2
- 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 -10
- data/app/serializers/spree/api/v3/stock_receipt_event_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/stock_transfer_serializer.rb +7 -4
- 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 +12 -5
- 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 +731 -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 +197 -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/asset_serializer.rb +0 -20
- 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 -28
- 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
|
@@ -6,111 +6,161 @@ module Spree
|
|
|
6
6
|
scoped_resource :products
|
|
7
7
|
|
|
8
8
|
def create
|
|
9
|
-
|
|
9
|
+
# An external video has no file, so it takes the plain create path
|
|
10
|
+
# even though a URL is present — `url` means "fetch this image from
|
|
11
|
+
# here" and only applies to image rows.
|
|
12
|
+
if permitted_params[:source_media_id].present?
|
|
13
|
+
create_from_library
|
|
14
|
+
elsif permitted_params[:url].present? && !external_video_request?
|
|
10
15
|
create_from_url
|
|
11
16
|
elsif permitted_params[:signed_id].present?
|
|
12
17
|
create_from_signed_id
|
|
13
18
|
else
|
|
14
|
-
|
|
15
|
-
authorize_resource!(@resource, :create)
|
|
16
|
-
|
|
17
|
-
if @resource.save
|
|
18
|
-
render json: serialize_resource(@resource), status: :created
|
|
19
|
-
else
|
|
20
|
-
render_validation_error(@resource.errors)
|
|
21
|
-
end
|
|
19
|
+
authorize_and_create(build_resource)
|
|
22
20
|
end
|
|
23
21
|
end
|
|
24
22
|
|
|
25
23
|
protected
|
|
26
24
|
|
|
25
|
+
# `url` and `signed_id` say how to *fetch* the bytes; neither is an
|
|
26
|
+
# attribute on the row. A re-synced asset already has its file, so
|
|
27
|
+
# the replay only carries them as leftovers from the create shape.
|
|
28
|
+
def normalize_upsert_params!
|
|
29
|
+
params.delete(:url)
|
|
30
|
+
params.delete(:signed_id)
|
|
31
|
+
end
|
|
32
|
+
|
|
27
33
|
def model_class
|
|
28
|
-
Spree::
|
|
34
|
+
Spree::Media
|
|
29
35
|
end
|
|
30
36
|
|
|
31
37
|
def serializer_class
|
|
32
38
|
Spree.api.admin_media_serializer
|
|
33
39
|
end
|
|
34
40
|
|
|
41
|
+
# A product's gallery is part of the product: authorizing the product
|
|
42
|
+
# here is the whole check, and the per-record hook stays a no-op so a
|
|
43
|
+
# media key is never required to manage a product's own pictures.
|
|
44
|
+
# The media keys govern the library.
|
|
45
|
+
def authorize_resource!(resource = @resource, action = action_name.to_sym); end
|
|
46
|
+
|
|
35
47
|
def set_parent
|
|
36
48
|
@product = current_store.products.find_by_prefix_id!(params[:product_id])
|
|
37
49
|
authorize!(:update, @product)
|
|
38
50
|
|
|
39
51
|
@parent = if params[:variant_id].present?
|
|
40
|
-
@product.
|
|
52
|
+
@product.variants.find_by_prefix_id!(params[:variant_id])
|
|
41
53
|
else
|
|
42
54
|
@product
|
|
43
55
|
end
|
|
44
56
|
end
|
|
45
57
|
|
|
46
58
|
# Variants store assets via the polymorphic `images` association; products own
|
|
47
|
-
# their gallery via `media`. Both resolve to `Spree::
|
|
59
|
+
# their gallery via `media`. Both resolve to `Spree::Media` rows with different
|
|
48
60
|
# `viewable_type` values.
|
|
49
61
|
def parent_association
|
|
50
62
|
params[:variant_id].present? ? :images : :media
|
|
51
63
|
end
|
|
52
64
|
|
|
53
65
|
# For product-scoped listings we surface BOTH product-level assets and any
|
|
54
|
-
# legacy
|
|
55
|
-
# merchants migrate. New uploads land on `Spree::Product`
|
|
66
|
+
# legacy assets still pinned to the default variant, so existing data keeps
|
|
67
|
+
# showing up while merchants migrate. New uploads land on `Spree::Product`
|
|
68
|
+
# (see #set_parent).
|
|
56
69
|
def scope
|
|
57
70
|
return super if params[:variant_id].present?
|
|
58
71
|
|
|
59
|
-
Spree::
|
|
72
|
+
Spree::Media.where(
|
|
60
73
|
viewable_type: 'Spree::Product', viewable_id: @product.id
|
|
61
74
|
).or(
|
|
62
|
-
Spree::
|
|
63
|
-
viewable_type: 'Spree::Variant', viewable_id: @product.
|
|
75
|
+
Spree::Media.where(
|
|
76
|
+
viewable_type: 'Spree::Variant', viewable_id: @product.default_variant&.id
|
|
64
77
|
)
|
|
65
78
|
).order(:position)
|
|
66
79
|
end
|
|
67
80
|
|
|
68
|
-
ALLOWED_MEDIA_TYPES = -> { [Spree::Asset, *Spree::Asset.descendants].map(&:name).to_set.freeze }
|
|
69
|
-
|
|
70
81
|
def build_resource
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
unless ALLOWED_MEDIA_TYPES.call.include?(media_type)
|
|
74
|
-
raise ArgumentError, "Invalid media type: #{media_type}"
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
media = @parent.send(parent_association).build(permitted_params.except(:type, :url, :signed_id))
|
|
78
|
-
media.type = media_type
|
|
82
|
+
@parent.send(parent_association).build(media_attributes)
|
|
83
|
+
end
|
|
79
84
|
|
|
80
|
-
|
|
85
|
+
# Everything the client sent minus the transport keys — a direct file,
|
|
86
|
+
# the URL to fetch one from, and the library row to copy are ways of
|
|
87
|
+
# getting at a file, not attributes of the row. Leaving `attachment`
|
|
88
|
+
# in let a request carrying it alongside `source_media_id` overwrite
|
|
89
|
+
# the shared blob with an upload, defeating the reuse.
|
|
90
|
+
def media_attributes
|
|
91
|
+
permitted_params.except(:attachment, :url, :signed_id, :source_media_id)
|
|
81
92
|
end
|
|
82
93
|
|
|
94
|
+
# The media file, a URL to fetch one from, and the library row to copy
|
|
95
|
+
# are transport, not attributes — everything a client can set lives on
|
|
96
|
+
# the model.
|
|
83
97
|
def permitted_params
|
|
84
|
-
params.permit(
|
|
98
|
+
params.permit(
|
|
99
|
+
*model_additional_permitted_attributes,
|
|
100
|
+
*Spree::Media::WRITABLE_ATTRIBUTES,
|
|
101
|
+
:attachment, :url, :signed_id, :source_media_id,
|
|
102
|
+
variant_ids: []
|
|
103
|
+
)
|
|
85
104
|
end
|
|
86
105
|
|
|
87
|
-
def
|
|
88
|
-
|
|
106
|
+
def external_video_request?
|
|
107
|
+
permitted_params[:media_type] == 'external_video'
|
|
108
|
+
end
|
|
89
109
|
|
|
110
|
+
def create_from_url
|
|
90
111
|
url = permitted_params[:url]
|
|
91
112
|
position = permitted_params[:position]
|
|
92
113
|
|
|
114
|
+
# The job runs later, so the identities the connector sent ride
|
|
115
|
+
# along and are written on the media once it exists. All of them:
|
|
116
|
+
# a DAM and a PIM may both name the same asset.
|
|
117
|
+
references = external_reference_params.map { |entry| entry.transform_keys(&:to_s) }
|
|
118
|
+
references = references.presence
|
|
119
|
+
|
|
93
120
|
Spree::Images::SaveFromUrlJob.perform_later(
|
|
94
121
|
@parent.id,
|
|
95
122
|
@parent.class.name,
|
|
96
123
|
url,
|
|
97
|
-
|
|
124
|
+
references,
|
|
98
125
|
position
|
|
99
126
|
)
|
|
100
127
|
|
|
101
128
|
head :accepted
|
|
102
129
|
end
|
|
103
130
|
|
|
131
|
+
# Places a file already in the library onto this product or variant.
|
|
132
|
+
# The copy shares the source's blob, so nothing is uploaded and no
|
|
133
|
+
# rendition is regenerated; it gets its own alt, position and variant
|
|
134
|
+
# links from there on.
|
|
135
|
+
#
|
|
136
|
+
# The source is fetched through the store's own library, so a media id
|
|
137
|
+
# belonging to another store reads as a 404 rather than copying a
|
|
138
|
+
# file across the tenancy boundary.
|
|
139
|
+
def create_from_library
|
|
140
|
+
source = current_store.media.find_by_prefix_id!(permitted_params[:source_media_id])
|
|
141
|
+
|
|
142
|
+
@resource = source.duplicate_for(@parent)
|
|
143
|
+
# Anything the client sent alongside the source wins over what was
|
|
144
|
+
# copied, so a merchant can place a file and correct its alt text
|
|
145
|
+
# for the new context in one request.
|
|
146
|
+
@resource.assign_attributes(media_attributes)
|
|
147
|
+
|
|
148
|
+
authorize_and_create(@resource)
|
|
149
|
+
end
|
|
150
|
+
|
|
104
151
|
def create_from_signed_id
|
|
105
152
|
@resource = build_resource
|
|
106
153
|
@resource.attachment.attach(permitted_params[:signed_id])
|
|
107
|
-
authorize_resource!(@resource, :create)
|
|
108
154
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
155
|
+
authorize_and_create(@resource)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
# The common tail of every create branch. Wraps the base class's
|
|
159
|
+
# save_and_render with the per-record authorization the branches
|
|
160
|
+
# share, since each builds its record a different way.
|
|
161
|
+
def authorize_and_create(media)
|
|
162
|
+
authorize_resource!(media, :create)
|
|
163
|
+
save_and_render(media, status: :created)
|
|
114
164
|
end
|
|
115
165
|
end
|
|
116
166
|
end
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
# The media library: every file in the store, whether or not it has been
|
|
6
|
+
# placed on a product yet.
|
|
7
|
+
#
|
|
8
|
+
# Subclasses the product-scoped media controller for its create
|
|
9
|
+
# branches, but drops the parent: a row created here has no viewable,
|
|
10
|
+
# which is what makes uploading before deciding where a file goes
|
|
11
|
+
# possible. Putting a file ON a product is the nested controller's job —
|
|
12
|
+
# POST that product's media with this row's id as `source_media_id`.
|
|
13
|
+
#
|
|
14
|
+
# `source_media_id` works here too, and means "copy this file into the
|
|
15
|
+
# library again" — an unplaced row sharing the original's blob.
|
|
16
|
+
class MediaLibraryController < MediaController
|
|
17
|
+
# The library reaches across products, categories and collections, so
|
|
18
|
+
# it is not a product endpoint. The nested gallery routes keep
|
|
19
|
+
# `products` — those are one product's own media, reached through a
|
|
20
|
+
# product the caller can already see.
|
|
21
|
+
scoped_resource :media
|
|
22
|
+
# Restates the base class's member actions with `usage` added — a
|
|
23
|
+
# second `before_action :set_resource` would replace that filter
|
|
24
|
+
# rather than extend it, leaving show/update/destroy without a record.
|
|
25
|
+
before_action :set_resource, only: %i[show update destroy usage]
|
|
26
|
+
|
|
27
|
+
# Deleting from the library means deleting the file. A file still in
|
|
28
|
+
# use needs the caller to say so — `detach=true`, which the dashboard
|
|
29
|
+
# sends after a confirmation showing the places — and then the file
|
|
30
|
+
# is removed from all of them in one pass. Without it the delete is
|
|
31
|
+
# refused with the usage list, so an API client can't take a file out
|
|
32
|
+
# from under a catalog by accident. Removing a file from one
|
|
33
|
+
# product's gallery is the nested endpoint's destroy, which stays
|
|
34
|
+
# unguarded: that is removing a placement, not the file.
|
|
35
|
+
def destroy
|
|
36
|
+
references = Spree::Media::Usage.call(media: @resource).value
|
|
37
|
+
return super if references.empty?
|
|
38
|
+
|
|
39
|
+
unless detach_requested?
|
|
40
|
+
return render_error(
|
|
41
|
+
code: ERROR_CODES[:resource_invalid],
|
|
42
|
+
message: Spree.t(
|
|
43
|
+
'api.errors.media_in_use',
|
|
44
|
+
places: references.filter_map(&:name).uniq.first(5).to_sentence
|
|
45
|
+
),
|
|
46
|
+
status: :unprocessable_content,
|
|
47
|
+
details: { usage: references.map { |reference| reference_payload(reference) } }
|
|
48
|
+
)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
result = Spree::Media::Destroy.call(media: @resource)
|
|
52
|
+
return head :no_content if result.success?
|
|
53
|
+
|
|
54
|
+
# A rolled-back delete carries no validation errors, so
|
|
55
|
+
# render_service_error would produce an empty message.
|
|
56
|
+
render_error(
|
|
57
|
+
code: ERROR_CODES[:processing_error],
|
|
58
|
+
message: Spree.t('api.errors.media_not_deleted'),
|
|
59
|
+
status: :unprocessable_content
|
|
60
|
+
)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Where this file is in use — other products it has been placed on,
|
|
64
|
+
# plain image fields sharing it, and descriptions embedding it. What
|
|
65
|
+
# the dashboard shows before a merchant deletes something.
|
|
66
|
+
def usage
|
|
67
|
+
references = Spree::Media::Usage.call(media: @resource).value
|
|
68
|
+
|
|
69
|
+
render json: { data: references.map { |reference| reference_payload(reference) } }
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
protected
|
|
73
|
+
|
|
74
|
+
def detach_requested?
|
|
75
|
+
ActiveModel::Type::Boolean.new.cast(params[:detach])
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def reference_payload(reference)
|
|
79
|
+
{
|
|
80
|
+
kind: reference.kind,
|
|
81
|
+
name: reference.name,
|
|
82
|
+
owner_type: reference.owner_type,
|
|
83
|
+
owner_id: reference.owner_id,
|
|
84
|
+
field: reference.field
|
|
85
|
+
}
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Reading where a file is used is reading the file, for the key gate
|
|
89
|
+
# and for CanCanCan alike. The latter needs saying twice: `read_actions`
|
|
90
|
+
# settles the required API-key scope, while this maps the action onto
|
|
91
|
+
# an ability a role actually grants — CanCanCan's `:read` alias covers
|
|
92
|
+
# only index and show, so a staffer with read access would otherwise
|
|
93
|
+
# be refused.
|
|
94
|
+
def read_actions
|
|
95
|
+
super + %w[usage]
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# The library authorizes the media record itself; the product-nested
|
|
99
|
+
# controller authorizes its product instead, so this restores the
|
|
100
|
+
# per-record check its no-op skips. `usage` maps to `:show` because
|
|
101
|
+
# CanCanCan's `:read` alias covers only index and show.
|
|
102
|
+
def authorize_resource!(resource = @resource, action = action_name.to_sym)
|
|
103
|
+
authorize!(action == :usage ? :show : action, resource || Spree::Media)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# No parent to resolve. The library is the store's own collection, so
|
|
107
|
+
# tenancy comes from the store_id on the rows themselves rather than
|
|
108
|
+
# from a product two hops away.
|
|
109
|
+
def set_parent
|
|
110
|
+
@parent = nil
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# The listing shows one row per file; member actions resolve any row.
|
|
114
|
+
#
|
|
115
|
+
# Reuse shares a blob across rows, so a picture placed on three
|
|
116
|
+
# products is three rows of the same image — the library shows files,
|
|
117
|
+
# and `usage` says where each one appears. But a row the grouping
|
|
118
|
+
# hides is still a real record a client may hold the id of, so
|
|
119
|
+
# narrowing every lookup would 404 it on show or destroy.
|
|
120
|
+
# The library has no parent, so this is the one media endpoint where
|
|
121
|
+
# the admin base's `accessible_by` would apply — a role's
|
|
122
|
+
# record-level rules must still filter it. `super` is skipped
|
|
123
|
+
# deliberately: the parent controller's scope reads @product, which
|
|
124
|
+
# a library request does not have.
|
|
125
|
+
def scope
|
|
126
|
+
media = current_store.media
|
|
127
|
+
.accessible_by(current_ability, ability_action_for_request)
|
|
128
|
+
.order(created_at: :desc)
|
|
129
|
+
listing? ? media.distinct_by_file : media
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def listing?
|
|
133
|
+
action_name == 'index'
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# A library row is born unplaced. `viewable` stays nil until someone
|
|
137
|
+
# copies the file onto a product.
|
|
138
|
+
def build_resource
|
|
139
|
+
current_store.media.build(media_attributes)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# There is no product to fetch into, so the URL import job — which
|
|
143
|
+
# takes a viewable — has nothing to target. A merchant importing by
|
|
144
|
+
# URL does it from the product they are filling.
|
|
145
|
+
def create_from_url
|
|
146
|
+
render_error(
|
|
147
|
+
code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:resource_invalid],
|
|
148
|
+
message: Spree.t('api.errors.media_url_import_requires_product'),
|
|
149
|
+
status: :unprocessable_content
|
|
150
|
+
)
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
class OrderCancellationReasonsController < ResourceController
|
|
6
|
+
scoped_resource :settings
|
|
7
|
+
|
|
8
|
+
protected
|
|
9
|
+
|
|
10
|
+
def model_class
|
|
11
|
+
Spree::OrderCancellationReason
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def serializer_class
|
|
15
|
+
Spree.api.admin_order_cancellation_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,43 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
# The multi-order transaction container — what a customer bought in one
|
|
6
|
+
# checkout when it was fulfilled by more than one seller.
|
|
7
|
+
#
|
|
8
|
+
# Read-only, enforced by the routes: a group records a checkout that
|
|
9
|
+
# already happened, and everything an operator can act on lives on the
|
|
10
|
+
# orders inside it or on the payment it holds.
|
|
11
|
+
class OrderGroupsController < ResourceController
|
|
12
|
+
scoped_resource :orders
|
|
13
|
+
|
|
14
|
+
protected
|
|
15
|
+
|
|
16
|
+
def model_class
|
|
17
|
+
Spree::OrderGroup
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def serializer_class
|
|
21
|
+
Spree.api.admin_order_group_serializer
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def scope
|
|
25
|
+
super.where(store_id: current_store.id)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Everything both serializers touch. The group's figures are summed
|
|
29
|
+
# from its children and its payments are rendered in full, so a page
|
|
30
|
+
# of groups that did not preload them would issue a query per row for
|
|
31
|
+
# each.
|
|
32
|
+
def collection_includes
|
|
33
|
+
[
|
|
34
|
+
:customer, :ship_address, :bill_address,
|
|
35
|
+
{ payments: %i[payment_method source] },
|
|
36
|
+
{ orders: %i[market gift_card] }
|
|
37
|
+
]
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -30,7 +30,7 @@ module Spree
|
|
|
30
30
|
end
|
|
31
31
|
|
|
32
32
|
def permitted_params
|
|
33
|
-
params.permit(:type, :active, :position, preferences: {})
|
|
33
|
+
params.permit(*model_additional_permitted_attributes, :type, :active, :position, preferences: {})
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
# `types` is read-only discovery — maps to the read scope + :show ability.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
module Orders
|
|
6
|
+
# Claims on a completed order.
|
|
7
|
+
class ClaimsController < BaseController
|
|
8
|
+
include Spree::Api::V3::Orders::ClaimActions
|
|
9
|
+
|
|
10
|
+
# Claims are a subject of the `orders` catalog resource, so
|
|
11
|
+
# `read_orders`/`write_orders` gate these endpoints. `:claims`
|
|
12
|
+
# would name a key no catalog knows.
|
|
13
|
+
scoped_resource :orders
|
|
14
|
+
|
|
15
|
+
before_action :set_resource, only: [:show, :update, :approve, :resolve, :deny, :cancel]
|
|
16
|
+
|
|
17
|
+
# PATCH /api/v3/admin/orders/:order_id/claims/:id
|
|
18
|
+
#
|
|
19
|
+
# Editable fields only — status moves through the member actions.
|
|
20
|
+
def update
|
|
21
|
+
if @resource.update(permitted_params)
|
|
22
|
+
render json: serialize_resource(@resource.reload)
|
|
23
|
+
else
|
|
24
|
+
render_validation_error(@resource.errors)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
protected
|
|
29
|
+
|
|
30
|
+
def serializer_class
|
|
31
|
+
Spree.api.admin_claim_serializer
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def collection_includes
|
|
35
|
+
[:reason, { claim_line_items: [:variant, :replacement_variant] }]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def permitted_params
|
|
39
|
+
params.permit(:memo, :reason_id, metadata: {})
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
# The whole store's catalogue: an operator may promise anything
|
|
45
|
+
# the store sells as a replacement.
|
|
46
|
+
def replacement_variant_for(variant_id)
|
|
47
|
+
return nil if variant_id.blank?
|
|
48
|
+
|
|
49
|
+
current_store.variants.find_by_prefix_id!(variant_id)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
module Orders
|
|
6
|
+
# The consignments of one fulfillment, under
|
|
7
|
+
# /orders/:order_id/fulfillments/:fulfillment_id/deliveries.
|
|
8
|
+
#
|
|
9
|
+
# CRUD lives in the shared concern; what is here is the store-wide
|
|
10
|
+
# scope and the one action only an operator has. The
|
|
11
|
+
# fulfillment-level mark_delivered stays beside it for parcels that
|
|
12
|
+
# have no delivery row at all.
|
|
13
|
+
class DeliveriesController < BaseController
|
|
14
|
+
include Spree::Api::V3::Orders::DeliveryActions
|
|
15
|
+
|
|
16
|
+
before_action :set_resource, only: [:show, :update, :destroy, :mark_delivered]
|
|
17
|
+
|
|
18
|
+
# PATCH .../deliveries/:id/mark_delivered — staff saying this one
|
|
19
|
+
# consignment arrived; the fulfillment follows once every
|
|
20
|
+
# consignment has.
|
|
21
|
+
def mark_delivered
|
|
22
|
+
with_order_lock do
|
|
23
|
+
result = Spree.delivery_update_tracking_workflow.call(
|
|
24
|
+
delivery: @resource,
|
|
25
|
+
tracking_status: 'delivered',
|
|
26
|
+
delivered_at: mark_delivered_params[:delivered_at],
|
|
27
|
+
notify_customer: notify_customer?(mark_delivered_params[:notify_customer])
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
if result.success?
|
|
31
|
+
render json: serialize_resource(result.value)
|
|
32
|
+
else
|
|
33
|
+
render_result_error(result)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
protected
|
|
39
|
+
|
|
40
|
+
def serializer_class
|
|
41
|
+
Spree.api.admin_delivery_serializer
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# The consignments hang off the fulfillment, not the order, so
|
|
45
|
+
# the parent is narrowed one step past the base's.
|
|
46
|
+
def set_parent
|
|
47
|
+
super
|
|
48
|
+
@parent = @order.fulfillments.find_by_prefix_id!(params[:fulfillment_id])
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
private
|
|
52
|
+
|
|
53
|
+
def mark_delivered_params
|
|
54
|
+
@mark_delivered_params ||= params.permit(:delivered_at, :notify_customer)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Only an explicit false suppresses the email.
|
|
58
|
+
def notify_customer?(value)
|
|
59
|
+
!ActiveModel::Type::Boolean.new.cast(value).equal?(false)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
module Orders
|
|
6
|
+
# Applies/removes a discount code on a draft order — the admin
|
|
7
|
+
# counterpart of the storefront cart endpoint, with the same pending
|
|
8
|
+
# semantics: a real-but-not-yet-eligible code is kept and activates
|
|
9
|
+
# on the first recalculation where the order qualifies. Completed
|
|
10
|
+
# orders are frozen; their discounts change only through manual rows
|
|
11
|
+
# (see DiscountsController).
|
|
12
|
+
class DiscountCodesController < BaseController
|
|
13
|
+
skip_before_action :set_resource, raise: false
|
|
14
|
+
|
|
15
|
+
# POST /api/v3/admin/orders/:order_id/discount_codes
|
|
16
|
+
def create
|
|
17
|
+
with_order_lock do
|
|
18
|
+
return render_completed_order_error if @parent.completed?
|
|
19
|
+
|
|
20
|
+
@parent.coupon_code = permitted_params[:code]
|
|
21
|
+
|
|
22
|
+
coupon_handler.apply
|
|
23
|
+
|
|
24
|
+
if coupon_handler.successful? || pending_eligibility?
|
|
25
|
+
@parent.save!(validate: false) if @parent.changed?
|
|
26
|
+
render json: serialize_resource(@parent.reload), status: :created
|
|
27
|
+
else
|
|
28
|
+
@parent.update_column(:coupon_code, nil) if @parent.read_attribute(:coupon_code).present?
|
|
29
|
+
render_errors(coupon_handler.error)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# DELETE /api/v3/admin/orders/:order_id/discount_codes/:id
|
|
35
|
+
# :id is the discount code string.
|
|
36
|
+
def destroy
|
|
37
|
+
with_order_lock do
|
|
38
|
+
return render_completed_order_error if @parent.completed?
|
|
39
|
+
|
|
40
|
+
coupon_handler.remove(params[:id])
|
|
41
|
+
|
|
42
|
+
if coupon_handler.successful?
|
|
43
|
+
render json: serialize_resource(@parent.reload)
|
|
44
|
+
else
|
|
45
|
+
render_errors(coupon_handler.error)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
protected
|
|
51
|
+
|
|
52
|
+
def model_class
|
|
53
|
+
Spree::Order
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def serializer_class
|
|
57
|
+
Spree.api.admin_order_serializer
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
private
|
|
61
|
+
|
|
62
|
+
def coupon_handler
|
|
63
|
+
@coupon_handler ||= Spree.coupon_handler.new(@parent, enable_gift_cards: false)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def pending_eligibility?
|
|
67
|
+
coupon_handler.status_code == :coupon_code_not_eligible
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def render_completed_order_error
|
|
71
|
+
render_error(
|
|
72
|
+
code: ERROR_CODES[:discount_not_editable],
|
|
73
|
+
message: Spree.t('errors.messages.coupon_code_frozen_after_completion'),
|
|
74
|
+
status: :unprocessable_content
|
|
75
|
+
)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def permitted_params
|
|
79
|
+
params.permit(:code)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|