spree_api 5.6.1 → 6.0.0.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE +28 -0
- data/Rakefile +1 -1
- data/app/controllers/concerns/spree/api/v3/address_params.rb +17 -0
- data/app/controllers/concerns/spree/api/v3/admin/product_listing.rb +46 -0
- data/app/controllers/concerns/spree/api/v3/admin/product_membership.rb +110 -0
- data/app/controllers/concerns/spree/api/v3/admin/receivable_actions.rb +68 -0
- data/app/controllers/concerns/spree/api/v3/admin/reporting_authorization.rb +27 -0
- data/app/controllers/concerns/spree/api/v3/admin/role_grant_guard.rb +69 -33
- data/app/controllers/concerns/spree/api/v3/admin/stock_receipt_actions.rb +86 -0
- data/app/controllers/concerns/spree/api/v3/admin/store_context.rb +97 -0
- data/app/controllers/concerns/spree/api/v3/admin/subclassed_resource.rb +12 -6
- data/app/controllers/concerns/spree/api/v3/admin/validation_details.rb +91 -0
- data/app/controllers/concerns/spree/api/v3/admin_authentication.rb +9 -5
- data/app/controllers/concerns/spree/api/v3/api_key_authentication.rb +41 -5
- data/app/controllers/concerns/spree/api/v3/authentication_strategies.rb +48 -0
- data/app/controllers/concerns/spree/api/v3/bulk_operations.rb +4 -6
- data/app/controllers/concerns/spree/api/v3/cart_resolvable.rb +52 -16
- data/app/controllers/concerns/spree/api/v3/company_address_writes.rb +37 -0
- data/app/controllers/concerns/spree/api/v3/current_password_confirmation.rb +41 -0
- data/app/controllers/concerns/spree/api/v3/direct_uploads.rb +35 -0
- data/app/controllers/concerns/spree/api/v3/error_handler.rb +53 -11
- data/app/controllers/concerns/spree/api/v3/idempotent.rb +10 -4
- data/app/controllers/concerns/spree/api/v3/items_payload.rb +54 -0
- data/app/controllers/concerns/spree/api/v3/jwt_authentication.rb +23 -3
- data/app/controllers/concerns/spree/api/v3/key_store_context.rb +31 -0
- data/app/controllers/concerns/spree/api/v3/locale_and_currency.rb +3 -3
- data/app/controllers/concerns/spree/api/v3/order_lock.rb +22 -3
- data/app/controllers/concerns/spree/api/v3/orders/claim_actions.rb +112 -0
- data/app/controllers/concerns/spree/api/v3/orders/delivery_actions.rb +105 -0
- data/app/controllers/concerns/spree/api/v3/orders/exchange_actions.rb +117 -0
- data/app/controllers/concerns/spree/api/v3/orders/fulfillment_actions.rb +157 -0
- data/app/controllers/concerns/spree/api/v3/orders/post_sale_actions.rb +76 -0
- data/app/controllers/concerns/spree/api/v3/orders/return_actions.rb +116 -0
- data/app/controllers/concerns/spree/api/v3/orders/shipping_label_actions.rb +128 -0
- data/app/controllers/concerns/spree/api/v3/params_normalizer.rb +7 -4
- data/app/controllers/concerns/spree/api/v3/permission_serialization.rb +42 -0
- data/app/controllers/concerns/spree/api/v3/rate_limit_headers.rb +40 -6
- data/app/controllers/concerns/spree/api/v3/scoped_authorization.rb +80 -26
- data/app/controllers/concerns/spree/api/v3/seller/auth_cookies.rb +62 -0
- data/app/controllers/concerns/spree/api/v3/seller/seller_context.rb +127 -0
- data/app/controllers/concerns/spree/api/v3/seller_authentication.rb +40 -0
- data/app/controllers/concerns/spree/api/v3/storefront_access.rb +38 -0
- data/app/controllers/concerns/spree/api/v3/streams_shipping_label.rb +37 -0
- data/app/controllers/concerns/spree/api/v3/tax_identifier_validation.rb +41 -0
- data/app/controllers/spree/api/v3/admin/admin_users_controller.rb +11 -14
- data/app/controllers/spree/api/v3/admin/allowed_origins_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/api_keys_controller.rb +16 -7
- data/app/controllers/spree/api/v3/admin/auth_controller.rb +138 -22
- data/app/controllers/spree/api/v3/admin/base_controller.rb +2 -0
- data/app/controllers/spree/api/v3/admin/catalog_assignments_controller.rb +27 -0
- data/app/controllers/spree/api/v3/admin/catalogs/base_controller.rb +29 -0
- data/app/controllers/spree/api/v3/admin/catalogs/order_minimums_controller.rb +40 -0
- data/app/controllers/spree/api/v3/admin/catalogs/products_controller.rb +107 -0
- data/app/controllers/spree/api/v3/admin/catalogs/quantity_rules_controller.rb +75 -0
- data/app/controllers/spree/api/v3/admin/catalogs_controller.rb +191 -0
- data/app/controllers/spree/api/v3/admin/categories/products_controller.rb +28 -41
- data/app/controllers/spree/api/v3/admin/categories_controller.rb +16 -7
- data/app/controllers/spree/api/v3/admin/channels_controller.rb +50 -2
- data/app/controllers/spree/api/v3/admin/claim_reasons_controller.rb +25 -0
- data/app/controllers/spree/api/v3/admin/claims_controller.rb +31 -0
- data/app/controllers/spree/api/v3/admin/collection_rules_controller.rb +40 -0
- data/app/controllers/spree/api/v3/admin/collections/products_controller.rb +101 -0
- data/app/controllers/spree/api/v3/admin/collections_controller.rb +56 -0
- data/app/controllers/spree/api/v3/admin/commission_lines_controller.rb +39 -0
- data/app/controllers/spree/api/v3/admin/commission_rates_controller.rb +174 -0
- data/app/controllers/spree/api/v3/admin/companies/addresses_controller.rb +65 -0
- data/app/controllers/spree/api/v3/admin/companies/base_controller.rb +29 -0
- data/app/controllers/spree/api/v3/admin/companies/invitations_controller.rb +56 -0
- data/app/controllers/spree/api/v3/admin/companies/memberships_controller.rb +66 -0
- data/app/controllers/spree/api/v3/admin/companies/tax_exemption_certificates_controller.rb +137 -0
- data/app/controllers/spree/api/v3/admin/companies/tax_identifiers_controller.rb +46 -0
- data/app/controllers/spree/api/v3/admin/companies_controller.rb +59 -0
- data/app/controllers/spree/api/v3/admin/concerns/external_references.rb +166 -0
- data/app/controllers/spree/api/v3/admin/consent_records_controller.rb +31 -0
- data/app/controllers/spree/api/v3/admin/countries_controller.rb +12 -4
- data/app/controllers/spree/api/v3/admin/custom_field_definitions_controller.rb +19 -4
- data/app/controllers/spree/api/v3/admin/custom_fields_controller.rb +5 -5
- data/app/controllers/spree/api/v3/admin/customer_groups_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/customers/addresses_controller.rb +4 -4
- data/app/controllers/spree/api/v3/admin/customers/base_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/customers/store_credits_controller.rb +2 -3
- data/app/controllers/spree/api/v3/admin/customers/tax_identifiers_controller.rb +43 -0
- data/app/controllers/spree/api/v3/admin/customers_controller.rb +190 -11
- data/app/controllers/spree/api/v3/admin/dashboard_controller.rb +24 -20
- data/app/controllers/spree/api/v3/admin/data_requests_controller.rb +60 -0
- data/app/controllers/spree/api/v3/admin/delivery_method_rules_controller.rb +54 -0
- data/app/controllers/spree/api/v3/admin/delivery_methods/rules_controller.rb +114 -0
- data/app/controllers/spree/api/v3/admin/delivery_methods_controller.rb +243 -0
- data/app/controllers/spree/api/v3/admin/delivery_profiles/origin_groups_controller.rb +80 -0
- data/app/controllers/spree/api/v3/admin/delivery_profiles_controller.rb +107 -0
- data/app/controllers/spree/api/v3/admin/delivery_zones_controller.rb +116 -0
- data/app/controllers/spree/api/v3/admin/digital_links_controller.rb +48 -0
- data/app/controllers/spree/api/v3/admin/direct_uploads_controller.rb +17 -3
- data/app/controllers/spree/api/v3/admin/exchanges_controller.rb +31 -0
- data/app/controllers/spree/api/v3/admin/exports_controller.rb +2 -2
- data/app/controllers/spree/api/v3/admin/gift_card_batches_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/gift_cards_controller.rb +3 -2
- data/app/controllers/spree/api/v3/admin/imports_controller.rb +71 -8
- data/app/controllers/spree/api/v3/admin/integrations_controller.rb +67 -0
- data/app/controllers/spree/api/v3/admin/invitation_acceptances_controller.rb +5 -5
- data/app/controllers/spree/api/v3/admin/invitations_controller.rb +5 -1
- data/app/controllers/spree/api/v3/admin/locales_controller.rb +3 -1
- data/app/controllers/spree/api/v3/admin/markets_controller.rb +9 -5
- data/app/controllers/spree/api/v3/admin/me_controller.rb +4 -30
- data/app/controllers/spree/api/v3/admin/media_controller.rb +88 -38
- data/app/controllers/spree/api/v3/admin/media_library_controller.rb +156 -0
- data/app/controllers/spree/api/v3/admin/option_types_controller.rb +1 -0
- data/app/controllers/spree/api/v3/admin/order_cancellation_reasons_controller.rb +25 -0
- data/app/controllers/spree/api/v3/admin/order_groups_controller.rb +43 -0
- data/app/controllers/spree/api/v3/admin/order_routing_rules_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/orders/claims_controller.rb +56 -0
- data/app/controllers/spree/api/v3/admin/orders/deliveries_controller.rb +66 -0
- data/app/controllers/spree/api/v3/admin/orders/discount_codes_controller.rb +86 -0
- data/app/controllers/spree/api/v3/admin/orders/discounts_controller.rb +99 -0
- data/app/controllers/spree/api/v3/admin/orders/exchanges_controller.rb +62 -0
- data/app/controllers/spree/api/v3/admin/orders/fees_controller.rb +83 -0
- data/app/controllers/spree/api/v3/admin/orders/fulfillments_controller.rb +45 -67
- data/app/controllers/spree/api/v3/admin/orders/items_controller.rb +40 -22
- data/app/controllers/spree/api/v3/admin/orders/labels_controller.rb +75 -0
- data/app/controllers/spree/api/v3/admin/orders/payments_controller.rb +36 -18
- data/app/controllers/spree/api/v3/admin/orders/refunds_controller.rb +39 -18
- data/app/controllers/spree/api/v3/admin/orders/returns_controller.rb +70 -0
- data/app/controllers/spree/api/v3/admin/orders/store_credits_controller.rb +2 -2
- data/app/controllers/spree/api/v3/admin/orders/tax_identifiers_controller.rb +41 -0
- data/app/controllers/spree/api/v3/admin/orders/tax_lines_controller.rb +32 -0
- data/app/controllers/spree/api/v3/admin/orders_controller.rb +157 -32
- data/app/controllers/spree/api/v3/admin/package_types_controller.rb +39 -0
- data/app/controllers/spree/api/v3/admin/password_resets_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/payment_methods_controller.rb +15 -4
- data/app/controllers/spree/api/v3/admin/payout_providers_controller.rb +27 -0
- data/app/controllers/spree/api/v3/admin/permissions_controller.rb +30 -0
- data/app/controllers/spree/api/v3/admin/policies_controller.rb +42 -0
- data/app/controllers/spree/api/v3/admin/price_lists/products_controller.rb +93 -0
- data/app/controllers/spree/api/v3/admin/price_lists_controller.rb +43 -29
- data/app/controllers/spree/api/v3/admin/prices_controller.rb +41 -4
- data/app/controllers/spree/api/v3/admin/product_types_controller.rb +93 -0
- data/app/controllers/spree/api/v3/admin/products/digital_assets_controller.rb +148 -0
- data/app/controllers/spree/api/v3/admin/products/variants_controller.rb +24 -3
- data/app/controllers/spree/api/v3/admin/products_controller.rb +149 -33
- data/app/controllers/spree/api/v3/admin/promotion_actions_controller.rb +6 -2
- data/app/controllers/spree/api/v3/admin/promotion_rules_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/promotions_controller.rb +1 -5
- data/app/controllers/spree/api/v3/admin/purchase_orders/stock_receipts_controller.rb +32 -0
- data/app/controllers/spree/api/v3/admin/purchase_orders_controller.rb +161 -0
- data/app/controllers/spree/api/v3/admin/refund_reasons_controller.rb +25 -0
- data/app/controllers/spree/api/v3/admin/reporting/saved_reports_controller.rb +45 -0
- data/app/controllers/spree/api/v3/admin/reporting_controller.rb +95 -0
- data/app/controllers/spree/api/v3/admin/resource_controller.rb +27 -10
- data/app/controllers/spree/api/v3/admin/return_reasons_controller.rb +25 -0
- data/app/controllers/spree/api/v3/admin/returns_controller.rb +31 -0
- data/app/controllers/spree/api/v3/admin/roles_controller.rb +50 -6
- data/app/controllers/spree/api/v3/admin/seller_payouts_controller.rb +83 -0
- data/app/controllers/spree/api/v3/admin/seller_requirement_submissions_controller.rb +139 -0
- data/app/controllers/spree/api/v3/admin/seller_requirements_controller.rb +115 -0
- data/app/controllers/spree/api/v3/admin/seller_transfers_controller.rb +36 -0
- data/app/controllers/spree/api/v3/admin/sellers/balances_controller.rb +44 -0
- data/app/controllers/spree/api/v3/admin/sellers/invitations_controller.rb +77 -0
- data/app/controllers/spree/api/v3/admin/sellers/payouts_controller.rb +107 -0
- data/app/controllers/spree/api/v3/admin/sellers/team_controller.rb +64 -0
- data/app/controllers/spree/api/v3/admin/sellers_controller.rb +197 -0
- data/app/controllers/spree/api/v3/admin/setup_controller.rb +231 -0
- data/app/controllers/spree/api/v3/admin/stock_levels_controller.rb +172 -0
- data/app/controllers/spree/api/v3/admin/stock_locations_controller.rb +3 -2
- data/app/controllers/spree/api/v3/admin/stock_movements_controller.rb +37 -0
- data/app/controllers/spree/api/v3/admin/stock_reservations_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/stock_transfers/stock_receipts_controller.rb +31 -0
- data/app/controllers/spree/api/v3/admin/stock_transfers_controller.rb +134 -38
- data/app/controllers/spree/api/v3/admin/store_controller.rb +65 -0
- data/app/controllers/spree/api/v3/admin/store_credits/events_controller.rb +47 -0
- data/app/controllers/spree/api/v3/admin/store_credits_controller.rb +87 -0
- data/app/controllers/spree/api/v3/admin/suppliers_controller.rb +30 -0
- data/app/controllers/spree/api/v3/admin/tags_controller.rb +2 -2
- data/app/controllers/spree/api/v3/admin/tax_categories_controller.rb +4 -0
- data/app/controllers/spree/api/v3/admin/tax_providers_controller.rb +25 -0
- data/app/controllers/spree/api/v3/admin/tax_rates_controller.rb +33 -0
- data/app/controllers/spree/api/v3/admin/tracking_carriers_controller.rb +33 -0
- data/app/controllers/spree/api/v3/admin/translatable_resources_controller.rb +37 -9
- data/app/controllers/spree/api/v3/admin/translations_controller.rb +10 -5
- data/app/controllers/spree/api/v3/admin/translations_coverage_controller.rb +150 -0
- data/app/controllers/spree/api/v3/admin/variants_controller.rb +11 -4
- data/app/controllers/spree/api/v3/admin/webhook_endpoints_controller.rb +1 -1
- data/app/controllers/spree/api/v3/base_controller.rb +59 -16
- data/app/controllers/spree/api/v3/resource_controller.rb +154 -38
- data/app/controllers/spree/api/v3/seller/auth_controller.rb +169 -0
- data/app/controllers/spree/api/v3/seller/balances_controller.rb +35 -0
- data/app/controllers/spree/api/v3/seller/base_controller.rb +25 -0
- data/app/controllers/spree/api/v3/seller/claim_reasons_controller.rb +20 -0
- data/app/controllers/spree/api/v3/seller/countries_controller.rb +38 -0
- data/app/controllers/spree/api/v3/seller/delivery_methods_controller.rb +265 -0
- data/app/controllers/spree/api/v3/seller/delivery_profiles_controller.rb +65 -0
- data/app/controllers/spree/api/v3/seller/delivery_zones_controller.rb +41 -0
- data/app/controllers/spree/api/v3/seller/direct_uploads_controller.rb +21 -0
- data/app/controllers/spree/api/v3/seller/exports_controller.rb +195 -0
- data/app/controllers/spree/api/v3/seller/import_rows_controller.rb +49 -0
- data/app/controllers/spree/api/v3/seller/imports_controller.rb +317 -0
- data/app/controllers/spree/api/v3/seller/invitation_acceptances_controller.rb +152 -0
- data/app/controllers/spree/api/v3/seller/invitations_controller.rb +71 -0
- data/app/controllers/spree/api/v3/seller/me_controller.rb +72 -0
- data/app/controllers/spree/api/v3/seller/onboarding_controller.rb +111 -0
- data/app/controllers/spree/api/v3/seller/order_cancellation_reasons_controller.rb +25 -0
- data/app/controllers/spree/api/v3/seller/orders/base_controller.rb +44 -0
- data/app/controllers/spree/api/v3/seller/orders/claims_controller.rb +45 -0
- data/app/controllers/spree/api/v3/seller/orders/deliveries_controller.rb +38 -0
- data/app/controllers/spree/api/v3/seller/orders/exchanges_controller.rb +50 -0
- data/app/controllers/spree/api/v3/seller/orders/fulfillments_controller.rb +79 -0
- data/app/controllers/spree/api/v3/seller/orders/labels_controller.rb +55 -0
- data/app/controllers/spree/api/v3/seller/orders/notes_controller.rb +82 -0
- data/app/controllers/spree/api/v3/seller/orders/returns_controller.rb +44 -0
- data/app/controllers/spree/api/v3/seller/orders_controller.rb +199 -0
- data/app/controllers/spree/api/v3/seller/package_types_controller.rb +100 -0
- data/app/controllers/spree/api/v3/seller/password_resets_controller.rb +155 -0
- data/app/controllers/spree/api/v3/seller/payouts_controller.rb +47 -0
- data/app/controllers/spree/api/v3/seller/policies_controller.rb +57 -0
- data/app/controllers/spree/api/v3/seller/product_types_controller.rb +35 -0
- data/app/controllers/spree/api/v3/seller/products_controller.rb +394 -0
- data/app/controllers/spree/api/v3/seller/profile_controller.rb +137 -0
- data/app/controllers/spree/api/v3/seller/reasons_controller.rb +45 -0
- data/app/controllers/spree/api/v3/seller/requirement_submissions_controller.rb +95 -0
- data/app/controllers/spree/api/v3/seller/resource_controller.rb +75 -0
- data/app/controllers/spree/api/v3/seller/return_reasons_controller.rb +20 -0
- data/app/controllers/spree/api/v3/seller/stock_locations_controller.rb +56 -0
- data/app/controllers/spree/api/v3/seller/tax_identifiers_controller.rb +48 -0
- data/app/controllers/spree/api/v3/seller/team_controller.rb +103 -0
- data/app/controllers/spree/api/v3/seller/tracking_carriers_controller.rb +35 -0
- data/app/controllers/spree/api/v3/seller/transfers_controller.rb +43 -0
- data/app/controllers/spree/api/v3/store/account/companies_controller.rb +42 -0
- data/app/controllers/spree/api/v3/store/auth_controller.rb +21 -34
- data/app/controllers/spree/api/v3/store/base_controller.rb +4 -0
- data/app/controllers/spree/api/v3/store/carts/discount_codes_controller.rb +24 -2
- data/app/controllers/spree/api/v3/store/carts/fulfillments_controller.rb +41 -15
- data/app/controllers/spree/api/v3/store/carts/items_controller.rb +53 -20
- data/app/controllers/spree/api/v3/store/carts/payment_sessions_controller.rb +36 -20
- data/app/controllers/spree/api/v3/store/carts/po_documents_controller.rb +111 -0
- data/app/controllers/spree/api/v3/store/carts/store_credits_controller.rb +2 -2
- data/app/controllers/spree/api/v3/store/carts/tax_identifiers_controller.rb +96 -0
- data/app/controllers/spree/api/v3/store/carts_controller.rb +57 -12
- data/app/controllers/spree/api/v3/store/categories_controller.rb +6 -3
- data/app/controllers/spree/api/v3/store/collections/products_controller.rb +59 -0
- data/app/controllers/spree/api/v3/store/collections_controller.rb +36 -0
- data/app/controllers/spree/api/v3/store/companies/addresses_controller.rb +81 -0
- data/app/controllers/spree/api/v3/store/companies/base_controller.rb +24 -0
- data/app/controllers/spree/api/v3/store/companies/invitations_controller.rb +50 -0
- data/app/controllers/spree/api/v3/store/companies/members_controller.rb +66 -0
- data/app/controllers/spree/api/v3/store/companies/orders_controller.rb +28 -0
- data/app/controllers/spree/api/v3/store/companies_controller.rb +47 -0
- data/app/controllers/spree/api/v3/store/company_invitations_controller.rb +90 -0
- data/app/controllers/spree/api/v3/store/countries_controller.rb +8 -6
- data/app/controllers/spree/api/v3/store/customer/addresses_controller.rb +3 -1
- data/app/controllers/spree/api/v3/store/customer/data_requests_controller.rb +78 -0
- data/app/controllers/spree/api/v3/store/customer/digital_links_controller.rb +52 -0
- data/app/controllers/spree/api/v3/store/customer/orders_controller.rb +6 -0
- data/app/controllers/spree/api/v3/store/customer/password_resets_controller.rb +7 -3
- data/app/controllers/spree/api/v3/store/customer/payment_setup_sessions_controller.rb +3 -3
- data/app/controllers/spree/api/v3/store/customer/store_credits_controller.rb +0 -3
- data/app/controllers/spree/api/v3/store/customer/tax_identifiers_controller.rb +91 -0
- data/app/controllers/spree/api/v3/store/customers_controller.rb +26 -31
- data/app/controllers/spree/api/v3/store/data_feeds_controller.rb +11 -0
- data/app/controllers/spree/api/v3/store/data_request_downloads_controller.rb +58 -0
- data/app/controllers/spree/api/v3/store/delivery_methods_controller.rb +108 -0
- data/app/controllers/spree/api/v3/store/digital_links_controller.rb +105 -0
- data/app/controllers/spree/api/v3/store/markets/countries_controller.rb +5 -9
- data/app/controllers/spree/api/v3/store/markets_controller.rb +4 -4
- data/app/controllers/spree/api/v3/store/newsletter_subscribers_controller.rb +8 -9
- data/app/controllers/spree/api/v3/store/orders/claims_controller.rb +94 -0
- data/app/controllers/spree/api/v3/store/orders/returns_controller.rb +116 -0
- data/app/controllers/spree/api/v3/store/orders/tax_identifiers_controller.rb +46 -0
- data/app/controllers/spree/api/v3/store/orders_controller.rb +12 -15
- data/app/controllers/spree/api/v3/store/products/filters_controller.rb +10 -3
- data/app/controllers/spree/api/v3/store/products_controller.rb +25 -6
- data/app/controllers/spree/api/v3/store/resource_controller.rb +2 -0
- data/app/controllers/spree/api/v3/store/sellers_controller.rb +43 -0
- data/app/controllers/spree/api/v3/store/wishlist_items_controller.rb +9 -6
- data/app/controllers/spree/api/v3/store/wishlists_controller.rb +3 -3
- data/app/controllers/spree/api/v3/webhooks/fulfillments_controller.rb +88 -0
- data/app/controllers/spree/api/v3/webhooks/payments_controller.rb +5 -2
- data/app/controllers/spree/api/v3/webhooks/payouts_controller.rb +61 -0
- data/app/models/spree/api/data_request_urls.rb +25 -0
- data/app/models/spree/api/digital_link_urls.rb +26 -0
- data/app/serializers/spree/api/v3/address_serializer.rb +17 -5
- data/app/serializers/spree/api/v3/admin/address_serializer.rb +27 -4
- data/app/serializers/spree/api/v3/admin/admin_user_serializer.rb +13 -10
- data/app/serializers/spree/api/v3/admin/api_key_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/admin/applied_promotion_serializer.rb +15 -0
- data/app/serializers/spree/api/v3/admin/cart_serializer.rb +34 -0
- data/app/serializers/spree/api/v3/admin/catalog_assignment_serializer.rb +32 -0
- data/app/serializers/spree/api/v3/admin/catalog_order_minimum_serializer.rb +23 -0
- data/app/serializers/spree/api/v3/admin/catalog_price_serializer.rb +48 -0
- data/app/serializers/spree/api/v3/admin/catalog_price_tier_serializer.rb +23 -0
- data/app/serializers/spree/api/v3/admin/catalog_product_serializer.rb +57 -0
- data/app/serializers/spree/api/v3/admin/catalog_product_term_serializer.rb +38 -0
- data/app/serializers/spree/api/v3/admin/catalog_quantity_rule_serializer.rb +37 -0
- data/app/serializers/spree/api/v3/admin/catalog_serializer.rb +46 -0
- data/app/serializers/spree/api/v3/admin/category_serializer.rb +3 -2
- data/app/serializers/spree/api/v3/admin/channel_serializer.rb +15 -1
- data/app/serializers/spree/api/v3/admin/claim_line_item_serializer.rb +16 -0
- data/app/serializers/spree/api/v3/admin/claim_reason_serializer.rb +21 -0
- data/app/serializers/spree/api/v3/admin/claim_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/admin/collection_rule_serializer.rb +22 -0
- data/app/serializers/spree/api/v3/admin/collection_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/admin/commission_line_serializer.rb +67 -0
- data/app/serializers/spree/api/v3/admin/commission_rate_serializer.rb +69 -0
- data/app/serializers/spree/api/v3/admin/commission_rule_serializer.rb +61 -0
- data/app/serializers/spree/api/v3/admin/company_invitation_serializer.rb +15 -0
- data/app/serializers/spree/api/v3/admin/company_membership_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/admin/company_serializer.rb +37 -0
- data/app/serializers/spree/api/v3/admin/concerns/external_references_attribute.rb +33 -0
- data/app/serializers/spree/api/v3/admin/consent_record_serializer.rb +28 -0
- data/app/serializers/spree/api/v3/admin/country_serializer.rb +2 -2
- data/app/serializers/spree/api/v3/admin/credit_card_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/admin/custom_field_definition_serializer.rb +2 -2
- data/app/serializers/spree/api/v3/admin/custom_field_serializer.rb +2 -2
- data/app/serializers/spree/api/v3/admin/customer_serializer.rb +23 -22
- data/app/serializers/spree/api/v3/admin/dashboard_counter_serializer.rb +24 -0
- data/app/serializers/spree/api/v3/admin/data_request_serializer.rb +36 -0
- data/app/serializers/spree/api/v3/admin/delivery_method_rule_serializer.rb +32 -0
- data/app/serializers/spree/api/v3/admin/delivery_method_serializer.rb +66 -1
- data/app/serializers/spree/api/v3/admin/delivery_method_service_serializer.rb +15 -0
- data/app/serializers/spree/api/v3/admin/delivery_origin_group_serializer.rb +34 -0
- data/app/serializers/spree/api/v3/admin/delivery_profile_serializer.rb +65 -0
- data/app/serializers/spree/api/v3/admin/delivery_rate_serializer.rb +10 -1
- data/app/serializers/spree/api/v3/admin/delivery_serializer.rb +20 -0
- data/app/serializers/spree/api/v3/admin/delivery_zone_member_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/admin/delivery_zone_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/admin/digital_asset_serializer.rb +59 -0
- data/app/serializers/spree/api/v3/admin/discount_serializer.rb +3 -4
- data/app/serializers/spree/api/v3/admin/exchange_line_item_serializer.rb +16 -0
- data/app/serializers/spree/api/v3/admin/exchange_serializer.rb +35 -0
- data/app/serializers/spree/api/v3/admin/export_serializer.rb +20 -1
- data/app/serializers/spree/api/v3/admin/fee_serializer.rb +14 -0
- data/app/serializers/spree/api/v3/admin/freight_summary_line_serializer.rb +46 -0
- data/app/serializers/spree/api/v3/admin/freight_summary_serializer.rb +16 -0
- data/app/serializers/spree/api/v3/admin/fulfillment_item_serializer.rb +39 -0
- data/app/serializers/spree/api/v3/admin/fulfillment_serializer.rb +31 -9
- data/app/serializers/spree/api/v3/admin/gift_card_serializer.rb +2 -3
- data/app/serializers/spree/api/v3/admin/import_serializer.rb +15 -2
- data/app/serializers/spree/api/v3/admin/integration_serializer.rb +32 -0
- data/app/serializers/spree/api/v3/admin/invitation_serializer.rb +4 -4
- data/app/serializers/spree/api/v3/admin/line_item_serializer.rb +19 -5
- data/app/serializers/spree/api/v3/admin/market_serializer.rb +5 -1
- data/app/serializers/spree/api/v3/admin/media_serializer.rb +50 -2
- data/app/serializers/spree/api/v3/admin/membership_product_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/admin/order_cancellation_reason_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/admin/order_group_serializer.rb +50 -0
- data/app/serializers/spree/api/v3/admin/order_routing_rule_serializer.rb +2 -6
- data/app/serializers/spree/api/v3/admin/order_serializer.rb +131 -19
- data/app/serializers/spree/api/v3/admin/package_type_serializer.rb +53 -0
- data/app/serializers/spree/api/v3/admin/payment_method_serializer.rb +8 -2
- data/app/serializers/spree/api/v3/admin/payment_serializer.rb +6 -0
- data/app/serializers/spree/api/v3/admin/payment_split_serializer.rb +41 -0
- data/app/serializers/spree/api/v3/admin/permission_serializer.rb +39 -0
- data/app/serializers/spree/api/v3/admin/policy_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/admin/price_adjustment_tier_serializer.rb +22 -0
- data/app/serializers/spree/api/v3/admin/price_list_product_serializer.rb +32 -0
- data/app/serializers/spree/api/v3/admin/price_list_serializer.rb +20 -8
- data/app/serializers/spree/api/v3/admin/price_rule_serializer.rb +2 -12
- data/app/serializers/spree/api/v3/admin/price_serializer.rb +3 -0
- data/app/serializers/spree/api/v3/admin/product_serializer.rb +54 -8
- data/app/serializers/spree/api/v3/admin/product_submission_serializer.rb +39 -0
- data/app/serializers/spree/api/v3/admin/product_type_custom_field_definition_serializer.rb +44 -0
- data/app/serializers/spree/api/v3/admin/product_type_serializer.rb +34 -0
- data/app/serializers/spree/api/v3/admin/promotion_action_serializer.rb +6 -12
- data/app/serializers/spree/api/v3/admin/promotion_rule_serializer.rb +17 -15
- data/app/serializers/spree/api/v3/admin/purchase_order_item_serializer.rb +80 -0
- data/app/serializers/spree/api/v3/admin/purchase_order_serializer.rb +94 -0
- data/app/serializers/spree/api/v3/admin/refund_reason_serializer.rb +27 -0
- data/app/serializers/spree/api/v3/admin/refund_serializer.rb +0 -5
- data/app/serializers/spree/api/v3/admin/reporting_result_serializer.rb +72 -0
- data/app/serializers/spree/api/v3/admin/return_line_item_serializer.rb +16 -0
- data/app/serializers/spree/api/v3/admin/return_reason_serializer.rb +21 -0
- data/app/serializers/spree/api/v3/admin/return_serializer.rb +59 -0
- data/app/serializers/spree/api/v3/admin/role_serializer.rb +24 -6
- data/app/serializers/spree/api/v3/admin/saved_report_serializer.rb +33 -0
- data/app/serializers/spree/api/v3/admin/seller_balance_serializer.rb +37 -0
- data/app/serializers/spree/api/v3/admin/seller_payout_serializer.rb +46 -0
- data/app/serializers/spree/api/v3/admin/seller_requirement_serializer.rb +68 -0
- data/app/serializers/spree/api/v3/admin/seller_requirement_status_serializer.rb +48 -0
- data/app/serializers/spree/api/v3/admin/seller_requirement_submission_serializer.rb +57 -0
- data/app/serializers/spree/api/v3/admin/seller_serializer.rb +92 -0
- data/app/serializers/spree/api/v3/admin/seller_team_member_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/admin/seller_transfer_serializer.rb +53 -0
- data/app/serializers/spree/api/v3/admin/shipping_label_serializer.rb +82 -0
- data/app/serializers/spree/api/v3/admin/state_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/admin/stock_level_serializer.rb +65 -0
- data/app/serializers/spree/api/v3/admin/stock_location_serializer.rb +20 -4
- data/app/serializers/spree/api/v3/admin/stock_movement_serializer.rb +116 -0
- data/app/serializers/spree/api/v3/admin/stock_receipt_item_serializer.rb +57 -0
- data/app/serializers/spree/api/v3/admin/stock_receipt_serializer.rb +49 -0
- data/app/serializers/spree/api/v3/admin/stock_reservation_serializer.rb +5 -5
- data/app/serializers/spree/api/v3/admin/stock_transfer_item_serializer.rb +57 -0
- data/app/serializers/spree/api/v3/admin/stock_transfer_serializer.rb +36 -16
- data/app/serializers/spree/api/v3/admin/store_credit_event_serializer.rb +32 -0
- data/app/serializers/spree/api/v3/admin/store_credit_serializer.rb +42 -7
- data/app/serializers/spree/api/v3/admin/store_serializer.rb +63 -1
- data/app/serializers/spree/api/v3/admin/supplier_serializer.rb +39 -0
- data/app/serializers/spree/api/v3/admin/tax_exemption_certificate_serializer.rb +67 -0
- data/app/serializers/spree/api/v3/admin/tax_identifier_serializer.rb +43 -0
- data/app/serializers/spree/api/v3/admin/tax_line_serializer.rb +21 -0
- data/app/serializers/spree/api/v3/admin/tax_rate_serializer.rb +49 -0
- data/app/serializers/spree/api/v3/admin/variant_serializer.rb +49 -8
- data/app/serializers/spree/api/v3/applied_promotion_serializer.rb +23 -0
- data/app/serializers/spree/api/v3/base_serializer.rb +39 -2
- data/app/serializers/spree/api/v3/cart_serializer.rb +90 -12
- data/app/serializers/spree/api/v3/category_serializer.rb +3 -3
- data/app/serializers/spree/api/v3/claim_line_item_serializer.rb +50 -0
- data/app/serializers/spree/api/v3/claim_reason_serializer.rb +20 -0
- data/app/serializers/spree/api/v3/claim_serializer.rb +62 -0
- data/app/serializers/spree/api/v3/collection_serializer.rb +41 -0
- data/app/serializers/spree/api/v3/company_invitation_serializer.rb +28 -0
- data/app/serializers/spree/api/v3/company_membership_serializer.rb +28 -0
- data/app/serializers/spree/api/v3/company_serializer.rb +33 -0
- data/app/serializers/spree/api/v3/custom_field_serializer.rb +2 -2
- data/app/serializers/spree/api/v3/customer_serializer.rb +9 -1
- data/app/serializers/spree/api/v3/data_request_event_serializer.rb +30 -0
- data/app/serializers/spree/api/v3/data_request_serializer.rb +40 -0
- data/app/serializers/spree/api/v3/delivery_method_serializer.rb +12 -2
- data/app/serializers/spree/api/v3/delivery_rate_serializer.rb +34 -17
- data/app/serializers/spree/api/v3/delivery_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/delivery_zone_member_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/delivery_zone_serializer.rb +13 -0
- data/app/serializers/spree/api/v3/digital_asset_serializer.rb +23 -0
- data/app/serializers/spree/api/v3/digital_link_serializer.rb +6 -2
- data/app/serializers/spree/api/v3/discount_serializer.rb +21 -7
- data/app/serializers/spree/api/v3/exchange_line_item_serializer.rb +53 -0
- data/app/serializers/spree/api/v3/exchange_serializer.rb +61 -0
- data/app/serializers/spree/api/v3/fee_serializer.rb +27 -0
- data/app/serializers/spree/api/v3/freight_summary_serializer.rb +38 -0
- data/app/serializers/spree/api/v3/fulfillment_serializer.rb +28 -15
- data/app/serializers/spree/api/v3/gift_card_serializer.rb +2 -2
- data/app/serializers/spree/api/v3/import_row_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/import_serializer.rb +18 -4
- data/app/serializers/spree/api/v3/invitation_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/line_item_serializer.rb +18 -1
- data/app/serializers/spree/api/v3/market_serializer.rb +2 -2
- data/app/serializers/spree/api/v3/{asset_serializer.rb → media_event_serializer.rb} +4 -4
- data/app/serializers/spree/api/v3/media_serializer.rb +48 -7
- data/app/serializers/spree/api/v3/newsletter_subscriber_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/option_type_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/order_group_serializer.rb +60 -0
- data/app/serializers/spree/api/v3/order_serializer.rb +58 -6
- data/app/serializers/spree/api/v3/payment_method_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/payment_serializer.rb +2 -6
- data/app/serializers/spree/api/v3/payment_session_serializer.rb +10 -3
- data/app/serializers/spree/api/v3/payment_setup_session_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/policy_serializer.rb +7 -2
- data/app/serializers/spree/api/v3/product_filter_option_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/product_serializer.rb +42 -10
- data/app/serializers/spree/api/v3/product_type_serializer.rb +17 -0
- data/app/serializers/spree/api/v3/purchase_order_event_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/refund_serializer.rb +9 -3
- data/app/serializers/spree/api/v3/return_line_item_serializer.rb +42 -0
- data/app/serializers/spree/api/v3/return_reason_serializer.rb +20 -0
- data/app/serializers/spree/api/v3/return_serializer.rb +62 -0
- data/app/serializers/spree/api/v3/seller/balance_serializer.rb +35 -0
- data/app/serializers/spree/api/v3/seller/claim_line_item_serializer.rb +21 -0
- data/app/serializers/spree/api/v3/seller/claim_serializer.rb +25 -0
- data/app/serializers/spree/api/v3/seller/delivery_method_rule_serializer.rb +32 -0
- data/app/serializers/spree/api/v3/seller/delivery_method_serializer.rb +59 -0
- data/app/serializers/spree/api/v3/seller/delivery_profile_serializer.rb +26 -0
- data/app/serializers/spree/api/v3/seller/delivery_rate_serializer.rb +35 -0
- data/app/serializers/spree/api/v3/seller/delivery_serializer.rb +17 -0
- data/app/serializers/spree/api/v3/seller/delivery_zone_serializer.rb +26 -0
- data/app/serializers/spree/api/v3/seller/exchange_line_item_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/seller/exchange_serializer.rb +30 -0
- data/app/serializers/spree/api/v3/seller/export_serializer.rb +44 -0
- data/app/serializers/spree/api/v3/seller/fulfillment_item_serializer.rb +43 -0
- data/app/serializers/spree/api/v3/seller/fulfillment_serializer.rb +76 -0
- data/app/serializers/spree/api/v3/seller/import_mapping_serializer.rb +20 -0
- data/app/serializers/spree/api/v3/seller/import_row_serializer.rb +17 -0
- data/app/serializers/spree/api/v3/seller/import_serializer.rb +77 -0
- data/app/serializers/spree/api/v3/seller/invitation_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/seller/media_serializer.rb +26 -0
- data/app/serializers/spree/api/v3/seller/order_line_item_serializer.rb +44 -0
- data/app/serializers/spree/api/v3/seller/order_serializer.rb +119 -0
- data/app/serializers/spree/api/v3/seller/package_type_serializer.rb +52 -0
- data/app/serializers/spree/api/v3/seller/payment_split_serializer.rb +34 -0
- data/app/serializers/spree/api/v3/seller/payout_serializer.rb +36 -0
- data/app/serializers/spree/api/v3/seller/policy_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/seller/product_serializer.rb +60 -0
- data/app/serializers/spree/api/v3/seller/product_submission_serializer.rb +30 -0
- data/app/serializers/spree/api/v3/seller/product_type_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/seller/profile_serializer.rb +77 -0
- data/app/serializers/spree/api/v3/seller/reason_serializer.rb +24 -0
- data/app/serializers/spree/api/v3/seller/requirement_custom_field_serializer.rb +36 -0
- data/app/serializers/spree/api/v3/seller/requirement_status_serializer.rb +62 -0
- data/app/serializers/spree/api/v3/seller/requirement_submission_serializer.rb +33 -0
- data/app/serializers/spree/api/v3/seller/return_line_item_serializer.rb +24 -0
- data/app/serializers/spree/api/v3/seller/return_serializer.rb +51 -0
- data/app/serializers/spree/api/v3/seller/shipping_label_serializer.rb +23 -0
- data/app/serializers/spree/api/v3/seller/stock_level_serializer.rb +27 -0
- data/app/serializers/spree/api/v3/seller/stock_location_serializer.rb +17 -0
- data/app/serializers/spree/api/v3/seller/tax_identifier_serializer.rb +15 -0
- data/app/serializers/spree/api/v3/seller/team_member_serializer.rb +22 -0
- data/app/serializers/spree/api/v3/seller/transfer_serializer.rb +49 -0
- data/app/serializers/spree/api/v3/seller/variant_serializer.rb +71 -0
- data/app/serializers/spree/api/v3/seller_serializer.rb +50 -0
- data/app/serializers/spree/api/v3/shipping_label_event_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/{stock_item_serializer.rb → stock_level_serializer.rb} +5 -5
- data/app/serializers/spree/api/v3/stock_location_serializer.rb +11 -7
- data/app/serializers/spree/api/v3/stock_movement_serializer.rb +8 -15
- data/app/serializers/spree/api/v3/stock_receipt_event_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/stock_transfer_serializer.rb +6 -6
- data/app/serializers/spree/api/v3/store_credit_event_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/supplier_event_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/tax_identifier_serializer.rb +15 -0
- data/app/serializers/spree/api/v3/tax_line_serializer.rb +37 -0
- data/app/serializers/spree/api/v3/variant_serializer.rb +52 -2
- data/app/serializers/spree/api/v3/wishlist_item_serializer.rb +6 -6
- data/app/serializers/spree/api/v3/wishlist_serializer.rb +1 -1
- data/app/services/spree/api/v3/filters_aggregator.rb +14 -12
- data/app/services/spree/webhooks/deliver_webhook.rb +62 -26
- data/app/subscribers/spree/webhook_event_subscriber.rb +9 -5
- data/config/brakeman.ignore +1 -1
- data/config/initializers/typelizer.rb +51 -4
- data/config/locales/en.yml +5 -0
- data/config/routes.rb +730 -22
- data/lib/spree/api/configuration.rb +2 -7
- data/lib/spree/api/dependencies.rb +173 -227
- data/lib/spree/api/openapi/schema_helper.rb +179 -13
- data/lib/spree/api/testing_support/v3/base.rb +45 -15
- data/lib/spree/api.rb +10 -4
- data/lib/typelizer/open_enums.rb +35 -0
- metadata +341 -27
- data/app/controllers/spree/api/v3/admin/orders/adjustments_controller.rb +0 -25
- data/app/controllers/spree/api/v3/admin/stock_items_controller.rb +0 -42
- data/app/controllers/spree/api/v3/admin/store_credit_categories_controller.rb +0 -21
- data/app/controllers/spree/api/v3/store/digitals_controller.rb +0 -38
- data/app/serializers/spree/api/v3/admin/adjustment_serializer.rb +0 -24
- data/app/serializers/spree/api/v3/admin/dashboard_analytics_serializer.rb +0 -143
- data/app/serializers/spree/api/v3/admin/reimbursement_serializer.rb +0 -15
- data/app/serializers/spree/api/v3/admin/return_authorization_serializer.rb +0 -19
- data/app/serializers/spree/api/v3/admin/stock_item_serializer.rb +0 -34
- data/app/serializers/spree/api/v3/admin/store_credit_category_serializer.rb +0 -19
- data/app/serializers/spree/api/v3/customer_return_serializer.rb +0 -17
- data/app/serializers/spree/api/v3/digital_serializer.rb +0 -17
- data/app/serializers/spree/api/v3/reimbursement_serializer.rb +0 -27
- data/app/serializers/spree/api/v3/report_serializer.rb +0 -34
- data/app/serializers/spree/api/v3/return_authorization_serializer.rb +0 -31
- data/app/serializers/spree/api/v3/return_item_serializer.rb +0 -53
- data/app/serializers/spree/api/v3/shipping_category_serializer.rb +0 -11
|
@@ -9,7 +9,7 @@ module Spree
|
|
|
9
9
|
# `store` and `created_by` are auto-stamped by `build_resource` in
|
|
10
10
|
# `Spree::Api::V3::ResourceController`, so create requests only need
|
|
11
11
|
# to include user-facing attributes (amount, currency, expires_at,
|
|
12
|
-
# optional code, optional
|
|
12
|
+
# optional code, optional customer_id).
|
|
13
13
|
class GiftCardsController < ResourceController
|
|
14
14
|
scoped_resource :gift_cards
|
|
15
15
|
|
|
@@ -24,7 +24,8 @@ module Spree
|
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
def permitted_params
|
|
27
|
-
params.permit(:code, :amount, :expires_at,
|
|
27
|
+
params.permit(*model_additional_permitted_attributes, :code, :amount, :expires_at,
|
|
28
|
+
:customer_id, :currency)
|
|
28
29
|
end
|
|
29
30
|
end
|
|
30
31
|
end
|
|
@@ -26,10 +26,15 @@ module Spree
|
|
|
26
26
|
def create
|
|
27
27
|
@resource = build_resource
|
|
28
28
|
authorize_resource!(@resource, :create)
|
|
29
|
+
# After authorization: a 404 for an unknown list must not tell a
|
|
30
|
+
# caller without import rights whether the id exists.
|
|
31
|
+
assign_price_list(@resource)
|
|
29
32
|
|
|
30
33
|
if @resource.save
|
|
31
34
|
begin
|
|
32
|
-
@resource
|
|
35
|
+
result = Spree.import_start_mapping_workflow.call(import: @resource)
|
|
36
|
+
|
|
37
|
+
return render_service_error(result.error) unless result.success?
|
|
33
38
|
rescue ::CSV::MalformedCSVError, EncodingError => e
|
|
34
39
|
@resource.update_columns(status: 'failed', processing_errors: e.message, updated_at: Time.current)
|
|
35
40
|
return render_error(
|
|
@@ -72,7 +77,10 @@ module Spree
|
|
|
72
77
|
apply_mappings!(@resource)
|
|
73
78
|
|
|
74
79
|
if @resource.mapping_done?
|
|
75
|
-
@resource
|
|
80
|
+
result = Spree.import_complete_mapping_workflow.call(import: @resource)
|
|
81
|
+
|
|
82
|
+
return render_service_error(result.error) unless result.success?
|
|
83
|
+
|
|
76
84
|
render json: serialize_resource(@resource)
|
|
77
85
|
else
|
|
78
86
|
missing = @resource.required_fields - @resource.mappings.mapped.pluck(:schema_field)
|
|
@@ -96,7 +104,11 @@ module Spree
|
|
|
96
104
|
@resource = find_resource
|
|
97
105
|
authorize_resource!(@resource, :update)
|
|
98
106
|
|
|
99
|
-
if
|
|
107
|
+
return if refuse_seller_owned!
|
|
108
|
+
|
|
109
|
+
result = Spree.import_retry_failed_rows_workflow.call(import: @resource)
|
|
110
|
+
|
|
111
|
+
if result.success?
|
|
100
112
|
render json: serialize_resource(@resource)
|
|
101
113
|
else
|
|
102
114
|
render_error(
|
|
@@ -136,7 +148,7 @@ module Spree
|
|
|
136
148
|
|
|
137
149
|
# GET /api/v3/admin/imports/template?type=Spree::Imports::Products
|
|
138
150
|
#
|
|
139
|
-
# CSV header row for the type's schema (including the
|
|
151
|
+
# CSV header row for the type's schema (including the custom_field
|
|
140
152
|
# columns available for the model) — the "Download template" link
|
|
141
153
|
# in the admin dashboard.
|
|
142
154
|
def template
|
|
@@ -181,6 +193,19 @@ module Spree
|
|
|
181
193
|
redirect_to url, allow_other_host: true, status: :found
|
|
182
194
|
end
|
|
183
195
|
|
|
196
|
+
# DELETE /api/v3/admin/imports/:id
|
|
197
|
+
#
|
|
198
|
+
# An operator deletes their own imports. A seller's is theirs to
|
|
199
|
+
# remove — see `refuse_seller_owned!`.
|
|
200
|
+
def destroy
|
|
201
|
+
@resource = find_resource
|
|
202
|
+
authorize_resource!(@resource, :destroy)
|
|
203
|
+
|
|
204
|
+
return if refuse_seller_owned!
|
|
205
|
+
|
|
206
|
+
super
|
|
207
|
+
end
|
|
208
|
+
|
|
184
209
|
protected
|
|
185
210
|
|
|
186
211
|
def model_class
|
|
@@ -224,8 +249,8 @@ module Spree
|
|
|
224
249
|
|
|
225
250
|
def build_resource
|
|
226
251
|
klass = resolve_import_type(permitted_params[:type]) || Spree::Import
|
|
227
|
-
attrs = permitted_params.except(:type).merge(
|
|
228
|
-
|
|
252
|
+
attrs = permitted_params.except(:type, :price_list_id).merge(
|
|
253
|
+
store: current_store,
|
|
229
254
|
user: acting_admin_user
|
|
230
255
|
)
|
|
231
256
|
# The done email links back to results_url — allowed origins only.
|
|
@@ -234,7 +259,21 @@ module Spree
|
|
|
234
259
|
end
|
|
235
260
|
|
|
236
261
|
def permitted_params
|
|
237
|
-
params.permit(:type, :attachment, :preferred_delimiter, :results_url)
|
|
262
|
+
params.permit(*model_additional_permitted_attributes, :type, :attachment, :preferred_delimiter, :results_url, :price_list_id)
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
# A price-list import writes into one list, named by its prefixed id.
|
|
266
|
+
# Resolved through the current store, so another store's list is a
|
|
267
|
+
# 404 rather than a write into it; a type without a list ignores the
|
|
268
|
+
# parameter. `permitted_params` does not normalize, so the raw
|
|
269
|
+
# prefixed id is what arrives here.
|
|
270
|
+
def assign_price_list(import)
|
|
271
|
+
return unless import.respond_to?(:price_list=)
|
|
272
|
+
|
|
273
|
+
prefixed_id = permitted_params[:price_list_id]
|
|
274
|
+
return if prefixed_id.blank?
|
|
275
|
+
|
|
276
|
+
import.price_list = current_store.price_lists.find_by_prefix_id!(prefixed_id)
|
|
238
277
|
end
|
|
239
278
|
|
|
240
279
|
# Returns the registered Import subclass matching `name`, or nil.
|
|
@@ -251,11 +290,35 @@ module Spree
|
|
|
251
290
|
return nil if name.blank?
|
|
252
291
|
|
|
253
292
|
name = name.to_s
|
|
254
|
-
Spree::Import.available_types.find { |type| type.api_type == name
|
|
293
|
+
Spree::Import.available_types.find { |type| type.api_type == name }
|
|
255
294
|
end
|
|
256
295
|
|
|
257
296
|
private
|
|
258
297
|
|
|
298
|
+
# Refuses a write against an import one of this store's sellers ran,
|
|
299
|
+
# rendering 422 and answering true so the caller returns.
|
|
300
|
+
#
|
|
301
|
+
# An operator can see every import in their marketplace — that is the
|
|
302
|
+
# point of the store-scoped list, and it is what makes a seller's
|
|
303
|
+
# failed rows debuggable. Acting on one is different: a retry re-runs
|
|
304
|
+
# writes into the seller's own catalog, and nothing on the import
|
|
305
|
+
# would record that the operator, rather than the seller, caused
|
|
306
|
+
# them. So reads span the store and writes stay with whoever owns the
|
|
307
|
+
# row.
|
|
308
|
+
#
|
|
309
|
+
# @return [Boolean]
|
|
310
|
+
def refuse_seller_owned!
|
|
311
|
+
return false if @resource.seller_id.blank?
|
|
312
|
+
|
|
313
|
+
render_error(
|
|
314
|
+
code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:validation_error],
|
|
315
|
+
message: Spree.t(:cannot_modify_seller_import, scope: 'api',
|
|
316
|
+
default: "This import belongs to a seller. It can be viewed here, but only the seller can retry or delete it."),
|
|
317
|
+
status: :unprocessable_content
|
|
318
|
+
)
|
|
319
|
+
true
|
|
320
|
+
end
|
|
321
|
+
|
|
259
322
|
# Imports require a user: row processors resolve records through
|
|
260
323
|
# `import.current_ability`. JWT requests use the signed-in admin;
|
|
261
324
|
# API-key requests attribute to the key's creator when that is an
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
# Credential records for provider gems (delivery rates, tax, ...) —
|
|
6
|
+
# one per (store, type). The types endpoint is the dashboard's
|
|
7
|
+
# gallery source; activation is verified by the model
|
|
8
|
+
# (verify-before-activate), so a failed connection surfaces as a
|
|
9
|
+
# plain 422 on `active`.
|
|
10
|
+
class IntegrationsController < ResourceController
|
|
11
|
+
include Spree::Api::V3::Admin::SubclassedResource
|
|
12
|
+
|
|
13
|
+
scoped_resource :integrations
|
|
14
|
+
|
|
15
|
+
subclassed_via -> { Spree::Integration.registered_classes },
|
|
16
|
+
unknown_type_error: 'unknown_integration_type'
|
|
17
|
+
|
|
18
|
+
# GET /api/v3/admin/integrations/types
|
|
19
|
+
# Pure registry discovery — which integrations are installed and how
|
|
20
|
+
# they're configured. Deliberately carries no per-store connected
|
|
21
|
+
# state: clients cache this long-lived and read live connection
|
|
22
|
+
# state from the integrations list instead.
|
|
23
|
+
def types
|
|
24
|
+
authorize! :create, model_class
|
|
25
|
+
|
|
26
|
+
render json: { data: Spree::Integration.discovery_entries }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# POST /api/v3/admin/integrations/:id/test
|
|
30
|
+
# Live connection check; nothing is persisted.
|
|
31
|
+
def test
|
|
32
|
+
@resource = find_resource
|
|
33
|
+
authorize_resource!(@resource, :update)
|
|
34
|
+
|
|
35
|
+
connected = @resource.can_connect?
|
|
36
|
+
render json: { connected: connected, error_message: connected ? nil : @resource.connection_error_message }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
protected
|
|
40
|
+
|
|
41
|
+
def model_class
|
|
42
|
+
Spree::Integration
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def serializer_class
|
|
46
|
+
Spree.api.admin_integration_serializer
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def permitted_params
|
|
50
|
+
params.permit(*model_additional_permitted_attributes, :type, :active, preferences: {})
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# `types` is read-only discovery — maps to the read scope.
|
|
54
|
+
def read_actions
|
|
55
|
+
super + %w[types]
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
private
|
|
59
|
+
|
|
60
|
+
def build_subclassed_resource(klass, attrs)
|
|
61
|
+
current_store.integrations.build(attrs.merge(type: klass.sti_name))
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -14,7 +14,7 @@ module Spree
|
|
|
14
14
|
within: Spree::Api::Config[:rate_limit_window].seconds,
|
|
15
15
|
store: Rails.cache,
|
|
16
16
|
only: [:lookup, :accept],
|
|
17
|
-
with:
|
|
17
|
+
with: -> { render_rate_limited(limit: Spree::Api::Config[:rate_limit_login]) }
|
|
18
18
|
|
|
19
19
|
# GET /api/v3/admin/auth/invitations/:id/lookup?token=:token
|
|
20
20
|
def lookup
|
|
@@ -32,13 +32,13 @@ module Spree
|
|
|
32
32
|
return if performed?
|
|
33
33
|
|
|
34
34
|
@invitation.invitee = user
|
|
35
|
-
@invitation
|
|
35
|
+
result = Spree.invitation_accept_workflow.call(invitation: @invitation)
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
return render_service_error(result.error) unless result.success?
|
|
38
|
+
|
|
39
|
+
refresh_token = Spree::RefreshToken.create_for(user, audience: JWT_AUDIENCE_ADMIN, request_env: request_env_for_token)
|
|
38
40
|
set_refresh_cookie(refresh_token)
|
|
39
41
|
render json: auth_response(user)
|
|
40
|
-
rescue ActiveRecord::RecordInvalid => e
|
|
41
|
-
render_validation_error(e.record.errors)
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
private
|
|
@@ -9,7 +9,9 @@ module Spree
|
|
|
9
9
|
class InvitationsController < ResourceController
|
|
10
10
|
include Spree::Api::V3::Admin::RoleGrantGuard
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
# Staff management is the escalation path — its own scope pair,
|
|
13
|
+
# grantable separately from store configuration (6.0-admin-rbac.md).
|
|
14
|
+
scoped_resource :staff
|
|
13
15
|
|
|
14
16
|
# POST /api/v3/admin/invitations
|
|
15
17
|
# Guards against inviting a new staff member straight into the admin
|
|
@@ -67,6 +69,8 @@ module Spree
|
|
|
67
69
|
end
|
|
68
70
|
|
|
69
71
|
# `email` and `role_id` are flat — `role_id` accepts a prefixed ID.
|
|
72
|
+
# No extension union: an invitation carries only the role grant, which is
|
|
73
|
+
# the authorization surface itself, not extensible resource data.
|
|
70
74
|
def permitted_params
|
|
71
75
|
attrs = params.permit(:email, :role_id)
|
|
72
76
|
if attrs[:role_id].present? && Spree::PrefixedId.prefixed_id?(attrs[:role_id])
|
|
@@ -6,7 +6,9 @@ module Spree
|
|
|
6
6
|
# current store (its supported_locales_list), so the dashboard's locale
|
|
7
7
|
# switcher enumerates locales instead of hardcoding them.
|
|
8
8
|
class LocalesController < Admin::BaseController
|
|
9
|
-
|
|
9
|
+
# Reference data the dashboard shell needs regardless of the caller's
|
|
10
|
+
# grant — exempt from the key gate like `/tags` and `/countries`.
|
|
11
|
+
skip_scope_check!
|
|
10
12
|
|
|
11
13
|
# GET /api/v3/admin/locales
|
|
12
14
|
def index
|
|
@@ -7,8 +7,8 @@ module Spree
|
|
|
7
7
|
# `scope` chain narrows appropriately when we restrict to
|
|
8
8
|
# `current_store.markets`.
|
|
9
9
|
#
|
|
10
|
-
# `
|
|
11
|
-
# wire and translated by model setters (`Spree::Market#
|
|
10
|
+
# `country_codes` and `supported_locales` are accepted as arrays on the
|
|
11
|
+
# wire and translated by model setters (`Spree::Market#country_codes=`,
|
|
12
12
|
# `#supported_locales=`).
|
|
13
13
|
class MarketsController < ResourceController
|
|
14
14
|
scoped_resource :settings
|
|
@@ -24,14 +24,18 @@ module Spree
|
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
def collection_includes
|
|
27
|
-
[:
|
|
27
|
+
[:market_countries]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def scope
|
|
31
|
+
super.ordered
|
|
28
32
|
end
|
|
29
33
|
|
|
30
34
|
def permitted_params
|
|
31
35
|
normalize_params(
|
|
32
36
|
params.permit(
|
|
33
|
-
:name, :currency, :default_locale, :tax_inclusive,
|
|
34
|
-
:default, :position, supported_locales: [],
|
|
37
|
+
:name, :currency, :default_locale, :tax_inclusive, :tax_provider,
|
|
38
|
+
:default, :position, supported_locales: [], country_codes: []
|
|
35
39
|
)
|
|
36
40
|
)
|
|
37
41
|
end
|
|
@@ -3,6 +3,8 @@ module Spree
|
|
|
3
3
|
module V3
|
|
4
4
|
module Admin
|
|
5
5
|
class MeController < Admin::BaseController
|
|
6
|
+
include Spree::Api::V3::PermissionSerialization
|
|
7
|
+
|
|
6
8
|
skip_scope_check!
|
|
7
9
|
|
|
8
10
|
before_action :require_current_user!
|
|
@@ -63,39 +65,11 @@ module Spree
|
|
|
63
65
|
def me_response
|
|
64
66
|
{
|
|
65
67
|
user: admin_user_serializer.new(current_user, params: serializer_params).to_h,
|
|
66
|
-
permissions: serialize_permissions(current_ability)
|
|
68
|
+
permissions: serialize_permissions(current_ability),
|
|
69
|
+
permission_keys: serialize_permission_keys(current_ability)
|
|
67
70
|
}
|
|
68
71
|
end
|
|
69
72
|
|
|
70
|
-
# Serializes CanCanCan's rules into a flat, JSON-safe list of permission rules.
|
|
71
|
-
#
|
|
72
|
-
# - Rule order is preserved so the frontend matcher can apply
|
|
73
|
-
# CanCanCan's "last matching rule wins" semantics.
|
|
74
|
-
# - Per-record conditions are NOT serialized (they often reference
|
|
75
|
-
# scopes or blocks that don't translate to JSON). The frontend
|
|
76
|
-
# receives `has_conditions: true` as a hint that the action might
|
|
77
|
-
# be denied at the per-record level — in practice the SPA shows
|
|
78
|
-
# the action optimistically and handles 403 from the API.
|
|
79
|
-
def serialize_permissions(ability)
|
|
80
|
-
ability.send(:rules).map do |rule|
|
|
81
|
-
{
|
|
82
|
-
allow: rule.base_behavior,
|
|
83
|
-
actions: Array(rule.actions).map(&:to_s),
|
|
84
|
-
subjects: Array(rule.subjects).map { |s| s.is_a?(Class) ? s.name : s.to_s },
|
|
85
|
-
has_conditions: rule_has_conditions?(rule)
|
|
86
|
-
}
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
def rule_has_conditions?(rule)
|
|
91
|
-
return true if rule.block.present?
|
|
92
|
-
conditions = rule.conditions
|
|
93
|
-
return false if conditions.nil?
|
|
94
|
-
return !conditions.empty? if conditions.respond_to?(:empty?)
|
|
95
|
-
|
|
96
|
-
true
|
|
97
|
-
end
|
|
98
|
-
|
|
99
73
|
def admin_user_serializer
|
|
100
74
|
Spree.api.admin_admin_user_serializer
|
|
101
75
|
end
|
|
@@ -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
|