spree_api 6.0.0.beta4 → 6.0.0.rc1
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 -31
- data/app/controllers/concerns/spree/api/v3/admin/email_template_lookup.rb +139 -0
- data/app/controllers/concerns/spree/api/v3/admin/store_context.rb +1 -1
- data/app/controllers/concerns/spree/api/v3/admin/subclassed_resource.rb +1 -1
- data/app/controllers/concerns/spree/api/v3/cart_resolvable.rb +7 -0
- data/app/controllers/concerns/spree/api/v3/channel_resolution.rb +2 -2
- data/app/controllers/concerns/spree/api/v3/current_password_confirmation.rb +1 -1
- data/app/controllers/concerns/spree/api/v3/error_handler.rb +7 -2
- 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/order_lock.rb +2 -2
- data/app/controllers/concerns/spree/api/v3/orders/delivery_actions.rb +1 -5
- data/app/controllers/concerns/spree/api/v3/orders/fulfillment_actions.rb +2 -10
- data/app/controllers/concerns/spree/api/v3/orders/post_sale_actions.rb +2 -10
- data/app/controllers/concerns/spree/api/v3/orders/shipping_label_actions.rb +4 -8
- data/app/controllers/concerns/spree/api/v3/permission_serialization.rb +9 -1
- 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/spree/api/v3/admin/admin_users_controller.rb +0 -5
- data/app/controllers/spree/api/v3/admin/api_keys_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/catalogs/order_minimums_controller.rb +0 -6
- data/app/controllers/spree/api/v3/admin/catalogs/quantity_rules_controller.rb +0 -4
- data/app/controllers/spree/api/v3/admin/catalogs_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/channels_controller.rb +0 -4
- data/app/controllers/spree/api/v3/admin/collections/products_controller.rb +1 -2
- data/app/controllers/spree/api/v3/admin/commission_rates_controller.rb +2 -2
- data/app/controllers/spree/api/v3/admin/companies/addresses_controller.rb +0 -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 +0 -4
- data/app/controllers/spree/api/v3/admin/companies/tax_exemption_certificates_controller.rb +1 -9
- data/app/controllers/spree/api/v3/admin/companies/tax_identifiers_controller.rb +0 -4
- data/app/controllers/spree/api/v3/admin/companies_controller.rb +0 -4
- data/app/controllers/spree/api/v3/admin/countries_controller.rb +1 -1
- 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 +9 -1
- data/app/controllers/spree/api/v3/admin/custom_fields_controller.rb +0 -4
- data/app/controllers/spree/api/v3/admin/customer_groups_controller.rb +0 -4
- data/app/controllers/spree/api/v3/admin/customers/addresses_controller.rb +0 -4
- 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 +0 -4
- data/app/controllers/spree/api/v3/admin/customers_controller.rb +2 -2
- data/app/controllers/spree/api/v3/admin/delivery_methods/rules_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/delivery_methods_controller.rb +3 -5
- data/app/controllers/spree/api/v3/admin/delivery_profiles_controller.rb +1 -6
- data/app/controllers/spree/api/v3/admin/email_templates/drafts_controller.rb +40 -0
- data/app/controllers/spree/api/v3/admin/email_templates/previews_controller.rb +30 -0
- data/app/controllers/spree/api/v3/admin/email_templates/publications_controller.rb +30 -0
- data/app/controllers/spree/api/v3/admin/email_templates/restorations_controller.rb +34 -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 +40 -0
- data/app/controllers/spree/api/v3/admin/email_templates_controller.rb +46 -0
- data/app/controllers/spree/api/v3/admin/imports_controller.rb +1 -2
- data/app/controllers/spree/api/v3/admin/invitations_controller.rb +0 -7
- data/app/controllers/spree/api/v3/admin/me_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/media_library_controller.rb +5 -5
- data/app/controllers/spree/api/v3/admin/order_routing_rules_controller.rb +0 -4
- data/app/controllers/spree/api/v3/admin/orders/deliveries_controller.rb +1 -5
- data/app/controllers/spree/api/v3/admin/orders/discount_codes_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/orders/discounts_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/orders/fulfillments_controller.rb +18 -16
- data/app/controllers/spree/api/v3/admin/orders/gift_cards_controller.rb +3 -3
- data/app/controllers/spree/api/v3/admin/orders/labels_controller.rb +2 -10
- data/app/controllers/spree/api/v3/admin/orders/payments_controller.rb +2 -14
- data/app/controllers/spree/api/v3/admin/orders/refunds_controller.rb +1 -5
- data/app/controllers/spree/api/v3/admin/orders_controller.rb +3 -3
- data/app/controllers/spree/api/v3/admin/password_resets_controller.rb +9 -7
- data/app/controllers/spree/api/v3/admin/price_lists_controller.rb +6 -53
- data/app/controllers/spree/api/v3/admin/prices_controller.rb +0 -4
- data/app/controllers/spree/api/v3/admin/products/digital_assets_controller.rb +2 -6
- data/app/controllers/spree/api/v3/admin/products/variants_controller.rb +0 -4
- data/app/controllers/spree/api/v3/admin/products_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/promotion_actions_controller.rb +0 -4
- data/app/controllers/spree/api/v3/admin/promotion_rules_controller.rb +0 -4
- data/app/controllers/spree/api/v3/admin/purchase_orders_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/resource_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/seller_payouts_controller.rb +1 -9
- data/app/controllers/spree/api/v3/admin/seller_requirement_submissions_controller.rb +2 -10
- 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 +2 -10
- data/app/controllers/spree/api/v3/admin/setup_controller.rb +3 -11
- data/app/controllers/spree/api/v3/admin/stock_transfers_controller.rb +1 -1
- data/app/controllers/spree/api/v3/admin/store_controller.rb +6 -1
- data/app/controllers/spree/api/v3/admin/tags_controller.rb +8 -5
- data/app/controllers/spree/api/v3/admin/webhook_endpoints_controller.rb +17 -12
- data/app/controllers/spree/api/v3/admin/webhook_events_controller.rb +25 -0
- data/app/controllers/spree/api/v3/base_controller.rb +10 -0
- data/app/controllers/spree/api/v3/resource_controller.rb +44 -1
- data/app/controllers/spree/api/v3/seller/auth_controller.rb +2 -2
- data/app/controllers/spree/api/v3/seller/countries_controller.rb +1 -1
- data/app/controllers/spree/api/v3/seller/exports_controller.rb +3 -3
- data/app/controllers/spree/api/v3/seller/invitation_acceptances_controller.rb +3 -3
- data/app/controllers/spree/api/v3/seller/invitations_controller.rb +1 -1
- data/app/controllers/spree/api/v3/seller/me_controller.rb +1 -1
- data/app/controllers/spree/api/v3/seller/orders/labels_controller.rb +1 -1
- data/app/controllers/spree/api/v3/seller/password_resets_controller.rb +10 -11
- data/app/controllers/spree/api/v3/seller/products_controller.rb +2 -1
- data/app/controllers/spree/api/v3/seller/requirement_submissions_controller.rb +1 -1
- data/app/controllers/spree/api/v3/seller/team_controller.rb +1 -1
- data/app/controllers/spree/api/v3/store/carts/discount_codes_controller.rb +1 -1
- data/app/controllers/spree/api/v3/store/carts/fulfillments_controller.rb +3 -11
- data/app/controllers/spree/api/v3/store/carts/gift_cards_controller.rb +5 -3
- data/app/controllers/spree/api/v3/store/carts/items_controller.rb +6 -2
- data/app/controllers/spree/api/v3/store/carts/payment_sessions_controller.rb +1 -1
- data/app/controllers/spree/api/v3/store/carts/payments_controller.rb +5 -3
- data/app/controllers/spree/api/v3/store/carts/po_documents_controller.rb +2 -2
- data/app/controllers/spree/api/v3/store/carts/store_credits_controller.rb +2 -0
- data/app/controllers/spree/api/v3/store/carts_controller.rb +9 -6
- data/app/controllers/spree/api/v3/store/companies/addresses_controller.rb +0 -4
- data/app/controllers/spree/api/v3/store/companies/invitations_controller.rb +1 -5
- data/app/controllers/spree/api/v3/store/company_invitations_controller.rb +1 -1
- data/app/controllers/spree/api/v3/store/customer/addresses_controller.rb +0 -4
- 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 +0 -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 +8 -6
- data/app/controllers/spree/api/v3/store/customer/payment_setup_sessions_controller.rb +0 -4
- data/app/controllers/spree/api/v3/store/customer/store_credits_controller.rb +0 -5
- 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 +5 -14
- data/app/controllers/spree/api/v3/store/orders/claims_controller.rb +1 -5
- data/app/controllers/spree/api/v3/store/orders/returns_controller.rb +1 -5
- data/app/controllers/spree/api/v3/store/wishlist_items_controller.rb +0 -4
- data/app/serializers/spree/api/v3/admin/address_serializer.rb +5 -7
- data/app/serializers/spree/api/v3/admin/api_key_serializer.rb +2 -6
- 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 +1 -7
- 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 +5 -6
- data/app/serializers/spree/api/v3/admin/claim_reason_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/commission_rule_serializer.rb +1 -3
- 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 +2 -10
- data/app/serializers/spree/api/v3/admin/data_request_serializer.rb +2 -6
- data/app/serializers/spree/api/v3/admin/delivery_method_serializer.rb +8 -22
- data/app/serializers/spree/api/v3/admin/delivery_origin_group_serializer.rb +1 -3
- 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/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_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/export_serializer.rb +1 -7
- data/app/serializers/spree/api/v3/admin/fulfillment_item_serializer.rb +1 -7
- data/app/serializers/spree/api/v3/admin/fulfillment_serializer.rb +1 -7
- data/app/serializers/spree/api/v3/admin/gift_card_serializer.rb +1 -7
- data/app/serializers/spree/api/v3/admin/line_item_serializer.rb +2 -6
- data/app/serializers/spree/api/v3/admin/market_serializer.rb +4 -2
- data/app/serializers/spree/api/v3/admin/media_serializer.rb +1 -3
- 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 +3 -9
- data/app/serializers/spree/api/v3/admin/order_routing_rule_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/order_serializer.rb +5 -15
- 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 -1
- data/app/serializers/spree/api/v3/admin/payment_serializer.rb +2 -7
- data/app/serializers/spree/api/v3/admin/permission_serializer.rb +4 -4
- data/app/serializers/spree/api/v3/admin/price_rule_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/product_serializer.rb +2 -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 +1 -3
- data/app/serializers/spree/api/v3/admin/promotion_rule_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/purchase_order_item_serializer.rb +2 -15
- data/app/serializers/spree/api/v3/admin/purchase_order_serializer.rb +2 -15
- data/app/serializers/spree/api/v3/admin/refund_reason_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/refund_serializer.rb +4 -1
- data/app/serializers/spree/api/v3/admin/return_line_item_serializer.rb +1 -0
- data/app/serializers/spree/api/v3/admin/return_reason_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/return_serializer.rb +3 -11
- data/app/serializers/spree/api/v3/admin/saved_report_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/seller_payout_serializer.rb +4 -2
- 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 +5 -15
- data/app/serializers/spree/api/v3/admin/seller_transfer_serializer.rb +4 -2
- data/app/serializers/spree/api/v3/admin/shipping_label_serializer.rb +6 -19
- data/app/serializers/spree/api/v3/admin/stock_level_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/stock_location_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/stock_movement_serializer.rb +1 -3
- 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 +1 -3
- data/app/serializers/spree/api/v3/admin/store_credit_serializer.rb +4 -18
- data/app/serializers/spree/api/v3/admin/store_serializer.rb +24 -6
- data/app/serializers/spree/api/v3/admin/supplier_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/tax_exemption_certificate_serializer.rb +3 -9
- data/app/serializers/spree/api/v3/admin/tax_identifier_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/admin/tax_line_serializer.rb +5 -1
- data/app/serializers/spree/api/v3/admin/tax_rate_serializer.rb +1 -7
- data/app/serializers/spree/api/v3/admin/variant_serializer.rb +6 -7
- 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 +20 -0
- data/app/serializers/spree/api/v3/cart_serializer.rb +17 -45
- data/app/serializers/spree/api/v3/category_serializer.rb +5 -15
- data/app/serializers/spree/api/v3/claim_line_item_serializer.rb +11 -26
- data/app/serializers/spree/api/v3/claim_serializer.rb +2 -15
- 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/custom_field_serializer.rb +1 -2
- data/app/serializers/spree/api/v3/delivery_rate_serializer.rb +3 -23
- 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 +1 -12
- data/app/serializers/spree/api/v3/exchange_line_item_serializer.rb +9 -27
- data/app/serializers/spree/api/v3/exchange_serializer.rb +2 -15
- 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/fulfillment_serializer.rb +4 -11
- data/app/serializers/spree/api/v3/gift_card_batch_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/gift_card_serializer.rb +5 -17
- data/app/serializers/spree/api/v3/import_row_serializer.rb +2 -6
- data/app/serializers/spree/api/v3/import_serializer.rb +3 -14
- data/app/serializers/spree/api/v3/invitation_serializer.rb +2 -19
- data/app/serializers/spree/api/v3/line_item_serializer.rb +6 -20
- data/app/serializers/spree/api/v3/media_event_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/media_serializer.rb +1 -3
- 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 +2 -23
- data/app/serializers/spree/api/v3/order_serializer.rb +12 -38
- 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 +3 -9
- 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 +1 -3
- data/app/serializers/spree/api/v3/price_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/product_publication_serializer.rb +1 -7
- data/app/serializers/spree/api/v3/product_serializer.rb +7 -21
- 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 +3 -11
- data/app/serializers/spree/api/v3/return_line_item_serializer.rb +12 -19
- data/app/serializers/spree/api/v3/return_serializer.rb +6 -15
- data/app/serializers/spree/api/v3/saved_report_event_serializer.rb +23 -0
- data/app/serializers/spree/api/v3/seller/delivery_method_serializer.rb +1 -7
- data/app/serializers/spree/api/v3/seller/delivery_rate_serializer.rb +1 -7
- 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_serializer.rb +1 -3
- 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/invitation_serializer.rb +1 -3
- data/app/serializers/spree/api/v3/seller/order_line_item_serializer.rb +7 -13
- data/app/serializers/spree/api/v3/seller/order_serializer.rb +4 -25
- data/app/serializers/spree/api/v3/seller/payout_serializer.rb +4 -2
- data/app/serializers/spree/api/v3/seller/product_serializer.rb +1 -7
- data/app/serializers/spree/api/v3/seller/product_submission_serializer.rb +1 -21
- data/app/serializers/spree/api/v3/seller/profile_serializer.rb +2 -6
- data/app/serializers/spree/api/v3/seller/requirement_status_serializer.rb +3 -9
- data/app/serializers/spree/api/v3/seller/return_serializer.rb +3 -15
- data/app/serializers/spree/api/v3/seller/transfer_serializer.rb +4 -2
- 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_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 -11
- data/app/serializers/spree/api/v3/store_credit_serializer.rb +2 -24
- data/app/serializers/spree/api/v3/supplier_event_serializer.rb +6 -4
- data/app/serializers/spree/api/v3/tax_line_serializer.rb +10 -20
- data/app/serializers/spree/api/v3/variant_serializer.rb +7 -21
- 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/subscribers/spree/webhook_event_subscriber.rb +3 -10
- data/config/initializers/pagy.rb +1 -1
- data/config/initializers/typelizer.rb +6 -8
- 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 +49 -99
- data/lib/spree/api/dependencies.rb +53 -274
- data/lib/spree/api/openapi/schema_helper.rb +1 -1
- data/lib/spree/api/typelizer_generation.rb +35 -0
- data/lib/spree/api/webhook_event_types.rb +140 -0
- data/lib/spree/api.rb +0 -2
- metadata +71 -36
- data/config/i18n-tasks.yml +0 -40
- data/config/initializers/alba.rb +0 -5
|
@@ -30,11 +30,7 @@ module Spree
|
|
|
30
30
|
reference: params[:reference].to_s.presence
|
|
31
31
|
)
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
render json: serialize_resource(result.value)
|
|
35
|
-
else
|
|
36
|
-
render_result_error(result)
|
|
37
|
-
end
|
|
33
|
+
render_result(result)
|
|
38
34
|
end
|
|
39
35
|
|
|
40
36
|
protected
|
|
@@ -47,10 +43,6 @@ module Spree
|
|
|
47
43
|
Spree.api.admin_seller_payout_serializer
|
|
48
44
|
end
|
|
49
45
|
|
|
50
|
-
def scope
|
|
51
|
-
super.for_store(current_store)
|
|
52
|
-
end
|
|
53
|
-
|
|
54
46
|
# Deliberately without `transfers`: the serializer wants their number,
|
|
55
47
|
# not the rows, and a monthly settlement can hold hundreds.
|
|
56
48
|
def collection_includes
|
|
@@ -30,11 +30,7 @@ module Spree
|
|
|
30
30
|
review_note: params[:review_note]
|
|
31
31
|
)
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
render json: serialize_resource(result.value), status: :created
|
|
35
|
-
else
|
|
36
|
-
render_result_error(result)
|
|
37
|
-
end
|
|
33
|
+
render_result(result, status: :created)
|
|
38
34
|
end
|
|
39
35
|
|
|
40
36
|
# PATCH /api/v3/admin/sellers/:seller_id/requirement_submissions/:id/accept
|
|
@@ -126,11 +122,7 @@ module Spree
|
|
|
126
122
|
review_note: params[:review_note]
|
|
127
123
|
)
|
|
128
124
|
|
|
129
|
-
|
|
130
|
-
render json: serialize_resource(result.value)
|
|
131
|
-
else
|
|
132
|
-
render_result_error(result)
|
|
133
|
-
end
|
|
125
|
+
render_result(result)
|
|
134
126
|
end
|
|
135
127
|
end
|
|
136
128
|
end
|
|
@@ -20,10 +20,6 @@ module Spree
|
|
|
20
20
|
Spree.api.admin_seller_transfer_serializer
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
-
def scope
|
|
24
|
-
super.for_store(current_store)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
23
|
# Every association the serializer reads, so a page of rows costs a
|
|
28
24
|
# fixed number of queries rather than one per row.
|
|
29
25
|
def collection_includes
|
|
@@ -47,7 +47,7 @@ module Spree
|
|
|
47
47
|
# than a success that produced no payout.
|
|
48
48
|
render_error(
|
|
49
49
|
code: ErrorHandler::ERROR_CODES[:validation_error],
|
|
50
|
-
message:
|
|
50
|
+
message: I18n.t('spree.seller_payout_nothing_to_settle'),
|
|
51
51
|
status: :unprocessable_content
|
|
52
52
|
)
|
|
53
53
|
end
|
|
@@ -31,11 +31,7 @@ module Spree
|
|
|
31
31
|
inviter: try_spree_current_user
|
|
32
32
|
)
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
render json: serialize_resource(result.value), status: :created
|
|
36
|
-
else
|
|
37
|
-
render_result_error(result)
|
|
38
|
-
end
|
|
34
|
+
render_result(result, status: :created)
|
|
39
35
|
end
|
|
40
36
|
|
|
41
37
|
# GET /api/v3/admin/sellers/:id/onboarding
|
|
@@ -176,11 +172,7 @@ module Spree
|
|
|
176
172
|
def run_workflow(workflow, **arguments)
|
|
177
173
|
result = workflow.call(seller: @resource, **arguments)
|
|
178
174
|
|
|
179
|
-
|
|
180
|
-
render json: serialize_resource(result.value)
|
|
181
|
-
else
|
|
182
|
-
render_result_error(result)
|
|
183
|
-
end
|
|
175
|
+
render_result(result)
|
|
184
176
|
end
|
|
185
177
|
|
|
186
178
|
# Read through the seller's own roles: a role id naming somewhere
|
|
@@ -149,20 +149,12 @@ module Spree
|
|
|
149
149
|
# would point a storefront at a language with nothing behind it.
|
|
150
150
|
# English closes the gap for countries whose languages all fall
|
|
151
151
|
# through, and is always offered alongside.
|
|
152
|
-
#
|
|
153
|
-
# Installs without spree_i18n only have English, and filtering
|
|
154
|
-
# against that would leave every country English-only. There the
|
|
155
|
-
# unfiltered list is the better answer: the merchant's own language
|
|
156
|
-
# is still the right default for their storefront, whether or not
|
|
157
|
-
# this install carries a translation bundle for it.
|
|
158
152
|
def offerable_locales(country)
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
(country.official_locales & translated_locales).presence || ['en']
|
|
153
|
+
country.official_locales.filter_map { |language| Spree.locale_for_language(language, available_locales) }.presence || ['en']
|
|
162
154
|
end
|
|
163
155
|
|
|
164
|
-
def
|
|
165
|
-
@
|
|
156
|
+
def available_locales
|
|
157
|
+
@available_locales ||= Spree.available_locales
|
|
166
158
|
end
|
|
167
159
|
|
|
168
160
|
# Token mismatch, spent token, and already-set-up all render the
|
|
@@ -38,7 +38,7 @@ module Spree
|
|
|
38
38
|
unless @resource.draft?
|
|
39
39
|
return render_error(
|
|
40
40
|
code: 'invalid_status',
|
|
41
|
-
message:
|
|
41
|
+
message: I18n.t('spree.stock_transfer.errors.only_draft_can_be_deleted'),
|
|
42
42
|
status: :unprocessable_content
|
|
43
43
|
)
|
|
44
44
|
end
|
|
@@ -56,7 +56,6 @@ module Spree
|
|
|
56
56
|
{
|
|
57
57
|
key: provider_class.key,
|
|
58
58
|
name: provider_class.provider_name,
|
|
59
|
-
integration_class: provider_class.integration_class,
|
|
60
59
|
integration_type: provider_class.integration_class.presence&.safe_constantize&.api_type,
|
|
61
60
|
available: provider_class.available_for_store?(current_store)
|
|
62
61
|
}
|
|
@@ -117,6 +116,12 @@ module Spree
|
|
|
117
116
|
:customer_support_email,
|
|
118
117
|
:new_order_notifications_email,
|
|
119
118
|
:preferred_send_consumer_transactional_emails,
|
|
119
|
+
:preferred_email_accent_color,
|
|
120
|
+
:preferred_email_background_color,
|
|
121
|
+
:preferred_email_card_color,
|
|
122
|
+
:preferred_email_text_color,
|
|
123
|
+
:preferred_email_heading_color,
|
|
124
|
+
:preferred_email_font,
|
|
120
125
|
:mailer_logo
|
|
121
126
|
)
|
|
122
127
|
end
|
|
@@ -45,16 +45,19 @@ module Spree
|
|
|
45
45
|
|
|
46
46
|
private
|
|
47
47
|
|
|
48
|
+
# The class name taggings store for the requested shorthand
|
|
49
|
+
# (`product` → `Spree::Product`), or nil when it is not taggable.
|
|
48
50
|
def taggable_type
|
|
49
|
-
params[:taggable_type]
|
|
51
|
+
@taggable_type ||= Spree::Base.polymorphic_type_for(params[:taggable_type], allowed_taggable_types)
|
|
50
52
|
end
|
|
51
53
|
|
|
52
54
|
def valid_taggable_type?
|
|
53
|
-
return true if
|
|
55
|
+
return true if taggable_type
|
|
54
56
|
|
|
57
|
+
allowed = allowed_taggable_types.map { |type| Spree::Base.polymorphic_api_type(type) }
|
|
55
58
|
render_error(
|
|
56
59
|
code: 'invalid_taggable_type',
|
|
57
|
-
message: "taggable_type must be one of #{
|
|
60
|
+
message: "taggable_type must be one of #{allowed.join(', ')}",
|
|
58
61
|
status: :unprocessable_content
|
|
59
62
|
)
|
|
60
63
|
false
|
|
@@ -83,7 +86,7 @@ module Spree
|
|
|
83
86
|
# admins are gated by store membership + CanCanCan, not scopes.
|
|
84
87
|
def authorize_taggable_scope!
|
|
85
88
|
return unless current_api_key
|
|
86
|
-
return unless
|
|
89
|
+
return unless taggable_type
|
|
87
90
|
|
|
88
91
|
required = self.class.scope_for_taggable_type.fetch(taggable_type, 'read_all')
|
|
89
92
|
return if current_api_key.has_scope?(required)
|
|
@@ -101,7 +104,7 @@ module Spree
|
|
|
101
104
|
# list in an initializer without overriding this controller:
|
|
102
105
|
# Spree.taggable_types << 'MyApp::Seller'
|
|
103
106
|
def allowed_taggable_types
|
|
104
|
-
Spree.taggable_types
|
|
107
|
+
Spree.taggable_types.map(&:to_s)
|
|
105
108
|
end
|
|
106
109
|
end
|
|
107
110
|
end
|
|
@@ -73,27 +73,32 @@ module Spree
|
|
|
73
73
|
|
|
74
74
|
private
|
|
75
75
|
|
|
76
|
-
#
|
|
77
|
-
# webhooks permission alone cannot subscribe an endpoint to
|
|
78
|
-
# repoint an endpoint that already receives
|
|
76
|
+
# A customer's password reset token is an account credential, so the
|
|
77
|
+
# webhooks permission alone cannot subscribe an endpoint to it, or
|
|
78
|
+
# repoint an endpoint that already receives it: that needs the
|
|
79
|
+
# permission the event catalog names for it (`write_customers`).
|
|
79
80
|
def reject_unauthorized_credential_subscription!
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
return if requested.empty? && !repoints_credential_endpoint?
|
|
81
|
+
events = requested_credential_events | repointed_credential_events
|
|
82
|
+
missing = events.reject { |entry| holds_permission?(entry.credential_permission) }
|
|
83
|
+
return if missing.empty?
|
|
84
84
|
|
|
85
85
|
render_error(
|
|
86
86
|
code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:access_denied],
|
|
87
|
-
message: "Receiving #{
|
|
87
|
+
message: "Receiving #{missing.map(&:name).to_sentence} requires the " \
|
|
88
|
+
"#{missing.map(&:credential_permission).uniq.to_sentence} permission",
|
|
88
89
|
status: :forbidden
|
|
89
90
|
)
|
|
90
91
|
end
|
|
91
92
|
|
|
92
|
-
def
|
|
93
|
-
|
|
94
|
-
|
|
93
|
+
def requested_credential_events
|
|
94
|
+
Spree::Events.catalog.credential_events(Array(permitted_params[:subscriptions]))
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def repointed_credential_events
|
|
98
|
+
return [] unless action_name == 'update'
|
|
99
|
+
return [] unless permitted_params.key?(:url) || permitted_params.key?(:subscriptions)
|
|
95
100
|
|
|
96
|
-
current_store.webhook_endpoints.find_by_prefix_id(params[:id])&.
|
|
101
|
+
current_store.webhook_endpoints.find_by_prefix_id(params[:id])&.credential_subscriptions || []
|
|
97
102
|
end
|
|
98
103
|
end
|
|
99
104
|
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module Api
|
|
3
|
+
module V3
|
|
4
|
+
module Admin
|
|
5
|
+
# The events a webhook endpoint can subscribe to — every event Spree
|
|
6
|
+
# and the installed extensions declare, so the endpoint picker never
|
|
7
|
+
# drifts from what the server really publishes.
|
|
8
|
+
class WebhookEventsController < Admin::BaseController
|
|
9
|
+
scoped_resource :webhooks
|
|
10
|
+
|
|
11
|
+
# GET /api/v3/admin/webhook_events
|
|
12
|
+
def index
|
|
13
|
+
authorize!(:show, Spree::WebhookEndpoint)
|
|
14
|
+
entries = Spree::Events.catalog.webhook_events
|
|
15
|
+
|
|
16
|
+
render json: {
|
|
17
|
+
data: entries.map { |entry| Spree.api.admin_webhook_event_serializer.new(entry).to_h },
|
|
18
|
+
meta: { count: entries.size }
|
|
19
|
+
}
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -70,6 +70,16 @@ module Spree
|
|
|
70
70
|
request.headers['x-spree-token']
|
|
71
71
|
end
|
|
72
72
|
|
|
73
|
+
# Renders a workflow's result: the serialized record on success, its
|
|
74
|
+
# errors otherwise.
|
|
75
|
+
def render_result(result, status: :ok)
|
|
76
|
+
if result.success?
|
|
77
|
+
render json: serialize_resource(result.value), status: status
|
|
78
|
+
else
|
|
79
|
+
render_result_error(result)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
73
83
|
# Renders a failed service/workflow Result: validation errors become a
|
|
74
84
|
# 422 field-error payload, anything else a plain service error. Shared
|
|
75
85
|
# by both APIs — Store endpoints surface workflow failures (a rejected
|
|
@@ -80,7 +80,7 @@ module Spree
|
|
|
80
80
|
# which raises before the controller hook fires and yields 403.
|
|
81
81
|
def destroy
|
|
82
82
|
if @resource.respond_to?(:can_be_deleted?) && !@resource.can_be_deleted?
|
|
83
|
-
message =
|
|
83
|
+
message = I18n.t('spree.api.cannot_delete', model: @resource.class.model_name.human)
|
|
84
84
|
return render_error(
|
|
85
85
|
code: ERROR_CODES[:validation_error],
|
|
86
86
|
message: message,
|
|
@@ -297,6 +297,7 @@ module Spree
|
|
|
297
297
|
def ransack_params
|
|
298
298
|
rp = params[:q]&.to_unsafe_h || params[:q] || {}
|
|
299
299
|
rp = decode_prefixed_id_predicates(rp)
|
|
300
|
+
rp = decode_api_type_predicates(rp)
|
|
300
301
|
sort_value = sort_param
|
|
301
302
|
|
|
302
303
|
if sort_value.present?
|
|
@@ -329,6 +330,48 @@ module Spree
|
|
|
329
330
|
end
|
|
330
331
|
end
|
|
331
332
|
|
|
333
|
+
# Filters on a type column take the same shorthand responses carry
|
|
334
|
+
# (`type_eq=orders`, `receivable_type_eq=purchase_order`), translated
|
|
335
|
+
# here to the class name the column stores. Only the model's own STI
|
|
336
|
+
# column and its polymorphic `*_type` columns are translated; any other
|
|
337
|
+
# `*_type` attribute (`media_type`, `key_type`) is a plain value.
|
|
338
|
+
RANSACK_TYPE_PREDICATE_RE = /\A(?<attribute>(?:\w+_)?type)_(?:eq|not_eq|in|not_in)\z/.freeze
|
|
339
|
+
def decode_api_type_predicates(hash)
|
|
340
|
+
return hash unless hash.is_a?(Hash)
|
|
341
|
+
|
|
342
|
+
hash.each_with_object({}) do |(key, value), result|
|
|
343
|
+
resolver = api_type_resolver(RANSACK_TYPE_PREDICATE_RE.match(key.to_s)&.[](:attribute))
|
|
344
|
+
result[key] = if resolver
|
|
345
|
+
resolve_api_type_values(value, resolver)
|
|
346
|
+
elsif value.is_a?(Hash)
|
|
347
|
+
decode_api_type_predicates(value)
|
|
348
|
+
else
|
|
349
|
+
value
|
|
350
|
+
end
|
|
351
|
+
end
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
# A scalar stays a scalar; a list — including the indexed form
|
|
355
|
+
# (`type_in[0]=orders`) that arrives as a hash — becomes an array.
|
|
356
|
+
def resolve_api_type_values(value, resolver)
|
|
357
|
+
case value
|
|
358
|
+
when Hash, Array then (value.is_a?(Hash) ? value.values : value).map { |entry| resolve_api_type_values(entry, resolver) }
|
|
359
|
+
else resolver.call(value.to_s) || value
|
|
360
|
+
end
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
# @param attribute [String, nil] a `*type` column of {#model_class}
|
|
364
|
+
# @return [Proc, nil] shorthand → stored class name
|
|
365
|
+
def api_type_resolver(attribute)
|
|
366
|
+
return if attribute.nil? || !model_class.respond_to?(:api_type_registry)
|
|
367
|
+
|
|
368
|
+
if attribute == model_class.inheritance_column && model_class.api_type_registry.any?
|
|
369
|
+
->(api_type) { model_class.class_name_for_api_type(api_type) }
|
|
370
|
+
elsif model_class.reflect_on_all_associations(:belongs_to).any? { |reflection| reflection.polymorphic? && reflection.foreign_type == attribute }
|
|
371
|
+
->(api_type) { Spree::Base.polymorphic_type_for(api_type) }
|
|
372
|
+
end
|
|
373
|
+
end
|
|
374
|
+
|
|
332
375
|
# Matches both prefixed-FK predicates (`product_id_in`, `tax_category_id_eq`)
|
|
333
376
|
# and the bare-`id` predicates (`id_in`, `id_eq`) on the resource's
|
|
334
377
|
# primary key. Without the bare-id branch, `q[id_in][]=prod_x` would
|
|
@@ -48,7 +48,7 @@ module Spree
|
|
|
48
48
|
# not enough: without a role on some seller there is no panel to
|
|
49
49
|
# sign in to, and minting a token would hand out an audience the
|
|
50
50
|
# holder can do nothing with.
|
|
51
|
-
return render_authentication_failed(
|
|
51
|
+
return render_authentication_failed(I18n.t('spree.seller_membership_required')) unless user.seller_member?
|
|
52
52
|
|
|
53
53
|
set_refresh_cookie(
|
|
54
54
|
Spree::RefreshToken.create_for(
|
|
@@ -100,7 +100,7 @@ module Spree
|
|
|
100
100
|
clear_refresh_cookie
|
|
101
101
|
return render_error(
|
|
102
102
|
code: ErrorHandler::ERROR_CODES[:access_denied],
|
|
103
|
-
message:
|
|
103
|
+
message: I18n.t('spree.seller_membership_required'),
|
|
104
104
|
status: :forbidden
|
|
105
105
|
)
|
|
106
106
|
end
|
|
@@ -14,7 +14,7 @@ module Spree
|
|
|
14
14
|
# GET /api/v3/seller/countries
|
|
15
15
|
#
|
|
16
16
|
# Unpaginated: there are ~250 countries and an address dropdown needs
|
|
17
|
-
# them all at once, which Pagy's global
|
|
17
|
+
# them all at once, which Pagy's global client_limit would prevent.
|
|
18
18
|
def index
|
|
19
19
|
countries = Spree::Country.all.sort_by(&:name)
|
|
20
20
|
|
|
@@ -181,9 +181,9 @@ module Spree
|
|
|
181
181
|
def render_unsupported_type
|
|
182
182
|
render_error(
|
|
183
183
|
code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:validation_error],
|
|
184
|
-
message:
|
|
185
|
-
'api.errors.unsupported_export_type',
|
|
186
|
-
|
|
184
|
+
message: I18n.t(
|
|
185
|
+
'spree.api.errors.unsupported_export_type',
|
|
186
|
+
types: ALLOWED_TYPES.join(', ')
|
|
187
187
|
),
|
|
188
188
|
status: :unprocessable_content
|
|
189
189
|
)
|
|
@@ -74,7 +74,7 @@ module Spree
|
|
|
74
74
|
unless @invitation
|
|
75
75
|
render_error(
|
|
76
76
|
code: ErrorHandler::ERROR_CODES[:record_not_found],
|
|
77
|
-
message:
|
|
77
|
+
message: I18n.t('spree.invitation_not_acceptable'),
|
|
78
78
|
status: :not_found
|
|
79
79
|
)
|
|
80
80
|
return false
|
|
@@ -101,7 +101,7 @@ module Spree
|
|
|
101
101
|
|
|
102
102
|
render_error(
|
|
103
103
|
code: ErrorHandler::ERROR_CODES[:authentication_failed],
|
|
104
|
-
message:
|
|
104
|
+
message: I18n.t('spree.invalid_password'),
|
|
105
105
|
status: :unauthorized
|
|
106
106
|
)
|
|
107
107
|
nil
|
|
@@ -111,7 +111,7 @@ module Spree
|
|
|
111
111
|
if params[:password].blank?
|
|
112
112
|
render_error(
|
|
113
113
|
code: ErrorHandler::ERROR_CODES[:parameter_missing],
|
|
114
|
-
message:
|
|
114
|
+
message: I18n.t('spree.password_required_to_create_account'),
|
|
115
115
|
status: :unprocessable_content
|
|
116
116
|
)
|
|
117
117
|
return nil
|
|
@@ -27,7 +27,7 @@ module Spree
|
|
|
27
27
|
if label_params[:file].blank?
|
|
28
28
|
return render_error(
|
|
29
29
|
code: ERROR_CODES[:validation_error],
|
|
30
|
-
message:
|
|
30
|
+
message: I18n.t('spree.shipping_labels.errors.file_required'),
|
|
31
31
|
status: :unprocessable_content
|
|
32
32
|
)
|
|
33
33
|
end
|
|
@@ -15,6 +15,8 @@ module Spree
|
|
|
15
15
|
include Spree::Api::V3::Seller::AuthCookies
|
|
16
16
|
include Spree::Api::V3::JwtAuthentication
|
|
17
17
|
|
|
18
|
+
RESET_REQUESTED_EVENT = 'seller_user.password_reset_requested'.freeze
|
|
19
|
+
|
|
18
20
|
# No `skip_scope_check!`: this extends the plain v3 base, which has
|
|
19
21
|
# no authentication or scope gate to lift. The emailed token is the
|
|
20
22
|
# only credential, exactly as on the admin twin.
|
|
@@ -32,12 +34,12 @@ module Spree
|
|
|
32
34
|
# them a seller reset link would be an invitation to a session they
|
|
33
35
|
# cannot hold.
|
|
34
36
|
if user&.seller_member?
|
|
35
|
-
user.publish_event(
|
|
37
|
+
user.publish_event(RESET_REQUESTED_EVENT, event_payload(user))
|
|
36
38
|
end
|
|
37
39
|
|
|
38
40
|
# Always 202, whether or not anything matched — this endpoint must
|
|
39
41
|
# not become a way to discover which addresses exist.
|
|
40
|
-
render json: { message:
|
|
42
|
+
render json: { message: I18n.t('spree.api.password_reset_requested') }, status: :accepted
|
|
41
43
|
end
|
|
42
44
|
|
|
43
45
|
# PATCH /api/v3/seller/auth/password_resets/:id
|
|
@@ -79,7 +81,7 @@ module Spree
|
|
|
79
81
|
def render_token_invalid
|
|
80
82
|
render_error(
|
|
81
83
|
code: ErrorHandler::ERROR_CODES[:password_reset_token_invalid],
|
|
82
|
-
message:
|
|
84
|
+
message: I18n.t('spree.api.password_reset_token_invalid'),
|
|
83
85
|
status: :unprocessable_content
|
|
84
86
|
)
|
|
85
87
|
end
|
|
@@ -88,14 +90,11 @@ module Spree
|
|
|
88
90
|
# right panel origin and locale without a request to read them from.
|
|
89
91
|
def event_payload(user)
|
|
90
92
|
store = seller_store(user)
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
redirect_url = validated_redirect_url(store)
|
|
97
|
-
payload[:redirect_url] = redirect_url if redirect_url.present?
|
|
98
|
-
payload
|
|
93
|
+
user.event_payload_for(
|
|
94
|
+
RESET_REQUESTED_EVENT,
|
|
95
|
+
reset_token: user.generate_token_for(:password_reset), store: store,
|
|
96
|
+
redirect_url: validated_redirect_url(store).presence
|
|
97
|
+
)
|
|
99
98
|
end
|
|
100
99
|
|
|
101
100
|
# Which store's panel to send them to.
|
|
@@ -107,7 +107,7 @@ module Spree
|
|
|
107
107
|
if resolve_workflow.nil?
|
|
108
108
|
return render_error(
|
|
109
109
|
code: 'invalid_status',
|
|
110
|
-
message:
|
|
110
|
+
message: I18n.t('spree.errors.messages.invalid_status'),
|
|
111
111
|
status: :unprocessable_content
|
|
112
112
|
)
|
|
113
113
|
end
|
|
@@ -166,6 +166,7 @@ module Spree
|
|
|
166
166
|
|
|
167
167
|
def permitted_params
|
|
168
168
|
attrs = params.permit(
|
|
169
|
+
*model_class.additional_seller_permitted_attributes,
|
|
169
170
|
:name, :description, :slug,
|
|
170
171
|
:meta_title, :meta_description, :meta_keywords,
|
|
171
172
|
:product_type_id, :delivery_profile_id,
|
|
@@ -42,7 +42,7 @@ module Spree
|
|
|
42
42
|
unless @submission.file.attached?
|
|
43
43
|
return render_error(
|
|
44
44
|
code: ErrorHandler::ERROR_CODES[:validation_error],
|
|
45
|
-
message:
|
|
45
|
+
message: I18n.t('spree.seller_submission_no_file'),
|
|
46
46
|
status: :unprocessable_content
|
|
47
47
|
)
|
|
48
48
|
end
|
|
@@ -64,7 +64,7 @@ module Spree
|
|
|
64
64
|
def attach_pending_coupon_warning
|
|
65
65
|
@cart.warnings |= [{
|
|
66
66
|
code: coupon_handler.status_code.to_s,
|
|
67
|
-
message: coupon_handler.error.presence ||
|
|
67
|
+
message: coupon_handler.error.presence || I18n.t('spree.coupon_code_not_eligible')
|
|
68
68
|
}]
|
|
69
69
|
end
|
|
70
70
|
|
|
@@ -9,15 +9,6 @@ module Spree
|
|
|
9
9
|
|
|
10
10
|
before_action :find_cart!
|
|
11
11
|
|
|
12
|
-
# GET /api/v3/store/carts/:cart_id/fulfillments
|
|
13
|
-
def index
|
|
14
|
-
fulfillments = @cart.fulfillments.includes(delivery_rates: :delivery_method)
|
|
15
|
-
render json: {
|
|
16
|
-
data: fulfillments.map { |s| Spree.api.fulfillment_serializer.new(s, params: serializer_params).to_h },
|
|
17
|
-
meta: { count: fulfillments.size }
|
|
18
|
-
}
|
|
19
|
-
end
|
|
20
|
-
|
|
21
12
|
# PATCH /api/v3/store/carts/:cart_id/fulfillments/:id
|
|
22
13
|
# Selects a delivery rate, and for pickup_point methods a concrete
|
|
23
14
|
# pickup point (validated against the provider, then frozen into
|
|
@@ -36,6 +27,7 @@ module Spree
|
|
|
36
27
|
|
|
37
28
|
recalculate
|
|
38
29
|
|
|
30
|
+
sweep_unavailable_coupon_code!
|
|
39
31
|
render_cart
|
|
40
32
|
end
|
|
41
33
|
end
|
|
@@ -62,7 +54,7 @@ module Spree
|
|
|
62
54
|
if provider.nil?
|
|
63
55
|
render_error(
|
|
64
56
|
code: ERROR_CODES[:validation_error],
|
|
65
|
-
message:
|
|
57
|
+
message: I18n.t('spree.errors.messages.no_pickup_point_provider'),
|
|
66
58
|
status: :unprocessable_entity
|
|
67
59
|
)
|
|
68
60
|
return false
|
|
@@ -72,7 +64,7 @@ module Spree
|
|
|
72
64
|
if point.nil?
|
|
73
65
|
render_error(
|
|
74
66
|
code: ERROR_CODES[:record_not_found],
|
|
75
|
-
message:
|
|
67
|
+
message: I18n.t('spree.errors.messages.pickup_point_not_found'),
|
|
76
68
|
status: :not_found
|
|
77
69
|
)
|
|
78
70
|
return false
|
|
@@ -18,6 +18,7 @@ module Spree
|
|
|
18
18
|
result = @cart.apply_gift_card(gift_card)
|
|
19
19
|
|
|
20
20
|
if result.success?
|
|
21
|
+
sweep_unavailable_coupon_code!
|
|
21
22
|
render_cart(status: :created)
|
|
22
23
|
else
|
|
23
24
|
render_service_error(result.error)
|
|
@@ -31,6 +32,7 @@ module Spree
|
|
|
31
32
|
result = @cart.remove_gift_card
|
|
32
33
|
|
|
33
34
|
if result.success?
|
|
35
|
+
sweep_unavailable_coupon_code!
|
|
34
36
|
render_cart
|
|
35
37
|
else
|
|
36
38
|
render_service_error(result.error)
|
|
@@ -44,17 +46,17 @@ module Spree
|
|
|
44
46
|
gift_card = @cart.store.gift_cards.find_by(code: permitted_params[:code]&.downcase)
|
|
45
47
|
|
|
46
48
|
if gift_card.nil?
|
|
47
|
-
render_error(code: ERROR_CODES[:gift_card_not_found], message:
|
|
49
|
+
render_error(code: ERROR_CODES[:gift_card_not_found], message: I18n.t('spree.gift_card_not_found'), status: :not_found)
|
|
48
50
|
return
|
|
49
51
|
end
|
|
50
52
|
|
|
51
53
|
if gift_card.expired?
|
|
52
|
-
render_error(code: ERROR_CODES[:gift_card_expired], message:
|
|
54
|
+
render_error(code: ERROR_CODES[:gift_card_expired], message: I18n.t('spree.gift_card_expired'), status: :unprocessable_content)
|
|
53
55
|
return
|
|
54
56
|
end
|
|
55
57
|
|
|
56
58
|
if gift_card.redeemed?
|
|
57
|
-
render_error(code: ERROR_CODES[:gift_card_already_redeemed], message:
|
|
59
|
+
render_error(code: ERROR_CODES[:gift_card_already_redeemed], message: I18n.t('spree.gift_card_already_redeemed'), status: :unprocessable_content)
|
|
58
60
|
return
|
|
59
61
|
end
|
|
60
62
|
|