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
|
@@ -2,16 +2,18 @@ module Spree
|
|
|
2
2
|
module Api
|
|
3
3
|
module V3
|
|
4
4
|
module Store
|
|
5
|
+
# Deliberately uncached. The country list is reference data that only
|
|
6
|
+
# changes with the countries gem, so the conditional-GET machinery had
|
|
7
|
+
# nothing meaningful to key on: it fell back to the store's timestamp,
|
|
8
|
+
# which invalidates on every unrelated store edit while never noticing
|
|
9
|
+
# a change to the countries themselves.
|
|
5
10
|
class CountriesController < Store::BaseController
|
|
6
11
|
allow_guest_storefront_access!
|
|
7
|
-
include Spree::Api::V3::HttpCaching
|
|
8
12
|
|
|
9
13
|
# GET /api/v3/store/countries
|
|
10
14
|
def index
|
|
11
15
|
countries = current_store.countries_from_markets
|
|
12
16
|
|
|
13
|
-
return unless cache_collection(countries)
|
|
14
|
-
|
|
15
17
|
render json: {
|
|
16
18
|
data: countries.map { |country| serialize_country(country) }
|
|
17
19
|
}
|
|
@@ -19,9 +21,9 @@ module Spree
|
|
|
19
21
|
|
|
20
22
|
# GET /api/v3/store/countries/:id
|
|
21
23
|
def show
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
iso = params[:id].to_s.upcase
|
|
25
|
+
country = current_store.countries_from_markets.find { |candidate| candidate.iso == iso }
|
|
26
|
+
raise ActiveRecord::RecordNotFound if country.nil?
|
|
25
27
|
|
|
26
28
|
render json: serialize_country(country)
|
|
27
29
|
end
|
|
@@ -63,8 +63,10 @@ module Spree
|
|
|
63
63
|
|
|
64
64
|
def permitted_params
|
|
65
65
|
params.permit(
|
|
66
|
+
*model_additional_permitted_attributes,
|
|
66
67
|
:first_name, :last_name, :address1, :address2, :city,
|
|
67
|
-
|
|
68
|
+
# country_iso and state_abbr are the legacy write names, accepted until 6.1.
|
|
69
|
+
:postal_code, :phone, :company, :country_code, :country_iso, :state_code, :state_abbr, :state_name,
|
|
68
70
|
:is_default_billing, :is_default_shipping
|
|
69
71
|
)
|
|
70
72
|
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Store
|
|
5
|
+
module Customer
|
|
6
|
+
# A customer exercising their own GDPR rights: a copy of their data
|
|
7
|
+
# (Art. 15) or its erasure (Art. 17).
|
|
8
|
+
#
|
|
9
|
+
# Erasure asks for the account password. Wiping a person's history is
|
|
10
|
+
# irreversible, and an unattended session should not be enough to
|
|
11
|
+
# trigger it — the same bar the account already applies to changing
|
|
12
|
+
# an email address.
|
|
13
|
+
class DataRequestsController < ResourceController
|
|
14
|
+
include Spree::Api::V3::CurrentPasswordConfirmation
|
|
15
|
+
|
|
16
|
+
prepend_before_action :require_authentication!
|
|
17
|
+
|
|
18
|
+
# POST /api/v3/store/customers/me/data_requests
|
|
19
|
+
def create
|
|
20
|
+
return render_current_password_invalid if erasure? && !valid_current_password?
|
|
21
|
+
|
|
22
|
+
result = Spree::DataRequests::Create.call(
|
|
23
|
+
store: current_store,
|
|
24
|
+
customer: current_user,
|
|
25
|
+
kind: requested_kind
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
return render_result_error(result) unless result.success?
|
|
29
|
+
|
|
30
|
+
# 202: the request is accepted and the work happens elsewhere.
|
|
31
|
+
# Answering 201 would imply the export already exists.
|
|
32
|
+
render json: serialize_resource(result.value), status: :accepted
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
protected
|
|
36
|
+
|
|
37
|
+
def model_class
|
|
38
|
+
Spree::DataRequest
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def serializer_class
|
|
42
|
+
Spree.api.data_request_serializer
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def set_parent
|
|
46
|
+
@parent = current_user
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def parent_association
|
|
50
|
+
:data_requests
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# A person sees their own requests and no one else's. The store
|
|
54
|
+
# narrowing is restated because the parent branch of the base scope
|
|
55
|
+
# replaces `for_store` with the association, and a customer is
|
|
56
|
+
# global while their requests are not.
|
|
57
|
+
def scope
|
|
58
|
+
super.for_store(current_store).recent_first
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
private
|
|
62
|
+
|
|
63
|
+
# Anything that is not an explicit erasure is a request to read —
|
|
64
|
+
# the safe reading of an ambiguous parameter.
|
|
65
|
+
def requested_kind
|
|
66
|
+
erasure? ? Spree::DataRequest::ERASURE : Spree::DataRequest::ACCESS
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def erasure?
|
|
70
|
+
params[:kind].to_s == Spree::DataRequest::ERASURE
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Store
|
|
5
|
+
module Customer
|
|
6
|
+
# Everything the signed-in customer can download, across all their
|
|
7
|
+
# orders — the storefront's "my downloads" page. Individual links are
|
|
8
|
+
# also nested in each order, but a library is unusable that way.
|
|
9
|
+
class DigitalLinksController < ResourceController
|
|
10
|
+
prepend_before_action :require_authentication!
|
|
11
|
+
|
|
12
|
+
protected
|
|
13
|
+
|
|
14
|
+
def model_class
|
|
15
|
+
Spree::DigitalLink
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def serializer_class
|
|
19
|
+
Spree.api.digital_link_serializer
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def set_parent
|
|
23
|
+
@parent = current_user
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def parent_association
|
|
27
|
+
:digital_links
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# The `digital_links` association reaches links through orders and
|
|
31
|
+
# line items, so it carries a DISTINCT and inherits an ORDER BY on
|
|
32
|
+
# the line items' table. PostgreSQL rejects DISTINCT combined with
|
|
33
|
+
# an ORDER BY column outside the select list, so reorder by the
|
|
34
|
+
# links' own table — SQLite tolerates the inherited order, so this
|
|
35
|
+
# only surfaces on a real deployment.
|
|
36
|
+
def scope
|
|
37
|
+
super.where(spree_orders: { store_id: current_store.id })
|
|
38
|
+
.reorder("#{Spree::DigitalLink.table_name}.created_at": :desc)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# The serializer asks each link whether it is still authorizable,
|
|
42
|
+
# which reads its order's store and its asset's limits — without
|
|
43
|
+
# both preloads that is four queries per row.
|
|
44
|
+
def scope_includes
|
|
45
|
+
[{ line_item: :order }, { digital_asset: { attachment_attachment: :blob } }]
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -27,6 +27,12 @@ module Spree
|
|
|
27
27
|
def scope
|
|
28
28
|
super.for_store(current_store).complete
|
|
29
29
|
end
|
|
30
|
+
|
|
31
|
+
# The withdrawal deadline reads both on every row, so without
|
|
32
|
+
# these an order history pays two queries per order.
|
|
33
|
+
def collection_includes
|
|
34
|
+
super + [:market, :fulfillments]
|
|
35
|
+
end
|
|
30
36
|
end
|
|
31
37
|
end
|
|
32
38
|
end
|
|
@@ -29,7 +29,7 @@ module Spree
|
|
|
29
29
|
end
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
-
user = Spree.
|
|
32
|
+
user = Spree.customer_class.find_by(email: params[:email])
|
|
33
33
|
|
|
34
34
|
if user
|
|
35
35
|
token = user.generate_token_for(:password_reset)
|
|
@@ -44,7 +44,7 @@ module Spree
|
|
|
44
44
|
|
|
45
45
|
# PATCH /api/v3/store/password_resets/:id
|
|
46
46
|
def update
|
|
47
|
-
user = Spree.
|
|
47
|
+
user = Spree.customer_class.find_by_password_reset_token(params[:id])
|
|
48
48
|
|
|
49
49
|
unless user
|
|
50
50
|
return render_error(
|
|
@@ -59,7 +59,11 @@ module Spree
|
|
|
59
59
|
# Kill every existing session before minting the new one —
|
|
60
60
|
# a stolen refresh token must not survive a password reset.
|
|
61
61
|
Spree::RefreshToken.revoke_all_for(user)
|
|
62
|
-
refresh_token = Spree::RefreshToken.create_for(
|
|
62
|
+
refresh_token = Spree::RefreshToken.create_for(
|
|
63
|
+
user,
|
|
64
|
+
audience: JWT_AUDIENCE_STORE,
|
|
65
|
+
request_env: { ip_address: request.remote_ip, user_agent: request.user_agent&.truncate(255) }
|
|
66
|
+
)
|
|
63
67
|
user.publish_event('customer.password_reset')
|
|
64
68
|
|
|
65
69
|
render json: {
|
|
@@ -11,7 +11,7 @@ module Spree
|
|
|
11
11
|
|
|
12
12
|
# POST /api/v3/store/customer/payment_setup_sessions
|
|
13
13
|
def create
|
|
14
|
-
payment_method = current_store.payment_methods.find_by_prefix_id!(
|
|
14
|
+
payment_method = current_store.payment_methods.find_by_prefix_id!(params[:payment_method_id])
|
|
15
15
|
|
|
16
16
|
@payment_setup_session = payment_method.create_payment_setup_session(
|
|
17
17
|
customer: current_user,
|
|
@@ -62,8 +62,8 @@ module Spree
|
|
|
62
62
|
Spree.api.payment_setup_session_serializer
|
|
63
63
|
end
|
|
64
64
|
|
|
65
|
-
def
|
|
66
|
-
|
|
65
|
+
def resource_permitted_attributes
|
|
66
|
+
[:payment_method_id, { external_data: {} }]
|
|
67
67
|
end
|
|
68
68
|
|
|
69
69
|
def complete_params
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Store
|
|
5
|
+
module Customer
|
|
6
|
+
# The signed-in customer's own tax registrations — one per kind, since a
|
|
7
|
+
# business can be registered under more than one regime.
|
|
8
|
+
#
|
|
9
|
+
# Reads come in two shapes: the list, for a checkout page offering the
|
|
10
|
+
# buyer a choice, and the singular one for reading or upserting a given
|
|
11
|
+
# kind without knowing whether it exists yet.
|
|
12
|
+
class TaxIdentifiersController < Store::BaseController
|
|
13
|
+
prepend_before_action :require_authentication!
|
|
14
|
+
|
|
15
|
+
# The singular endpoints address one registration, and a buyer can
|
|
16
|
+
# hold several. Without a kind, `first` picked whichever row the
|
|
17
|
+
# database happened to return — so a DELETE removed a registration
|
|
18
|
+
# the buyer never named and could not predict.
|
|
19
|
+
before_action :require_kind!, only: %i[show update destroy]
|
|
20
|
+
|
|
21
|
+
# GET /api/v3/store/customers/me/tax_identifiers
|
|
22
|
+
#
|
|
23
|
+
# Everything the buyer could choose between at checkout. Small and
|
|
24
|
+
# unpaginated by nature — a business has a handful of registrations,
|
|
25
|
+
# not a page of them.
|
|
26
|
+
def index
|
|
27
|
+
render json: { data: serialize_collection(current_user.tax_identifiers.to_a) }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# GET /api/v3/store/customers/me/tax_identifier
|
|
31
|
+
def show
|
|
32
|
+
return head :not_found if tax_identifier.nil?
|
|
33
|
+
|
|
34
|
+
render json: serialize_resource(tax_identifier)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# PUT /api/v3/store/customers/me/tax_identifier
|
|
38
|
+
#
|
|
39
|
+
# Upsert rather than create/update: a buyer has one registration of a
|
|
40
|
+
# kind, and asking the storefront to know whether it exists yet would
|
|
41
|
+
# be bookkeeping we can do ourselves.
|
|
42
|
+
def update
|
|
43
|
+
resource = current_user.tax_identifiers.find_or_initialize_by(kind: permitted_params[:kind])
|
|
44
|
+
resource.value = permitted_params[:value]
|
|
45
|
+
|
|
46
|
+
if resource.save
|
|
47
|
+
render json: serialize_resource(resource), status: resource.previously_new_record? ? :created : :ok
|
|
48
|
+
else
|
|
49
|
+
render_validation_error(resource.errors)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# DELETE /api/v3/store/customers/me/tax_identifier
|
|
54
|
+
def destroy
|
|
55
|
+
return head :not_found if tax_identifier.nil?
|
|
56
|
+
|
|
57
|
+
tax_identifier.destroy!
|
|
58
|
+
head :no_content
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
protected
|
|
62
|
+
|
|
63
|
+
def serializer_class
|
|
64
|
+
Spree.api.tax_identifier_serializer
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def permitted_params
|
|
68
|
+
params.permit(:kind, :value)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
private
|
|
72
|
+
|
|
73
|
+
def require_kind!
|
|
74
|
+
return if params[:kind].present?
|
|
75
|
+
|
|
76
|
+
render_error(
|
|
77
|
+
code: ERROR_CODES[:parameter_missing],
|
|
78
|
+
message: 'kind is required — name the registration to read, replace or remove',
|
|
79
|
+
status: :unprocessable_content
|
|
80
|
+
)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def tax_identifier
|
|
84
|
+
@tax_identifier ||= current_user.tax_identifiers.for_kind(params[:kind]).first
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
@@ -3,19 +3,36 @@ module Spree
|
|
|
3
3
|
module V3
|
|
4
4
|
module Store
|
|
5
5
|
class CustomersController < Store::BaseController
|
|
6
|
+
include Spree::Api::V3::CurrentPasswordConfirmation
|
|
7
|
+
|
|
6
8
|
allow_guest_storefront_access!
|
|
7
|
-
rate_limit to: Spree::Api::Config[:rate_limit_register], within: Spree::Api::Config[:rate_limit_window].seconds, store: Rails.cache, only: :create, with:
|
|
9
|
+
rate_limit to: Spree::Api::Config[:rate_limit_register], within: Spree::Api::Config[:rate_limit_window].seconds, store: Rails.cache, only: :create, with: -> { render_rate_limited(limit: Spree::Api::Config[:rate_limit_register]) }
|
|
8
10
|
|
|
9
11
|
skip_before_action :authenticate_user, only: [:create]
|
|
10
12
|
prepend_before_action :require_authentication!, only: [:show, :update]
|
|
11
13
|
|
|
12
14
|
# POST /api/v3/store/customers
|
|
15
|
+
# Registration runs through the customer_create_workflow seam
|
|
16
|
+
# (password requirement, newsletter-subscriber linking, registration
|
|
17
|
+
# policy hooks); token issuance is an HTTP session concern and
|
|
18
|
+
# stays here.
|
|
13
19
|
def create
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
20
|
+
result = Spree.customer_create_workflow.call(
|
|
21
|
+
store: current_store,
|
|
22
|
+
# Records that the storefront's terms box was ticked. Read from
|
|
23
|
+
# params rather than permitted: it is evidence the workflow acts
|
|
24
|
+
# on, not an attribute of the customer row.
|
|
25
|
+
terms_of_service: params[:terms_of_service],
|
|
26
|
+
# Where and from what the agreement was made. A consent record
|
|
27
|
+
# without them says only that someone ticked a box.
|
|
28
|
+
ip_address: request.remote_ip,
|
|
29
|
+
user_agent: request.user_agent,
|
|
30
|
+
**permitted_params.except(:current_password).to_h.symbolize_keys
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
if result.success?
|
|
34
|
+
user = result.value
|
|
35
|
+
refresh_token = Spree::RefreshToken.create_for(user, audience: JWT_AUDIENCE_STORE, request_env: {
|
|
19
36
|
ip_address: request.remote_ip,
|
|
20
37
|
user_agent: request.user_agent&.truncate(255)
|
|
21
38
|
})
|
|
@@ -25,7 +42,7 @@ module Spree
|
|
|
25
42
|
user: user_serializer.new(user, params: serializer_params).to_h
|
|
26
43
|
}, status: :created
|
|
27
44
|
else
|
|
28
|
-
|
|
45
|
+
render_result_error(result)
|
|
29
46
|
end
|
|
30
47
|
end
|
|
31
48
|
|
|
@@ -36,15 +53,10 @@ module Spree
|
|
|
36
53
|
|
|
37
54
|
# PATCH /api/v3/store/customer
|
|
38
55
|
def update
|
|
39
|
-
if sensitive_update? && !valid_current_password?
|
|
40
|
-
return render_error(
|
|
41
|
-
code: ErrorHandler::ERROR_CODES[:current_password_invalid],
|
|
42
|
-
message: Spree.t(:current_password_invalid, scope: :api),
|
|
43
|
-
status: :unprocessable_content
|
|
44
|
-
)
|
|
45
|
-
end
|
|
56
|
+
return render_current_password_invalid if sensitive_update? && !valid_current_password?
|
|
46
57
|
|
|
47
58
|
update_params = permitted_params.except(:current_password)
|
|
59
|
+
current_user.consent_source = Spree::ConsentRecord::ACCOUNT
|
|
48
60
|
|
|
49
61
|
if current_user.update(update_params)
|
|
50
62
|
render json: serialize_resource(current_user)
|
|
@@ -82,26 +94,9 @@ module Spree
|
|
|
82
94
|
params[:password].present?
|
|
83
95
|
end
|
|
84
96
|
|
|
85
|
-
def valid_current_password?
|
|
86
|
-
return false if params[:current_password].blank?
|
|
87
|
-
|
|
88
|
-
if current_user.respond_to?(:valid_password?)
|
|
89
|
-
current_user.valid_password?(params[:current_password])
|
|
90
|
-
elsif current_user.respond_to?(:authenticate)
|
|
91
|
-
current_user.authenticate(params[:current_password]).present?
|
|
92
|
-
else
|
|
93
|
-
false
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
|
|
97
97
|
def user_serializer
|
|
98
98
|
Spree.api.customer_serializer
|
|
99
99
|
end
|
|
100
|
-
|
|
101
|
-
def link_matching_newsletter_subscriber!(user)
|
|
102
|
-
subscriber = Spree::NewsletterSubscriber.find_by(email: user.email, store: current_store)
|
|
103
|
-
Spree::Newsletter::LinkUser.new(subscriber: subscriber, user: user).call
|
|
104
|
-
end
|
|
105
100
|
end
|
|
106
101
|
end
|
|
107
102
|
end
|
|
@@ -13,6 +13,17 @@ module Spree
|
|
|
13
13
|
|
|
14
14
|
render xml: presenter.call
|
|
15
15
|
end
|
|
16
|
+
|
|
17
|
+
protected
|
|
18
|
+
|
|
19
|
+
# Feed URLs carry only a slug (unique per store, not globally), and
|
|
20
|
+
# no credential accompanies the request — so feeds are served for
|
|
21
|
+
# the default store. This matches the pre-6.0 behavior in practice:
|
|
22
|
+
# the old finder resolved every host to the default store too. A
|
|
23
|
+
# store-carrying feed URL shape is future work.
|
|
24
|
+
def current_store
|
|
25
|
+
@current_store ||= Spree::Store.default
|
|
26
|
+
end
|
|
16
27
|
end
|
|
17
28
|
end
|
|
18
29
|
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Store
|
|
5
|
+
# Hands a completed export to the person who asked for it.
|
|
6
|
+
#
|
|
7
|
+
# Token-addressed rather than session-authenticated, and unauthenticated
|
|
8
|
+
# for the same reason the digital-link download is: the link arrives by
|
|
9
|
+
# email and has to work when clicked, including from a device that was
|
|
10
|
+
# never signed in. The token is the credential — long, unguessable, only
|
|
11
|
+
# ever sent to the address that made the request, and dead once the
|
|
12
|
+
# request expires.
|
|
13
|
+
class DataRequestDownloadsController < Store::BaseController
|
|
14
|
+
# Lets the Disk service build absolute URLs from the current request;
|
|
15
|
+
# remote services (S3 et al.) sign without it.
|
|
16
|
+
include ActiveStorage::SetCurrent
|
|
17
|
+
|
|
18
|
+
allow_guest_storefront_access!
|
|
19
|
+
skip_before_action :authenticate_api_key!
|
|
20
|
+
|
|
21
|
+
# GET /api/v3/store/data_requests/:token/download
|
|
22
|
+
def show
|
|
23
|
+
# Guarded rather than trusting the route to reject an empty
|
|
24
|
+
# segment: erasure clears the token, and a blank lookup matching a
|
|
25
|
+
# cleared row would hand back the very export it was meant to
|
|
26
|
+
# withdraw.
|
|
27
|
+
token = params[:token].presence
|
|
28
|
+
data_request = token && Spree::DataRequest.find_by(download_token: token)
|
|
29
|
+
|
|
30
|
+
unless data_request&.downloadable?
|
|
31
|
+
return render_error(
|
|
32
|
+
code: 'data_request_expired',
|
|
33
|
+
message: Spree.t('data_request_errors.download_unavailable'),
|
|
34
|
+
status: :forbidden
|
|
35
|
+
)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Streamed rather than redirected to a storage URL. A redirect only
|
|
39
|
+
# carries `no-store` on itself — the browser then fetches the
|
|
40
|
+
# storage response separately, under whatever cache policy that
|
|
41
|
+
# bucket happens to have, and a person's entire personal-data
|
|
42
|
+
# export is not something to leave to that. Streaming also keeps
|
|
43
|
+
# the file behind this token check rather than behind a URL that
|
|
44
|
+
# outlives the request.
|
|
45
|
+
response.headers['Cache-Control'] = 'no-store'
|
|
46
|
+
|
|
47
|
+
send_data(
|
|
48
|
+
data_request.export_file.download,
|
|
49
|
+
filename: "#{data_request.number.downcase}.json",
|
|
50
|
+
type: 'application/json',
|
|
51
|
+
disposition: 'attachment'
|
|
52
|
+
)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Store
|
|
5
|
+
# Storefront delivery method discovery — primarily for pickup flows:
|
|
6
|
+
# list pickup-capable methods, then their pickup locations (merchant
|
|
7
|
+
# stock locations) or third-party pickup points near the customer.
|
|
8
|
+
class DeliveryMethodsController < ResourceController
|
|
9
|
+
# GET /api/v3/store/delivery_methods/:id/pickup_locations
|
|
10
|
+
# Pickup-enabled stock locations. With ?cart_id= the list is
|
|
11
|
+
# narrowed to locations that can fulfill the whole cart from local
|
|
12
|
+
# stock (package-scoped availability).
|
|
13
|
+
def pickup_locations
|
|
14
|
+
locations = find_resource.available_pickup_locations
|
|
15
|
+
# A channel-bound cart only collects from counters its channel is
|
|
16
|
+
# served by (docs/plans/6.0-channel-delivery.md).
|
|
17
|
+
if pickup_cart&.channel
|
|
18
|
+
locations = locations.merge(pickup_cart.channel.served_stock_locations)
|
|
19
|
+
end
|
|
20
|
+
locations = locations.select { |location| covers_cart?(location, pickup_cart) } if pickup_cart
|
|
21
|
+
|
|
22
|
+
render json: { data: locations.map { |location| Spree.api.stock_location_serializer.new(location, params: serializer_params).to_h } }
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# GET /api/v3/store/delivery_methods/:id/pickup_points?latitude=&longitude=
|
|
26
|
+
def pickup_points
|
|
27
|
+
provider = find_resource.pickup_point_provider_instance
|
|
28
|
+
if provider.nil?
|
|
29
|
+
return render_error(code: ERROR_CODES[:record_not_found], message: Spree.t('errors.messages.no_pickup_point_provider'), status: :not_found)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
latitude = params[:latitude].presence&.to_f
|
|
33
|
+
longitude = params[:longitude].presence&.to_f
|
|
34
|
+
if latitude.nil? || longitude.nil?
|
|
35
|
+
return render_error(code: ERROR_CODES[:parameter_missing], message: 'latitude and longitude are required', status: :bad_request)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
points = provider.find_nearby(latitude: latitude, longitude: longitude)
|
|
39
|
+
render json: { data: points.map(&:to_pickup_point_data) }
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
protected
|
|
43
|
+
|
|
44
|
+
def model_class
|
|
45
|
+
Spree::DeliveryMethod
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def serializer_class
|
|
49
|
+
Spree.api.delivery_method_serializer
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def scope
|
|
53
|
+
scope = current_store.delivery_methods.storefront_visible
|
|
54
|
+
scope = filter_by_kind(scope, params[:fulfillment_type]) if params[:fulfillment_type].present?
|
|
55
|
+
scope
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Public filter values map onto provider class predicates — the
|
|
59
|
+
# string vocabulary is a wire convenience, not a stored column.
|
|
60
|
+
def filter_by_kind(scope, kind)
|
|
61
|
+
case kind
|
|
62
|
+
when 'digital' then scope.with_provider(:digital?)
|
|
63
|
+
when 'pickup' then scope.with_provider(:pickup?)
|
|
64
|
+
when 'pickup_point' then scope.with_provider(:pickup_point?)
|
|
65
|
+
when 'shipping'
|
|
66
|
+
shipping_providers = Spree.fulfillment_providers.reject { |p| p.digital? || p.pickup? || p.pickup_point? }
|
|
67
|
+
scope.where(fulfillment_provider: shipping_providers.map(&:to_s))
|
|
68
|
+
else
|
|
69
|
+
scope.none
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
private
|
|
74
|
+
|
|
75
|
+
# Coverage results depend on the cart's contents — the caller must
|
|
76
|
+
# prove access to it (owner JWT or the cart token), like every
|
|
77
|
+
# other cart read.
|
|
78
|
+
def pickup_cart
|
|
79
|
+
return @pickup_cart if defined?(@pickup_cart)
|
|
80
|
+
return @pickup_cart = nil if params[:cart_id].blank?
|
|
81
|
+
|
|
82
|
+
cart = current_store.carts.incomplete.find_by_prefix_id!(params[:cart_id])
|
|
83
|
+
authorize_storefront_read!(cart, token: request.headers['x-spree-token'])
|
|
84
|
+
@pickup_cart = cart
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# 'local' policy: every cart item must be on hand at the location.
|
|
88
|
+
# 'any' policy: the location offers pickup regardless of local stock
|
|
89
|
+
# (the merchant transfers goods in).
|
|
90
|
+
# Only pickup-collectable items count toward local coverage — a
|
|
91
|
+
# tracked digital variant in a mixed cart is delivered by its own
|
|
92
|
+
# provider and must not disqualify a counter.
|
|
93
|
+
def covers_cart?(location, cart)
|
|
94
|
+
return true if location.pickup_stock_policy == 'any'
|
|
95
|
+
|
|
96
|
+
cart.line_items.includes(variant: :product).all? do |line_item|
|
|
97
|
+
next true if line_item.variant.digital?
|
|
98
|
+
next true unless line_item.variant.should_track_inventory?
|
|
99
|
+
|
|
100
|
+
stock_level = location.stock_level(line_item.variant)
|
|
101
|
+
stock_level.present? && stock_level.available_count >= line_item.quantity
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|