spree_api 6.0.0.beta4 → 6.0.0.rc2
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/Rakefile +4 -48
- data/app/controllers/concerns/spree/api/v3/admin/email_template_lookup.rb +139 -0
- data/app/controllers/concerns/spree/api/v3/admin/product_membership.rb +10 -0
- data/app/controllers/concerns/spree/api/v3/admin/stock_receipt_actions.rb +26 -4
- data/app/controllers/concerns/spree/api/v3/admin/store_context.rb +1 -1
- data/app/controllers/concerns/spree/api/v3/admin/subclassed_resource.rb +15 -29
- data/app/controllers/concerns/spree/api/v3/admin/validation_details.rb +1 -1
- data/app/controllers/concerns/spree/api/v3/cart_resolvable.rb +10 -2
- data/app/controllers/concerns/spree/api/v3/channel_resolution.rb +3 -3
- data/app/controllers/concerns/spree/api/v3/company_address_writes.rb +3 -1
- data/app/controllers/concerns/spree/api/v3/current_password_confirmation.rb +1 -1
- data/app/controllers/concerns/spree/api/v3/error_handler.rb +55 -4
- data/app/controllers/concerns/spree/api/v3/file_uploads.rb +35 -0
- data/app/controllers/concerns/spree/api/v3/http_caching.rb +44 -11
- data/app/controllers/concerns/spree/api/v3/idempotent.rb +20 -5
- data/app/controllers/concerns/spree/api/v3/items_payload.rb +1 -1
- data/app/controllers/concerns/spree/api/v3/money_params.rb +52 -0
- data/app/controllers/concerns/spree/api/v3/order_lock.rb +2 -2
- data/app/controllers/concerns/spree/api/v3/orders/claim_actions.rb +1 -5
- data/app/controllers/concerns/spree/api/v3/orders/delivery_actions.rb +7 -11
- data/app/controllers/concerns/spree/api/v3/orders/exchange_actions.rb +1 -4
- data/app/controllers/concerns/spree/api/v3/orders/fulfillment_actions.rb +3 -15
- data/app/controllers/concerns/spree/api/v3/orders/post_sale_actions.rb +2 -10
- data/app/controllers/concerns/spree/api/v3/orders/return_actions.rb +1 -4
- data/app/controllers/concerns/spree/api/v3/orders/shipping_label_actions.rb +8 -28
- data/app/controllers/concerns/spree/api/v3/params_normalizer.rb +5 -0
- data/app/controllers/concerns/spree/api/v3/permission_serialization.rb +9 -1
- data/app/controllers/concerns/spree/api/v3/purchase_serialization.rb +26 -0
- data/app/controllers/concerns/spree/api/v3/request_params.rb +65 -0
- data/app/controllers/concerns/spree/api/v3/seller/seller_context.rb +1 -1
- data/app/controllers/concerns/spree/api/v3/store/storefront_products.rb +5 -4
- data/app/controllers/concerns/spree/api/v3/storefront_gating.rb +11 -5
- data/app/controllers/concerns/spree/api/v3/strict_money_params.rb +94 -0
- data/app/controllers/spree/api/v3/admin/admin_users_controller.rb +8 -4
- data/app/controllers/spree/api/v3/admin/allowed_origins_controller.rb +8 -1
- data/app/controllers/spree/api/v3/admin/api_keys_controller.rb +16 -8
- data/app/controllers/spree/api/v3/admin/base_controller.rb +1 -0
- data/app/controllers/spree/api/v3/admin/catalogs/order_minimums_controller.rb +2 -6
- data/app/controllers/spree/api/v3/admin/catalogs/quantity_rules_controller.rb +7 -9
- data/app/controllers/spree/api/v3/admin/catalogs_controller.rb +61 -34
- data/app/controllers/spree/api/v3/admin/categories/products_controller.rb +4 -1
- data/app/controllers/spree/api/v3/admin/categories_controller.rb +40 -20
- data/app/controllers/spree/api/v3/admin/channels_controller.rb +39 -10
- data/app/controllers/spree/api/v3/admin/claim_reasons_controller.rb +5 -1
- data/app/controllers/spree/api/v3/admin/collections/products_controller.rb +5 -3
- data/app/controllers/spree/api/v3/admin/collections_controller.rb +44 -15
- data/app/controllers/spree/api/v3/admin/commission_rates_controller.rb +62 -14
- data/app/controllers/spree/api/v3/admin/companies/addresses_controller.rb +11 -4
- data/app/controllers/spree/api/v3/admin/companies/invitations_controller.rb +1 -5
- data/app/controllers/spree/api/v3/admin/companies/memberships_controller.rb +9 -5
- data/app/controllers/spree/api/v3/admin/companies/tax_exemption_certificates_controller.rb +20 -27
- data/app/controllers/spree/api/v3/admin/companies/tax_identifiers_controller.rb +6 -5
- data/app/controllers/spree/api/v3/admin/companies_controller.rb +17 -7
- data/app/controllers/spree/api/v3/admin/countries_controller.rb +6 -2
- data/app/controllers/spree/api/v3/admin/coupon_codes_controller.rb +0 -4
- data/app/controllers/spree/api/v3/admin/custom_field_definitions_controller.rb +22 -4
- data/app/controllers/spree/api/v3/admin/custom_fields_controller.rb +12 -9
- data/app/controllers/spree/api/v3/admin/customer_groups_controller.rb +9 -5
- data/app/controllers/spree/api/v3/admin/customers/addresses_controller.rb +12 -11
- data/app/controllers/spree/api/v3/admin/customers/credit_cards_controller.rb +0 -4
- data/app/controllers/spree/api/v3/admin/customers/store_credits_controller.rb +11 -13
- data/app/controllers/spree/api/v3/admin/customers/tax_identifiers_controller.rb +6 -1
- data/app/controllers/spree/api/v3/admin/customers_controller.rb +37 -9
- data/app/controllers/spree/api/v3/admin/data_requests_controller.rb +8 -0
- data/app/controllers/spree/api/v3/admin/delivery_method_rules_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/delivery_methods/rules_controller.rb +16 -8
- data/app/controllers/spree/api/v3/admin/delivery_methods_controller.rb +95 -62
- data/app/controllers/spree/api/v3/admin/delivery_profiles/origin_groups_controller.rb +8 -1
- data/app/controllers/spree/api/v3/admin/delivery_profiles_controller.rb +14 -7
- data/app/controllers/spree/api/v3/admin/delivery_zones_controller.rb +21 -5
- data/app/controllers/spree/api/v3/admin/email_templates/drafts_controller.rb +53 -0
- data/app/controllers/spree/api/v3/admin/email_templates/previews_controller.rb +34 -0
- data/app/controllers/spree/api/v3/admin/email_templates/publications_controller.rb +37 -0
- data/app/controllers/spree/api/v3/admin/email_templates/restorations_controller.rb +42 -0
- data/app/controllers/spree/api/v3/admin/email_templates/revisions_controller.rb +35 -0
- data/app/controllers/spree/api/v3/admin/email_templates/sample_records_controller.rb +33 -0
- data/app/controllers/spree/api/v3/admin/email_templates/test_emails_controller.rb +44 -0
- data/app/controllers/spree/api/v3/admin/email_templates_controller.rb +46 -0
- data/app/controllers/spree/api/v3/admin/exports_controller.rb +23 -6
- data/app/controllers/spree/api/v3/admin/files_controller.rb +29 -0
- data/app/controllers/spree/api/v3/admin/gift_card_batches_controller.rb +20 -1
- data/app/controllers/spree/api/v3/admin/gift_cards_controller.rb +19 -1
- data/app/controllers/spree/api/v3/admin/imports_controller.rb +37 -11
- data/app/controllers/spree/api/v3/admin/integrations_controller.rb +13 -1
- data/app/controllers/spree/api/v3/admin/invitation_acceptances_controller.rb +9 -2
- data/app/controllers/spree/api/v3/admin/invitations_controller.rb +8 -8
- data/app/controllers/spree/api/v3/admin/locales_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/markets_controller.rb +30 -9
- data/app/controllers/spree/api/v3/admin/me_controller.rb +13 -4
- data/app/controllers/spree/api/v3/admin/media_controller.rb +22 -9
- data/app/controllers/spree/api/v3/admin/media_library_controller.rb +9 -5
- data/app/controllers/spree/api/v3/admin/option_types_controller.rb +24 -7
- data/app/controllers/spree/api/v3/admin/order_cancellation_reasons_controller.rb +5 -1
- data/app/controllers/spree/api/v3/admin/order_routing_rules_controller.rb +13 -5
- data/app/controllers/spree/api/v3/admin/orders/claims_controller.rb +39 -1
- data/app/controllers/spree/api/v3/admin/orders/deliveries_controller.rb +20 -6
- data/app/controllers/spree/api/v3/admin/orders/discount_codes_controller.rb +6 -2
- data/app/controllers/spree/api/v3/admin/orders/discounts_controller.rb +30 -6
- data/app/controllers/spree/api/v3/admin/orders/exchanges_controller.rb +36 -1
- data/app/controllers/spree/api/v3/admin/orders/fees_controller.rb +22 -1
- data/app/controllers/spree/api/v3/admin/orders/fulfillments_controller.rb +83 -22
- data/app/controllers/spree/api/v3/admin/orders/gift_cards_controller.rb +9 -5
- data/app/controllers/spree/api/v3/admin/orders/items_controller.rb +11 -1
- data/app/controllers/spree/api/v3/admin/orders/labels_controller.rb +37 -12
- data/app/controllers/spree/api/v3/admin/orders/payments_controller.rb +18 -19
- data/app/controllers/spree/api/v3/admin/orders/refunds_controller.rb +7 -5
- data/app/controllers/spree/api/v3/admin/orders/returns_controller.rb +37 -1
- data/app/controllers/spree/api/v3/admin/orders/store_credits_controller.rb +6 -3
- data/app/controllers/spree/api/v3/admin/orders_controller.rb +76 -62
- data/app/controllers/spree/api/v3/admin/package_types_controller.rb +30 -5
- data/app/controllers/spree/api/v3/admin/password_resets_controller.rb +26 -7
- data/app/controllers/spree/api/v3/admin/payment_methods_controller.rb +38 -22
- data/app/controllers/spree/api/v3/admin/policies_controller.rb +8 -4
- data/app/controllers/spree/api/v3/admin/price_lists_controller.rb +32 -67
- data/app/controllers/spree/api/v3/admin/prices_controller.rb +51 -8
- data/app/controllers/spree/api/v3/admin/product_types_controller.rb +25 -8
- data/app/controllers/spree/api/v3/admin/products/digital_assets_controller.rb +29 -16
- data/app/controllers/spree/api/v3/admin/products/variants_controller.rb +9 -18
- data/app/controllers/spree/api/v3/admin/products_controller.rb +122 -71
- data/app/controllers/spree/api/v3/admin/promotion_actions_controller.rb +11 -6
- data/app/controllers/spree/api/v3/admin/promotion_rules_controller.rb +10 -5
- data/app/controllers/spree/api/v3/admin/promotions_controller.rb +50 -14
- data/app/controllers/spree/api/v3/admin/purchase_orders_controller.rb +55 -8
- data/app/controllers/spree/api/v3/admin/refund_reasons_controller.rb +5 -1
- data/app/controllers/spree/api/v3/admin/reporting/saved_reports_controller.rb +9 -1
- data/app/controllers/spree/api/v3/admin/reporting_controller.rb +34 -0
- data/app/controllers/spree/api/v3/admin/resource_controller.rb +2 -1
- data/app/controllers/spree/api/v3/admin/return_reasons_controller.rb +5 -1
- data/app/controllers/spree/api/v3/admin/roles_controller.rb +13 -1
- data/app/controllers/spree/api/v3/admin/seller_payouts_controller.rb +7 -9
- data/app/controllers/spree/api/v3/admin/seller_requirement_submissions_controller.rb +17 -10
- data/app/controllers/spree/api/v3/admin/seller_requirements_controller.rb +32 -6
- data/app/controllers/spree/api/v3/admin/seller_transfers_controller.rb +0 -4
- data/app/controllers/spree/api/v3/admin/sellers/invitations_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/sellers/payouts_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/sellers_controller.rb +77 -32
- data/app/controllers/spree/api/v3/admin/setup_controller.rb +54 -23
- data/app/controllers/spree/api/v3/admin/stock_levels_controller.rb +38 -9
- data/app/controllers/spree/api/v3/admin/stock_locations_controller.rb +41 -9
- data/app/controllers/spree/api/v3/admin/stock_transfers_controller.rb +49 -8
- data/app/controllers/spree/api/v3/admin/store_controller.rb +122 -48
- data/app/controllers/spree/api/v3/admin/store_credits_controller.rb +1 -7
- data/app/controllers/spree/api/v3/admin/suppliers_controller.rb +16 -6
- data/app/controllers/spree/api/v3/admin/tags_controller.rb +8 -5
- data/app/controllers/spree/api/v3/admin/tax_categories_controller.rb +7 -4
- data/app/controllers/spree/api/v3/admin/tax_rates_controller.rb +21 -3
- data/app/controllers/spree/api/v3/admin/tracking_carriers_controller.rb +4 -0
- data/app/controllers/spree/api/v3/admin/translations/batches_controller.rb +17 -9
- data/app/controllers/spree/api/v3/admin/translations_controller.rb +4 -0
- data/app/controllers/spree/api/v3/admin/translations_coverage_controller.rb +5 -0
- data/app/controllers/spree/api/v3/admin/updates_controller.rb +39 -0
- data/app/controllers/spree/api/v3/admin/webhook_endpoints_controller.rb +40 -13
- data/app/controllers/spree/api/v3/admin/webhook_events_controller.rb +25 -0
- data/app/controllers/spree/api/v3/base_controller.rb +12 -0
- data/app/controllers/spree/api/v3/resource_controller.rb +99 -3
- data/app/controllers/spree/api/v3/seller/auth_controller.rb +10 -2
- data/app/controllers/spree/api/v3/seller/base_controller.rb +1 -0
- data/app/controllers/spree/api/v3/seller/countries_controller.rb +3 -3
- data/app/controllers/spree/api/v3/seller/delivery_methods_controller.rb +49 -60
- data/app/controllers/spree/api/v3/seller/exports_controller.rb +21 -4
- data/app/controllers/spree/api/v3/seller/files_controller.rb +27 -0
- data/app/controllers/spree/api/v3/seller/imports_controller.rb +25 -9
- data/app/controllers/spree/api/v3/seller/invitation_acceptances_controller.rb +12 -4
- data/app/controllers/spree/api/v3/seller/invitations_controller.rb +1 -1
- data/app/controllers/spree/api/v3/seller/me_controller.rb +15 -4
- data/app/controllers/spree/api/v3/seller/onboarding_controller.rb +11 -0
- data/app/controllers/spree/api/v3/seller/orders/claims_controller.rb +35 -0
- data/app/controllers/spree/api/v3/seller/orders/deliveries_controller.rb +12 -0
- data/app/controllers/spree/api/v3/seller/orders/exchanges_controller.rb +33 -0
- data/app/controllers/spree/api/v3/seller/orders/fulfillments_controller.rb +28 -2
- data/app/controllers/spree/api/v3/seller/orders/labels_controller.rb +23 -2
- data/app/controllers/spree/api/v3/seller/orders/notes_controller.rb +8 -1
- data/app/controllers/spree/api/v3/seller/orders/returns_controller.rb +32 -0
- data/app/controllers/spree/api/v3/seller/orders_controller.rb +35 -14
- data/app/controllers/spree/api/v3/seller/package_types_controller.rb +21 -9
- data/app/controllers/spree/api/v3/seller/password_resets_controller.rb +20 -11
- data/app/controllers/spree/api/v3/seller/policies_controller.rb +12 -4
- data/app/controllers/spree/api/v3/seller/products_controller.rb +115 -28
- data/app/controllers/spree/api/v3/seller/profile_controller.rb +33 -10
- data/app/controllers/spree/api/v3/seller/requirement_submissions_controller.rb +13 -6
- data/app/controllers/spree/api/v3/seller/resource_controller.rb +12 -0
- data/app/controllers/spree/api/v3/seller/stock_locations_controller.rb +44 -13
- data/app/controllers/spree/api/v3/seller/tax_identifiers_controller.rb +10 -1
- data/app/controllers/spree/api/v3/seller/team_controller.rb +5 -1
- data/app/controllers/spree/api/v3/store/auth_controller.rb +10 -0
- data/app/controllers/spree/api/v3/store/carts/discount_codes_controller.rb +9 -2
- data/app/controllers/spree/api/v3/store/carts/fulfillments_controller.rb +11 -11
- data/app/controllers/spree/api/v3/store/carts/gift_cards_controller.rb +13 -4
- data/app/controllers/spree/api/v3/store/carts/items_controller.rb +23 -7
- data/app/controllers/spree/api/v3/store/carts/payment_sessions_controller.rb +21 -7
- data/app/controllers/spree/api/v3/store/carts/payments_controller.rb +16 -3
- data/app/controllers/spree/api/v3/store/carts/po_documents_controller.rb +26 -28
- data/app/controllers/spree/api/v3/store/carts/store_credits_controller.rb +9 -1
- data/app/controllers/spree/api/v3/store/carts/tax_identifiers_controller.rb +5 -1
- data/app/controllers/spree/api/v3/store/carts_controller.rb +64 -52
- data/app/controllers/spree/api/v3/store/companies/addresses_controller.rb +12 -8
- data/app/controllers/spree/api/v3/store/companies/invitations_controller.rb +1 -5
- data/app/controllers/spree/api/v3/store/companies/members_controller.rb +4 -0
- data/app/controllers/spree/api/v3/store/companies_controller.rb +5 -1
- data/app/controllers/spree/api/v3/store/company_invitations_controller.rb +10 -2
- data/app/controllers/spree/api/v3/store/customer/addresses_controller.rb +8 -11
- data/app/controllers/spree/api/v3/store/customer/credit_cards_controller.rb +0 -4
- data/app/controllers/spree/api/v3/store/customer/data_requests_controller.rb +5 -5
- data/app/controllers/spree/api/v3/store/customer/digital_links_controller.rb +0 -4
- data/app/controllers/spree/api/v3/store/customer/gift_cards_controller.rb +0 -4
- data/app/controllers/spree/api/v3/store/customer/orders_controller.rb +0 -4
- data/app/controllers/spree/api/v3/store/customer/password_resets_controller.rb +25 -6
- data/app/controllers/spree/api/v3/store/customer/payment_setup_sessions_controller.rb +10 -9
- data/app/controllers/spree/api/v3/store/customer/store_credits_controller.rb +0 -5
- data/app/controllers/spree/api/v3/store/customer/tax_identifiers_controller.rb +5 -1
- data/app/controllers/spree/api/v3/store/customers_controller.rb +28 -2
- data/app/controllers/spree/api/v3/store/data_request_downloads_controller.rb +1 -1
- data/app/controllers/spree/api/v3/store/delivery_methods_controller.rb +1 -1
- data/app/controllers/spree/api/v3/store/newsletter_subscribers_controller.rb +27 -14
- data/app/controllers/spree/api/v3/store/orders/claims_controller.rb +12 -7
- data/app/controllers/spree/api/v3/store/orders/returns_controller.rb +11 -6
- data/app/controllers/spree/api/v3/store/orders_controller.rb +47 -10
- data/app/controllers/spree/api/v3/store/products_controller.rb +8 -0
- data/app/controllers/spree/api/v3/store/wishlist_items_controller.rb +10 -8
- data/app/controllers/spree/api/v3/store/wishlists_controller.rb +12 -4
- data/app/request_schemas/spree/api/v3/address_request_schema.rb +27 -0
- data/app/request_schemas/spree/api/v3/admin/address_request_schema.rb +13 -0
- data/app/request_schemas/spree/api/v3/admin/bulk_tags_request_schema.rb +17 -0
- data/app/request_schemas/spree/api/v3/admin/catalog_order_minimum_request_schema.rb +17 -0
- data/app/request_schemas/spree/api/v3/admin/email_template_language_request_schema.rb +17 -0
- data/app/request_schemas/spree/api/v3/admin/email_template_preview_request_schema.rb +32 -0
- data/app/request_schemas/spree/api/v3/admin/price_adjustment_tier_request_schema.rb +21 -0
- data/app/request_schemas/spree/api/v3/admin/price_list_price_request_schema.rb +21 -0
- data/app/request_schemas/spree/api/v3/admin/price_list_rule_request_schema.rb +19 -0
- data/app/request_schemas/spree/api/v3/admin/product_membership_reposition_request_schema.rb +17 -0
- data/app/request_schemas/spree/api/v3/admin/promotion_action_calculator_request_schema.rb +18 -0
- data/app/request_schemas/spree/api/v3/admin/promotion_action_line_item_request_schema.rb +15 -0
- data/app/request_schemas/spree/api/v3/admin/promotion_action_request_schema.rb +19 -0
- data/app/request_schemas/spree/api/v3/admin/promotion_rule_request_schema.rb +22 -0
- data/app/request_schemas/spree/api/v3/admin/reason_request_schema.rb +14 -0
- data/app/request_schemas/spree/api/v3/admin/tax_identifier_request_schema.rb +15 -0
- data/app/request_schemas/spree/api/v3/custom_field_value_request_schema.rb +15 -0
- data/app/request_schemas/spree/api/v3/file_upload_request_schema.rb +20 -0
- data/app/request_schemas/spree/api/v3/media_request_schema.rb +27 -0
- data/app/request_schemas/spree/api/v3/price_request_schema.rb +17 -0
- data/app/request_schemas/spree/api/v3/stock_level_request_schema.rb +18 -0
- data/app/request_schemas/spree/api/v3/store/address_request_schema.rb +29 -0
- data/app/request_schemas/spree/api/v3/tax_identifier_request_schema.rb +18 -0
- data/app/request_schemas/spree/api/v3/variant_option_request_schema.rb +13 -0
- data/app/request_schemas/spree/api/v3/variant_request_schema.rb +52 -0
- data/app/serializers/concerns/spree/api/v3/purchase_summary.rb +48 -0
- data/app/serializers/spree/api/v3/address_serializer.rb +4 -2
- data/app/serializers/spree/api/v3/admin/address_serializer.rb +8 -7
- data/app/serializers/spree/api/v3/admin/api_key_serializer.rb +2 -6
- data/app/serializers/spree/api/v3/admin/applied_promotion_serializer.rb +3 -1
- data/app/serializers/spree/api/v3/admin/cart_serializer.rb +3 -1
- data/app/serializers/spree/api/v3/admin/catalog_assignment_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/catalog_order_minimum_serializer.rb +3 -8
- data/app/serializers/spree/api/v3/admin/catalog_price_serializer.rb +3 -4
- data/app/serializers/spree/api/v3/admin/catalog_price_tier_serializer.rb +4 -3
- data/app/serializers/spree/api/v3/admin/catalog_product_term_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/catalog_quantity_rule_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/channel_serializer.rb +7 -10
- data/app/serializers/spree/api/v3/admin/claim_line_item_serializer.rb +7 -0
- data/app/serializers/spree/api/v3/admin/claim_reason_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/claim_serializer.rb +5 -0
- data/app/serializers/spree/api/v3/admin/commission_line_serializer.rb +7 -18
- data/app/serializers/spree/api/v3/admin/commission_rate_serializer.rb +7 -11
- data/app/serializers/spree/api/v3/admin/commission_rule_serializer.rb +1 -5
- data/app/serializers/spree/api/v3/admin/country_serializer.rb +4 -0
- data/app/serializers/spree/api/v3/admin/coupon_code_serializer.rb +1 -7
- data/app/serializers/spree/api/v3/admin/credit_card_serializer.rb +1 -7
- data/app/serializers/spree/api/v3/admin/custom_field_definition_serializer.rb +6 -2
- data/app/serializers/spree/api/v3/admin/customer_serializer.rb +5 -17
- data/app/serializers/spree/api/v3/admin/data_request_serializer.rb +2 -6
- data/app/serializers/spree/api/v3/admin/delivery_method_rule_serializer.rb +0 -2
- data/app/serializers/spree/api/v3/admin/delivery_method_serializer.rb +20 -30
- data/app/serializers/spree/api/v3/admin/delivery_method_service_serializer.rb +9 -1
- data/app/serializers/spree/api/v3/admin/delivery_origin_group_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/delivery_rate_serializer.rb +8 -0
- data/app/serializers/spree/api/v3/admin/delivery_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/delivery_zone_serializer.rb +1 -7
- data/app/serializers/spree/api/v3/admin/digital_asset_serializer.rb +4 -2
- data/app/serializers/spree/api/v3/admin/discount_serializer.rb +3 -1
- data/app/serializers/spree/api/v3/admin/email_template_draft_serializer.rb +19 -0
- data/app/serializers/spree/api/v3/admin/email_template_preview_serializer.rb +38 -0
- data/app/serializers/spree/api/v3/admin/email_template_revision_serializer.rb +18 -0
- data/app/serializers/spree/api/v3/admin/email_template_sample_record_serializer.rb +13 -0
- data/app/serializers/spree/api/v3/admin/email_template_serializer.rb +61 -0
- data/app/serializers/spree/api/v3/admin/exchange_line_item_serializer.rb +5 -0
- data/app/serializers/spree/api/v3/admin/exchange_serializer.rb +6 -3
- data/app/serializers/spree/api/v3/admin/export_serializer.rb +1 -7
- data/app/serializers/spree/api/v3/admin/fee_serializer.rb +3 -1
- data/app/serializers/spree/api/v3/admin/file_upload_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/admin/file_upload_target_serializer.rb +10 -0
- data/app/serializers/spree/api/v3/admin/fulfillment_item_serializer.rb +1 -7
- data/app/serializers/spree/api/v3/admin/fulfillment_serializer.rb +13 -17
- data/app/serializers/spree/api/v3/admin/gift_card_serializer.rb +4 -10
- data/app/serializers/spree/api/v3/admin/import_serializer.rb +2 -2
- data/app/serializers/spree/api/v3/admin/integration_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/line_item_serializer.rb +14 -18
- data/app/serializers/spree/api/v3/admin/locale_serializer.rb +13 -0
- data/app/serializers/spree/api/v3/admin/market_serializer.rb +7 -2
- data/app/serializers/spree/api/v3/admin/media_serializer.rb +4 -5
- data/app/serializers/spree/api/v3/admin/order_cancellation_reason_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/order_group_serializer.rb +5 -9
- data/app/serializers/spree/api/v3/admin/order_routing_rule_serializer.rb +2 -6
- data/app/serializers/spree/api/v3/admin/order_serializer.rb +38 -48
- data/app/serializers/spree/api/v3/admin/package_type_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/payment_method_serializer.rb +7 -4
- data/app/serializers/spree/api/v3/admin/payment_serializer.rb +6 -8
- data/app/serializers/spree/api/v3/admin/payment_split_serializer.rb +8 -9
- data/app/serializers/spree/api/v3/admin/permission_serializer.rb +4 -4
- data/app/serializers/spree/api/v3/admin/price_adjustment_tier_serializer.rb +3 -6
- data/app/serializers/spree/api/v3/admin/price_history_serializer.rb +5 -2
- data/app/serializers/spree/api/v3/admin/price_list_serializer.rb +1 -5
- data/app/serializers/spree/api/v3/admin/price_rule_serializer.rb +2 -6
- data/app/serializers/spree/api/v3/admin/price_serializer.rb +2 -0
- data/app/serializers/spree/api/v3/admin/product_serializer.rb +4 -10
- data/app/serializers/spree/api/v3/admin/product_submission_serializer.rb +2 -10
- data/app/serializers/spree/api/v3/admin/product_type_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/promotion_action_serializer.rb +5 -9
- data/app/serializers/spree/api/v3/admin/promotion_rule_serializer.rb +1 -5
- data/app/serializers/spree/api/v3/admin/purchase_order_item_serializer.rb +6 -25
- data/app/serializers/spree/api/v3/admin/purchase_order_serializer.rb +4 -17
- data/app/serializers/spree/api/v3/admin/refund_reason_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/refund_serializer.rb +7 -0
- data/app/serializers/spree/api/v3/admin/reporting_result_serializer.rb +9 -2
- data/app/serializers/spree/api/v3/admin/return_line_item_serializer.rb +9 -0
- data/app/serializers/spree/api/v3/admin/return_reason_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/return_serializer.rb +8 -12
- data/app/serializers/spree/api/v3/admin/saved_report_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/seller_balance_serializer.rb +15 -10
- data/app/serializers/spree/api/v3/admin/seller_payout_serializer.rb +7 -7
- data/app/serializers/spree/api/v3/admin/seller_requirement_status_serializer.rb +2 -6
- data/app/serializers/spree/api/v3/admin/seller_requirement_submission_serializer.rb +1 -7
- data/app/serializers/spree/api/v3/admin/seller_serializer.rb +8 -16
- data/app/serializers/spree/api/v3/admin/seller_transfer_serializer.rb +11 -10
- data/app/serializers/spree/api/v3/admin/shipping_label_serializer.rb +8 -21
- data/app/serializers/spree/api/v3/admin/stock_level_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/stock_location_serializer.rb +4 -3
- data/app/serializers/spree/api/v3/admin/stock_movement_serializer.rb +3 -9
- data/app/serializers/spree/api/v3/admin/stock_receipt_item_serializer.rb +1 -7
- data/app/serializers/spree/api/v3/admin/stock_receipt_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/stock_reservation_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/stock_transfer_item_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/store_credit_event_serializer.rb +6 -3
- data/app/serializers/spree/api/v3/admin/store_credit_serializer.rb +11 -20
- data/app/serializers/spree/api/v3/admin/store_serializer.rb +21 -84
- data/app/serializers/spree/api/v3/admin/supplier_serializer.rb +2 -4
- data/app/serializers/spree/api/v3/admin/tax_exemption_certificate_serializer.rb +6 -10
- data/app/serializers/spree/api/v3/admin/tax_identifier_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/tax_line_serializer.rb +9 -3
- data/app/serializers/spree/api/v3/admin/tax_rate_serializer.rb +3 -19
- data/app/serializers/spree/api/v3/admin/update_status_serializer.rb +28 -0
- data/app/serializers/spree/api/v3/admin/variant_serializer.rb +13 -10
- data/app/serializers/spree/api/v3/admin/webhook_delivery_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/webhook_event_serializer.rb +23 -0
- data/app/serializers/spree/api/v3/applied_promotion_serializer.rb +2 -4
- data/app/serializers/spree/api/v3/base_serializer.rb +132 -7
- data/app/serializers/spree/api/v3/cart_serializer.rb +20 -66
- data/app/serializers/spree/api/v3/category_serializer.rb +5 -15
- data/app/serializers/spree/api/v3/claim_line_item_serializer.rb +6 -29
- data/app/serializers/spree/api/v3/claim_serializer.rb +2 -16
- data/app/serializers/spree/api/v3/collection_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/company_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/country_serializer.rb +2 -1
- data/app/serializers/spree/api/v3/currency_serializer.rb +9 -1
- data/app/serializers/spree/api/v3/custom_field_serializer.rb +1 -2
- data/app/serializers/spree/api/v3/customer_serializer.rb +3 -2
- data/app/serializers/spree/api/v3/delivery_rate_serializer.rb +8 -32
- data/app/serializers/spree/api/v3/delivery_zone_member_serializer.rb +1 -1
- data/app/serializers/spree/api/v3/digital_asset_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/digital_link_serializer.rb +3 -9
- data/app/serializers/spree/api/v3/discount_serializer.rb +4 -12
- data/app/serializers/spree/api/v3/exchange_line_item_serializer.rb +6 -30
- data/app/serializers/spree/api/v3/exchange_serializer.rb +2 -16
- data/app/serializers/spree/api/v3/export_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/fee_serializer.rb +2 -10
- data/app/serializers/spree/api/v3/file_upload_serializer.rb +28 -0
- data/app/serializers/spree/api/v3/file_upload_target_serializer.rb +17 -0
- data/app/serializers/spree/api/v3/fulfillment_serializer.rb +4 -11
- data/app/serializers/spree/api/v3/gift_card_batch_serializer.rb +3 -7
- data/app/serializers/spree/api/v3/gift_card_serializer.rb +7 -17
- data/app/serializers/spree/api/v3/import_row_serializer.rb +2 -6
- data/app/serializers/spree/api/v3/import_serializer.rb +3 -26
- data/app/serializers/spree/api/v3/invitation_serializer.rb +2 -19
- data/app/serializers/spree/api/v3/line_item_serializer.rb +19 -23
- data/app/serializers/spree/api/v3/locale_serializer.rb +3 -1
- data/app/serializers/spree/api/v3/market_serializer.rb +5 -5
- data/app/serializers/spree/api/v3/media_event_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/media_serializer.rb +8 -5
- data/app/serializers/spree/api/v3/newsletter_subscriber_request_event_serializer.rb +35 -0
- data/app/serializers/spree/api/v3/newsletter_subscriber_serializer.rb +2 -6
- data/app/serializers/spree/api/v3/option_value_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/order_group_serializer.rb +12 -25
- data/app/serializers/spree/api/v3/order_serializer.rb +14 -58
- data/app/serializers/spree/api/v3/password_reset_requested_event_serializer.rb +29 -0
- data/app/serializers/spree/api/v3/payment_method_serializer.rb +2 -6
- data/app/serializers/spree/api/v3/payment_serializer.rb +5 -10
- data/app/serializers/spree/api/v3/payment_session_serializer.rb +5 -13
- data/app/serializers/spree/api/v3/payment_setup_session_serializer.rb +3 -11
- data/app/serializers/spree/api/v3/policy_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/price_history_serializer.rb +6 -8
- data/app/serializers/spree/api/v3/price_serializer.rb +7 -12
- data/app/serializers/spree/api/v3/product_filter_price_range_serializer.rb +10 -4
- data/app/serializers/spree/api/v3/product_publication_serializer.rb +1 -7
- data/app/serializers/spree/api/v3/product_serializer.rb +10 -24
- data/app/serializers/spree/api/v3/product_submission_serializer.rb +26 -0
- data/app/serializers/spree/api/v3/purchase_order_event_serializer.rb +23 -4
- data/app/serializers/spree/api/v3/refund_serializer.rb +11 -16
- data/app/serializers/spree/api/v3/return_line_item_serializer.rb +6 -21
- data/app/serializers/spree/api/v3/return_serializer.rb +4 -16
- data/app/serializers/spree/api/v3/saved_report_event_serializer.rb +23 -0
- data/app/serializers/spree/api/v3/seller/address_serializer.rb +12 -0
- data/app/serializers/spree/api/v3/seller/balance_serializer.rb +15 -10
- data/app/serializers/spree/api/v3/seller/claim_line_item_serializer.rb +7 -0
- data/app/serializers/spree/api/v3/seller/claim_serializer.rb +5 -0
- data/app/serializers/spree/api/v3/seller/country_serializer.rb +19 -0
- data/app/serializers/spree/api/v3/seller/delivery_method_rule_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/seller/delivery_method_serializer.rb +5 -15
- data/app/serializers/spree/api/v3/seller/delivery_rate_serializer.rb +8 -13
- data/app/serializers/spree/api/v3/seller/delivery_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/seller/delivery_zone_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/seller/exchange_line_item_serializer.rb +5 -0
- data/app/serializers/spree/api/v3/seller/exchange_serializer.rb +6 -3
- data/app/serializers/spree/api/v3/seller/file_upload_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/seller/file_upload_target_serializer.rb +10 -0
- data/app/serializers/spree/api/v3/seller/fulfillment_item_serializer.rb +1 -7
- data/app/serializers/spree/api/v3/seller/fulfillment_serializer.rb +2 -6
- data/app/serializers/spree/api/v3/seller/import_serializer.rb +2 -2
- data/app/serializers/spree/api/v3/seller/invitation_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/seller/media_serializer.rb +2 -5
- data/app/serializers/spree/api/v3/seller/order_line_item_serializer.rb +8 -13
- data/app/serializers/spree/api/v3/seller/order_serializer.rb +19 -40
- data/app/serializers/spree/api/v3/seller/payment_split_serializer.rb +8 -9
- data/app/serializers/spree/api/v3/seller/payout_serializer.rb +6 -6
- data/app/serializers/spree/api/v3/seller/price_history_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/seller/price_serializer.rb +11 -0
- data/app/serializers/spree/api/v3/seller/product_serializer.rb +3 -7
- data/app/serializers/spree/api/v3/seller/product_submission_serializer.rb +1 -21
- data/app/serializers/spree/api/v3/seller/profile_serializer.rb +9 -13
- data/app/serializers/spree/api/v3/seller/requirement_status_serializer.rb +3 -9
- data/app/serializers/spree/api/v3/seller/return_line_item_serializer.rb +8 -0
- data/app/serializers/spree/api/v3/seller/return_serializer.rb +8 -17
- data/app/serializers/spree/api/v3/seller/state_serializer.rb +10 -0
- data/app/serializers/spree/api/v3/seller/stock_location_serializer.rb +3 -0
- data/app/serializers/spree/api/v3/seller/transfer_serializer.rb +10 -9
- data/app/serializers/spree/api/v3/seller/variant_serializer.rb +8 -4
- data/app/serializers/spree/api/v3/seller_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/shipping_label_event_serializer.rb +22 -4
- data/app/serializers/spree/api/v3/stock_level_serializer.rb +1 -7
- data/app/serializers/spree/api/v3/stock_location_serializer.rb +8 -1
- data/app/serializers/spree/api/v3/stock_movement_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/stock_receipt_event_serializer.rb +20 -4
- data/app/serializers/spree/api/v3/stock_transfer_serializer.rb +1 -7
- data/app/serializers/spree/api/v3/store_credit_event_serializer.rb +2 -13
- data/app/serializers/spree/api/v3/store_credit_serializer.rb +3 -27
- data/app/serializers/spree/api/v3/supplier_event_serializer.rb +6 -4
- data/app/serializers/spree/api/v3/tax_line_serializer.rb +11 -23
- data/app/serializers/spree/api/v3/variant_serializer.rb +10 -24
- data/app/serializers/spree/api/v3/wishlist_item_serializer.rb +1 -11
- data/app/serializers/spree/api/v3/wishlist_serializer.rb +2 -6
- data/app/services/spree/api/v3/filter_predicates.rb +29 -0
- data/app/services/spree/api/v3/filter_table.rb +337 -0
- data/app/services/spree/api/v3/filters_aggregator.rb +2 -2
- data/app/services/spree/api/v3/request_schema.rb +430 -0
- data/app/services/spree/webhooks/deliver_webhook.rb +7 -3
- data/app/subscribers/spree/webhook_event_subscriber.rb +3 -10
- data/config/initializers/pagy.rb +1 -1
- data/config/initializers/typelizer.rb +7 -9
- data/config/locales/ar.yml +15 -0
- data/config/locales/be.yml +15 -0
- data/config/locales/bg.yml +15 -0
- data/config/locales/ca.yml +15 -0
- data/config/locales/cs.yml +15 -0
- data/config/locales/da.yml +15 -0
- data/config/locales/de-CH.yml +11 -0
- data/config/locales/de.yml +15 -0
- data/config/locales/el.yml +15 -0
- data/config/locales/en.yml +5 -40
- data/config/locales/es-CL.yml +10 -0
- data/config/locales/es-EC.yml +11 -0
- data/config/locales/es-MX.yml +12 -0
- data/config/locales/es.yml +15 -0
- data/config/locales/et.yml +15 -0
- data/config/locales/fa.yml +15 -0
- data/config/locales/fi.yml +15 -0
- data/config/locales/fr.yml +15 -0
- data/config/locales/hu.yml +15 -0
- data/config/locales/id.yml +15 -0
- data/config/locales/it.yml +15 -0
- data/config/locales/ja.yml +15 -0
- data/config/locales/km.yml +15 -0
- data/config/locales/ko.yml +15 -0
- data/config/locales/ku.yml +15 -0
- data/config/locales/lt.yml +15 -0
- data/config/locales/lv.yml +15 -0
- data/config/locales/nb.yml +15 -0
- data/config/locales/ne.yml +15 -0
- data/config/locales/nl.yml +15 -0
- data/config/locales/pl.yml +15 -0
- data/config/locales/pt-BR.yml +13 -0
- data/config/locales/pt.yml +15 -0
- data/config/locales/ro.yml +15 -0
- data/config/locales/ru.yml +15 -0
- data/config/locales/sk.yml +15 -0
- data/config/locales/sl-SI.yml +15 -0
- data/config/locales/sv.yml +15 -0
- data/config/locales/th.yml +15 -0
- data/config/locales/tr.yml +15 -0
- data/config/locales/uk.yml +15 -0
- data/config/locales/vi.yml +15 -0
- data/config/locales/zh-CN.yml +15 -0
- data/config/locales/zh-TW.yml +15 -0
- data/config/routes.rb +54 -102
- data/lib/spree/api/configuration.rb +5 -0
- data/lib/spree/api/dependencies.rb +54 -274
- data/lib/spree/api/middleware/request_size_limit.rb +24 -3
- data/lib/spree/api/openapi/filter_documentation.rb +136 -0
- data/lib/spree/api/openapi/schema_helper.rb +127 -81
- data/lib/spree/api/preference_families.rb +46 -0
- data/lib/spree/api/preference_types.rb +138 -0
- data/lib/spree/api/typelizer_generation.rb +39 -0
- data/lib/spree/api/webhook_event_types.rb +140 -0
- data/lib/spree/api.rb +0 -2
- data/lib/tasks/filters.rake +12 -0
- data/lib/typelizer/open_enums.rb +10 -0
- metadata +125 -40
- data/app/controllers/concerns/spree/api/v3/address_params.rb +0 -17
- data/app/controllers/concerns/spree/api/v3/direct_uploads.rb +0 -35
- data/app/controllers/spree/api/v3/admin/direct_uploads_controller.rb +0 -54
- data/app/controllers/spree/api/v3/seller/direct_uploads_controller.rb +0 -21
- data/config/i18n-tasks.yml +0 -40
- data/config/initializers/alba.rb +0 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 06aac9de6a57402c698fb881a27df504047b5a488e9bdc87b472af681115d5f8
|
|
4
|
+
data.tar.gz: fa3c078090e803d00a5fa1b947b594175d8c5657d90e9490f074a57b814f7dd3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c3d0ab4516f51aaa3e3c062e35fc1267c2c90191948e5b0d0dc5a7d6fba6b7ce5020cc66ac563ea9ae49c3948d13cf8a2245b655678fb14806612409d3f7cae3
|
|
7
|
+
data.tar.gz: ac4aae51601b99ab1e4985c521a6edd4dae0613ec68f7950f837cf6fa4181a3c258fd9765206443e1a1b590e2584ce64fb2a93174dd9276a73bc526446a02111
|
data/Rakefile
CHANGED
|
@@ -45,61 +45,17 @@ namespace :rswag do
|
|
|
45
45
|
puts "Reordered paths by tag → #{path}"
|
|
46
46
|
end
|
|
47
47
|
end
|
|
48
|
-
|
|
49
|
-
# Keep the CLI's bundled offline spec (@spree/cli's `admin-spec.json` /
|
|
50
|
-
# `resource-paths.json`) in sync with the freshly generated admin.yaml,
|
|
51
|
-
# so `spree api endpoints`/`schema` never drift from the published docs.
|
|
52
|
-
# Best-effort: skipped with a notice when the JS toolchain isn't present
|
|
53
|
-
# (this is a Ruby/doc task and shouldn't hard-fail on a missing runtime).
|
|
54
|
-
bundler = File.expand_path('../../packages/cli/scripts/bundle-spec.mjs', __dir__)
|
|
55
|
-
if File.exist?(bundler) && system('node', '--version', out: File::NULL, err: File::NULL)
|
|
56
|
-
cli_dir = File.expand_path('../../packages/cli', __dir__)
|
|
57
|
-
if system('node', bundler, chdir: cli_dir)
|
|
58
|
-
puts 'Regenerated CLI offline spec → packages/cli/src/generated/'
|
|
59
|
-
else
|
|
60
|
-
warn 'WARNING: failed to regenerate CLI offline spec (bundle-spec.mjs); run `pnpm --filter @spree/cli build` to resync.'
|
|
61
|
-
end
|
|
62
|
-
else
|
|
63
|
-
puts 'Skipping CLI offline spec regeneration (node/bundle-spec.mjs unavailable).'
|
|
64
|
-
end
|
|
65
48
|
end
|
|
66
49
|
end
|
|
67
50
|
end
|
|
68
51
|
|
|
69
52
|
namespace :typelizer do
|
|
70
|
-
desc 'Generate TypeScript types for
|
|
53
|
+
desc 'Generate TypeScript types for every SDK (runs in spree_emails, where all serializers load)'
|
|
71
54
|
task :generate do
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
require File.expand_path('spec/dummy/config/environment', __dir__)
|
|
76
|
-
|
|
77
|
-
# Eager load serializers so typelizer can find them
|
|
78
|
-
serializers_path = File.expand_path('app/serializers/spree/api/v3', __dir__)
|
|
79
|
-
Rails.autoloaders.main.eager_load_dir(serializers_path)
|
|
80
|
-
|
|
81
|
-
require 'typelizer/generator'
|
|
82
|
-
|
|
83
|
-
# Writer config is in config/initializers/typelizer.rb
|
|
84
|
-
Typelizer::Generator.call(force: true)
|
|
85
|
-
|
|
86
|
-
# Post-process: convert `type Foo = {` to `interface Foo {` for declaration merging support.
|
|
87
|
-
# This lets SDK consumers extend generated types via `declare module '@spree/sdk' { interface Product { ... } }`.
|
|
88
|
-
api_root = Spree::Api::Engine.root
|
|
89
|
-
[
|
|
90
|
-
api_root.join('../../packages/sdk/src/types/generated'),
|
|
91
|
-
api_root.join('../../packages/admin-sdk/src/types/generated')
|
|
92
|
-
].each do |dir|
|
|
93
|
-
Dir[File.join(dir, '*.ts')].each do |file|
|
|
94
|
-
next if File.basename(file) == 'index.ts'
|
|
95
|
-
|
|
96
|
-
content = File.read(file)
|
|
97
|
-
updated = content.gsub(/^type (\w+) = \{/, 'interface \1 {')
|
|
98
|
-
File.write(file, updated) if updated != content
|
|
99
|
-
end
|
|
55
|
+
emails_dir = File.expand_path('../emails', __dir__)
|
|
56
|
+
Bundler.with_unbundled_env do
|
|
57
|
+
sh "cd #{emails_dir} && bundle exec rake typelizer:generate"
|
|
100
58
|
end
|
|
101
|
-
|
|
102
|
-
puts "Generated types → packages/sdk/src/types/generated/ & packages/admin-sdk/src/types/generated/"
|
|
103
59
|
end
|
|
104
60
|
|
|
105
61
|
desc 'Clean and regenerate TypeScript types'
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
# Finds the editable email template a request is about, from its
|
|
6
|
+
# dotted key, for the language the request names.
|
|
7
|
+
module EmailTemplateLookup
|
|
8
|
+
extend ActiveSupport::Concern
|
|
9
|
+
|
|
10
|
+
included do
|
|
11
|
+
scoped_resource :email_templates
|
|
12
|
+
|
|
13
|
+
before_action :load_email_template
|
|
14
|
+
|
|
15
|
+
rescue_from Spree::EmailTemplates::NoSampleRecord, with: :render_no_sample
|
|
16
|
+
rescue_from Liquid::Error, MRML::Error, with: :render_render_error
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
attr_reader :email_template
|
|
22
|
+
|
|
23
|
+
def load_email_template
|
|
24
|
+
@email_template = Spree::EmailTemplates::Entry.for_id(
|
|
25
|
+
current_store, params[:email_template_id] || params[:id], locale: language
|
|
26
|
+
)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# A language code, or "any" for the version every language uses. Named
|
|
30
|
+
# `language` rather than `locale`, which picks the response's language.
|
|
31
|
+
def language
|
|
32
|
+
@language ||= params[:language].to_s.strip.presence || Spree::EmailTemplate::ANY_LOCALE
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def serialize_email_template(reload: false)
|
|
36
|
+
load_email_template if reload
|
|
37
|
+
Spree.api.admin_email_template_serializer.new(email_template, params: serializer_params).to_h
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def serializer_class
|
|
41
|
+
Spree.api.admin_email_template_serializer
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Renders the template as it stands after a workflow ran, or why the
|
|
45
|
+
# workflow refused.
|
|
46
|
+
def render_email_template_result(result, status: :ok)
|
|
47
|
+
return render_stale_draft if result.error&.value == :stale
|
|
48
|
+
return render_template_problems(result.value) if result.error&.value == :invalid_template
|
|
49
|
+
return render_result_error(result) unless result.success?
|
|
50
|
+
|
|
51
|
+
render json: serialize_email_template(reload: true), status: status
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Every published version of the template in the requested language.
|
|
55
|
+
def email_template_revisions
|
|
56
|
+
Spree::EmailTemplateRevision.where(
|
|
57
|
+
email_template: current_store.email_templates.for_key(email_template.key, language)
|
|
58
|
+
)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# An unsaved subject and body are previewed only when sent, so an
|
|
62
|
+
# empty body still previews as empty. `branding` previews unsaved
|
|
63
|
+
# colors and font.
|
|
64
|
+
def preview_arguments
|
|
65
|
+
arguments = params.permit(:record_id, :subject, :body).to_h.symbolize_keys
|
|
66
|
+
arguments[:locale] = language
|
|
67
|
+
arguments[:email_key] = params[:email_key].to_s.tr('.', '/').presence
|
|
68
|
+
arguments[:branding] = params.fetch(:branding, {}).permit(*Spree::Emails::Branding.attribute_names).to_h
|
|
69
|
+
arguments
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Samples show a real record of the store (the latest order, a
|
|
73
|
+
# company), so previewing one needs permission to read it.
|
|
74
|
+
def authorize_sample_data!
|
|
75
|
+
missing = sample_classes.flat_map { |sample| Array(sample.try(:required_permissions)) }.uniq.
|
|
76
|
+
reject { |key| holds_permission?(key) }
|
|
77
|
+
return if missing.empty?
|
|
78
|
+
|
|
79
|
+
render_error(
|
|
80
|
+
code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:access_denied],
|
|
81
|
+
message: I18n.t('spree.email_templates.sample_needs_permission', permissions: missing.to_sentence),
|
|
82
|
+
status: :forbidden,
|
|
83
|
+
details: { required_scope: missing.first }
|
|
84
|
+
)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# A preview shows one email; publishing the layout or a partial
|
|
88
|
+
# renders every email, so it needs what all of their samples need.
|
|
89
|
+
def sample_classes
|
|
90
|
+
if action_name == 'create' && controller_name == 'publications' && !email_template.definition.email?
|
|
91
|
+
Spree.editable_email_templates.emails.map(&:sample_class)
|
|
92
|
+
else
|
|
93
|
+
[build_preview.email.sample_class]
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def build_preview
|
|
98
|
+
Spree::EmailTemplates::Preview.new(store: current_store, key: email_template.key, strict: true, **preview_arguments)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def render_template_problems(problems)
|
|
102
|
+
problems = problems.map { |problem| problem.merge(email: problem[:email].tr('/', '.')) }
|
|
103
|
+
|
|
104
|
+
render_error(
|
|
105
|
+
code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:email_template_invalid],
|
|
106
|
+
message: problems.map { |problem| problem[:message] }.uniq.to_sentence,
|
|
107
|
+
status: :unprocessable_content,
|
|
108
|
+
details: { problems: problems }
|
|
109
|
+
)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Attributed to the template being edited, whose lines the editor marks.
|
|
113
|
+
def render_render_error(error)
|
|
114
|
+
render_template_problems([{ email: email_template.id, message: error.message, line: error.try(:line_number) }])
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def render_no_sample(error)
|
|
118
|
+
render_error(
|
|
119
|
+
code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:email_template_no_sample],
|
|
120
|
+
message: error.message,
|
|
121
|
+
status: :unprocessable_content
|
|
122
|
+
)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def render_stale_draft
|
|
126
|
+
saved_by = email_template.draft&.updated_by&.actor_label
|
|
127
|
+
|
|
128
|
+
render_error(
|
|
129
|
+
code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:email_template_stale],
|
|
130
|
+
message: I18n.t('spree.email_templates.stale_draft', name: saved_by || I18n.t('spree.email_templates.another_admin')),
|
|
131
|
+
status: :conflict,
|
|
132
|
+
details: { updated_by: saved_by }
|
|
133
|
+
)
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
@@ -32,6 +32,16 @@ module Spree
|
|
|
32
32
|
# Membership actions resolve products themselves; the base
|
|
33
33
|
# single-resource load has nothing to look up.
|
|
34
34
|
skip_before_action :set_resource
|
|
35
|
+
|
|
36
|
+
# Adding (create) and removing (destroy) take the same body.
|
|
37
|
+
[nil, :destroy].each do |action|
|
|
38
|
+
request_params 'ProductMembershipParams', action: action do |body|
|
|
39
|
+
body.attribute :product_ids, :array, of: :id,
|
|
40
|
+
required: true,
|
|
41
|
+
example: %w[prod_abc123],
|
|
42
|
+
description: 'Products from other stores, or ones the caller cannot see, are ignored.'
|
|
43
|
+
end
|
|
44
|
+
end
|
|
35
45
|
end
|
|
36
46
|
|
|
37
47
|
# POST /{parents}/:parent_id/products
|
|
@@ -15,6 +15,32 @@ module Spree
|
|
|
15
15
|
|
|
16
16
|
included do
|
|
17
17
|
before_action :authorize_parent_access!
|
|
18
|
+
|
|
19
|
+
# Read from the raw params by `create_workflow_arguments`, with
|
|
20
|
+
# every line resolved through the document.
|
|
21
|
+
request_params :stock_receipt do |body|
|
|
22
|
+
body.attribute :reference, :string,
|
|
23
|
+
nullable: true,
|
|
24
|
+
example: 'DN-4471',
|
|
25
|
+
description: "The supplier's delivery note, or the carrier's reference."
|
|
26
|
+
body.attribute :received_at, :datetime,
|
|
27
|
+
nullable: true,
|
|
28
|
+
description: 'When the goods were counted in. Defaults to now.'
|
|
29
|
+
body.attribute :notes, :string, nullable: true
|
|
30
|
+
body.attribute :items, :array,
|
|
31
|
+
permit: false,
|
|
32
|
+
as: 'StockReceiptItemParams',
|
|
33
|
+
description: 'Omit to book in everything still outstanding, intact. Naming lines, even none, records exactly what the dock counted: `quantity_accepted` reaches the shelf; `quantity_rejected` is refused, recorded with a `rejection_reason` and never stocked.' do |item|
|
|
34
|
+
item.attribute :id, :id, required: true, description: 'The purchase order or transfer line.'
|
|
35
|
+
item.attribute :quantity_accepted, :integer, example: 58
|
|
36
|
+
item.attribute :quantity_rejected, :integer, example: 2
|
|
37
|
+
item.attribute :rejection_reason, :string,
|
|
38
|
+
nullable: true,
|
|
39
|
+
choices: Spree::StockReceiptItem::REJECTION_REASONS,
|
|
40
|
+
example: 'damaged'
|
|
41
|
+
item.attribute :notes, :string, nullable: true
|
|
42
|
+
end
|
|
43
|
+
end
|
|
18
44
|
end
|
|
19
45
|
|
|
20
46
|
protected
|
|
@@ -39,10 +65,6 @@ module Spree
|
|
|
39
65
|
[items: :line]
|
|
40
66
|
end
|
|
41
67
|
|
|
42
|
-
def resource_permitted_attributes
|
|
43
|
-
[:received_at, :reference, :notes]
|
|
44
|
-
end
|
|
45
|
-
|
|
46
68
|
def create_workflow_arguments
|
|
47
69
|
{
|
|
48
70
|
receivable_keyword => @parent,
|
|
@@ -44,7 +44,7 @@ module Spree
|
|
|
44
44
|
if secret_api_key && store_id_header && secret_api_key.store&.prefixed_id != store_id_header
|
|
45
45
|
render_error(
|
|
46
46
|
code: ErrorHandler::ERROR_CODES[:access_denied],
|
|
47
|
-
message:
|
|
47
|
+
message: I18n.t('spree.api.errors.store_mismatch'),
|
|
48
48
|
status: :forbidden
|
|
49
49
|
)
|
|
50
50
|
return
|
|
@@ -13,11 +13,10 @@ module Spree
|
|
|
13
13
|
#
|
|
14
14
|
# The body picks the subclass against the registry (returns 422 with
|
|
15
15
|
# the configured error code on miss), strips `type`/`preferences`
|
|
16
|
-
# from the permitted attrs, builds/assigns the rest, and
|
|
17
|
-
#
|
|
18
|
-
#
|
|
19
|
-
#
|
|
20
|
-
# for what's settable.
|
|
16
|
+
# from the permitted attrs, builds/assigns the rest, and writes the
|
|
17
|
+
# preferences after checking them against the subclass's schema —
|
|
18
|
+
# an unknown key or a value of the wrong type is a 422
|
|
19
|
+
# `invalid_preferences`.
|
|
21
20
|
module SubclassedResource
|
|
22
21
|
extend ActiveSupport::Concern
|
|
23
22
|
|
|
@@ -45,9 +44,9 @@ module Spree
|
|
|
45
44
|
attrs, preferences, calculator = extract_subclass_params(permitted)
|
|
46
45
|
|
|
47
46
|
@resource = build_subclassed_resource(klass, attrs)
|
|
47
|
+
authorize_resource!(@resource, :create)
|
|
48
48
|
apply_preferences(@resource, preferences) if preferences.present?
|
|
49
49
|
apply_calculator(@resource, calculator) if calculator.present?
|
|
50
|
-
authorize_resource!(@resource, :create)
|
|
51
50
|
|
|
52
51
|
if @resource.save
|
|
53
52
|
render json: serialize_resource(@resource), status: :created
|
|
@@ -63,11 +62,13 @@ module Spree
|
|
|
63
62
|
permitted = permitted_params_for(@resource.class)
|
|
64
63
|
attrs, preferences, calculator = extract_subclass_params(permitted)
|
|
65
64
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
65
|
+
saved = save_atomically do
|
|
66
|
+
@resource.assign_attributes(attrs)
|
|
67
|
+
apply_preferences(@resource, preferences) if preferences.present?
|
|
68
|
+
apply_calculator(@resource, calculator) if calculator.present?
|
|
69
|
+
end
|
|
69
70
|
|
|
70
|
-
if
|
|
71
|
+
if saved
|
|
71
72
|
render json: serialize_resource(@resource)
|
|
72
73
|
else
|
|
73
74
|
render_validation_error(@resource.errors)
|
|
@@ -103,31 +104,16 @@ module Spree
|
|
|
103
104
|
def render_unknown_type
|
|
104
105
|
render_error(
|
|
105
106
|
code: self.class.unknown_type_error_code,
|
|
106
|
-
message:
|
|
107
|
+
message: I18n.t("spree.api.#{self.class.unknown_type_error_code}",
|
|
107
108
|
default: 'Unknown type'),
|
|
108
109
|
status: :unprocessable_content
|
|
109
110
|
)
|
|
110
111
|
end
|
|
111
112
|
|
|
113
|
+
# Validated against the subclass's schema before anything is written
|
|
114
|
+
# (see `Spree::Preferences::Preferable#assign_preferences`).
|
|
112
115
|
def apply_preferences(resource, preferences)
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
preferences.each do |key, value|
|
|
116
|
-
pref_name = key.to_sym
|
|
117
|
-
next unless resource.has_preference?(pref_name)
|
|
118
|
-
# Internal preferences are Spree's to write — a secret a
|
|
119
|
-
# provider issued, an id it gave back. They are absent from the
|
|
120
|
-
# schema, so no form offers them; ignoring them here is what
|
|
121
|
-
# stops a client writing one anyway and breaking the signature
|
|
122
|
-
# check that depends on it.
|
|
123
|
-
next if resource.preference_internal(pref_name)
|
|
124
|
-
# Round-trip guard: clients fetching a record see masked
|
|
125
|
-
# `:password` values. Submitting the mask back unchanged
|
|
126
|
-
# must NOT overwrite the real secret with `••••cret`.
|
|
127
|
-
next if password_keys.include?(pref_name) && Spree::Preferences::Masking.masked?(value)
|
|
128
|
-
|
|
129
|
-
resource.set_preference(pref_name, value)
|
|
130
|
-
end
|
|
116
|
+
resource.assign_preferences(preferences)
|
|
131
117
|
end
|
|
132
118
|
|
|
133
119
|
# Pulls `preferences` and `calculator` out of the permitted
|
|
@@ -26,7 +26,7 @@ module Spree
|
|
|
26
26
|
# nil code, which the dashboard reads as "render the message".
|
|
27
27
|
details = errors.details[attribute] || []
|
|
28
28
|
|
|
29
|
-
result[attribute] = messages.each_with_index.map do |message, index|
|
|
29
|
+
result[wire_error_attribute(errors, attribute)] = messages.each_with_index.map do |message, index|
|
|
30
30
|
detail = details[index] || {}
|
|
31
31
|
code = detail[:error].is_a?(Symbol) ? detail[:error] : nil
|
|
32
32
|
|
|
@@ -4,6 +4,8 @@ module Spree
|
|
|
4
4
|
module CartResolvable
|
|
5
5
|
extend ActiveSupport::Concern
|
|
6
6
|
|
|
7
|
+
include Spree::Api::V3::PurchaseSerialization
|
|
8
|
+
|
|
7
9
|
protected
|
|
8
10
|
|
|
9
11
|
# Find cart by prefixed ID and authorize read access (owner or guest
|
|
@@ -57,6 +59,13 @@ module Spree
|
|
|
57
59
|
@cart = @cart.remove_out_of_stock_items!
|
|
58
60
|
end
|
|
59
61
|
|
|
62
|
+
# Drops a batch coupon code the cart no longer holds. Unlike the line
|
|
63
|
+
# sweep this runs after writes too, since an API client may rely on
|
|
64
|
+
# write responses alone to learn why its discount went.
|
|
65
|
+
def sweep_unavailable_coupon_code!
|
|
66
|
+
@cart = @cart.remove_unavailable_coupon_code!
|
|
67
|
+
end
|
|
68
|
+
|
|
60
69
|
# Render what the checkout produced (for the complete action).
|
|
61
70
|
#
|
|
62
71
|
# A checkout spanning several sellers produced a group of orders rather
|
|
@@ -66,9 +75,8 @@ module Spree
|
|
|
66
75
|
# needs there.
|
|
67
76
|
def render_order(status: :ok)
|
|
68
77
|
record = @cart.reload
|
|
69
|
-
serializer = record.is_a?(Spree::OrderGroup) ? Spree.api.order_group_serializer : Spree.api.order_serializer
|
|
70
78
|
|
|
71
|
-
render json:
|
|
79
|
+
render json: purchase_serializer_for(record).new(record, params: serializer_params).to_h, status: status
|
|
72
80
|
end
|
|
73
81
|
|
|
74
82
|
# Return the cart token from the request headers.
|
|
@@ -59,8 +59,8 @@ module Spree
|
|
|
59
59
|
if header && header.id != bound.id
|
|
60
60
|
render_error(
|
|
61
61
|
code: ErrorHandler::ERROR_CODES[:channel_mismatch],
|
|
62
|
-
message:
|
|
63
|
-
status: :
|
|
62
|
+
message: I18n.t('spree.api.errors.channel_mismatch'),
|
|
63
|
+
status: :unprocessable_content
|
|
64
64
|
)
|
|
65
65
|
return
|
|
66
66
|
end
|
|
@@ -68,7 +68,7 @@ module Spree
|
|
|
68
68
|
unless bound.active?
|
|
69
69
|
render_error(
|
|
70
70
|
code: ErrorHandler::ERROR_CODES[:channel_inactive],
|
|
71
|
-
message:
|
|
71
|
+
message: I18n.t('spree.api.errors.channel_inactive'),
|
|
72
72
|
status: :forbidden
|
|
73
73
|
)
|
|
74
74
|
return
|
|
@@ -13,8 +13,10 @@ module Spree
|
|
|
13
13
|
|
|
14
14
|
protected
|
|
15
15
|
|
|
16
|
+
# Each including controller declares the address it takes with
|
|
17
|
+
# `request_params`.
|
|
16
18
|
def permitted_params
|
|
17
|
-
params.permit(
|
|
19
|
+
params.permit(*declared_permitted_attributes)
|
|
18
20
|
end
|
|
19
21
|
|
|
20
22
|
# @return [Hash] default keywords for Spree::Addresses::Create / Update
|
|
@@ -39,7 +39,7 @@ module Spree
|
|
|
39
39
|
def render_current_password_invalid
|
|
40
40
|
render_error(
|
|
41
41
|
code: ErrorHandler::ERROR_CODES[:current_password_invalid],
|
|
42
|
-
message:
|
|
42
|
+
message: I18n.t('spree.api.current_password_invalid'),
|
|
43
43
|
status: :unprocessable_content
|
|
44
44
|
)
|
|
45
45
|
end
|
|
@@ -48,10 +48,12 @@ module Spree
|
|
|
48
48
|
insufficient_stock: 'insufficient_stock',
|
|
49
49
|
invalid_quantity: 'invalid_quantity',
|
|
50
50
|
invalid_price: 'invalid_price',
|
|
51
|
+
invalid_money_format: 'invalid_money_format',
|
|
51
52
|
price_override_not_allowed: 'price_override_not_allowed',
|
|
52
53
|
|
|
53
54
|
# Validation errors
|
|
54
55
|
validation_error: 'validation_error',
|
|
56
|
+
invalid_preferences: 'invalid_preferences',
|
|
55
57
|
parameter_missing: 'parameter_missing',
|
|
56
58
|
parameter_invalid: 'parameter_invalid',
|
|
57
59
|
|
|
@@ -74,6 +76,11 @@ module Spree
|
|
|
74
76
|
# Export errors
|
|
75
77
|
export_not_ready: 'export_not_ready',
|
|
76
78
|
|
|
79
|
+
# Email template errors
|
|
80
|
+
email_template_stale: 'email_template_stale',
|
|
81
|
+
email_template_invalid: 'email_template_invalid',
|
|
82
|
+
email_template_no_sample: 'email_template_no_sample',
|
|
83
|
+
|
|
77
84
|
# Rate limiting errors
|
|
78
85
|
rate_limit_exceeded: 'rate_limit_exceeded',
|
|
79
86
|
|
|
@@ -96,8 +103,11 @@ module Spree
|
|
|
96
103
|
rescue_from Spree::Core::GatewayError, with: :handle_gateway_error
|
|
97
104
|
rescue_from ActionController::ParameterMissing, with: :handle_parameter_missing
|
|
98
105
|
rescue_from ActiveRecord::RecordInvalid, with: :handle_record_invalid
|
|
106
|
+
rescue_from Spree::Preferences::InvalidPreferences, with: :handle_invalid_preferences
|
|
107
|
+
rescue_from ActiveRecord::RecordNotSaved, with: :handle_record_not_saved
|
|
99
108
|
rescue_from ArgumentError, with: :handle_argument_error
|
|
100
109
|
rescue_from ActionDispatch::Http::Parameters::ParseError, with: :handle_parse_error
|
|
110
|
+
rescue_from ActiveSupport::MessageVerifier::InvalidSignature, with: :handle_invalid_signature
|
|
101
111
|
end
|
|
102
112
|
|
|
103
113
|
protected
|
|
@@ -155,7 +165,7 @@ module Spree
|
|
|
155
165
|
# Workflows reject with a symbol naming the reason. Translate it,
|
|
156
166
|
# falling back to the symbol so a missing key is visible rather
|
|
157
167
|
# than silently blank.
|
|
158
|
-
render_error(code: code, message:
|
|
168
|
+
render_error(code: code, message: I18n.t("spree.#{error}", default: error.to_s.humanize), status: status)
|
|
159
169
|
else
|
|
160
170
|
render_error(code: code, message: error.to_s, status: status)
|
|
161
171
|
end
|
|
@@ -239,6 +249,26 @@ module Spree
|
|
|
239
249
|
render_validation_error(exception.record.errors)
|
|
240
250
|
end
|
|
241
251
|
|
|
252
|
+
# Each failing value is keyed by its JSON pointer into the request,
|
|
253
|
+
# e.g. `/preferences/channel_ids/1`.
|
|
254
|
+
def handle_invalid_preferences(exception)
|
|
255
|
+
render_error(
|
|
256
|
+
code: ERROR_CODES[:invalid_preferences],
|
|
257
|
+
message: exception.message,
|
|
258
|
+
status: :unprocessable_content,
|
|
259
|
+
details: exception.failures.group_by { |failure| failure[:pointer] }.transform_values { |failures| failures.pluck(:message) }
|
|
260
|
+
)
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
# Replacing a has_one on a saved record saves the new one at once, and
|
|
264
|
+
# raises when that one fails its own validations.
|
|
265
|
+
def handle_record_not_saved(exception)
|
|
266
|
+
errors = exception.record&.errors
|
|
267
|
+
return render_validation_error(errors) if errors.present?
|
|
268
|
+
|
|
269
|
+
render_error(code: ERROR_CODES[:validation_error], message: exception.message, status: :unprocessable_content)
|
|
270
|
+
end
|
|
271
|
+
|
|
242
272
|
def handle_argument_error(exception)
|
|
243
273
|
Rails.error.report(exception, context: error_context, source: 'spree.api.v3')
|
|
244
274
|
render_error(
|
|
@@ -248,6 +278,16 @@ module Spree
|
|
|
248
278
|
)
|
|
249
279
|
end
|
|
250
280
|
|
|
281
|
+
# A `signed_id` that was tampered with, or has expired (they last a
|
|
282
|
+
# day), is a bad parameter rather than a server fault.
|
|
283
|
+
def handle_invalid_signature(_exception)
|
|
284
|
+
render_error(
|
|
285
|
+
code: ERROR_CODES[:parameter_invalid],
|
|
286
|
+
message: I18n.t('spree.upload_reference_invalid'),
|
|
287
|
+
status: :unprocessable_content
|
|
288
|
+
)
|
|
289
|
+
end
|
|
290
|
+
|
|
251
291
|
def handle_parse_error(exception)
|
|
252
292
|
Rails.error.report(exception, context: error_context, source: 'spree.api.v3')
|
|
253
293
|
message = exception.respond_to?(:original_message) ? exception.original_message : exception.message
|
|
@@ -263,11 +303,22 @@ module Spree
|
|
|
263
303
|
|
|
264
304
|
# Format validation errors for details field
|
|
265
305
|
def format_validation_details(errors)
|
|
266
|
-
errors.messages.
|
|
267
|
-
messages.map { |msg| msg }
|
|
306
|
+
errors.messages.to_h do |attribute, messages|
|
|
307
|
+
[wire_error_attribute(errors, attribute), messages.map { |msg| msg }]
|
|
268
308
|
end
|
|
269
309
|
end
|
|
270
310
|
|
|
311
|
+
# A setting the API reads and writes under its plain name reports its
|
|
312
|
+
# errors under that name too, never the `preferred_` one the model uses;
|
|
313
|
+
# an attachment slot reports them under the `<slot>_signed_id` it is
|
|
314
|
+
# written with.
|
|
315
|
+
def wire_error_attribute(errors, attribute)
|
|
316
|
+
record_class = errors.objects.first&.base&.class
|
|
317
|
+
(record_class.exposed_preference_name(attribute) if record_class.respond_to?(:exposed_preference_name)) ||
|
|
318
|
+
(record_class.signed_id_attribute_for(attribute) if record_class.respond_to?(:signed_id_attribute_for)) ||
|
|
319
|
+
attribute
|
|
320
|
+
end
|
|
321
|
+
|
|
271
322
|
# Infer error code from context
|
|
272
323
|
def infer_error_code(errors, status)
|
|
273
324
|
case status
|
|
@@ -311,7 +362,7 @@ module Spree
|
|
|
311
362
|
model_name&.humanize || 'record'
|
|
312
363
|
end
|
|
313
364
|
|
|
314
|
-
|
|
365
|
+
I18n.t('spree.api.record_not_found', model: label)
|
|
315
366
|
end
|
|
316
367
|
|
|
317
368
|
# Extract clean model name from exception
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
# `POST /files`: accepts a file for the current store and returns the
|
|
5
|
+
# opaque, expiring `signed_id` an endpoint that uses the file takes
|
|
6
|
+
# (docs/plans/6.0-uploads-and-file-ownership.md).
|
|
7
|
+
#
|
|
8
|
+
# A JSON request carries the file's metadata and gets back a storage
|
|
9
|
+
# target to send the bytes to; a multipart request carries the bytes in
|
|
10
|
+
# its `file` part. Shared by the admin and seller branches: a file
|
|
11
|
+
# stored here is attached to nothing, so what differs is only the gate
|
|
12
|
+
# each branch puts in front of it, which stays on the including
|
|
13
|
+
# controller as its `scoped_resource`.
|
|
14
|
+
module FileUploads
|
|
15
|
+
extend ActiveSupport::Concern
|
|
16
|
+
|
|
17
|
+
def create
|
|
18
|
+
file_upload = Spree::FileUpload.new(store: current_store, **file_upload_params)
|
|
19
|
+
|
|
20
|
+
if file_upload.save
|
|
21
|
+
render json: file_upload_serializer.new(file_upload, params: serializer_params).to_h, status: :created
|
|
22
|
+
else
|
|
23
|
+
render_validation_error(file_upload.errors)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
def file_upload_params
|
|
30
|
+
params.permit(*declared_permitted_attributes).to_h.symbolize_keys
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|