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
|
@@ -8,23 +8,26 @@ module Spree
|
|
|
8
8
|
protected
|
|
9
9
|
|
|
10
10
|
def set_parent
|
|
11
|
-
@parent =
|
|
11
|
+
@parent = storefront_access_policy.
|
|
12
|
+
scope(Spree::Wishlist.for_store(current_store)).
|
|
13
|
+
find_by_prefix_id!(params[:wishlist_id])
|
|
14
|
+
authorize_storefront_write!(@parent)
|
|
12
15
|
end
|
|
13
16
|
|
|
14
17
|
def parent_association
|
|
15
|
-
:
|
|
18
|
+
:wishlist_items
|
|
16
19
|
end
|
|
17
20
|
|
|
18
21
|
def model_class
|
|
19
|
-
Spree::
|
|
22
|
+
Spree::WishlistItem
|
|
20
23
|
end
|
|
21
24
|
|
|
22
25
|
def serializer_class
|
|
23
|
-
Spree.api.
|
|
26
|
+
Spree.api.wishlist_item_serializer
|
|
24
27
|
end
|
|
25
28
|
|
|
26
|
-
def
|
|
27
|
-
|
|
29
|
+
def resource_permitted_attributes
|
|
30
|
+
[:variant_id, :quantity]
|
|
28
31
|
end
|
|
29
32
|
end
|
|
30
33
|
end
|
|
@@ -20,7 +20,7 @@ module Spree
|
|
|
20
20
|
protected
|
|
21
21
|
|
|
22
22
|
def scope
|
|
23
|
-
|
|
23
|
+
storefront_access_policy.scope(Spree::Wishlist.for_store(current_store))
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
def model_class
|
|
@@ -31,8 +31,8 @@ module Spree
|
|
|
31
31
|
Spree.api.wishlist_serializer
|
|
32
32
|
end
|
|
33
33
|
|
|
34
|
-
def
|
|
35
|
-
|
|
34
|
+
def resource_permitted_attributes
|
|
35
|
+
[:name, :is_default, :is_private]
|
|
36
36
|
end
|
|
37
37
|
end
|
|
38
38
|
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Webhooks
|
|
5
|
+
# Carrier webhooks, addressed to the integration holding the carrier's
|
|
6
|
+
# credentials: POST /api/v3/webhooks/fulfillments/:integration_id.
|
|
7
|
+
#
|
|
8
|
+
# Mirrors the payments webhook endpoint: the integration verifies the
|
|
9
|
+
# signature synchronously (401 when it fails, so a misconfigured
|
|
10
|
+
# sender notices), translates the payload into core vocabulary, and
|
|
11
|
+
# anything unrecognised is acknowledged with 200 — carriers retry
|
|
12
|
+
# anything else, and there is nothing to retry for a parcel that is
|
|
13
|
+
# not ours. Unlike payments there is no job hand-off: recording a
|
|
14
|
+
# tracking update is a couple of database writes, well inside any
|
|
15
|
+
# sender's timeout.
|
|
16
|
+
class FulfillmentsController < ActionController::API
|
|
17
|
+
include ActionController::RateLimiting
|
|
18
|
+
include Spree::Core::ControllerHelpers::Store
|
|
19
|
+
|
|
20
|
+
# Must render — instance_exec'd in a before_action, where only
|
|
21
|
+
# render/redirect halts the chain.
|
|
22
|
+
RATE_LIMIT_RESPONSE = -> {
|
|
23
|
+
response.headers['Retry-After'] = '60'
|
|
24
|
+
render json: { error: { code: 'rate_limit_exceeded', message: 'Too many requests' } },
|
|
25
|
+
status: :too_many_requests
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
rate_limit to: 120, within: 1.minute,
|
|
29
|
+
store: Rails.cache,
|
|
30
|
+
by: -> { request.remote_ip },
|
|
31
|
+
with: RATE_LIMIT_RESPONSE
|
|
32
|
+
|
|
33
|
+
def create
|
|
34
|
+
integration = current_store.integrations.active.find_by_prefix_id!(params[:integration_id])
|
|
35
|
+
|
|
36
|
+
event = integration.parse_webhook_event(request.raw_post, request.headers)
|
|
37
|
+
return head :ok if event.nil?
|
|
38
|
+
|
|
39
|
+
delivery = find_delivery(event[:tracking_code])
|
|
40
|
+
return head :ok if delivery.nil?
|
|
41
|
+
|
|
42
|
+
Spree.delivery_update_tracking_workflow.call(
|
|
43
|
+
delivery: delivery,
|
|
44
|
+
**event.except(:tracking_code)
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
head :ok
|
|
48
|
+
rescue Spree::Integration::WebhookSignatureError
|
|
49
|
+
head :unauthorized
|
|
50
|
+
rescue ActiveRecord::RecordNotFound
|
|
51
|
+
head :not_found
|
|
52
|
+
rescue StandardError => e
|
|
53
|
+
Rails.error.report(e, source: 'spree.webhooks.fulfillments')
|
|
54
|
+
head :ok
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
private
|
|
58
|
+
|
|
59
|
+
# Scoped to the store the verified integration belongs to — a
|
|
60
|
+
# tracking code can never address another tenant's parcel — and to
|
|
61
|
+
# consignments whose parcel was not canceled, so a recycled code
|
|
62
|
+
# cannot reopen an old one. The newest wins when a code was reused.
|
|
63
|
+
# Carriers reuse tracking numbers across years, so a code can match
|
|
64
|
+
# more than one consignment. The store-scoped index makes that
|
|
65
|
+
# candidate set tiny — almost always one row — and the stood-down
|
|
66
|
+
# ones are dropped from it rather than from every parcel in the
|
|
67
|
+
# database. The newest survivor wins.
|
|
68
|
+
CANDIDATE_LIMIT = 20
|
|
69
|
+
|
|
70
|
+
def find_delivery(tracking_code)
|
|
71
|
+
return if tracking_code.blank?
|
|
72
|
+
|
|
73
|
+
# Paged rather than capped: a tracking number reused across
|
|
74
|
+
# canceled owners would otherwise fill the window and hide the
|
|
75
|
+
# live delivery behind them, and the webhook would be
|
|
76
|
+
# acknowledged without applying the carrier's update.
|
|
77
|
+
current_store.deliveries.
|
|
78
|
+
where(tracking_number: tracking_code).
|
|
79
|
+
order(created_at: :desc, id: :desc).
|
|
80
|
+
includes(:owner).
|
|
81
|
+
find_each(batch_size: CANDIDATE_LIMIT, order: :desc).
|
|
82
|
+
find { |delivery| delivery.owner.present? && !delivery.owner.canceled? }
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -6,9 +6,12 @@ module Spree
|
|
|
6
6
|
include ActionController::RateLimiting
|
|
7
7
|
include Spree::Core::ControllerHelpers::Store
|
|
8
8
|
|
|
9
|
+
# Must render — instance_exec'd in a before_action, where only
|
|
10
|
+
# render/redirect halts the chain.
|
|
9
11
|
RATE_LIMIT_RESPONSE = -> {
|
|
10
|
-
[
|
|
11
|
-
|
|
12
|
+
response.headers['Retry-After'] = '60'
|
|
13
|
+
render json: { error: { code: 'rate_limit_exceeded', message: 'Too many requests' } },
|
|
14
|
+
status: :too_many_requests
|
|
12
15
|
}
|
|
13
16
|
|
|
14
17
|
rate_limit to: 120, within: 1.minute,
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Webhooks
|
|
5
|
+
# Marketplace events about sellers: POST /api/v3/webhooks/payouts/:payment_method_id.
|
|
6
|
+
#
|
|
7
|
+
# Separate from the payments endpoint because providers scope the two
|
|
8
|
+
# separately. Events originating in a seller's own account — whether
|
|
9
|
+
# they may be paid, whether a payout reached their bank — arrive on
|
|
10
|
+
# their own subscription with their own signing secret, so verifying
|
|
11
|
+
# them against the payment endpoint's secret would reject every one.
|
|
12
|
+
#
|
|
13
|
+
# Addressed to the payment method because a marketplace pays sellers
|
|
14
|
+
# out of the account it charges their customers from: the same
|
|
15
|
+
# credentials, and so the same record.
|
|
16
|
+
#
|
|
17
|
+
# Handled inline rather than handed to a job, like the carrier
|
|
18
|
+
# endpoint: marking a seller payable or a payout settled is a couple of
|
|
19
|
+
# database writes, well inside any sender's timeout.
|
|
20
|
+
class PayoutsController < ActionController::API
|
|
21
|
+
include ActionController::RateLimiting
|
|
22
|
+
include Spree::Core::ControllerHelpers::Store
|
|
23
|
+
|
|
24
|
+
# Must render — instance_exec'd in a before_action, where only
|
|
25
|
+
# render/redirect halts the chain.
|
|
26
|
+
RATE_LIMIT_RESPONSE = -> {
|
|
27
|
+
response.headers['Retry-After'] = '60'
|
|
28
|
+
render json: { error: { code: 'rate_limit_exceeded', message: 'Too many requests' } },
|
|
29
|
+
status: :too_many_requests
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
rate_limit to: 120, within: 1.minute,
|
|
33
|
+
store: Rails.cache,
|
|
34
|
+
by: -> { request.remote_ip },
|
|
35
|
+
with: RATE_LIMIT_RESPONSE
|
|
36
|
+
|
|
37
|
+
def create
|
|
38
|
+
payment_method = current_store.payment_methods.find_by_prefix_id!(params[:payment_method_id])
|
|
39
|
+
return head :not_found unless payment_method.respond_to?(:handle_payout_webhook)
|
|
40
|
+
|
|
41
|
+
payment_method.handle_payout_webhook(request.raw_post, request.headers)
|
|
42
|
+
|
|
43
|
+
head :ok
|
|
44
|
+
rescue Spree::PaymentMethod::WebhookSignatureError
|
|
45
|
+
head :unauthorized
|
|
46
|
+
rescue ActiveRecord::RecordNotFound
|
|
47
|
+
head :not_found
|
|
48
|
+
rescue StandardError => e
|
|
49
|
+
# 500, unlike the payments endpoint beside this one — that hands
|
|
50
|
+
# its work to a job, so accepting the delivery is honest. This acts
|
|
51
|
+
# inline, so answering 200 for work that failed tells the provider
|
|
52
|
+
# the settlement was recorded when it was not, and nothing will
|
|
53
|
+
# redeliver it. A retry is the only thing that recovers it.
|
|
54
|
+
Rails.error.report(e, source: 'spree.webhooks.payouts')
|
|
55
|
+
head :internal_server_error
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
# The one place that knows how a finished export is addressed. Mirrors
|
|
4
|
+
# DigitalLinkUrls: the route only exists in this gem, while the email that
|
|
5
|
+
# needs it absolute lives in another.
|
|
6
|
+
module DataRequestUrls
|
|
7
|
+
module_function
|
|
8
|
+
|
|
9
|
+
# @param data_request [Spree::DataRequest]
|
|
10
|
+
# @return [String] path relative to the API host
|
|
11
|
+
def download_path(data_request)
|
|
12
|
+
Spree::Core::Engine.routes.url_helpers.api_v3_store_data_request_download_path(
|
|
13
|
+
token: data_request.download_token
|
|
14
|
+
)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# @param data_request [Spree::DataRequest]
|
|
18
|
+
# @param host [String] the backend's own URL
|
|
19
|
+
# @return [String] absolute URL, for emails and anything else off-request
|
|
20
|
+
def download_url(data_request, host)
|
|
21
|
+
URI.join(host, download_path(data_request)).to_s
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
# The one place that knows how a download link is addressed. Both consumers
|
|
4
|
+
# live in different gems — the store serializer emits the path, the email
|
|
5
|
+
# needs it absolute — and the route only exists here, in the gem that draws
|
|
6
|
+
# it, so neither the core model nor the emails gem can own this.
|
|
7
|
+
module DigitalLinkUrls
|
|
8
|
+
module_function
|
|
9
|
+
|
|
10
|
+
# @param digital_link [Spree::DigitalLink]
|
|
11
|
+
# @return [String] path relative to the API host
|
|
12
|
+
def download_path(digital_link)
|
|
13
|
+
Spree::Core::Engine.routes.url_helpers.api_v3_store_digital_link_download_path(
|
|
14
|
+
token: digital_link.token
|
|
15
|
+
)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# @param digital_link [Spree::DigitalLink]
|
|
19
|
+
# @param host [String] the backend's own URL
|
|
20
|
+
# @return [String] absolute URL, for emails and anything else off-request
|
|
21
|
+
def download_url(digital_link, host)
|
|
22
|
+
URI.join(host, download_path(digital_link)).to_s
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -5,13 +5,25 @@ module Spree
|
|
|
5
5
|
typelize first_name: [:string, nullable: true], last_name: [:string, nullable: true], full_name: :string,
|
|
6
6
|
address1: [:string, nullable: true], address2: [:string, nullable: true],
|
|
7
7
|
city: [:string, nullable: true], postal_code: [:string, nullable: true], phone: [:string, nullable: true],
|
|
8
|
-
company: [:string, nullable: true],
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
company: [:string, nullable: true], state_code: [:string, nullable: true],
|
|
9
|
+
state_abbr: [:string, nullable: true], state_name: [:string, nullable: true],
|
|
10
|
+
state_text: [:string, nullable: true], country_code: :string, country_iso: :string,
|
|
11
|
+
country_name: :string,
|
|
12
|
+
quick_checkout: :boolean, is_default_billing: :boolean, is_default_shipping: :boolean,
|
|
13
|
+
label: [:string, nullable: true]
|
|
14
|
+
|
|
15
|
+
# What the address is filed under in whichever book owns it — a
|
|
16
|
+
# customer's ("Home") or a company node's ("Northern Warehouse").
|
|
17
|
+
attributes :label
|
|
11
18
|
|
|
12
19
|
attributes :first_name, :last_name, :full_name, :address1, :address2, :postal_code,
|
|
13
|
-
:city, :phone, :company, :country_name, :
|
|
14
|
-
:
|
|
20
|
+
:city, :phone, :company, :country_name, :country_code, :state_text,
|
|
21
|
+
:state_code, :quick_checkout, :is_default_billing, :is_default_shipping
|
|
22
|
+
|
|
23
|
+
# @deprecated Storefronts shipped against these names; use +state_code+
|
|
24
|
+
# and +country_code+. Removed in 6.1.
|
|
25
|
+
attribute :state_abbr, &:state_code
|
|
26
|
+
attribute :country_iso, &:country_code
|
|
15
27
|
|
|
16
28
|
# State name - used for countries without predefined states
|
|
17
29
|
attribute :state_name do |address|
|
|
@@ -3,16 +3,39 @@ module Spree
|
|
|
3
3
|
module V3
|
|
4
4
|
module Admin
|
|
5
5
|
class AddressSerializer < V3::AddressSerializer
|
|
6
|
-
typelize
|
|
7
|
-
|
|
6
|
+
typelize customer_id: [:string, nullable: true],
|
|
7
|
+
owner_id: [:string, nullable: true],
|
|
8
|
+
owner_type: [:string, nullable: true],
|
|
9
|
+
latitude: [:number, nullable: true],
|
|
10
|
+
longitude: [:number, nullable: true],
|
|
8
11
|
metadata: 'Record<string, unknown>'
|
|
9
12
|
|
|
10
|
-
attributes :
|
|
13
|
+
attributes :metadata,
|
|
11
14
|
created_at: :iso8601, updated_at: :iso8601
|
|
12
15
|
|
|
16
|
+
# Geocoded in the background after the address is saved, so both are
|
|
17
|
+
# null until that job has run — a client showing a map has to cope
|
|
18
|
+
# with an address it cannot place yet.
|
|
19
|
+
attribute :latitude do |address|
|
|
20
|
+
address.latitude&.to_f
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
attribute :longitude do |address|
|
|
24
|
+
address.longitude&.to_f
|
|
25
|
+
end
|
|
26
|
+
|
|
13
27
|
attribute :customer_id do |address|
|
|
14
|
-
address.
|
|
28
|
+
address.customer_owner&.prefixed_id
|
|
15
29
|
end
|
|
30
|
+
|
|
31
|
+
# Who the row belongs to — a customer's book, a company node's, or a
|
|
32
|
+
# seller's billing address. `customer_id` above stays as the
|
|
33
|
+
# customer-only shorthand the customers surface reads.
|
|
34
|
+
attribute :owner_id do |address|
|
|
35
|
+
address.owner&.prefixed_id
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
attributes :owner_type
|
|
16
39
|
end
|
|
17
40
|
end
|
|
18
41
|
end
|
|
@@ -25,21 +25,24 @@ module Spree
|
|
|
25
25
|
# the user might have on other stores. Block receives `params`
|
|
26
26
|
# only when Alba passes it through the `serializer_params` hash —
|
|
27
27
|
# we fall back to `Spree::Current.store` if not.
|
|
28
|
+
# Filtered in Ruby rather than with `for_resource`, so the staff
|
|
29
|
+
# index's preloaded roles are used instead of a query per user.
|
|
28
30
|
attribute :roles do |user, params|
|
|
29
31
|
store = params&.dig(:store) || Spree::Current.store
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
32
|
+
roles = user.spree_roles.to_a
|
|
33
|
+
roles = roles.select { |role| role.resource == store } if store
|
|
34
|
+
roles.map { |role| { id: role.prefixed_id, name: role.name } }
|
|
33
35
|
end
|
|
34
36
|
|
|
35
|
-
# Every store this user holds a role on
|
|
36
|
-
#
|
|
37
|
-
#
|
|
38
|
-
#
|
|
39
|
-
#
|
|
40
|
-
# an extra query per user.
|
|
37
|
+
# Every store this user holds a role on — unlike `roles`,
|
|
38
|
+
# deliberately NOT scoped to the current store, so the dashboard
|
|
39
|
+
# store switcher can offer all accessible stores. Read off the same
|
|
40
|
+
# preloaded roles, and deduped/sorted in Ruby, so the staff index
|
|
41
|
+
# spends no extra query per user.
|
|
41
42
|
attribute :stores do |user|
|
|
42
|
-
user.
|
|
43
|
+
stores = user.spree_roles.filter_map { |role| role.resource if role.resource.is_a?(Spree::Store) }
|
|
44
|
+
|
|
45
|
+
stores.uniq.sort_by(&:name).map do |store|
|
|
43
46
|
{ id: store.prefixed_id, name: store.name, code: store.code }
|
|
44
47
|
end
|
|
45
48
|
end
|
|
@@ -12,7 +12,7 @@ module Spree
|
|
|
12
12
|
# via {#plaintext_token} below — it is `nil` everywhere else.
|
|
13
13
|
class ApiKeySerializer < V3::BaseSerializer
|
|
14
14
|
typelize name: :string,
|
|
15
|
-
key_type: :string,
|
|
15
|
+
key_type: [:string, enum: Spree::ApiKey::KEY_TYPES],
|
|
16
16
|
token_prefix: [:string, nullable: true],
|
|
17
17
|
plaintext_token: [:string, nullable: true],
|
|
18
18
|
scopes: [:string, multi: true],
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
class AppliedPromotionSerializer < V3::AppliedPromotionSerializer
|
|
6
|
+
# The Admin API has no guest gating — money fields inherited from the
|
|
7
|
+
# store serializer are always present, so override their nullability.
|
|
8
|
+
typelize amount: [:string, nullable: false], display_amount: [:string, nullable: false]
|
|
9
|
+
|
|
10
|
+
attributes created_at: :iso8601, updated_at: :iso8601
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Spree
|
|
4
|
+
module Api
|
|
5
|
+
module V3
|
|
6
|
+
module Admin
|
|
7
|
+
# Admin Cart serializer — the store shape plus operational timestamps,
|
|
8
|
+
# slimmed to what inspecting an originating cart needs. The cart's
|
|
9
|
+
# fulfillment/payment sub-graphs are pre-conversion duplicates of the
|
|
10
|
+
# order's own and are dropped (they also ballooned the generated type
|
|
11
|
+
# graph past the TypeScript instantiation limit). Kept associations
|
|
12
|
+
# are redeclared with admin counterparts — admin serializers never
|
|
13
|
+
# reference store serializers.
|
|
14
|
+
class CartSerializer < V3::CartSerializer
|
|
15
|
+
%i[fulfillments payments payment_methods gift_card discounts fees].each { |key| _attributes.delete(key) }
|
|
16
|
+
|
|
17
|
+
typelize completed_at: [:string, nullable: true]
|
|
18
|
+
|
|
19
|
+
attributes completed_at: :iso8601, created_at: :iso8601, updated_at: :iso8601
|
|
20
|
+
|
|
21
|
+
many :order_promotions, key: :applied_promotions, resource: proc { Spree.api.admin_applied_promotion_serializer }
|
|
22
|
+
many :line_items, key: :items, resource: proc { Spree.api.admin_line_item_serializer }
|
|
23
|
+
one :billing_address, resource: proc { Spree.api.admin_address_serializer }
|
|
24
|
+
one :shipping_address, resource: proc { Spree.api.admin_address_serializer }
|
|
25
|
+
one :market, resource: proc { Spree.api.admin_market_serializer }
|
|
26
|
+
|
|
27
|
+
# An admin twin, so this package carries its own type rather
|
|
28
|
+
# than importing the store one.
|
|
29
|
+
one :freight_summary, resource: proc { Spree.api.admin_freight_summary_serializer }
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
class CatalogAssignmentSerializer < V3::BaseSerializer
|
|
6
|
+
typelize catalog_id: :string, assignable_type: :string, assignable_id: :string,
|
|
7
|
+
assignable_name: [:string, nullable: true]
|
|
8
|
+
|
|
9
|
+
attributes created_at: :iso8601
|
|
10
|
+
|
|
11
|
+
attribute :catalog_id do |assignment|
|
|
12
|
+
assignment.catalog.prefixed_id
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# The client-facing type vocabulary: 'company', 'customer_group' —
|
|
16
|
+
# never Ruby class names.
|
|
17
|
+
attribute :assignable_type do |assignment|
|
|
18
|
+
assignment.assignable_type.demodulize.underscore
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
attribute :assignable_id do |assignment|
|
|
22
|
+
assignment.assignable&.prefixed_id
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
attribute :assignable_name do |assignment|
|
|
26
|
+
assignment.assignable.try(:name)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
# The least a whole order must come to under a catalog's agreement,
|
|
6
|
+
# in one currency.
|
|
7
|
+
class CatalogOrderMinimumSerializer < V3::BaseSerializer
|
|
8
|
+
typelize currency: :string, amount: :string, display_amount: :string
|
|
9
|
+
|
|
10
|
+
attributes :currency, created_at: :iso8601, updated_at: :iso8601
|
|
11
|
+
|
|
12
|
+
attribute :amount do |minimum|
|
|
13
|
+
minimum.amount.to_s
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
attribute :display_amount do |minimum|
|
|
17
|
+
minimum.display_amount.to_s
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
# What a buyer on one catalog pays for one product, and where that
|
|
6
|
+
# number came from — an explicit amount on the catalog's own list,
|
|
7
|
+
# that list's percentage applied to the base price, or the base price
|
|
8
|
+
# itself, meaning this agreement does not price the product at all
|
|
9
|
+
# (docs/plans/6.0-catalog-agreement-rework.md).
|
|
10
|
+
#
|
|
11
|
+
# Serializes a {Spree::CatalogPrice}, which is resolved rather than
|
|
12
|
+
# stored, so it carries no id.
|
|
13
|
+
class CatalogPriceSerializer < V3::BaseSerializer
|
|
14
|
+
# Resolved rather than stored, so the id is the priced variant's —
|
|
15
|
+
# the thing a client would actually act on. Null on a reading that
|
|
16
|
+
# names no variant.
|
|
17
|
+
_attributes.delete(:id)
|
|
18
|
+
|
|
19
|
+
typelize id: 'string | null', label: 'string | null', sku: 'string | null',
|
|
20
|
+
amount: :string, display_amount: :string,
|
|
21
|
+
currency: :string, source: [:string, enum: Spree::CatalogPrice::SOURCES], break_count: :number
|
|
22
|
+
|
|
23
|
+
# The variant this prices, so a row can name what it is showing —
|
|
24
|
+
# a product's variants can be priced differently, and one figure
|
|
25
|
+
# without a variant beside it names nothing
|
|
26
|
+
# (docs/plans/6.0-volume-pricing.md).
|
|
27
|
+
attribute :id, &:prefixed_id
|
|
28
|
+
|
|
29
|
+
attributes :label, :sku
|
|
30
|
+
|
|
31
|
+
# How many quantity tiers sit above this amount, so the view can say
|
|
32
|
+
# "and three more from a case up" rather than showing one figure as
|
|
33
|
+
# though it were the only one.
|
|
34
|
+
attributes :currency, :source, :break_count
|
|
35
|
+
|
|
36
|
+
attribute :amount, &:display_value
|
|
37
|
+
|
|
38
|
+
attributes :display_amount
|
|
39
|
+
|
|
40
|
+
# The ladder itself, so the agreement page can show what a buyer
|
|
41
|
+
# pays at each threshold without opening the price sheet
|
|
42
|
+
# (docs/plans/6.0-volume-pricing.md).
|
|
43
|
+
many :tiers, resource: proc { Spree.api.admin_catalog_price_tier_serializer }
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
# One rung of a catalog's quantity ladder: from this quantity up, a
|
|
6
|
+
# buyer on this agreement pays this amount
|
|
7
|
+
# (docs/plans/6.0-volume-pricing.md).
|
|
8
|
+
#
|
|
9
|
+
# Serializes a {Spree::CatalogPriceTier}, which is resolved rather
|
|
10
|
+
# than stored, so it carries no id.
|
|
11
|
+
class CatalogPriceTierSerializer < V3::BaseSerializer
|
|
12
|
+
_attributes.delete(:id)
|
|
13
|
+
|
|
14
|
+
typelize min_quantity: :number, amount: :string, display_amount: :string
|
|
15
|
+
|
|
16
|
+
attributes :min_quantity, :display_amount
|
|
17
|
+
|
|
18
|
+
attribute :amount, &:display_value
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
# A product as seen from one catalog: what the membership card renders,
|
|
6
|
+
# plus what a buyer on this agreement actually pays for it and where
|
|
7
|
+
# that number comes from.
|
|
8
|
+
#
|
|
9
|
+
# The rows are expanded rather than always sent, because resolving
|
|
10
|
+
# them costs a query per page that the picker and the plain membership
|
|
11
|
+
# listing have no use for (docs/plans/6.0-catalog-agreement-rework.md).
|
|
12
|
+
# There is deliberately no product-level price: the card prices
|
|
13
|
+
# variants, and a figure on the product row would have to pick one
|
|
14
|
+
# variant to speak for the rest (docs/plans/6.0-volume-pricing.md).
|
|
15
|
+
class CatalogProductSerializer < Admin::MembershipProductSerializer
|
|
16
|
+
typelize quantity_rule: ['CatalogProductTerm', nullable: true]
|
|
17
|
+
|
|
18
|
+
# Priced off the same variant the row's own price is read from, so
|
|
19
|
+
# the agreement's amount and the shop's describe the same offer.
|
|
20
|
+
#
|
|
21
|
+
# Null means nothing prices this variant in this currency at all —
|
|
22
|
+
# distinct from a `base` source, which is a real amount the
|
|
23
|
+
# agreement simply does not touch.
|
|
24
|
+
# This product's quantity terms under the agreement, rolled up from
|
|
25
|
+
# the variant rows the page already loaded. Its own request used to
|
|
26
|
+
# fetch every rule in the catalog unpaginated and group them the
|
|
27
|
+
# same way, which is the same object graph this endpoint holds
|
|
28
|
+
# (docs/plans/6.0-volume-pricing.md).
|
|
29
|
+
attribute :quantity_rule, if: proc { expand?('quantity_rule') } do |product|
|
|
30
|
+
rules = params[:catalog_quantity_rules]&.fetch(product.id, nil)
|
|
31
|
+
|
|
32
|
+
if rules.present?
|
|
33
|
+
term = Spree::Catalogs::ProductTerm.new(product: product, rules: rules)
|
|
34
|
+
Spree.api.admin_catalog_product_term_serializer.new(term, params: params).to_h
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Every variant with what this agreement charges for it. A product's
|
|
39
|
+
# variants can be priced differently — and carry different quantity
|
|
40
|
+
# ladders — so a single figure on the product row names one variant's
|
|
41
|
+
# deal and hides the rest (docs/plans/6.0-volume-pricing.md).
|
|
42
|
+
# `source:` rather than a plain association: the rows are resolved
|
|
43
|
+
# per request against the catalog's price list, which the serializer
|
|
44
|
+
# receives in params rather than the product carrying it.
|
|
45
|
+
many :catalog_variants,
|
|
46
|
+
resource: proc { Spree.api.admin_catalog_price_serializer },
|
|
47
|
+
if: proc { expand?('catalog_price') },
|
|
48
|
+
source: lambda { |params|
|
|
49
|
+
resolver = params[:catalog_price_resolver]
|
|
50
|
+
|
|
51
|
+
variants.filter_map { |variant| resolver&.call(variant) }
|
|
52
|
+
}
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|