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
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Seller
|
|
5
|
+
module Orders
|
|
6
|
+
# Labels on a parcel the seller ships themselves.
|
|
7
|
+
#
|
|
8
|
+
# Recording, printing and deleting are shared with the operator's
|
|
9
|
+
# branch through the concern. Buying and refunding are not: they
|
|
10
|
+
# need the operator's carrier account, so a seller uploads a label
|
|
11
|
+
# bought elsewhere and prints it back.
|
|
12
|
+
#
|
|
13
|
+
# Rooted at the order fetched through `current_seller_orders`, so a
|
|
14
|
+
# fulfillment on somebody else's order reads as missing.
|
|
15
|
+
class LabelsController < BaseController
|
|
16
|
+
include Spree::Api::V3::Orders::ShippingLabelActions
|
|
17
|
+
|
|
18
|
+
before_action :set_resource, only: [:show, :download, :destroy]
|
|
19
|
+
|
|
20
|
+
# POST .../labels
|
|
21
|
+
#
|
|
22
|
+
# Records an uploaded label; a request without a file is refused,
|
|
23
|
+
# since purchase is the operator's.
|
|
24
|
+
def create
|
|
25
|
+
authorize!(:create, Spree::ShippingLabel)
|
|
26
|
+
|
|
27
|
+
if label_params[:file].blank?
|
|
28
|
+
return render_error(
|
|
29
|
+
code: ERROR_CODES[:validation_error],
|
|
30
|
+
message: Spree.t('shipping_labels.errors.file_required'),
|
|
31
|
+
status: :unprocessable_content
|
|
32
|
+
)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
record_uploaded_label
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
protected
|
|
39
|
+
|
|
40
|
+
def serializer_class
|
|
41
|
+
Spree.api.seller_shipping_label_serializer
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# The labels and consignments hang off the fulfillment, not the
|
|
45
|
+
# order, so the parent is narrowed one step past the base's.
|
|
46
|
+
def set_parent
|
|
47
|
+
super
|
|
48
|
+
@parent = @order.fulfillments.find_by_prefix_id!(params[:fulfillment_id])
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Seller
|
|
5
|
+
module Orders
|
|
6
|
+
# The notes on one of this seller's orders: the instructions the
|
|
7
|
+
# buyer left, and the seller's own working note.
|
|
8
|
+
#
|
|
9
|
+
# A marketplace basket splits into one order per seller, so the
|
|
10
|
+
# internal note on this row is the seller's alone — never the
|
|
11
|
+
# operator's note about the whole sale.
|
|
12
|
+
#
|
|
13
|
+
# Singular, because an order has one set of notes: reading and
|
|
14
|
+
# writing them is a resource rather than a verb on the order.
|
|
15
|
+
class NotesController < BaseController
|
|
16
|
+
# The notes are columns on the order, not a nested collection, so
|
|
17
|
+
# there is no member record to fetch.
|
|
18
|
+
skip_before_action :set_resource, raise: false
|
|
19
|
+
|
|
20
|
+
# GET /api/v3/seller/orders/:order_id/notes
|
|
21
|
+
def show
|
|
22
|
+
render json: serialize_resource(@order)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# PATCH /api/v3/seller/orders/:order_id/notes
|
|
26
|
+
#
|
|
27
|
+
# Send only the note that changes: an absent key leaves the other
|
|
28
|
+
# alone, while an empty string clears it.
|
|
29
|
+
def update
|
|
30
|
+
attributes = notes_params
|
|
31
|
+
return render_validation_error(missing_notes_errors) if attributes.empty?
|
|
32
|
+
|
|
33
|
+
if @order.update(attributes)
|
|
34
|
+
render json: serialize_resource(@order.reload)
|
|
35
|
+
else
|
|
36
|
+
render_validation_error(@order.errors)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
protected
|
|
41
|
+
|
|
42
|
+
def model_class
|
|
43
|
+
Spree::Order
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# The whole order, so a client refreshing a note gets the same
|
|
47
|
+
# shape it renders the page from.
|
|
48
|
+
def serializer_class
|
|
49
|
+
Spree.api.seller_order_serializer
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def read_actions
|
|
53
|
+
%w[show]
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
private
|
|
57
|
+
|
|
58
|
+
# The rich-text note is written through `internal_note`, which the
|
|
59
|
+
# model sanitizes — the `_html` reader is its round-trip partner,
|
|
60
|
+
# never a write.
|
|
61
|
+
def notes_params
|
|
62
|
+
permitted = params.permit(:customer_note, :internal_note)
|
|
63
|
+
|
|
64
|
+
{}.tap do |attributes|
|
|
65
|
+
attributes[:customer_note] = permitted[:customer_note] if params.key?(:customer_note)
|
|
66
|
+
attributes[:internal_note] = permitted[:internal_note] if params.key?(:internal_note)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# A request naming neither note has asked for nothing; saying so
|
|
71
|
+
# beats a 200 that changed nothing.
|
|
72
|
+
def missing_notes_errors
|
|
73
|
+
ActiveModel::Errors.new(@order).tap do |errors|
|
|
74
|
+
errors.add(:base, :blank, message: 'customer_note or internal_note is required')
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Seller
|
|
5
|
+
module Orders
|
|
6
|
+
# Goods coming back on one of this seller's orders.
|
|
7
|
+
#
|
|
8
|
+
# Every status move reuses the operator's workflow, shared through
|
|
9
|
+
# the concern, so restocking, the tax credit, the refund and the
|
|
10
|
+
# ledger reversal all happen exactly as they do when the marketplace
|
|
11
|
+
# handles the return itself. What is here is what makes it the
|
|
12
|
+
# seller's: the order comes from `current_seller_orders`, so a
|
|
13
|
+
# return on somebody else's order reads as missing rather than
|
|
14
|
+
# denied, and the goods go back onto the seller's own shelf.
|
|
15
|
+
class ReturnsController < BaseController
|
|
16
|
+
include Spree::Api::V3::Orders::ReturnActions
|
|
17
|
+
|
|
18
|
+
before_action :set_resource, only: [:show, :approve, :receive, :refund, :cancel]
|
|
19
|
+
|
|
20
|
+
protected
|
|
21
|
+
|
|
22
|
+
def serializer_class
|
|
23
|
+
Spree.api.seller_return_serializer
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def collection_includes
|
|
27
|
+
[:reason, :stock_location, { return_line_items: [:variant, :line_item] }]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
# The seller's own shelves: returned goods go back into the stock
|
|
33
|
+
# the seller sells from, never a marketplace warehouse.
|
|
34
|
+
def stock_location_for_create
|
|
35
|
+
return nil if create_params[:stock_location_id].blank?
|
|
36
|
+
|
|
37
|
+
current_seller.stock_locations.find_by_prefix_id!(create_params[:stock_location_id])
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Seller
|
|
5
|
+
# The orders placed with this seller.
|
|
6
|
+
#
|
|
7
|
+
# On a marketplace a basket spanning several sellers is split into one
|
|
8
|
+
# order each, so a seller's orders are their own rows — not a filtered
|
|
9
|
+
# view of somebody else's. The anchor roots `scope` in
|
|
10
|
+
# `current_seller.orders`, so an id belonging to another seller reads
|
|
11
|
+
# as missing rather than denied. Drafts are not this seller's either —
|
|
12
|
+
# neither an in-flight checkout nor the operator's working document —
|
|
13
|
+
# and are unreachable from every endpoint on this branch.
|
|
14
|
+
#
|
|
15
|
+
# Read, cancel, and correct an address. Fulfilling is the
|
|
16
|
+
# fulfillments endpoint under the order, and everything that settles
|
|
17
|
+
# money with the customer — approving, resuming, refunds, payments —
|
|
18
|
+
# stays with the operator, who owns that relationship.
|
|
19
|
+
class OrdersController < Seller::ResourceController
|
|
20
|
+
include Spree::Api::V3::OrderLock
|
|
21
|
+
|
|
22
|
+
scoped_resource :orders
|
|
23
|
+
|
|
24
|
+
before_action :set_resource, only: [:show, :cancel, :address]
|
|
25
|
+
|
|
26
|
+
# PATCH /api/v3/seller/orders/:id/cancel
|
|
27
|
+
#
|
|
28
|
+
# A seller withdrawing from an order they cannot fulfil, naming a
|
|
29
|
+
# reason from the marketplace's own list.
|
|
30
|
+
#
|
|
31
|
+
# `refund_payments` hands back what the buyer paid for these goods.
|
|
32
|
+
# A seller is merchant of record for their own child order, so the
|
|
33
|
+
# party who owes that money back is the party who took it — and on a
|
|
34
|
+
# split checkout the workflow settles through this order's own
|
|
35
|
+
# payment splits, capped at each share, so a seller can never reach
|
|
36
|
+
# a sibling's money.
|
|
37
|
+
#
|
|
38
|
+
# Deliberately takes no `refund_amount`: withdrawing from the whole
|
|
39
|
+
# order returns what that order was paid, and a seller choosing a
|
|
40
|
+
# partial figure is a return, which has its own endpoint and its own
|
|
41
|
+
# bound.
|
|
42
|
+
def cancel
|
|
43
|
+
with_order_lock do
|
|
44
|
+
result = Spree.order_cancel_workflow.call(
|
|
45
|
+
order: @resource,
|
|
46
|
+
canceler: try_spree_current_user,
|
|
47
|
+
reason: cancel_reason,
|
|
48
|
+
note: params[:cancel_note].presence,
|
|
49
|
+
refund_payments: params[:refund_payments].to_b,
|
|
50
|
+
notify_customer: params[:notify_customer].to_b
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
if result.success?
|
|
54
|
+
render json: serialize_resource(@resource.reload)
|
|
55
|
+
else
|
|
56
|
+
render_service_error(@resource.errors.presence || result.error)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# PATCH /api/v3/seller/orders/:id/address
|
|
62
|
+
#
|
|
63
|
+
# Corrects where the goods go or who the invoice names. The seller is
|
|
64
|
+
# merchant of record for their own child order, so a delivery address
|
|
65
|
+
# the buyer got wrong is theirs to fix.
|
|
66
|
+
#
|
|
67
|
+
# Its own action rather than a general PATCH: an order's terms are
|
|
68
|
+
# the marketplace's, and a write that took whatever the serializer
|
|
69
|
+
# permits would quietly grow into one a seller could reprice with.
|
|
70
|
+
def address
|
|
71
|
+
# Checked before the lock: an empty payload needs no serialization,
|
|
72
|
+
# and returning out of a locked block is worth avoiding.
|
|
73
|
+
return render_validation_error(missing_address_errors) if sent_addresses.blank?
|
|
74
|
+
|
|
75
|
+
# The merge reads the address it is about to replace, so it runs
|
|
76
|
+
# under the order's lock: two corrections landing together would
|
|
77
|
+
# each lay their fields over the same snapshot, and the later one
|
|
78
|
+
# would undo the earlier one's lines.
|
|
79
|
+
with_order_lock do
|
|
80
|
+
if @resource.update(address_params)
|
|
81
|
+
render json: serialize_resource(@resource.reload)
|
|
82
|
+
else
|
|
83
|
+
render_validation_error(@resource.errors)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
protected
|
|
89
|
+
|
|
90
|
+
def model_class
|
|
91
|
+
Spree::Order
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def serializer_class
|
|
95
|
+
Spree.api.seller_order_serializer
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def read_actions
|
|
99
|
+
%w[index show]
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# The same exclusion the nested endpoints get from
|
|
103
|
+
# `current_seller_orders`, applied over the inherited scope so its
|
|
104
|
+
# includes and preloading survive.
|
|
105
|
+
def scope
|
|
106
|
+
super.not_drafts
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def collection_includes
|
|
110
|
+
[:line_items, :customer, :channel]
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
private
|
|
114
|
+
|
|
115
|
+
# Either address, as a correction rather than a replacement: the
|
|
116
|
+
# sent fields are laid over what the order already holds, so a
|
|
117
|
+
# request naming one line does not blank out the country and
|
|
118
|
+
# postcode beside it. The nested writer builds a fresh address row
|
|
119
|
+
# either way, which is what keeps a shared customer address book
|
|
120
|
+
# entry from being rewritten by an order-level fix.
|
|
121
|
+
def sent_addresses
|
|
122
|
+
@sent_addresses ||= params.permit(
|
|
123
|
+
shipping_address: address_permitted_keys,
|
|
124
|
+
billing_address: address_permitted_keys
|
|
125
|
+
).slice(:shipping_address, :billing_address).reject { |_key, value| value.blank? }
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def address_params
|
|
129
|
+
permitted = sent_addresses
|
|
130
|
+
|
|
131
|
+
{}.tap do |attributes|
|
|
132
|
+
if permitted[:shipping_address].present?
|
|
133
|
+
attributes[:ship_address_attributes] =
|
|
134
|
+
merged_address(@resource.ship_address, permitted[:shipping_address])
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
if permitted[:billing_address].present?
|
|
138
|
+
attributes[:bill_address_attributes] =
|
|
139
|
+
merged_address(@resource.bill_address, permitted[:billing_address])
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def merged_address(address, sent)
|
|
145
|
+
current = address ? address.attributes.slice(*address_attribute_names) : {}
|
|
146
|
+
current.merge(sent.to_h)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# The permitted keys that are real columns; the rest are the writer
|
|
150
|
+
# aliases a client may send, which have no value to carry over.
|
|
151
|
+
def address_attribute_names
|
|
152
|
+
@address_attribute_names ||=
|
|
153
|
+
address_permitted_keys.map(&:to_s) & Spree::Address.column_names
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def address_permitted_keys
|
|
157
|
+
[
|
|
158
|
+
:firstname, :lastname, :first_name, :last_name,
|
|
159
|
+
:address1, :address2, :city,
|
|
160
|
+
:country_code, :state_code,
|
|
161
|
+
:zipcode, :postal_code, :phone, :alternative_phone,
|
|
162
|
+
:state_name, :company, :label
|
|
163
|
+
]
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# A request naming neither address has asked for nothing; saying so
|
|
167
|
+
# beats a 200 that changed nothing.
|
|
168
|
+
def missing_address_errors
|
|
169
|
+
ActiveModel::Errors.new(@resource).tap do |errors|
|
|
170
|
+
errors.add(:base, :blank, message: 'shipping_address or billing_address is required')
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
# The reason a seller picked, resolved through the store's own list so
|
|
175
|
+
# a reason belonging to another store reads as missing. Optional —
|
|
176
|
+
# the workflow accepts a cancellation with none.
|
|
177
|
+
def cancel_reason
|
|
178
|
+
id = params[:cancel_reason_id].presence
|
|
179
|
+
return if id.nil?
|
|
180
|
+
|
|
181
|
+
current_store.order_cancellation_reasons.find_by_prefix_id!(id)
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def set_resource
|
|
185
|
+
@resource = find_resource
|
|
186
|
+
@order = @resource # OrderLock reads this
|
|
187
|
+
authorize_resource!(@resource)
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
# Cancelling and correcting an address are both changes to the
|
|
191
|
+
# order, so they need the write key rather than a key of their own.
|
|
192
|
+
def authorize_resource!(resource = @resource, action = action_name.to_sym)
|
|
193
|
+
authorize!(%i[cancel address].include?(action) ? :update : action, resource)
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
end
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Seller
|
|
5
|
+
# What this seller packs their goods into: the boxes their parcels
|
|
6
|
+
# ship in, the cartons their products are packed into, the pallets a
|
|
7
|
+
# wholesale order leaves on (docs/plans/6.0-seller-package-types.md).
|
|
8
|
+
#
|
|
9
|
+
# The listing also carries the marketplace's own packaging, so a
|
|
10
|
+
# seller can pack into the operator's standard cartons rather than
|
|
11
|
+
# re-measuring them. Those rows are read-only: `find_resource` roots
|
|
12
|
+
# writes in the seller's own packaging, so a marketplace row's id is a
|
|
13
|
+
# 404 on every action but `show`.
|
|
14
|
+
#
|
|
15
|
+
# Marking a row default makes it the box this seller's parcels are
|
|
16
|
+
# quoted with — one default per owner, so it never displaces the
|
|
17
|
+
# marketplace's.
|
|
18
|
+
class PackageTypesController < Seller::ResourceController
|
|
19
|
+
scoped_resource :package_types
|
|
20
|
+
|
|
21
|
+
protected
|
|
22
|
+
|
|
23
|
+
def model_class
|
|
24
|
+
Spree::PackageType
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def serializer_class
|
|
28
|
+
Spree.api.seller_package_type_serializer
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Reading shows the seller's own packaging plus the marketplace's —
|
|
32
|
+
# the same set their variants may reference, so a carton picker can
|
|
33
|
+
# ask "what can I pack into" rather than only "what have I
|
|
34
|
+
# measured".
|
|
35
|
+
#
|
|
36
|
+
# `owner=mine` narrows it to the seller's own rows. The packaging
|
|
37
|
+
# settings page asks for that, because a list mixing both owners
|
|
38
|
+
# reads as "packaging is configured" while the seller has recorded
|
|
39
|
+
# nothing — the shipping-box requirement then looks broken rather
|
|
40
|
+
# than outstanding. Not a Ransack predicate: `available_to_seller`
|
|
41
|
+
# composes with `.or()`, so a filter on `seller_id` widens back out
|
|
42
|
+
# to the whole condition instead of narrowing it.
|
|
43
|
+
def scope
|
|
44
|
+
rows = current_store.package_types
|
|
45
|
+
rows = params[:owner] == 'mine' ? rows.for_seller(current_seller) : rows.available_to_seller(current_seller)
|
|
46
|
+
rows.preload_associations_lazily
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Writes root in the seller's own rows, so the marketplace's
|
|
50
|
+
# packaging cannot be edited or deleted through this branch.
|
|
51
|
+
def resource_scope
|
|
52
|
+
current_seller.package_types
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def find_resource
|
|
56
|
+
action_name == 'show' ? super : resource_scope.find_by_prefix_id!(params[:id])
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# No DISTINCT, so the owner ordering below is legal on PostgreSQL:
|
|
60
|
+
# it rejects an ORDER BY expression that is not in the select list
|
|
61
|
+
# of a SELECT DISTINCT, and `available_to_seller` makes the query
|
|
62
|
+
# distinct through `.or()`. Nothing here needs it — one table, no
|
|
63
|
+
# joins, so no row can appear twice.
|
|
64
|
+
def collection_distinct?
|
|
65
|
+
false
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# The seller's own rows before the marketplace's, then by name.
|
|
69
|
+
#
|
|
70
|
+
# This list holds two owners' packaging, so it has roughly twice as
|
|
71
|
+
# much to fit under the 100-row page limit as the operator's does.
|
|
72
|
+
# Ordering here rather than in the client is what makes the limit
|
|
73
|
+
# cut the shared rows instead of the seller's own measurements —
|
|
74
|
+
# the page is taken before anything client-side can reorder it.
|
|
75
|
+
# Ransack cannot express it: it drops the direction on `seller_id`,
|
|
76
|
+
# and NULLs sort first ascending.
|
|
77
|
+
#
|
|
78
|
+
# Skipped when the caller asked for its own order.
|
|
79
|
+
def apply_collection_sort(collection)
|
|
80
|
+
return collection if params[:sort].present?
|
|
81
|
+
|
|
82
|
+
collection.order(
|
|
83
|
+
Arel.sql('CASE WHEN seller_id IS NULL THEN 1 ELSE 0 END'),
|
|
84
|
+
Spree::PackageType.arel_table[:name].asc
|
|
85
|
+
)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# The same set the operator's controller permits — a seller measures
|
|
89
|
+
# their own packaging, so every field on the shared form is theirs
|
|
90
|
+
# to set. `seller_id` is deliberately absent: ownership comes from
|
|
91
|
+
# the authenticated seller, never the payload.
|
|
92
|
+
def resource_permitted_attributes
|
|
93
|
+
[:name, :kind, :length, :width, :height, :dimensions_unit,
|
|
94
|
+
:weight, :max_weight, :weight_unit, :default, { metadata: {} }]
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Spree
|
|
4
|
+
module Api
|
|
5
|
+
module V3
|
|
6
|
+
module Seller
|
|
7
|
+
# Password reset for the marketplace seller panel.
|
|
8
|
+
#
|
|
9
|
+
# Parallel to the admin controller rather than a subclass of it, per
|
|
10
|
+
# Decision 10: what differs is the audience it issues and the panel the
|
|
11
|
+
# emailed link opens, and both are the point. A seller resetting their
|
|
12
|
+
# password must end up with a seller session on the seller panel, never
|
|
13
|
+
# an admin one on the dashboard.
|
|
14
|
+
class PasswordResetsController < Spree::Api::V3::BaseController
|
|
15
|
+
include Spree::Api::V3::Seller::AuthCookies
|
|
16
|
+
include Spree::Api::V3::JwtAuthentication
|
|
17
|
+
|
|
18
|
+
# No `skip_scope_check!`: this extends the plain v3 base, which has
|
|
19
|
+
# no authentication or scope gate to lift. The emailed token is the
|
|
20
|
+
# only credential, exactly as on the admin twin.
|
|
21
|
+
rate_limit to: Spree::Api::Config[:rate_limit_password_reset],
|
|
22
|
+
within: Spree::Api::Config[:rate_limit_window].seconds,
|
|
23
|
+
store: Rails.cache,
|
|
24
|
+
with: RATE_LIMIT_RESPONSE
|
|
25
|
+
|
|
26
|
+
# POST /api/v3/seller/auth/password_resets
|
|
27
|
+
def create
|
|
28
|
+
user = Spree.admin_user_class.find_by(email: params[:email])
|
|
29
|
+
|
|
30
|
+
# Staff share this user class, so a match is not enough: a store
|
|
31
|
+
# admin who runs no seller has no panel to be sent to, and mailing
|
|
32
|
+
# them a seller reset link would be an invitation to a session they
|
|
33
|
+
# cannot hold.
|
|
34
|
+
if user&.seller_member?
|
|
35
|
+
user.publish_event('seller_user.password_reset_requested', event_payload(user))
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Always 202, whether or not anything matched — this endpoint must
|
|
39
|
+
# not become a way to discover which addresses exist.
|
|
40
|
+
render json: { message: Spree.t(:password_reset_requested, scope: :api) }, status: :accepted
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# PATCH /api/v3/seller/auth/password_resets/:id
|
|
44
|
+
def update
|
|
45
|
+
user = Spree.admin_user_class.find_by_password_reset_token(params[:id])
|
|
46
|
+
|
|
47
|
+
# Membership is re-checked here rather than trusted from the token:
|
|
48
|
+
# it can be revoked between the email being sent and the link being
|
|
49
|
+
# opened, and signing in is what the success path does.
|
|
50
|
+
return render_token_invalid unless user&.seller_member?
|
|
51
|
+
|
|
52
|
+
unless user.update(password: params[:password], password_confirmation: params[:password_confirmation])
|
|
53
|
+
return render_errors(user.errors)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
user.publish_event('seller_user.password_reset')
|
|
57
|
+
|
|
58
|
+
# A reset must kill every existing session — a stolen refresh token
|
|
59
|
+
# must not survive the victim resetting their password. Revoked
|
|
60
|
+
# across every audience, since the password is what they all rest
|
|
61
|
+
# on. Then mint the fresh one for this browser.
|
|
62
|
+
Spree::RefreshToken.revoke_all_for(user)
|
|
63
|
+
set_refresh_cookie(
|
|
64
|
+
Spree::RefreshToken.create_for(
|
|
65
|
+
user,
|
|
66
|
+
audience: Spree::Api::V3::JwtAuthentication::JWT_AUDIENCE_SELLER,
|
|
67
|
+
request_env: request_env_for_token
|
|
68
|
+
)
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
render json: auth_response(user)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
private
|
|
75
|
+
|
|
76
|
+
# A token that no longer belongs to a seller is reported exactly as an
|
|
77
|
+
# expired or forged one: the caller is unauthenticated either way, and
|
|
78
|
+
# distinguishing them would leak that the address is a real account.
|
|
79
|
+
def render_token_invalid
|
|
80
|
+
render_error(
|
|
81
|
+
code: ErrorHandler::ERROR_CODES[:password_reset_token_invalid],
|
|
82
|
+
message: Spree.t(:password_reset_token_invalid, scope: :api),
|
|
83
|
+
status: :unprocessable_content
|
|
84
|
+
)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# The store is carried on the event so the mailer can resolve the
|
|
88
|
+
# right panel origin and locale without a request to read them from.
|
|
89
|
+
def event_payload(user)
|
|
90
|
+
store = seller_store(user)
|
|
91
|
+
payload = {
|
|
92
|
+
reset_token: user.generate_token_for(:password_reset),
|
|
93
|
+
email: user.email,
|
|
94
|
+
store_id: store&.prefixed_id
|
|
95
|
+
}
|
|
96
|
+
redirect_url = validated_redirect_url(store)
|
|
97
|
+
payload[:redirect_url] = redirect_url if redirect_url.present?
|
|
98
|
+
payload
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Which store's panel to send them to.
|
|
102
|
+
#
|
|
103
|
+
# Derived from the seller, never from `current_store`: this endpoint
|
|
104
|
+
# is unauthenticated, so the request carries no seller header and
|
|
105
|
+
# `current_store` is simply the default store — which on a
|
|
106
|
+
# multi-store install is the wrong marketplace entirely. The seller
|
|
107
|
+
# branch's rule is that the store follows the seller.
|
|
108
|
+
def seller_store(user)
|
|
109
|
+
user.sellers.first&.store
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Honoured only when it points somewhere the seller's own store has
|
|
113
|
+
# vouched for. An unvalidated value would let anyone with the reset
|
|
114
|
+
# form turn this endpoint into a token-exfiltration channel, and
|
|
115
|
+
# judging it against the default store's allowlist would let one
|
|
116
|
+
# marketplace's origins approve a link mailed to another's seller.
|
|
117
|
+
# Dropping it leaves the mailer to resolve the panel origin itself.
|
|
118
|
+
def validated_redirect_url(store)
|
|
119
|
+
url = params[:redirect_url].presence
|
|
120
|
+
return unless url && store
|
|
121
|
+
return unless store.allowed_origins.exists? && store.allowed_origin?(url)
|
|
122
|
+
|
|
123
|
+
url
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# Same shape as the login response, so the panel can sign them
|
|
127
|
+
# straight in rather than bouncing them to a login form.
|
|
128
|
+
def auth_response(user)
|
|
129
|
+
{
|
|
130
|
+
token: generate_jwt(user, audience: Spree::Api::V3::JwtAuthentication::JWT_AUDIENCE_SELLER),
|
|
131
|
+
user: Spree.api.seller_team_member_serializer.new(
|
|
132
|
+
user, params: { store: seller_store(user) }
|
|
133
|
+
).to_h,
|
|
134
|
+
sellers: serialized_sellers(user)
|
|
135
|
+
}
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# The panel needs these to choose an X-Spree-Seller-Id before it can
|
|
139
|
+
# make any other request.
|
|
140
|
+
def serialized_sellers(user)
|
|
141
|
+
user.sellers.map { |seller| { id: seller.prefixed_id, name: seller.name, status: seller.status } }
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def request_env_for_token
|
|
145
|
+
{ ip_address: request.remote_ip, user_agent: request.user_agent&.truncate(255) }
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def jwt_expiration
|
|
149
|
+
Spree::Api::Config[:admin_jwt_expiration]
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Seller
|
|
5
|
+
# Settlements to this seller — what has been sent, and what is owed.
|
|
6
|
+
#
|
|
7
|
+
# Read-only: a payout is created by the sweep and confirmed by the
|
|
8
|
+
# provider or the operator, never by the seller.
|
|
9
|
+
class PayoutsController < Seller::ResourceController
|
|
10
|
+
scoped_resource :seller_earnings
|
|
11
|
+
|
|
12
|
+
protected
|
|
13
|
+
|
|
14
|
+
def model_class
|
|
15
|
+
Spree::SellerPayout
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def serializer_class
|
|
19
|
+
Spree.api.seller_payout_serializer
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def scope
|
|
23
|
+
super.order(created_at: :desc)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# See TransfersController: the model class is the operator's subject.
|
|
27
|
+
def authorize_resource!(_resource = @resource, action = action_name.to_sym)
|
|
28
|
+
authorize!(action, :seller_earnings)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# One grouped count for the page rather than a query per settlement
|
|
32
|
+
# (the sweep claims transfers with `update_all`, so no counter column
|
|
33
|
+
# could stay right). A single payout read asks for its own.
|
|
34
|
+
def serializer_params
|
|
35
|
+
return super unless action_name == 'index'
|
|
36
|
+
|
|
37
|
+
super.merge(transfer_counts: transfer_counts)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def transfer_counts
|
|
41
|
+
@transfer_counts ||= Spree::SellerTransfer.where(payout_id: collection.map(&:id)).group(:payout_id).count
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|