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,95 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
# The semantic reporting surface (docs/plans/6.0-analytics-semantic-layer.md):
|
|
6
|
+
# one query endpoint compiled against the Spree.reporting registry, plus
|
|
7
|
+
# registry introspection for pickers and agent tool schemas.
|
|
8
|
+
class ReportingController < Admin::BaseController
|
|
9
|
+
include ReportingAuthorization
|
|
10
|
+
|
|
11
|
+
scoped_resource :reports
|
|
12
|
+
|
|
13
|
+
rescue_from Spree::Reporting::UnknownMember, Spree::Reporting::InvalidQuery, with: :render_invalid_query
|
|
14
|
+
|
|
15
|
+
QUERY_KEYS = %w[metrics dimensions filters metric_filters time_range compare sort limit currency].freeze
|
|
16
|
+
|
|
17
|
+
# POST /api/v3/admin/reporting/query
|
|
18
|
+
def query
|
|
19
|
+
reporting_query = Spree::Reporting::Query.new(store: current_store, params: query_params)
|
|
20
|
+
authorize_reporting_members!(reporting_query)
|
|
21
|
+
return if performed?
|
|
22
|
+
|
|
23
|
+
result = reporting_query.execute
|
|
24
|
+
|
|
25
|
+
render json: ReportingResultSerializer.new(
|
|
26
|
+
result,
|
|
27
|
+
store: current_store,
|
|
28
|
+
params: serializer_params
|
|
29
|
+
).to_h
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# GET /api/v3/admin/reporting/schema
|
|
33
|
+
#
|
|
34
|
+
# Filtered to what this caller may reference: pickers never offer,
|
|
35
|
+
# and agents never propose, a member that would be refused.
|
|
36
|
+
def schema
|
|
37
|
+
render json: Spree::Reporting::Schema.new(
|
|
38
|
+
store: current_store,
|
|
39
|
+
allowed: ->(member) { member_allowed?(member) }
|
|
40
|
+
).to_h
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
private
|
|
44
|
+
|
|
45
|
+
def action_kind
|
|
46
|
+
'read'
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# The contract owns shape validation (registry allowlist, loud
|
|
50
|
+
# rejection of unknown members) — nothing here is mass-assigned to a
|
|
51
|
+
# model, so strong-params filtering would only duplicate it.
|
|
52
|
+
def query_params
|
|
53
|
+
params.to_unsafe_h.slice(*QUERY_KEYS)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Both credential types are authorized per referenced member:
|
|
57
|
+
# JWT admins via CanCanCan (`required_subjects`), secret keys via
|
|
58
|
+
# their scopes (`required_key_scopes` on top of the `read_reports`
|
|
59
|
+
# endpoint gate) — a key without `read_products` cannot query the
|
|
60
|
+
# product dimension any more than a limited staff role can.
|
|
61
|
+
def authorize_reporting_members!(reporting_query)
|
|
62
|
+
if current_api_key.present?
|
|
63
|
+
missing = reporting_query.required_key_scopes.reject { |scope| current_api_key.has_scope?(scope) }
|
|
64
|
+
return if missing.empty?
|
|
65
|
+
|
|
66
|
+
render_error(
|
|
67
|
+
code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:access_denied],
|
|
68
|
+
message: "API key lacks scope: #{missing.join(', ')}",
|
|
69
|
+
status: :forbidden,
|
|
70
|
+
details: { required_scopes: missing }
|
|
71
|
+
)
|
|
72
|
+
else
|
|
73
|
+
authorize!(:read, :reports)
|
|
74
|
+
forbidden = reporting_query.unreadable_subjects(current_ability).first
|
|
75
|
+
raise CanCan::AccessDenied.new(nil, :read, forbidden) if forbidden
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# An unknown member carries what it was and what was valid instead.
|
|
80
|
+
# Passing those through as `details` lets a client correct the query
|
|
81
|
+
# without parsing the sentence — the same list the schema endpoint
|
|
82
|
+
# would have given it.
|
|
83
|
+
def render_invalid_query(error)
|
|
84
|
+
details = if error.is_a?(Spree::Reporting::UnknownMember)
|
|
85
|
+
{ kind: error.kind, name: error.name.to_s, valid: error.valid.map(&:to_s) }
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
render_error(code: 'invalid_reporting_query', message: error.message,
|
|
89
|
+
status: :unprocessable_content, details: details)
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
@@ -6,8 +6,17 @@ module Spree
|
|
|
6
6
|
# inheritance branches (V3::BaseController vs V3::ResourceController);
|
|
7
7
|
# any concern added here MUST also be added to Admin::BaseController.
|
|
8
8
|
class ResourceController < Spree::Api::V3::ResourceController
|
|
9
|
+
include Spree::Api::V3::Admin::StoreContext
|
|
9
10
|
include Spree::Api::V3::AdminAuthentication
|
|
10
11
|
include Spree::Api::V3::ScopedAuthorization
|
|
12
|
+
# External-identity addressing for every admin resource whose model
|
|
13
|
+
# opts in via Spree::HasExternalReferences — the concern's guards
|
|
14
|
+
# no-op for everything else. Sitting here rather than per controller
|
|
15
|
+
# means a newly synced resource cannot ship the half-supported state
|
|
16
|
+
# (readable references, unaddressable member paths) by forgetting an
|
|
17
|
+
# include.
|
|
18
|
+
include Spree::Api::V3::Admin::Concerns::ExternalReferences
|
|
19
|
+
include Spree::Api::V3::Admin::ValidationDetails
|
|
11
20
|
|
|
12
21
|
protected
|
|
13
22
|
|
|
@@ -15,19 +24,27 @@ module Spree
|
|
|
15
24
|
authenticate_admin!
|
|
16
25
|
end
|
|
17
26
|
|
|
18
|
-
#
|
|
19
|
-
#
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
27
|
+
# CanCanCan lives on the admin branch only. The shared base leaves
|
|
28
|
+
# these as no-ops because the Store API authorizes by ownership
|
|
29
|
+
# scoping; back-office callers are authorized per record and per
|
|
30
|
+
# collection by their role's catalog keys.
|
|
31
|
+
def scope
|
|
32
|
+
base_scope = super
|
|
33
|
+
return base_scope if @parent.present?
|
|
23
34
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
35
|
+
base_scope.accessible_by(current_ability, ability_action_for_request)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def authorize_resource!(resource = @resource, action = action_name.to_sym)
|
|
39
|
+
authorize!(action, resource)
|
|
29
40
|
end
|
|
30
41
|
|
|
42
|
+
def authorize_parent!(parent)
|
|
43
|
+
authorize!(parent_ability_action, parent)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Render error from ServiceModule::Result, extracting ActiveModel::Errors
|
|
47
|
+
# from the ResultError wrapper to get proper validation_error responses.
|
|
31
48
|
def decode_ids(ids, klass)
|
|
32
49
|
Array(ids).map do |id|
|
|
33
50
|
Spree::PrefixedId.prefixed_id?(id) ? klass.find_by_param!(id).id : id
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
class ReturnReasonsController < ResourceController
|
|
6
|
+
scoped_resource :settings
|
|
7
|
+
|
|
8
|
+
protected
|
|
9
|
+
|
|
10
|
+
def model_class
|
|
11
|
+
Spree::ReturnReason
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def serializer_class
|
|
15
|
+
Spree.api.admin_return_reason_serializer
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def permitted_params
|
|
19
|
+
params.permit(*model_additional_permitted_attributes, :name, :active)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
# Cross-order listing of returns — "what is awaiting receipt across
|
|
6
|
+
# the whole store". Read-only by route: opening a return needs an
|
|
7
|
+
# order, so creation and the status transitions stay on the nested
|
|
8
|
+
# Orders::ReturnsController.
|
|
9
|
+
class ReturnsController < ResourceController
|
|
10
|
+
# Post-sale records are order data: a key that may read orders may
|
|
11
|
+
# read these, and nothing here writes.
|
|
12
|
+
scoped_resource :orders
|
|
13
|
+
|
|
14
|
+
protected
|
|
15
|
+
|
|
16
|
+
def model_class
|
|
17
|
+
Spree::Return
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def serializer_class
|
|
21
|
+
Spree.api.admin_return_serializer
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def collection_includes
|
|
25
|
+
[:order, :reason, :stock_location, { return_line_items: :variant }]
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -2,12 +2,32 @@ module Spree
|
|
|
2
2
|
module Api
|
|
3
3
|
module V3
|
|
4
4
|
module Admin
|
|
5
|
-
#
|
|
6
|
-
#
|
|
7
|
-
#
|
|
8
|
-
#
|
|
5
|
+
# Staff roles and their catalog permissions (docs/plans/6.0-admin-rbac.md).
|
|
6
|
+
# A role belongs to what it governs, so this surface reads and writes
|
|
7
|
+
# the current store's own roles; one owned by another resource — a
|
|
8
|
+
# marketplace seller's — belongs to that panel. Protection of the admin
|
|
9
|
+
# role and host-locked rows lives on the model (`mutable` guards,
|
|
10
|
+
# `can_be_deleted?`).
|
|
9
11
|
class RolesController < ResourceController
|
|
10
|
-
|
|
12
|
+
include Spree::Api::V3::Admin::RoleGrantGuard
|
|
13
|
+
|
|
14
|
+
scoped_resource :staff
|
|
15
|
+
|
|
16
|
+
# POST /api/v3/admin/roles
|
|
17
|
+
# A caller may only grant permissions they effectively hold — the
|
|
18
|
+
# same anti-amplification rule as role grants and API-key minting.
|
|
19
|
+
def create
|
|
20
|
+
return if reject_unauthorized_permission_grant!(requested_permissions)
|
|
21
|
+
|
|
22
|
+
super
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# PATCH /api/v3/admin/roles/:id
|
|
26
|
+
def update
|
|
27
|
+
return if params.key?(:permissions) && reject_unauthorized_permission_grant!(requested_permissions)
|
|
28
|
+
|
|
29
|
+
super
|
|
30
|
+
end
|
|
11
31
|
|
|
12
32
|
protected
|
|
13
33
|
|
|
@@ -19,8 +39,32 @@ module Spree
|
|
|
19
39
|
Spree.api.admin_role_serializer
|
|
20
40
|
end
|
|
21
41
|
|
|
42
|
+
# The store's own roles. A role belonging to another resource — a
|
|
43
|
+
# marketplace seller's — is managed from that panel and never appears
|
|
44
|
+
# in the staff role picker.
|
|
22
45
|
def scope
|
|
23
|
-
|
|
46
|
+
current_store.roles.accessible_by(current_ability, :show)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def collection_includes
|
|
50
|
+
[:role_users]
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Roles created here belong to the store being administered. The base
|
|
54
|
+
# builder stamps `store`, which a role does not have — its owner is
|
|
55
|
+
# polymorphic — so it would leave the resource unset.
|
|
56
|
+
def build_resource
|
|
57
|
+
current_store.roles.build(permitted_params)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def permitted_params
|
|
61
|
+
params.permit(*model_additional_permitted_attributes, :name, :description, permissions: [])
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
private
|
|
65
|
+
|
|
66
|
+
def requested_permissions
|
|
67
|
+
Array(params[:permissions]).map(&:to_s).reject(&:blank?)
|
|
24
68
|
end
|
|
25
69
|
end
|
|
26
70
|
end
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
# Settlements to sellers — what has been sent, and what is still owed.
|
|
6
|
+
#
|
|
7
|
+
# A payout is created by the sweep on the seller's own schedule rather
|
|
8
|
+
# than by a caller, so there is no create or update here. The one thing
|
|
9
|
+
# an operator does to a payout is say it landed, which is what the
|
|
10
|
+
# built-in provider expects: it records the settlement and waits to be
|
|
11
|
+
# told the bank transfer went out.
|
|
12
|
+
class SellerPayoutsController < ResourceController
|
|
13
|
+
scoped_resource :payouts
|
|
14
|
+
|
|
15
|
+
# PATCH /api/v3/admin/seller_payouts/:id/complete
|
|
16
|
+
#
|
|
17
|
+
# What the built-in provider waits for: the operator saying the bank
|
|
18
|
+
# transfer went out, with the reference it went out under.
|
|
19
|
+
#
|
|
20
|
+
# Authorized as an update, like every other custom member action —
|
|
21
|
+
# naming the action itself would only pass while the ability grants
|
|
22
|
+
# `manage`, and a host narrowing that would get a 403 the scope gate
|
|
23
|
+
# had already allowed.
|
|
24
|
+
def complete
|
|
25
|
+
@resource = find_resource
|
|
26
|
+
authorize! :update, @resource
|
|
27
|
+
|
|
28
|
+
result = Spree.seller_payout_complete_workflow.call(
|
|
29
|
+
seller_payout: @resource,
|
|
30
|
+
reference: params[:reference].to_s.presence
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
if result.success?
|
|
34
|
+
render json: serialize_resource(result.value)
|
|
35
|
+
else
|
|
36
|
+
render_result_error(result)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
protected
|
|
41
|
+
|
|
42
|
+
def model_class
|
|
43
|
+
Spree::SellerPayout
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def serializer_class
|
|
47
|
+
Spree.api.admin_seller_payout_serializer
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def scope
|
|
51
|
+
super.for_store(current_store)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Deliberately without `transfers`: the serializer wants their number,
|
|
55
|
+
# not the rows, and a monthly settlement can hold hundreds.
|
|
56
|
+
def collection_includes
|
|
57
|
+
[:seller]
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# One grouped count for the page, handed to the serializer — asking
|
|
61
|
+
# each row for its own would be a query per settlement, and a
|
|
62
|
+
# counter column cannot work here because the sweep claims transfers
|
|
63
|
+
# with `update_all`, which no callback sees.
|
|
64
|
+
#
|
|
65
|
+
# Only for the listing. Every action shares this method, and building
|
|
66
|
+
# the count needs `collection` — so a member action would run a whole
|
|
67
|
+
# paginated index query to serialize its one record, then read that
|
|
68
|
+
# record's count out of a page it may not even be on. The serializer
|
|
69
|
+
# asks a single payout for its own count, which is one query.
|
|
70
|
+
def serializer_params
|
|
71
|
+
return super unless action_name == 'index'
|
|
72
|
+
|
|
73
|
+
super.merge(transfer_counts: transfer_counts)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def transfer_counts
|
|
77
|
+
@transfer_counts ||= Spree::SellerTransfer.where(payout_id: collection.map(&:id)).group(:payout_id).count
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
# The operator's review queue: what sellers have submitted about the
|
|
6
|
+
# marketplace's requirements, and the decisions on them.
|
|
7
|
+
#
|
|
8
|
+
# Each decision is its own member action because each is a workflow
|
|
9
|
+
# carrying its own arguments — a rejection carries the reason the
|
|
10
|
+
# seller needs in order to fix it — and because a status moved by
|
|
11
|
+
# PATCH would skip the mail and the extension hooks.
|
|
12
|
+
class SellerRequirementSubmissionsController < ResourceController
|
|
13
|
+
scoped_resource :sellers
|
|
14
|
+
|
|
15
|
+
before_action :set_resource, only: [:show, :accept, :reject, :download]
|
|
16
|
+
|
|
17
|
+
# POST /api/v3/admin/sellers/:seller_id/requirement_submissions
|
|
18
|
+
#
|
|
19
|
+
# The operator excusing one seller from something the marketplace
|
|
20
|
+
# asks of everyone. Creating anything else here would be the
|
|
21
|
+
# operator submitting on the seller's behalf, which is what the
|
|
22
|
+
# seller's own branch is for.
|
|
23
|
+
def create
|
|
24
|
+
authorize! :create, Spree::SellerRequirementSubmission
|
|
25
|
+
|
|
26
|
+
result = Spree.seller_requirement_submission_waive_workflow.call(
|
|
27
|
+
seller: seller,
|
|
28
|
+
requirement: requirement_from_params,
|
|
29
|
+
reviewed_by: try_spree_current_user,
|
|
30
|
+
review_note: params[:review_note]
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
if result.success?
|
|
34
|
+
render json: serialize_resource(result.value), status: :created
|
|
35
|
+
else
|
|
36
|
+
render_result_error(result)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# PATCH /api/v3/admin/sellers/:seller_id/requirement_submissions/:id/accept
|
|
41
|
+
def accept
|
|
42
|
+
run_workflow(Spree.seller_requirement_submission_accept_workflow)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# PATCH /api/v3/admin/sellers/:seller_id/requirement_submissions/:id/reject
|
|
46
|
+
def reject
|
|
47
|
+
run_workflow(Spree.seller_requirement_submission_reject_workflow)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# GET /api/v3/admin/sellers/:seller_id/requirement_submissions/:id/download
|
|
51
|
+
#
|
|
52
|
+
# Served through the API rather than as a storage link: these are
|
|
53
|
+
# business registrations and identity documents, so each read is
|
|
54
|
+
# authorized instead of being open to anyone holding a URL.
|
|
55
|
+
def download
|
|
56
|
+
unless @resource.file.attached?
|
|
57
|
+
return render_error(
|
|
58
|
+
code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:validation_error],
|
|
59
|
+
message: 'Submission has no attached file',
|
|
60
|
+
status: :unprocessable_content
|
|
61
|
+
)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
send_data(
|
|
65
|
+
@resource.file.download,
|
|
66
|
+
filename: @resource.file.filename.to_s,
|
|
67
|
+
type: @resource.file.content_type,
|
|
68
|
+
disposition: 'attachment'
|
|
69
|
+
)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
protected
|
|
73
|
+
|
|
74
|
+
def model_class
|
|
75
|
+
Spree::SellerRequirementSubmission
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def serializer_class
|
|
79
|
+
Spree.api.admin_seller_requirement_submission_serializer
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# The parent is set and authorized by the base controller, and the
|
|
83
|
+
# scope hangs off it — so a submission belonging to another
|
|
84
|
+
# marketplace is a 404 rather than a document.
|
|
85
|
+
def parent_association
|
|
86
|
+
:requirement_submissions
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# The serializer reads each row's file and its seller, so both are
|
|
90
|
+
# loaded with the page rather than per row.
|
|
91
|
+
def collection_includes
|
|
92
|
+
[:requirement, :reviewed_by, :seller, { file_attachment: :blob }]
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def read_actions
|
|
96
|
+
super + %w[download]
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Scope-fetched through the store, then filtered by what this role may
|
|
100
|
+
# do with it: reading a seller is not licence to decide its
|
|
101
|
+
# submissions, which `authorize_parent!` enforces per action.
|
|
102
|
+
def set_parent
|
|
103
|
+
@parent = current_store.sellers.
|
|
104
|
+
accessible_by(current_ability, parent_ability_action).
|
|
105
|
+
find_by_prefix_id!(params[:seller_id])
|
|
106
|
+
authorize_parent!(@parent)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
private
|
|
110
|
+
|
|
111
|
+
def seller
|
|
112
|
+
@parent
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Through the store's own requirements: an id from elsewhere is a
|
|
116
|
+
# 404 here rather than a waiver written against another
|
|
117
|
+
# marketplace's checklist.
|
|
118
|
+
def requirement_from_params
|
|
119
|
+
current_store.seller_requirements.find_by_prefix_id!(params[:requirement_id])
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def run_workflow(workflow)
|
|
123
|
+
result = workflow.call(
|
|
124
|
+
submission: @resource,
|
|
125
|
+
reviewed_by: try_spree_current_user,
|
|
126
|
+
review_note: params[:review_note]
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
if result.success?
|
|
130
|
+
render json: serialize_resource(result.value)
|
|
131
|
+
else
|
|
132
|
+
render_result_error(result)
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
# What this marketplace asks of a seller before it will let them
|
|
6
|
+
# trade (docs/plans/6.0-seller-onboarding-requirements.md).
|
|
7
|
+
#
|
|
8
|
+
# Under `write_sellers` rather than `settings`: who decides admission
|
|
9
|
+
# is who admits, and a key that can approve sellers is the same key
|
|
10
|
+
# that should be able to change what approval requires.
|
|
11
|
+
class SellerRequirementsController < ResourceController
|
|
12
|
+
include Spree::Api::V3::Admin::SubclassedResource
|
|
13
|
+
|
|
14
|
+
scoped_resource :sellers
|
|
15
|
+
|
|
16
|
+
subclassed_via -> { Spree.seller_requirements },
|
|
17
|
+
unknown_type_error: 'unknown_seller_requirement_type'
|
|
18
|
+
|
|
19
|
+
# GET /api/v3/admin/seller_requirements/types
|
|
20
|
+
#
|
|
21
|
+
# The kinds an operator can add, with the shape of each one's
|
|
22
|
+
# configuration form. A marketplace's own kinds appear here the
|
|
23
|
+
# moment they are registered, which is what keeps the picker from
|
|
24
|
+
# being a hardcoded list in the dashboard.
|
|
25
|
+
def types
|
|
26
|
+
# `:read`, matching its place in `read_actions`: this lists the
|
|
27
|
+
# kinds a marketplace has registered and nothing about any store,
|
|
28
|
+
# so a staffer who can see the checklist can see what it is made
|
|
29
|
+
# of. Asking for `:create` here 403s exactly those people.
|
|
30
|
+
authorize! :read, model_class
|
|
31
|
+
|
|
32
|
+
data = Spree.seller_requirements.map do |klass|
|
|
33
|
+
{
|
|
34
|
+
type: klass.api_type,
|
|
35
|
+
name: klass.human_name,
|
|
36
|
+
description: klass.human_description,
|
|
37
|
+
allow_multiple: klass.allow_multiple?,
|
|
38
|
+
accepts_submissions: klass.accepts_submissions?,
|
|
39
|
+
reviewed_by_operator: klass.reviewed_by_operator?,
|
|
40
|
+
# Whether the store already has one, and whether it may add
|
|
41
|
+
# another — the uniqueness rule is the model's, so the picker
|
|
42
|
+
# reads the answer rather than reimplementing it.
|
|
43
|
+
configured: configured_types.include?(klass.to_s),
|
|
44
|
+
addable: klass.allow_multiple? || configured_types.exclude?(klass.to_s),
|
|
45
|
+
# What a seller may upload, for kinds that collect a file.
|
|
46
|
+
# Told to the operator, never asked of them — the answer is
|
|
47
|
+
# the same for every marketplace.
|
|
48
|
+
accepted_content_types: klass.accepted_content_types,
|
|
49
|
+
# Config a kind takes beyond its preferences — a reference
|
|
50
|
+
# list gets its own picker, not a text box.
|
|
51
|
+
association_fields: association_fields_for(klass),
|
|
52
|
+
preference_schema: klass.serialized_preference_schema
|
|
53
|
+
}
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
render json: { data: data }
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
protected
|
|
60
|
+
|
|
61
|
+
def model_class
|
|
62
|
+
Spree::SellerRequirement
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def serializer_class
|
|
66
|
+
Spree.api.admin_seller_requirement_serializer
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def scope
|
|
70
|
+
super.ordered
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# `type` is stripped before assignment by the subclassed-resource
|
|
74
|
+
# flow, so a saved row's kind can never change — which matters
|
|
75
|
+
# because its submissions answered the old one.
|
|
76
|
+
def permitted_params
|
|
77
|
+
params.permit(:type, :name, :description, :position, :active, :required,
|
|
78
|
+
preferences: {}, metadata: {})
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# `types` is read-only discovery — maps to the read scope.
|
|
82
|
+
def read_actions
|
|
83
|
+
super + %w[types]
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
private
|
|
87
|
+
|
|
88
|
+
# `additional_permitted_attributes` entries are either bare symbols
|
|
89
|
+
# or `{ custom_field_definition_ids: [] }` hashes; both reduce to
|
|
90
|
+
# field names an editor can render a picker for.
|
|
91
|
+
def association_fields_for(klass)
|
|
92
|
+
return [] unless klass.respond_to?(:additional_permitted_attributes)
|
|
93
|
+
|
|
94
|
+
klass.additional_permitted_attributes.flat_map do |attribute|
|
|
95
|
+
attribute.is_a?(Hash) ? attribute.keys : attribute
|
|
96
|
+
end.map(&:to_s)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def build_subclassed_resource(klass, attrs)
|
|
100
|
+
current_store.seller_requirements.build(attrs.merge(type: klass.sti_name))
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# `pluck` queries whether or not the association is already loaded,
|
|
104
|
+
# so a warm `current_store` cannot leave this answering with a kind
|
|
105
|
+
# the store no longer has. `reorder(nil)` because the association
|
|
106
|
+
# orders by position, and PostgreSQL refuses SELECT DISTINCT with an
|
|
107
|
+
# ORDER BY on a column it does not select.
|
|
108
|
+
def configured_types
|
|
109
|
+
@configured_types ||= current_store.seller_requirements.reorder(nil).distinct.pluck(:type)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
# What each seller has earned, order by order.
|
|
6
|
+
#
|
|
7
|
+
# Read-only, enforced by the routes: a transfer records money that
|
|
8
|
+
# moved. Correcting one is a reversal — another row, written by the
|
|
9
|
+
# refund that caused it — rather than an edit.
|
|
10
|
+
class SellerTransfersController < ResourceController
|
|
11
|
+
scoped_resource :payouts
|
|
12
|
+
|
|
13
|
+
protected
|
|
14
|
+
|
|
15
|
+
def model_class
|
|
16
|
+
Spree::SellerTransfer
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def serializer_class
|
|
20
|
+
Spree.api.admin_seller_transfer_serializer
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def scope
|
|
24
|
+
super.for_store(current_store)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Every association the serializer reads, so a page of rows costs a
|
|
28
|
+
# fixed number of queries rather than one per row.
|
|
29
|
+
def collection_includes
|
|
30
|
+
[:seller, :order, :payout, :reversed_from, :refund]
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|