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.
Files changed (531) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +4 -48
  3. data/app/controllers/concerns/spree/api/v3/admin/email_template_lookup.rb +139 -0
  4. data/app/controllers/concerns/spree/api/v3/admin/product_membership.rb +10 -0
  5. data/app/controllers/concerns/spree/api/v3/admin/stock_receipt_actions.rb +26 -4
  6. data/app/controllers/concerns/spree/api/v3/admin/store_context.rb +1 -1
  7. data/app/controllers/concerns/spree/api/v3/admin/subclassed_resource.rb +15 -29
  8. data/app/controllers/concerns/spree/api/v3/admin/validation_details.rb +1 -1
  9. data/app/controllers/concerns/spree/api/v3/cart_resolvable.rb +10 -2
  10. data/app/controllers/concerns/spree/api/v3/channel_resolution.rb +3 -3
  11. data/app/controllers/concerns/spree/api/v3/company_address_writes.rb +3 -1
  12. data/app/controllers/concerns/spree/api/v3/current_password_confirmation.rb +1 -1
  13. data/app/controllers/concerns/spree/api/v3/error_handler.rb +55 -4
  14. data/app/controllers/concerns/spree/api/v3/file_uploads.rb +35 -0
  15. data/app/controllers/concerns/spree/api/v3/http_caching.rb +44 -11
  16. data/app/controllers/concerns/spree/api/v3/idempotent.rb +20 -5
  17. data/app/controllers/concerns/spree/api/v3/items_payload.rb +1 -1
  18. data/app/controllers/concerns/spree/api/v3/money_params.rb +52 -0
  19. data/app/controllers/concerns/spree/api/v3/order_lock.rb +2 -2
  20. data/app/controllers/concerns/spree/api/v3/orders/claim_actions.rb +1 -5
  21. data/app/controllers/concerns/spree/api/v3/orders/delivery_actions.rb +7 -11
  22. data/app/controllers/concerns/spree/api/v3/orders/exchange_actions.rb +1 -4
  23. data/app/controllers/concerns/spree/api/v3/orders/fulfillment_actions.rb +3 -15
  24. data/app/controllers/concerns/spree/api/v3/orders/post_sale_actions.rb +2 -10
  25. data/app/controllers/concerns/spree/api/v3/orders/return_actions.rb +1 -4
  26. data/app/controllers/concerns/spree/api/v3/orders/shipping_label_actions.rb +8 -28
  27. data/app/controllers/concerns/spree/api/v3/params_normalizer.rb +5 -0
  28. data/app/controllers/concerns/spree/api/v3/permission_serialization.rb +9 -1
  29. data/app/controllers/concerns/spree/api/v3/purchase_serialization.rb +26 -0
  30. data/app/controllers/concerns/spree/api/v3/request_params.rb +65 -0
  31. data/app/controllers/concerns/spree/api/v3/seller/seller_context.rb +1 -1
  32. data/app/controllers/concerns/spree/api/v3/store/storefront_products.rb +5 -4
  33. data/app/controllers/concerns/spree/api/v3/storefront_gating.rb +11 -5
  34. data/app/controllers/concerns/spree/api/v3/strict_money_params.rb +94 -0
  35. data/app/controllers/spree/api/v3/admin/admin_users_controller.rb +8 -4
  36. data/app/controllers/spree/api/v3/admin/allowed_origins_controller.rb +8 -1
  37. data/app/controllers/spree/api/v3/admin/api_keys_controller.rb +16 -8
  38. data/app/controllers/spree/api/v3/admin/base_controller.rb +1 -0
  39. data/app/controllers/spree/api/v3/admin/catalogs/order_minimums_controller.rb +2 -6
  40. data/app/controllers/spree/api/v3/admin/catalogs/quantity_rules_controller.rb +7 -9
  41. data/app/controllers/spree/api/v3/admin/catalogs_controller.rb +61 -34
  42. data/app/controllers/spree/api/v3/admin/categories/products_controller.rb +4 -1
  43. data/app/controllers/spree/api/v3/admin/categories_controller.rb +40 -20
  44. data/app/controllers/spree/api/v3/admin/channels_controller.rb +39 -10
  45. data/app/controllers/spree/api/v3/admin/claim_reasons_controller.rb +5 -1
  46. data/app/controllers/spree/api/v3/admin/collections/products_controller.rb +5 -3
  47. data/app/controllers/spree/api/v3/admin/collections_controller.rb +44 -15
  48. data/app/controllers/spree/api/v3/admin/commission_rates_controller.rb +62 -14
  49. data/app/controllers/spree/api/v3/admin/companies/addresses_controller.rb +11 -4
  50. data/app/controllers/spree/api/v3/admin/companies/invitations_controller.rb +1 -5
  51. data/app/controllers/spree/api/v3/admin/companies/memberships_controller.rb +9 -5
  52. data/app/controllers/spree/api/v3/admin/companies/tax_exemption_certificates_controller.rb +20 -27
  53. data/app/controllers/spree/api/v3/admin/companies/tax_identifiers_controller.rb +6 -5
  54. data/app/controllers/spree/api/v3/admin/companies_controller.rb +17 -7
  55. data/app/controllers/spree/api/v3/admin/countries_controller.rb +6 -2
  56. data/app/controllers/spree/api/v3/admin/coupon_codes_controller.rb +0 -4
  57. data/app/controllers/spree/api/v3/admin/custom_field_definitions_controller.rb +22 -4
  58. data/app/controllers/spree/api/v3/admin/custom_fields_controller.rb +12 -9
  59. data/app/controllers/spree/api/v3/admin/customer_groups_controller.rb +9 -5
  60. data/app/controllers/spree/api/v3/admin/customers/addresses_controller.rb +12 -11
  61. data/app/controllers/spree/api/v3/admin/customers/credit_cards_controller.rb +0 -4
  62. data/app/controllers/spree/api/v3/admin/customers/store_credits_controller.rb +11 -13
  63. data/app/controllers/spree/api/v3/admin/customers/tax_identifiers_controller.rb +6 -1
  64. data/app/controllers/spree/api/v3/admin/customers_controller.rb +37 -9
  65. data/app/controllers/spree/api/v3/admin/data_requests_controller.rb +8 -0
  66. data/app/controllers/spree/api/v3/admin/delivery_method_rules_controller.rb +1 -1
  67. data/app/controllers/spree/api/v3/admin/delivery_methods/rules_controller.rb +16 -8
  68. data/app/controllers/spree/api/v3/admin/delivery_methods_controller.rb +95 -62
  69. data/app/controllers/spree/api/v3/admin/delivery_profiles/origin_groups_controller.rb +8 -1
  70. data/app/controllers/spree/api/v3/admin/delivery_profiles_controller.rb +14 -7
  71. data/app/controllers/spree/api/v3/admin/delivery_zones_controller.rb +21 -5
  72. data/app/controllers/spree/api/v3/admin/email_templates/drafts_controller.rb +53 -0
  73. data/app/controllers/spree/api/v3/admin/email_templates/previews_controller.rb +34 -0
  74. data/app/controllers/spree/api/v3/admin/email_templates/publications_controller.rb +37 -0
  75. data/app/controllers/spree/api/v3/admin/email_templates/restorations_controller.rb +42 -0
  76. data/app/controllers/spree/api/v3/admin/email_templates/revisions_controller.rb +35 -0
  77. data/app/controllers/spree/api/v3/admin/email_templates/sample_records_controller.rb +33 -0
  78. data/app/controllers/spree/api/v3/admin/email_templates/test_emails_controller.rb +44 -0
  79. data/app/controllers/spree/api/v3/admin/email_templates_controller.rb +46 -0
  80. data/app/controllers/spree/api/v3/admin/exports_controller.rb +23 -6
  81. data/app/controllers/spree/api/v3/admin/files_controller.rb +29 -0
  82. data/app/controllers/spree/api/v3/admin/gift_card_batches_controller.rb +20 -1
  83. data/app/controllers/spree/api/v3/admin/gift_cards_controller.rb +19 -1
  84. data/app/controllers/spree/api/v3/admin/imports_controller.rb +37 -11
  85. data/app/controllers/spree/api/v3/admin/integrations_controller.rb +13 -1
  86. data/app/controllers/spree/api/v3/admin/invitation_acceptances_controller.rb +9 -2
  87. data/app/controllers/spree/api/v3/admin/invitations_controller.rb +8 -8
  88. data/app/controllers/spree/api/v3/admin/locales_controller.rb +1 -1
  89. data/app/controllers/spree/api/v3/admin/markets_controller.rb +30 -9
  90. data/app/controllers/spree/api/v3/admin/me_controller.rb +13 -4
  91. data/app/controllers/spree/api/v3/admin/media_controller.rb +22 -9
  92. data/app/controllers/spree/api/v3/admin/media_library_controller.rb +9 -5
  93. data/app/controllers/spree/api/v3/admin/option_types_controller.rb +24 -7
  94. data/app/controllers/spree/api/v3/admin/order_cancellation_reasons_controller.rb +5 -1
  95. data/app/controllers/spree/api/v3/admin/order_routing_rules_controller.rb +13 -5
  96. data/app/controllers/spree/api/v3/admin/orders/claims_controller.rb +39 -1
  97. data/app/controllers/spree/api/v3/admin/orders/deliveries_controller.rb +20 -6
  98. data/app/controllers/spree/api/v3/admin/orders/discount_codes_controller.rb +6 -2
  99. data/app/controllers/spree/api/v3/admin/orders/discounts_controller.rb +30 -6
  100. data/app/controllers/spree/api/v3/admin/orders/exchanges_controller.rb +36 -1
  101. data/app/controllers/spree/api/v3/admin/orders/fees_controller.rb +22 -1
  102. data/app/controllers/spree/api/v3/admin/orders/fulfillments_controller.rb +83 -22
  103. data/app/controllers/spree/api/v3/admin/orders/gift_cards_controller.rb +9 -5
  104. data/app/controllers/spree/api/v3/admin/orders/items_controller.rb +11 -1
  105. data/app/controllers/spree/api/v3/admin/orders/labels_controller.rb +37 -12
  106. data/app/controllers/spree/api/v3/admin/orders/payments_controller.rb +18 -19
  107. data/app/controllers/spree/api/v3/admin/orders/refunds_controller.rb +7 -5
  108. data/app/controllers/spree/api/v3/admin/orders/returns_controller.rb +37 -1
  109. data/app/controllers/spree/api/v3/admin/orders/store_credits_controller.rb +6 -3
  110. data/app/controllers/spree/api/v3/admin/orders_controller.rb +76 -62
  111. data/app/controllers/spree/api/v3/admin/package_types_controller.rb +30 -5
  112. data/app/controllers/spree/api/v3/admin/password_resets_controller.rb +26 -7
  113. data/app/controllers/spree/api/v3/admin/payment_methods_controller.rb +38 -22
  114. data/app/controllers/spree/api/v3/admin/policies_controller.rb +8 -4
  115. data/app/controllers/spree/api/v3/admin/price_lists_controller.rb +32 -67
  116. data/app/controllers/spree/api/v3/admin/prices_controller.rb +51 -8
  117. data/app/controllers/spree/api/v3/admin/product_types_controller.rb +25 -8
  118. data/app/controllers/spree/api/v3/admin/products/digital_assets_controller.rb +29 -16
  119. data/app/controllers/spree/api/v3/admin/products/variants_controller.rb +9 -18
  120. data/app/controllers/spree/api/v3/admin/products_controller.rb +122 -71
  121. data/app/controllers/spree/api/v3/admin/promotion_actions_controller.rb +11 -6
  122. data/app/controllers/spree/api/v3/admin/promotion_rules_controller.rb +10 -5
  123. data/app/controllers/spree/api/v3/admin/promotions_controller.rb +50 -14
  124. data/app/controllers/spree/api/v3/admin/purchase_orders_controller.rb +55 -8
  125. data/app/controllers/spree/api/v3/admin/refund_reasons_controller.rb +5 -1
  126. data/app/controllers/spree/api/v3/admin/reporting/saved_reports_controller.rb +9 -1
  127. data/app/controllers/spree/api/v3/admin/reporting_controller.rb +34 -0
  128. data/app/controllers/spree/api/v3/admin/resource_controller.rb +2 -1
  129. data/app/controllers/spree/api/v3/admin/return_reasons_controller.rb +5 -1
  130. data/app/controllers/spree/api/v3/admin/roles_controller.rb +13 -1
  131. data/app/controllers/spree/api/v3/admin/seller_payouts_controller.rb +7 -9
  132. data/app/controllers/spree/api/v3/admin/seller_requirement_submissions_controller.rb +17 -10
  133. data/app/controllers/spree/api/v3/admin/seller_requirements_controller.rb +32 -6
  134. data/app/controllers/spree/api/v3/admin/seller_transfers_controller.rb +0 -4
  135. data/app/controllers/spree/api/v3/admin/sellers/invitations_controller.rb +1 -1
  136. data/app/controllers/spree/api/v3/admin/sellers/payouts_controller.rb +1 -1
  137. data/app/controllers/spree/api/v3/admin/sellers_controller.rb +77 -32
  138. data/app/controllers/spree/api/v3/admin/setup_controller.rb +54 -23
  139. data/app/controllers/spree/api/v3/admin/stock_levels_controller.rb +38 -9
  140. data/app/controllers/spree/api/v3/admin/stock_locations_controller.rb +41 -9
  141. data/app/controllers/spree/api/v3/admin/stock_transfers_controller.rb +49 -8
  142. data/app/controllers/spree/api/v3/admin/store_controller.rb +122 -48
  143. data/app/controllers/spree/api/v3/admin/store_credits_controller.rb +1 -7
  144. data/app/controllers/spree/api/v3/admin/suppliers_controller.rb +16 -6
  145. data/app/controllers/spree/api/v3/admin/tags_controller.rb +8 -5
  146. data/app/controllers/spree/api/v3/admin/tax_categories_controller.rb +7 -4
  147. data/app/controllers/spree/api/v3/admin/tax_rates_controller.rb +21 -3
  148. data/app/controllers/spree/api/v3/admin/tracking_carriers_controller.rb +4 -0
  149. data/app/controllers/spree/api/v3/admin/translations/batches_controller.rb +17 -9
  150. data/app/controllers/spree/api/v3/admin/translations_controller.rb +4 -0
  151. data/app/controllers/spree/api/v3/admin/translations_coverage_controller.rb +5 -0
  152. data/app/controllers/spree/api/v3/admin/updates_controller.rb +39 -0
  153. data/app/controllers/spree/api/v3/admin/webhook_endpoints_controller.rb +40 -13
  154. data/app/controllers/spree/api/v3/admin/webhook_events_controller.rb +25 -0
  155. data/app/controllers/spree/api/v3/base_controller.rb +12 -0
  156. data/app/controllers/spree/api/v3/resource_controller.rb +99 -3
  157. data/app/controllers/spree/api/v3/seller/auth_controller.rb +10 -2
  158. data/app/controllers/spree/api/v3/seller/base_controller.rb +1 -0
  159. data/app/controllers/spree/api/v3/seller/countries_controller.rb +3 -3
  160. data/app/controllers/spree/api/v3/seller/delivery_methods_controller.rb +49 -60
  161. data/app/controllers/spree/api/v3/seller/exports_controller.rb +21 -4
  162. data/app/controllers/spree/api/v3/seller/files_controller.rb +27 -0
  163. data/app/controllers/spree/api/v3/seller/imports_controller.rb +25 -9
  164. data/app/controllers/spree/api/v3/seller/invitation_acceptances_controller.rb +12 -4
  165. data/app/controllers/spree/api/v3/seller/invitations_controller.rb +1 -1
  166. data/app/controllers/spree/api/v3/seller/me_controller.rb +15 -4
  167. data/app/controllers/spree/api/v3/seller/onboarding_controller.rb +11 -0
  168. data/app/controllers/spree/api/v3/seller/orders/claims_controller.rb +35 -0
  169. data/app/controllers/spree/api/v3/seller/orders/deliveries_controller.rb +12 -0
  170. data/app/controllers/spree/api/v3/seller/orders/exchanges_controller.rb +33 -0
  171. data/app/controllers/spree/api/v3/seller/orders/fulfillments_controller.rb +28 -2
  172. data/app/controllers/spree/api/v3/seller/orders/labels_controller.rb +23 -2
  173. data/app/controllers/spree/api/v3/seller/orders/notes_controller.rb +8 -1
  174. data/app/controllers/spree/api/v3/seller/orders/returns_controller.rb +32 -0
  175. data/app/controllers/spree/api/v3/seller/orders_controller.rb +35 -14
  176. data/app/controllers/spree/api/v3/seller/package_types_controller.rb +21 -9
  177. data/app/controllers/spree/api/v3/seller/password_resets_controller.rb +20 -11
  178. data/app/controllers/spree/api/v3/seller/policies_controller.rb +12 -4
  179. data/app/controllers/spree/api/v3/seller/products_controller.rb +115 -28
  180. data/app/controllers/spree/api/v3/seller/profile_controller.rb +33 -10
  181. data/app/controllers/spree/api/v3/seller/requirement_submissions_controller.rb +13 -6
  182. data/app/controllers/spree/api/v3/seller/resource_controller.rb +12 -0
  183. data/app/controllers/spree/api/v3/seller/stock_locations_controller.rb +44 -13
  184. data/app/controllers/spree/api/v3/seller/tax_identifiers_controller.rb +10 -1
  185. data/app/controllers/spree/api/v3/seller/team_controller.rb +5 -1
  186. data/app/controllers/spree/api/v3/store/auth_controller.rb +10 -0
  187. data/app/controllers/spree/api/v3/store/carts/discount_codes_controller.rb +9 -2
  188. data/app/controllers/spree/api/v3/store/carts/fulfillments_controller.rb +11 -11
  189. data/app/controllers/spree/api/v3/store/carts/gift_cards_controller.rb +13 -4
  190. data/app/controllers/spree/api/v3/store/carts/items_controller.rb +23 -7
  191. data/app/controllers/spree/api/v3/store/carts/payment_sessions_controller.rb +21 -7
  192. data/app/controllers/spree/api/v3/store/carts/payments_controller.rb +16 -3
  193. data/app/controllers/spree/api/v3/store/carts/po_documents_controller.rb +26 -28
  194. data/app/controllers/spree/api/v3/store/carts/store_credits_controller.rb +9 -1
  195. data/app/controllers/spree/api/v3/store/carts/tax_identifiers_controller.rb +5 -1
  196. data/app/controllers/spree/api/v3/store/carts_controller.rb +64 -52
  197. data/app/controllers/spree/api/v3/store/companies/addresses_controller.rb +12 -8
  198. data/app/controllers/spree/api/v3/store/companies/invitations_controller.rb +1 -5
  199. data/app/controllers/spree/api/v3/store/companies/members_controller.rb +4 -0
  200. data/app/controllers/spree/api/v3/store/companies_controller.rb +5 -1
  201. data/app/controllers/spree/api/v3/store/company_invitations_controller.rb +10 -2
  202. data/app/controllers/spree/api/v3/store/customer/addresses_controller.rb +8 -11
  203. data/app/controllers/spree/api/v3/store/customer/credit_cards_controller.rb +0 -4
  204. data/app/controllers/spree/api/v3/store/customer/data_requests_controller.rb +5 -5
  205. data/app/controllers/spree/api/v3/store/customer/digital_links_controller.rb +0 -4
  206. data/app/controllers/spree/api/v3/store/customer/gift_cards_controller.rb +0 -4
  207. data/app/controllers/spree/api/v3/store/customer/orders_controller.rb +0 -4
  208. data/app/controllers/spree/api/v3/store/customer/password_resets_controller.rb +25 -6
  209. data/app/controllers/spree/api/v3/store/customer/payment_setup_sessions_controller.rb +10 -9
  210. data/app/controllers/spree/api/v3/store/customer/store_credits_controller.rb +0 -5
  211. data/app/controllers/spree/api/v3/store/customer/tax_identifiers_controller.rb +5 -1
  212. data/app/controllers/spree/api/v3/store/customers_controller.rb +28 -2
  213. data/app/controllers/spree/api/v3/store/data_request_downloads_controller.rb +1 -1
  214. data/app/controllers/spree/api/v3/store/delivery_methods_controller.rb +1 -1
  215. data/app/controllers/spree/api/v3/store/newsletter_subscribers_controller.rb +27 -14
  216. data/app/controllers/spree/api/v3/store/orders/claims_controller.rb +12 -7
  217. data/app/controllers/spree/api/v3/store/orders/returns_controller.rb +11 -6
  218. data/app/controllers/spree/api/v3/store/orders_controller.rb +47 -10
  219. data/app/controllers/spree/api/v3/store/products_controller.rb +8 -0
  220. data/app/controllers/spree/api/v3/store/wishlist_items_controller.rb +10 -8
  221. data/app/controllers/spree/api/v3/store/wishlists_controller.rb +12 -4
  222. data/app/request_schemas/spree/api/v3/address_request_schema.rb +27 -0
  223. data/app/request_schemas/spree/api/v3/admin/address_request_schema.rb +13 -0
  224. data/app/request_schemas/spree/api/v3/admin/bulk_tags_request_schema.rb +17 -0
  225. data/app/request_schemas/spree/api/v3/admin/catalog_order_minimum_request_schema.rb +17 -0
  226. data/app/request_schemas/spree/api/v3/admin/email_template_language_request_schema.rb +17 -0
  227. data/app/request_schemas/spree/api/v3/admin/email_template_preview_request_schema.rb +32 -0
  228. data/app/request_schemas/spree/api/v3/admin/price_adjustment_tier_request_schema.rb +21 -0
  229. data/app/request_schemas/spree/api/v3/admin/price_list_price_request_schema.rb +21 -0
  230. data/app/request_schemas/spree/api/v3/admin/price_list_rule_request_schema.rb +19 -0
  231. data/app/request_schemas/spree/api/v3/admin/product_membership_reposition_request_schema.rb +17 -0
  232. data/app/request_schemas/spree/api/v3/admin/promotion_action_calculator_request_schema.rb +18 -0
  233. data/app/request_schemas/spree/api/v3/admin/promotion_action_line_item_request_schema.rb +15 -0
  234. data/app/request_schemas/spree/api/v3/admin/promotion_action_request_schema.rb +19 -0
  235. data/app/request_schemas/spree/api/v3/admin/promotion_rule_request_schema.rb +22 -0
  236. data/app/request_schemas/spree/api/v3/admin/reason_request_schema.rb +14 -0
  237. data/app/request_schemas/spree/api/v3/admin/tax_identifier_request_schema.rb +15 -0
  238. data/app/request_schemas/spree/api/v3/custom_field_value_request_schema.rb +15 -0
  239. data/app/request_schemas/spree/api/v3/file_upload_request_schema.rb +20 -0
  240. data/app/request_schemas/spree/api/v3/media_request_schema.rb +27 -0
  241. data/app/request_schemas/spree/api/v3/price_request_schema.rb +17 -0
  242. data/app/request_schemas/spree/api/v3/stock_level_request_schema.rb +18 -0
  243. data/app/request_schemas/spree/api/v3/store/address_request_schema.rb +29 -0
  244. data/app/request_schemas/spree/api/v3/tax_identifier_request_schema.rb +18 -0
  245. data/app/request_schemas/spree/api/v3/variant_option_request_schema.rb +13 -0
  246. data/app/request_schemas/spree/api/v3/variant_request_schema.rb +52 -0
  247. data/app/serializers/concerns/spree/api/v3/purchase_summary.rb +48 -0
  248. data/app/serializers/spree/api/v3/address_serializer.rb +4 -2
  249. data/app/serializers/spree/api/v3/admin/address_serializer.rb +8 -7
  250. data/app/serializers/spree/api/v3/admin/api_key_serializer.rb +2 -6
  251. data/app/serializers/spree/api/v3/admin/applied_promotion_serializer.rb +3 -1
  252. data/app/serializers/spree/api/v3/admin/cart_serializer.rb +3 -1
  253. data/app/serializers/spree/api/v3/admin/catalog_assignment_serializer.rb +1 -3
  254. data/app/serializers/spree/api/v3/admin/catalog_order_minimum_serializer.rb +3 -8
  255. data/app/serializers/spree/api/v3/admin/catalog_price_serializer.rb +3 -4
  256. data/app/serializers/spree/api/v3/admin/catalog_price_tier_serializer.rb +4 -3
  257. data/app/serializers/spree/api/v3/admin/catalog_product_term_serializer.rb +1 -3
  258. data/app/serializers/spree/api/v3/admin/catalog_quantity_rule_serializer.rb +1 -3
  259. data/app/serializers/spree/api/v3/admin/channel_serializer.rb +7 -10
  260. data/app/serializers/spree/api/v3/admin/claim_line_item_serializer.rb +7 -0
  261. data/app/serializers/spree/api/v3/admin/claim_reason_serializer.rb +1 -3
  262. data/app/serializers/spree/api/v3/admin/claim_serializer.rb +5 -0
  263. data/app/serializers/spree/api/v3/admin/commission_line_serializer.rb +7 -18
  264. data/app/serializers/spree/api/v3/admin/commission_rate_serializer.rb +7 -11
  265. data/app/serializers/spree/api/v3/admin/commission_rule_serializer.rb +1 -5
  266. data/app/serializers/spree/api/v3/admin/country_serializer.rb +4 -0
  267. data/app/serializers/spree/api/v3/admin/coupon_code_serializer.rb +1 -7
  268. data/app/serializers/spree/api/v3/admin/credit_card_serializer.rb +1 -7
  269. data/app/serializers/spree/api/v3/admin/custom_field_definition_serializer.rb +6 -2
  270. data/app/serializers/spree/api/v3/admin/customer_serializer.rb +5 -17
  271. data/app/serializers/spree/api/v3/admin/data_request_serializer.rb +2 -6
  272. data/app/serializers/spree/api/v3/admin/delivery_method_rule_serializer.rb +0 -2
  273. data/app/serializers/spree/api/v3/admin/delivery_method_serializer.rb +20 -30
  274. data/app/serializers/spree/api/v3/admin/delivery_method_service_serializer.rb +9 -1
  275. data/app/serializers/spree/api/v3/admin/delivery_origin_group_serializer.rb +1 -3
  276. data/app/serializers/spree/api/v3/admin/delivery_rate_serializer.rb +8 -0
  277. data/app/serializers/spree/api/v3/admin/delivery_serializer.rb +1 -3
  278. data/app/serializers/spree/api/v3/admin/delivery_zone_serializer.rb +1 -7
  279. data/app/serializers/spree/api/v3/admin/digital_asset_serializer.rb +4 -2
  280. data/app/serializers/spree/api/v3/admin/discount_serializer.rb +3 -1
  281. data/app/serializers/spree/api/v3/admin/email_template_draft_serializer.rb +19 -0
  282. data/app/serializers/spree/api/v3/admin/email_template_preview_serializer.rb +38 -0
  283. data/app/serializers/spree/api/v3/admin/email_template_revision_serializer.rb +18 -0
  284. data/app/serializers/spree/api/v3/admin/email_template_sample_record_serializer.rb +13 -0
  285. data/app/serializers/spree/api/v3/admin/email_template_serializer.rb +61 -0
  286. data/app/serializers/spree/api/v3/admin/exchange_line_item_serializer.rb +5 -0
  287. data/app/serializers/spree/api/v3/admin/exchange_serializer.rb +6 -3
  288. data/app/serializers/spree/api/v3/admin/export_serializer.rb +1 -7
  289. data/app/serializers/spree/api/v3/admin/fee_serializer.rb +3 -1
  290. data/app/serializers/spree/api/v3/admin/file_upload_serializer.rb +11 -0
  291. data/app/serializers/spree/api/v3/admin/file_upload_target_serializer.rb +10 -0
  292. data/app/serializers/spree/api/v3/admin/fulfillment_item_serializer.rb +1 -7
  293. data/app/serializers/spree/api/v3/admin/fulfillment_serializer.rb +13 -17
  294. data/app/serializers/spree/api/v3/admin/gift_card_serializer.rb +4 -10
  295. data/app/serializers/spree/api/v3/admin/import_serializer.rb +2 -2
  296. data/app/serializers/spree/api/v3/admin/integration_serializer.rb +1 -3
  297. data/app/serializers/spree/api/v3/admin/line_item_serializer.rb +14 -18
  298. data/app/serializers/spree/api/v3/admin/locale_serializer.rb +13 -0
  299. data/app/serializers/spree/api/v3/admin/market_serializer.rb +7 -2
  300. data/app/serializers/spree/api/v3/admin/media_serializer.rb +4 -5
  301. data/app/serializers/spree/api/v3/admin/order_cancellation_reason_serializer.rb +1 -3
  302. data/app/serializers/spree/api/v3/admin/order_group_serializer.rb +5 -9
  303. data/app/serializers/spree/api/v3/admin/order_routing_rule_serializer.rb +2 -6
  304. data/app/serializers/spree/api/v3/admin/order_serializer.rb +38 -48
  305. data/app/serializers/spree/api/v3/admin/package_type_serializer.rb +1 -3
  306. data/app/serializers/spree/api/v3/admin/payment_method_serializer.rb +7 -4
  307. data/app/serializers/spree/api/v3/admin/payment_serializer.rb +6 -8
  308. data/app/serializers/spree/api/v3/admin/payment_split_serializer.rb +8 -9
  309. data/app/serializers/spree/api/v3/admin/permission_serializer.rb +4 -4
  310. data/app/serializers/spree/api/v3/admin/price_adjustment_tier_serializer.rb +3 -6
  311. data/app/serializers/spree/api/v3/admin/price_history_serializer.rb +5 -2
  312. data/app/serializers/spree/api/v3/admin/price_list_serializer.rb +1 -5
  313. data/app/serializers/spree/api/v3/admin/price_rule_serializer.rb +2 -6
  314. data/app/serializers/spree/api/v3/admin/price_serializer.rb +2 -0
  315. data/app/serializers/spree/api/v3/admin/product_serializer.rb +4 -10
  316. data/app/serializers/spree/api/v3/admin/product_submission_serializer.rb +2 -10
  317. data/app/serializers/spree/api/v3/admin/product_type_serializer.rb +1 -3
  318. data/app/serializers/spree/api/v3/admin/promotion_action_serializer.rb +5 -9
  319. data/app/serializers/spree/api/v3/admin/promotion_rule_serializer.rb +1 -5
  320. data/app/serializers/spree/api/v3/admin/purchase_order_item_serializer.rb +6 -25
  321. data/app/serializers/spree/api/v3/admin/purchase_order_serializer.rb +4 -17
  322. data/app/serializers/spree/api/v3/admin/refund_reason_serializer.rb +1 -3
  323. data/app/serializers/spree/api/v3/admin/refund_serializer.rb +7 -0
  324. data/app/serializers/spree/api/v3/admin/reporting_result_serializer.rb +9 -2
  325. data/app/serializers/spree/api/v3/admin/return_line_item_serializer.rb +9 -0
  326. data/app/serializers/spree/api/v3/admin/return_reason_serializer.rb +1 -3
  327. data/app/serializers/spree/api/v3/admin/return_serializer.rb +8 -12
  328. data/app/serializers/spree/api/v3/admin/saved_report_serializer.rb +1 -3
  329. data/app/serializers/spree/api/v3/admin/seller_balance_serializer.rb +15 -10
  330. data/app/serializers/spree/api/v3/admin/seller_payout_serializer.rb +7 -7
  331. data/app/serializers/spree/api/v3/admin/seller_requirement_status_serializer.rb +2 -6
  332. data/app/serializers/spree/api/v3/admin/seller_requirement_submission_serializer.rb +1 -7
  333. data/app/serializers/spree/api/v3/admin/seller_serializer.rb +8 -16
  334. data/app/serializers/spree/api/v3/admin/seller_transfer_serializer.rb +11 -10
  335. data/app/serializers/spree/api/v3/admin/shipping_label_serializer.rb +8 -21
  336. data/app/serializers/spree/api/v3/admin/stock_level_serializer.rb +1 -3
  337. data/app/serializers/spree/api/v3/admin/stock_location_serializer.rb +4 -3
  338. data/app/serializers/spree/api/v3/admin/stock_movement_serializer.rb +3 -9
  339. data/app/serializers/spree/api/v3/admin/stock_receipt_item_serializer.rb +1 -7
  340. data/app/serializers/spree/api/v3/admin/stock_receipt_serializer.rb +1 -3
  341. data/app/serializers/spree/api/v3/admin/stock_reservation_serializer.rb +1 -3
  342. data/app/serializers/spree/api/v3/admin/stock_transfer_item_serializer.rb +1 -3
  343. data/app/serializers/spree/api/v3/admin/store_credit_event_serializer.rb +6 -3
  344. data/app/serializers/spree/api/v3/admin/store_credit_serializer.rb +11 -20
  345. data/app/serializers/spree/api/v3/admin/store_serializer.rb +21 -84
  346. data/app/serializers/spree/api/v3/admin/supplier_serializer.rb +2 -4
  347. data/app/serializers/spree/api/v3/admin/tax_exemption_certificate_serializer.rb +6 -10
  348. data/app/serializers/spree/api/v3/admin/tax_identifier_serializer.rb +1 -3
  349. data/app/serializers/spree/api/v3/admin/tax_line_serializer.rb +9 -3
  350. data/app/serializers/spree/api/v3/admin/tax_rate_serializer.rb +3 -19
  351. data/app/serializers/spree/api/v3/admin/update_status_serializer.rb +28 -0
  352. data/app/serializers/spree/api/v3/admin/variant_serializer.rb +13 -10
  353. data/app/serializers/spree/api/v3/admin/webhook_delivery_serializer.rb +1 -3
  354. data/app/serializers/spree/api/v3/admin/webhook_event_serializer.rb +23 -0
  355. data/app/serializers/spree/api/v3/applied_promotion_serializer.rb +2 -4
  356. data/app/serializers/spree/api/v3/base_serializer.rb +132 -7
  357. data/app/serializers/spree/api/v3/cart_serializer.rb +20 -66
  358. data/app/serializers/spree/api/v3/category_serializer.rb +5 -15
  359. data/app/serializers/spree/api/v3/claim_line_item_serializer.rb +6 -29
  360. data/app/serializers/spree/api/v3/claim_serializer.rb +2 -16
  361. data/app/serializers/spree/api/v3/collection_serializer.rb +1 -3
  362. data/app/serializers/spree/api/v3/company_serializer.rb +1 -3
  363. data/app/serializers/spree/api/v3/country_serializer.rb +2 -1
  364. data/app/serializers/spree/api/v3/currency_serializer.rb +9 -1
  365. data/app/serializers/spree/api/v3/custom_field_serializer.rb +1 -2
  366. data/app/serializers/spree/api/v3/customer_serializer.rb +3 -2
  367. data/app/serializers/spree/api/v3/delivery_rate_serializer.rb +8 -32
  368. data/app/serializers/spree/api/v3/delivery_zone_member_serializer.rb +1 -1
  369. data/app/serializers/spree/api/v3/digital_asset_serializer.rb +1 -3
  370. data/app/serializers/spree/api/v3/digital_link_serializer.rb +3 -9
  371. data/app/serializers/spree/api/v3/discount_serializer.rb +4 -12
  372. data/app/serializers/spree/api/v3/exchange_line_item_serializer.rb +6 -30
  373. data/app/serializers/spree/api/v3/exchange_serializer.rb +2 -16
  374. data/app/serializers/spree/api/v3/export_serializer.rb +1 -3
  375. data/app/serializers/spree/api/v3/fee_serializer.rb +2 -10
  376. data/app/serializers/spree/api/v3/file_upload_serializer.rb +28 -0
  377. data/app/serializers/spree/api/v3/file_upload_target_serializer.rb +17 -0
  378. data/app/serializers/spree/api/v3/fulfillment_serializer.rb +4 -11
  379. data/app/serializers/spree/api/v3/gift_card_batch_serializer.rb +3 -7
  380. data/app/serializers/spree/api/v3/gift_card_serializer.rb +7 -17
  381. data/app/serializers/spree/api/v3/import_row_serializer.rb +2 -6
  382. data/app/serializers/spree/api/v3/import_serializer.rb +3 -26
  383. data/app/serializers/spree/api/v3/invitation_serializer.rb +2 -19
  384. data/app/serializers/spree/api/v3/line_item_serializer.rb +19 -23
  385. data/app/serializers/spree/api/v3/locale_serializer.rb +3 -1
  386. data/app/serializers/spree/api/v3/market_serializer.rb +5 -5
  387. data/app/serializers/spree/api/v3/media_event_serializer.rb +1 -3
  388. data/app/serializers/spree/api/v3/media_serializer.rb +8 -5
  389. data/app/serializers/spree/api/v3/newsletter_subscriber_request_event_serializer.rb +35 -0
  390. data/app/serializers/spree/api/v3/newsletter_subscriber_serializer.rb +2 -6
  391. data/app/serializers/spree/api/v3/option_value_serializer.rb +1 -3
  392. data/app/serializers/spree/api/v3/order_group_serializer.rb +12 -25
  393. data/app/serializers/spree/api/v3/order_serializer.rb +14 -58
  394. data/app/serializers/spree/api/v3/password_reset_requested_event_serializer.rb +29 -0
  395. data/app/serializers/spree/api/v3/payment_method_serializer.rb +2 -6
  396. data/app/serializers/spree/api/v3/payment_serializer.rb +5 -10
  397. data/app/serializers/spree/api/v3/payment_session_serializer.rb +5 -13
  398. data/app/serializers/spree/api/v3/payment_setup_session_serializer.rb +3 -11
  399. data/app/serializers/spree/api/v3/policy_serializer.rb +1 -3
  400. data/app/serializers/spree/api/v3/price_history_serializer.rb +6 -8
  401. data/app/serializers/spree/api/v3/price_serializer.rb +7 -12
  402. data/app/serializers/spree/api/v3/product_filter_price_range_serializer.rb +10 -4
  403. data/app/serializers/spree/api/v3/product_publication_serializer.rb +1 -7
  404. data/app/serializers/spree/api/v3/product_serializer.rb +10 -24
  405. data/app/serializers/spree/api/v3/product_submission_serializer.rb +26 -0
  406. data/app/serializers/spree/api/v3/purchase_order_event_serializer.rb +23 -4
  407. data/app/serializers/spree/api/v3/refund_serializer.rb +11 -16
  408. data/app/serializers/spree/api/v3/return_line_item_serializer.rb +6 -21
  409. data/app/serializers/spree/api/v3/return_serializer.rb +4 -16
  410. data/app/serializers/spree/api/v3/saved_report_event_serializer.rb +23 -0
  411. data/app/serializers/spree/api/v3/seller/address_serializer.rb +12 -0
  412. data/app/serializers/spree/api/v3/seller/balance_serializer.rb +15 -10
  413. data/app/serializers/spree/api/v3/seller/claim_line_item_serializer.rb +7 -0
  414. data/app/serializers/spree/api/v3/seller/claim_serializer.rb +5 -0
  415. data/app/serializers/spree/api/v3/seller/country_serializer.rb +19 -0
  416. data/app/serializers/spree/api/v3/seller/delivery_method_rule_serializer.rb +1 -3
  417. data/app/serializers/spree/api/v3/seller/delivery_method_serializer.rb +5 -15
  418. data/app/serializers/spree/api/v3/seller/delivery_rate_serializer.rb +8 -13
  419. data/app/serializers/spree/api/v3/seller/delivery_serializer.rb +1 -3
  420. data/app/serializers/spree/api/v3/seller/delivery_zone_serializer.rb +1 -3
  421. data/app/serializers/spree/api/v3/seller/exchange_line_item_serializer.rb +5 -0
  422. data/app/serializers/spree/api/v3/seller/exchange_serializer.rb +6 -3
  423. data/app/serializers/spree/api/v3/seller/file_upload_serializer.rb +11 -0
  424. data/app/serializers/spree/api/v3/seller/file_upload_target_serializer.rb +10 -0
  425. data/app/serializers/spree/api/v3/seller/fulfillment_item_serializer.rb +1 -7
  426. data/app/serializers/spree/api/v3/seller/fulfillment_serializer.rb +2 -6
  427. data/app/serializers/spree/api/v3/seller/import_serializer.rb +2 -2
  428. data/app/serializers/spree/api/v3/seller/invitation_serializer.rb +1 -3
  429. data/app/serializers/spree/api/v3/seller/media_serializer.rb +2 -5
  430. data/app/serializers/spree/api/v3/seller/order_line_item_serializer.rb +8 -13
  431. data/app/serializers/spree/api/v3/seller/order_serializer.rb +19 -40
  432. data/app/serializers/spree/api/v3/seller/payment_split_serializer.rb +8 -9
  433. data/app/serializers/spree/api/v3/seller/payout_serializer.rb +6 -6
  434. data/app/serializers/spree/api/v3/seller/price_history_serializer.rb +11 -0
  435. data/app/serializers/spree/api/v3/seller/price_serializer.rb +11 -0
  436. data/app/serializers/spree/api/v3/seller/product_serializer.rb +3 -7
  437. data/app/serializers/spree/api/v3/seller/product_submission_serializer.rb +1 -21
  438. data/app/serializers/spree/api/v3/seller/profile_serializer.rb +9 -13
  439. data/app/serializers/spree/api/v3/seller/requirement_status_serializer.rb +3 -9
  440. data/app/serializers/spree/api/v3/seller/return_line_item_serializer.rb +8 -0
  441. data/app/serializers/spree/api/v3/seller/return_serializer.rb +8 -17
  442. data/app/serializers/spree/api/v3/seller/state_serializer.rb +10 -0
  443. data/app/serializers/spree/api/v3/seller/stock_location_serializer.rb +3 -0
  444. data/app/serializers/spree/api/v3/seller/transfer_serializer.rb +10 -9
  445. data/app/serializers/spree/api/v3/seller/variant_serializer.rb +8 -4
  446. data/app/serializers/spree/api/v3/seller_serializer.rb +1 -3
  447. data/app/serializers/spree/api/v3/shipping_label_event_serializer.rb +22 -4
  448. data/app/serializers/spree/api/v3/stock_level_serializer.rb +1 -7
  449. data/app/serializers/spree/api/v3/stock_location_serializer.rb +8 -1
  450. data/app/serializers/spree/api/v3/stock_movement_serializer.rb +1 -3
  451. data/app/serializers/spree/api/v3/stock_receipt_event_serializer.rb +20 -4
  452. data/app/serializers/spree/api/v3/stock_transfer_serializer.rb +1 -7
  453. data/app/serializers/spree/api/v3/store_credit_event_serializer.rb +2 -13
  454. data/app/serializers/spree/api/v3/store_credit_serializer.rb +3 -27
  455. data/app/serializers/spree/api/v3/supplier_event_serializer.rb +6 -4
  456. data/app/serializers/spree/api/v3/tax_line_serializer.rb +11 -23
  457. data/app/serializers/spree/api/v3/variant_serializer.rb +10 -24
  458. data/app/serializers/spree/api/v3/wishlist_item_serializer.rb +1 -11
  459. data/app/serializers/spree/api/v3/wishlist_serializer.rb +2 -6
  460. data/app/services/spree/api/v3/filter_predicates.rb +29 -0
  461. data/app/services/spree/api/v3/filter_table.rb +337 -0
  462. data/app/services/spree/api/v3/filters_aggregator.rb +2 -2
  463. data/app/services/spree/api/v3/request_schema.rb +430 -0
  464. data/app/services/spree/webhooks/deliver_webhook.rb +7 -3
  465. data/app/subscribers/spree/webhook_event_subscriber.rb +3 -10
  466. data/config/initializers/pagy.rb +1 -1
  467. data/config/initializers/typelizer.rb +7 -9
  468. data/config/locales/ar.yml +15 -0
  469. data/config/locales/be.yml +15 -0
  470. data/config/locales/bg.yml +15 -0
  471. data/config/locales/ca.yml +15 -0
  472. data/config/locales/cs.yml +15 -0
  473. data/config/locales/da.yml +15 -0
  474. data/config/locales/de-CH.yml +11 -0
  475. data/config/locales/de.yml +15 -0
  476. data/config/locales/el.yml +15 -0
  477. data/config/locales/en.yml +5 -40
  478. data/config/locales/es-CL.yml +10 -0
  479. data/config/locales/es-EC.yml +11 -0
  480. data/config/locales/es-MX.yml +12 -0
  481. data/config/locales/es.yml +15 -0
  482. data/config/locales/et.yml +15 -0
  483. data/config/locales/fa.yml +15 -0
  484. data/config/locales/fi.yml +15 -0
  485. data/config/locales/fr.yml +15 -0
  486. data/config/locales/hu.yml +15 -0
  487. data/config/locales/id.yml +15 -0
  488. data/config/locales/it.yml +15 -0
  489. data/config/locales/ja.yml +15 -0
  490. data/config/locales/km.yml +15 -0
  491. data/config/locales/ko.yml +15 -0
  492. data/config/locales/ku.yml +15 -0
  493. data/config/locales/lt.yml +15 -0
  494. data/config/locales/lv.yml +15 -0
  495. data/config/locales/nb.yml +15 -0
  496. data/config/locales/ne.yml +15 -0
  497. data/config/locales/nl.yml +15 -0
  498. data/config/locales/pl.yml +15 -0
  499. data/config/locales/pt-BR.yml +13 -0
  500. data/config/locales/pt.yml +15 -0
  501. data/config/locales/ro.yml +15 -0
  502. data/config/locales/ru.yml +15 -0
  503. data/config/locales/sk.yml +15 -0
  504. data/config/locales/sl-SI.yml +15 -0
  505. data/config/locales/sv.yml +15 -0
  506. data/config/locales/th.yml +15 -0
  507. data/config/locales/tr.yml +15 -0
  508. data/config/locales/uk.yml +15 -0
  509. data/config/locales/vi.yml +15 -0
  510. data/config/locales/zh-CN.yml +15 -0
  511. data/config/locales/zh-TW.yml +15 -0
  512. data/config/routes.rb +54 -102
  513. data/lib/spree/api/configuration.rb +5 -0
  514. data/lib/spree/api/dependencies.rb +54 -274
  515. data/lib/spree/api/middleware/request_size_limit.rb +24 -3
  516. data/lib/spree/api/openapi/filter_documentation.rb +136 -0
  517. data/lib/spree/api/openapi/schema_helper.rb +127 -81
  518. data/lib/spree/api/preference_families.rb +46 -0
  519. data/lib/spree/api/preference_types.rb +138 -0
  520. data/lib/spree/api/typelizer_generation.rb +39 -0
  521. data/lib/spree/api/webhook_event_types.rb +140 -0
  522. data/lib/spree/api.rb +0 -2
  523. data/lib/tasks/filters.rake +12 -0
  524. data/lib/typelizer/open_enums.rb +10 -0
  525. metadata +125 -40
  526. data/app/controllers/concerns/spree/api/v3/address_params.rb +0 -17
  527. data/app/controllers/concerns/spree/api/v3/direct_uploads.rb +0 -35
  528. data/app/controllers/spree/api/v3/admin/direct_uploads_controller.rb +0 -54
  529. data/app/controllers/spree/api/v3/seller/direct_uploads_controller.rb +0 -21
  530. data/config/i18n-tasks.yml +0 -40
  531. data/config/initializers/alba.rb +0 -5
@@ -5,6 +5,125 @@ module Spree
5
5
  class StoreController < Admin::BaseController
6
6
  scoped_resource :settings
7
7
 
8
+ request_params :store do |body|
9
+ body.attribute :name, :string, example: 'My Store'
10
+ body.attribute :admin_locale, :string, example: 'en'
11
+ body.attribute :timezone, :string, example: 'Europe/Berlin'
12
+ body.attribute :weight_unit, :string, choices: Spree::Variant::WEIGHT_UNITS
13
+ body.attribute :unit_system, :string, choices: Spree::Store::UNIT_SYSTEMS
14
+ body.attribute :storefront_access, :string,
15
+ choices: Spree::Channel::Gating::STOREFRONT_ACCESS,
16
+ description: "The store-wide default for what anonymous visitors can see. Channels fall back to it when they don't set their own."
17
+ body.attribute :storefront_url, :string,
18
+ nullable: true,
19
+ description: "The storefront's public URL, the base for links in customer emails. Saving it also completes the storefront setup task."
20
+ body.attribute :guest_checkout, :boolean,
21
+ description: 'The store-wide default for guest checkout. Channels fall back to it.'
22
+ body.attribute :always_include_confirm_step, :boolean,
23
+ description: 'Always show a confirmation step in checkout, even when no payment method requires one.'
24
+ body.attribute :company_field_enabled, :boolean, description: 'Shows a company field on address forms.'
25
+ body.attribute :address_requires_company, :boolean,
26
+ description: 'Makes a company name mandatory on addresses.'
27
+ body.attribute :address_requires_phone, :boolean,
28
+ description: 'Makes a phone number mandatory on customer addresses.'
29
+ body.attribute :capture_method, :string,
30
+ choices: Spree::CaptureMethod::CAPTURE_METHODS,
31
+ description: "The store-wide default for when a customer is charged rather than only authorized. A payment method's own setting wins when set."
32
+ body.attribute :track_inventory_levels, :boolean,
33
+ description: 'Counts on-hand quantities. Off means everything is treated as always available.'
34
+ body.attribute :stock_reservations_enabled, :boolean,
35
+ description: "Holds stock for shoppers while they check out, so the same item can't be sold twice."
36
+ body.attribute :low_stock_threshold, :integer,
37
+ description: 'On-hand units at or below which a tracked variant counts as low stock on the home screen; 0 turns the warning off.'
38
+ body.attribute :tax_using_ship_address, :boolean,
39
+ description: 'Calculates tax from the shipping address. When false, tax is calculated from the billing address.'
40
+ body.attribute :track_price_history, :boolean,
41
+ description: 'Records price changes for the EU Omnibus lowest-price-in-30-days display.'
42
+ body.attribute :show_products_without_price, :boolean,
43
+ description: "Whether products with no price in the shopper's currency still appear in listings."
44
+ body.attribute :disable_sku_validation, :boolean,
45
+ description: 'Lets more than one variant share the same SKU.'
46
+ body.attribute :order_routing_strategy, :string,
47
+ description: 'The store-wide order routing strategy shorthand. Channels fall back to it.'
48
+ body.attribute :pricing_provider, :string,
49
+ description: 'Where prices come from: a registered provider key, or `internal`.'
50
+ body.attribute :inventory_provider, :string,
51
+ description: 'Where stock levels come from: a registered provider key, or `internal`.'
52
+ body.attribute :pricing_provider_failure_policy, :string,
53
+ choices: Spree::ProviderFailurePolicy::VALUES,
54
+ description: '`strict` refuses to price when the provider cannot answer; `fallback` uses the catalog.'
55
+ body.attribute :inventory_provider_failure_policy, :string,
56
+ choices: Spree::ProviderFailurePolicy::VALUES,
57
+ description: '`fallback` sells on the local stock snapshot when the provider cannot answer; `strict` refuses.'
58
+ body.attribute :payout_provider, :string,
59
+ description: 'Blank means the built-in provider: the marketplace settles by hand.'
60
+ body.attribute :default_payouts_schedule_interval, :string, choices: Spree::Seller::PAYOUT_INTERVALS
61
+ body.attribute :default_minimum_payout_amount, :decimal,
62
+ example: '50.00',
63
+ description: "In the store's currency."
64
+ body.attribute :auto_approve_sellers, :boolean,
65
+ description: 'Admits a seller as soon as they finish onboarding, with no operator review.'
66
+ body.attribute :auto_approve_seller_products, :boolean,
67
+ description: 'Puts a seller product on sale the moment it is submitted, with no review.'
68
+ body.attribute :send_seller_transactional_emails, :boolean,
69
+ description: 'When false, transactional seller emails (approval, payouts and so on) are not sent.'
70
+ body.attribute :default_commission_tax_rate, :decimal,
71
+ example: '0.23',
72
+ description: 'Tax charged on commission as a fraction (`"0.23"` is 23%), when neither the commission rate nor the tax provider names one.'
73
+ body.attribute :document_number_format, :string,
74
+ example: 'sequential',
75
+ description: 'How document numbers are produced: `sequential` or `random`. Applies to every numbered document.'
76
+ body.attribute :order_number_prefix, :string,
77
+ example: 'R',
78
+ description: 'Leads every order number. Uppercase letters, digits, dashes and # only.'
79
+ body.attribute :order_number_suffix, :string,
80
+ description: 'Ends every order number. Uppercase letters, digits, dashes and # only.'
81
+ body.attribute :order_number_sequence_start, :integer,
82
+ description: "The first sequential order number. Only applies before the store's first order."
83
+ body.attribute :limit_digital_download_count, :boolean,
84
+ description: 'Whether a digital download link stops working after a number of clicks.'
85
+ body.attribute :digital_asset_authorized_clicks, :integer,
86
+ description: 'How many clicks a download link allows, unless the file sets its own.'
87
+ body.attribute :limit_digital_download_days, :boolean,
88
+ description: 'Whether a digital download link expires after a number of days.'
89
+ body.attribute :digital_asset_authorized_days, :integer,
90
+ description: 'How many days a download link stays valid, unless the file sets its own.'
91
+ body.attribute :mail_from_address, :string, description: 'Sender address of every transactional email.'
92
+ body.attribute :customer_support_email, :string,
93
+ nullable: true,
94
+ description: 'Customer-facing reply-to address shown in the storefront and email footers.'
95
+ body.attribute :new_order_notifications_email, :string,
96
+ nullable: true,
97
+ description: 'Recipient of "new order placed" staff notifications.'
98
+ body.attribute :send_consumer_transactional_emails, :boolean,
99
+ description: 'When false, transactional customer emails (order confirmation and so on) are not sent.'
100
+ body.attribute :email_accent_color, :string,
101
+ nullable: true,
102
+ description: 'Customer email buttons and links, as `#RRGGBB`. Blank keeps the outlined buttons emails ship with.'
103
+ body.attribute :email_background_color, :string,
104
+ nullable: true,
105
+ description: 'Customer email page background, as `#RRGGBB`.'
106
+ body.attribute :email_card_color, :string,
107
+ nullable: true,
108
+ description: 'Customer email card behind the content, as `#RRGGBB`.'
109
+ body.attribute :email_text_color, :string,
110
+ nullable: true,
111
+ description: 'Customer email body text, as `#RRGGBB`.'
112
+ body.attribute :email_heading_color, :string,
113
+ nullable: true,
114
+ description: 'Customer email headings and emphasized text, as `#RRGGBB`.'
115
+ body.attribute :email_font, :string,
116
+ nullable: true,
117
+ example: 'inter',
118
+ description: 'Customer email font: `inter`, `system`, `helvetica`, `georgia`, `roboto`, `lato` or `merriweather`.'
119
+ body.attribute :logo_signed_id, :string,
120
+ nullable: true,
121
+ description: 'A `signed_id` from `files.upload()` for the store logo, or null to remove it.'
122
+ body.attribute :mailer_logo_signed_id, :string,
123
+ nullable: true,
124
+ description: 'A `signed_id` from `files.upload()` for the logo in transactional emails, or null to remove it.'
125
+ end
126
+
8
127
  # Reading the current store is shell data — the dashboard needs the
9
128
  # name, logo, timezone, currency and locales to render anything at
10
129
  # all, so every signed-in staff member can read it regardless of
@@ -56,7 +175,6 @@ module Spree
56
175
  {
57
176
  key: provider_class.key,
58
177
  name: provider_class.provider_name,
59
- integration_class: provider_class.integration_class,
60
178
  integration_type: provider_class.integration_class.presence&.safe_constantize&.api_type,
61
179
  available: provider_class.available_for_store?(current_store)
62
180
  }
@@ -71,54 +189,10 @@ module Spree
71
189
  Spree.api.admin_store_serializer
72
190
  end
73
191
 
192
+ # Extensions' fields too: the store settings page saves the fields
193
+ # plugins add to it with the rest of the form.
74
194
  def permitted_params
75
- params.permit(
76
- :name,
77
- :preferred_admin_locale,
78
- :preferred_timezone,
79
- :preferred_weight_unit,
80
- :preferred_unit_system,
81
- :preferred_storefront_access,
82
- :preferred_storefront_url,
83
- :preferred_guest_checkout,
84
- :preferred_always_include_confirm_step,
85
- :preferred_company_field_enabled,
86
- :preferred_address_requires_company,
87
- :preferred_address_requires_phone,
88
- :preferred_capture_method,
89
- # @deprecated Superseded by preferred_capture_method; the model
90
- # maps them onto it. Removed in 6.1.
91
- :preferred_auto_capture,
92
- :preferred_auto_capture_on_dispatch,
93
- :preferred_track_inventory_levels,
94
- :preferred_stock_reservations_enabled,
95
- :preferred_low_stock_threshold,
96
- :preferred_tax_using_ship_address,
97
- :preferred_track_price_history,
98
- :preferred_show_products_without_price,
99
- :preferred_disable_sku_validation,
100
- :preferred_order_routing_strategy,
101
- :preferred_pricing_provider,
102
- :preferred_inventory_provider,
103
- :preferred_pricing_provider_failure_policy,
104
- :preferred_inventory_provider_failure_policy,
105
- :preferred_payout_provider,
106
- :preferred_default_payouts_schedule_interval,
107
- :preferred_default_minimum_payout_amount,
108
- :preferred_auto_approve_sellers,
109
- :preferred_auto_approve_seller_products,
110
- :preferred_send_seller_transactional_emails,
111
- :preferred_default_commission_tax_rate,
112
- :preferred_document_number_format,
113
- :preferred_order_number_prefix,
114
- :preferred_order_number_suffix,
115
- :preferred_order_number_sequence_start,
116
- :mail_from_address,
117
- :customer_support_email,
118
- :new_order_notifications_email,
119
- :preferred_send_consumer_transactional_emails,
120
- :mailer_logo
121
- )
195
+ params.permit(*declared_permitted_attributes, *Array(Spree::Store.additional_permitted_attributes))
122
196
  end
123
197
  end
124
198
  end
@@ -63,9 +63,6 @@ module Spree
63
63
  )
64
64
 
65
65
  rows.map do |currency, amount, used, authorized|
66
- # `SUM` answers an Integer on a whole-number total, and these
67
- # totals render beside rows that serialize decimal strings — so
68
- # "50" must not appear against their "50.0".
69
66
  figures = {
70
67
  amount: amount.to_d,
71
68
  amount_used: used.to_d,
@@ -74,10 +71,7 @@ module Spree
74
71
  figures[:amount_remaining] =
75
72
  figures[:amount] - figures[:amount_used] - figures[:amount_authorized]
76
73
 
77
- displays = figures.transform_keys { |name| :"display_#{name}" }.
78
- transform_values { |value| Spree::Money.new(value, currency: currency).to_s }
79
-
80
- { currency: currency }.merge(figures.transform_values(&:to_s)).merge(displays)
74
+ { currency: currency }.merge(figures.transform_values { |value| Spree::Money::Rounding.format(value, currency) })
81
75
  end
82
76
  end
83
77
  end
@@ -8,6 +8,22 @@ module Spree
8
8
  class SuppliersController < ResourceController
9
9
  scoped_resource :purchasing
10
10
 
11
+ request_params :supplier do |body|
12
+ body.attribute :name, :string, required: true, on: :create, example: 'Northwind Trading'
13
+ body.attribute :contact_name, :string, nullable: true, example: 'Dana Okafor'
14
+ body.attribute :email, :string, nullable: true, example: 'sales@northwind.test'
15
+ body.attribute :phone, :string, nullable: true, example: '555-0100'
16
+ body.attribute :notes, :string, nullable: true
17
+ body.attribute :address1, :string, nullable: true, example: '1 Warehouse Way'
18
+ body.attribute :address2, :string, nullable: true
19
+ body.attribute :city, :string, nullable: true, example: 'Brooklyn'
20
+ body.attribute :state_name, :string, nullable: true
21
+ body.attribute :state_code, :string, nullable: true, example: 'NY'
22
+ body.attribute :country_code, :country, nullable: true, example: 'US'
23
+ body.attribute :postal_code, :string, nullable: true, example: '11201'
24
+ body.attribute :metadata, :hash, nullable: true
25
+ end
26
+
11
27
  protected
12
28
 
13
29
  def model_class
@@ -17,12 +33,6 @@ module Spree
17
33
  def serializer_class
18
34
  Spree.api.admin_supplier_serializer
19
35
  end
20
-
21
- def resource_permitted_attributes
22
- [:name, :contact_name, :email, :phone, :notes,
23
- :address1, :address2, :city, :state_name, :state_code,
24
- :country_code, :postal_code, { metadata: {} }]
25
- end
26
36
  end
27
37
  end
28
38
  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].to_s
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 allowed_taggable_types.include?(taggable_type)
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 #{allowed_taggable_types.join(', ')}",
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 allowed_taggable_types.include?(taggable_type)
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
@@ -5,6 +5,13 @@ module Spree
5
5
  class TaxCategoriesController < ResourceController
6
6
  scoped_resource :settings
7
7
 
8
+ request_params :tax_category do |body|
9
+ body.attribute :name, :string, required: true, on: :create
10
+ body.attribute :tax_code, :string, nullable: true
11
+ body.attribute :description, :string, nullable: true
12
+ body.attribute :is_default, :boolean
13
+ end
14
+
8
15
  protected
9
16
 
10
17
  def model_class
@@ -14,10 +21,6 @@ module Spree
14
21
  def serializer_class
15
22
  Spree.api.admin_tax_category_serializer
16
23
  end
17
-
18
- def resource_permitted_attributes
19
- [:name, :tax_code, :description, :is_default]
20
- end
21
24
  end
22
25
  end
23
26
  end
@@ -7,6 +7,26 @@ module Spree
7
7
  class TaxRatesController < ResourceController
8
8
  scoped_resource :settings
9
9
 
10
+ request_params :tax_rate do |body|
11
+ body.attribute :name, :string, required: true, on: :create, example: 'VAT', description: 'Customer-facing rate name.'
12
+ body.attribute :rate, :decimal,
13
+ example: '0.19',
14
+ description: 'The rate as a fraction. Send this or `rate_percent`.'
15
+ body.attribute :rate_percent, :decimal, example: '19', description: 'The rate as a percentage.'
16
+ body.attribute :included_in_price, :boolean
17
+ body.attribute :show_rate_in_label, :boolean
18
+ body.attribute :tax_category_id, :id, required: true, on: :create
19
+ body.attribute :country_code, :country,
20
+ nullable: true,
21
+ example: 'DE',
22
+ description: 'ISO country code. A rate naming no country taxes everywhere.'
23
+ body.attribute :state_code, :string,
24
+ nullable: true,
25
+ example: 'CA',
26
+ description: 'State abbreviation within that country.'
27
+ body.attribute :metadata, :hash
28
+ end
29
+
10
30
  protected
11
31
 
12
32
  def model_class
@@ -22,9 +42,7 @@ module Spree
22
42
  end
23
43
 
24
44
  def permitted_params
25
- params.permit(*model_additional_permitted_attributes, :name, :amount, :amount_percentage, :included_in_price,
26
- :show_rate_in_label, :tax_category_id,
27
- :country_code, :state_code, metadata: {})
45
+ params.permit(*permitted_attributes)
28
46
  end
29
47
  end
30
48
  end
@@ -23,6 +23,10 @@ module Spree
23
23
 
24
24
  protected
25
25
 
26
+ def filterable?
27
+ false
28
+ end
29
+
26
30
  def model_class
27
31
  Spree::Fulfillment
28
32
  end
@@ -13,15 +13,6 @@ module Spree
13
13
  # resource_type + resource_id, so the controller stays free of
14
14
  # per-model branching.
15
15
  #
16
- # POST /api/v3/admin/translations/batch
17
- # Body:
18
- # { "translations": [
19
- # { "resource_type": "option_type", "resource_id": "opt_…",
20
- # "values": { "de": { "label": "Größe" } } },
21
- # { "resource_type": "option_value", "resource_id": "optval_…",
22
- # "values": { "de": { "label": "Klein" } } }
23
- # ] }
24
- #
25
16
  # All entries succeed or none do — a validation failure on any entry
26
17
  # rolls back the whole transaction and returns per-entry detail.
27
18
  # The orchestration (resolve → upsert → rollback) lives in
@@ -34,6 +25,23 @@ module Spree
34
25
  # which is stricter than the static check and keeps the audit model.
35
26
  skip_scope_check!
36
27
 
28
+ request_params 'TranslationBatchParams' do |body|
29
+ body.attribute :translations, :array,
30
+ required: true,
31
+ as: 'TranslationBatchEntryParams',
32
+ description: 'At least one entry. All entries are saved, or none are.' do |translation|
33
+ translation.attribute :resource_type, :string,
34
+ required: true,
35
+ example: 'option_type',
36
+ description: 'Translatable resource type token, e.g. `option_type`.'
37
+ translation.attribute :resource_id, :id, required: true, example: 'opt_abc123'
38
+ translation.attribute :values, :hash,
39
+ required: true,
40
+ example: { de: { label: 'Größe' } },
41
+ description: 'Translated fields keyed by locale code, then by field name.'
42
+ end
43
+ end
44
+
37
45
  # POST /api/v3/admin/translations/batch
38
46
  def create
39
47
  raw = params[:translations]
@@ -29,6 +29,10 @@ module Spree
29
29
 
30
30
  protected
31
31
 
32
+ def filterable?
33
+ false
34
+ end
35
+
32
36
  def set_parent
33
37
  raise ActiveRecord::RecordNotFound, 'Parent resource not found' unless parent_lookup
34
38
 
@@ -31,6 +31,11 @@ module Spree
31
31
 
32
32
  protected
33
33
 
34
+ # The model, and so the filters, follow `resource_type`.
35
+ def filterable?
36
+ false
37
+ end
38
+
34
39
  # Resolved from the required `resource_type` param. An unknown or
35
40
  # untranslatable type is a 404 rather than a 500 from a nil class.
36
41
  def model_class
@@ -0,0 +1,39 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ # Whether a newer Spree release exists, for the dashboard's update
6
+ # notice. Asks spreecloud.io at most once a day (see Spree::UpdateCheck).
7
+ #
8
+ # The only place the Admin API reveals the running Spree version, so it
9
+ # answers signed-in staff who can manage the store and nobody else. A
10
+ # secret API key gets a 404, like GET /me: an integration key would
11
+ # otherwise fingerprint the deployment for anyone matching CVEs.
12
+ class UpdatesController < Admin::BaseController
13
+ skip_scope_check!
14
+
15
+ before_action :require_current_user!
16
+
17
+ # GET /api/v3/admin/updates
18
+ def show
19
+ authorize! :manage, current_store
20
+
21
+ render json: Spree.api.admin_update_status_serializer.new(Spree::UpdateCheck.status).to_h
22
+ end
23
+
24
+ private
25
+
26
+ def require_current_user!
27
+ return if current_user
28
+
29
+ render_error(
30
+ code: ERROR_CODES[:record_not_found],
31
+ message: I18n.t('spree.me_no_current_user'),
32
+ status: :not_found
33
+ )
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -8,6 +8,28 @@ module Spree
8
8
  class WebhookEndpointsController < ResourceController
9
9
  scoped_resource :webhooks
10
10
 
11
+ request_params :webhook_endpoint do |body|
12
+ body.attribute :name, :string,
13
+ nullable: true,
14
+ example: 'Order pipeline',
15
+ description: 'A label shown in the dashboard list.'
16
+ body.attribute :url, :string,
17
+ required: true, on: :create,
18
+ example: 'https://example.com/webhooks/orders',
19
+ description: 'HTTPS destination URL. It cannot resolve to a private IP address outside development.'
20
+ body.attribute :active, :boolean,
21
+ description: 'Defaults to true on create. Prefer the disable and enable endpoints to pause one.'
22
+ body.attribute :subscriptions, :array, of: :string,
23
+ example: %w[order.placed order.canceled],
24
+ description: 'Event names this endpoint receives. An empty list or `["*"]` subscribes to every event; otherwise list exact names (`order.completed`) or patterns (`order.*`).'
25
+ end
26
+
27
+ request_params 'WebhookEndpointDisableParams', action: :disable do |body|
28
+ body.attribute :reason, :string,
29
+ example: 'Investigating elevated 5xx rate',
30
+ description: 'Shown next to the disabled indicator. Defaults to "Manually disabled".'
31
+ end
32
+
11
33
  before_action :reject_unauthorized_credential_subscription!, only: [:create, :update]
12
34
 
13
35
  # POST /api/v3/admin/webhook_endpoints/:id/send_test
@@ -68,32 +90,37 @@ module Spree
68
90
  end
69
91
 
70
92
  def permitted_params
71
- params.permit(*model_additional_permitted_attributes, :name, :url, :active, subscriptions: [])
93
+ params.permit(*permitted_attributes)
72
94
  end
73
95
 
74
96
  private
75
97
 
76
- # Customer password reset tokens are account credentials, so the
77
- # webhooks permission alone cannot subscribe an endpoint to them, or
78
- # repoint an endpoint that already receives them.
98
+ # A customer's password reset token is an account credential, so the
99
+ # webhooks permission alone cannot subscribe an endpoint to it, or
100
+ # repoint an endpoint that already receives it: that needs the
101
+ # permission the event catalog names for it (`write_customers`).
79
102
  def reject_unauthorized_credential_subscription!
80
- return if holds_permission?('write_customers')
81
-
82
- requested = Array(permitted_params[:subscriptions]) & Spree::WebhookEndpoint::CREDENTIAL_EVENTS
83
- return if requested.empty? && !repoints_credential_endpoint?
103
+ events = requested_credential_events | repointed_credential_events
104
+ missing = events.reject { |entry| holds_permission?(entry.credential_permission) }
105
+ return if missing.empty?
84
106
 
85
107
  render_error(
86
108
  code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:access_denied],
87
- message: "Receiving #{Spree::WebhookEndpoint::CREDENTIAL_EVENTS.to_sentence} requires permission to manage customers",
109
+ message: "Receiving #{missing.map(&:name).to_sentence} requires the " \
110
+ "#{missing.map(&:credential_permission).uniq.to_sentence} permission",
88
111
  status: :forbidden
89
112
  )
90
113
  end
91
114
 
92
- def repoints_credential_endpoint?
93
- return false unless action_name == 'update'
94
- return false unless permitted_params.key?(:url) || permitted_params.key?(:subscriptions)
115
+ def requested_credential_events
116
+ Spree::Events.catalog.credential_events(Array(permitted_params[:subscriptions]))
117
+ end
118
+
119
+ def repointed_credential_events
120
+ return [] unless action_name == 'update'
121
+ return [] unless permitted_params.key?(:url) || permitted_params.key?(:subscriptions)
95
122
 
96
- current_store.webhook_endpoints.find_by_prefix_id(params[:id])&.receives_credentials?
123
+ current_store.webhook_endpoints.find_by_prefix_id(params[:id])&.credential_subscriptions || []
97
124
  end
98
125
  end
99
126
  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
@@ -12,6 +12,8 @@ module Spree
12
12
  include Spree::Api::V3::JwtAuthentication
13
13
  include Spree::Api::V3::ApiKeyAuthentication
14
14
  include Spree::Api::V3::ErrorHandler
15
+ include Spree::Api::V3::MoneyParams
16
+ include Spree::Api::V3::RequestParams
15
17
  include Spree::Api::V3::SecurityHeaders
16
18
  include Spree::Api::V3::ResourceSerializer
17
19
  include Spree::Api::V3::RateLimitHeaders
@@ -70,6 +72,16 @@ module Spree
70
72
  request.headers['x-spree-token']
71
73
  end
72
74
 
75
+ # Renders a workflow's result: the serialized record on success, its
76
+ # errors otherwise.
77
+ def render_result(result, status: :ok)
78
+ if result.success?
79
+ render json: serialize_resource(result.value), status: status
80
+ else
81
+ render_result_error(result)
82
+ end
83
+ end
84
+
73
85
  # Renders a failed service/workflow Result: validation errors become a
74
86
  # 422 field-error payload, anything else a plain service error. Shared
75
87
  # by both APIs — Store endpoints surface workflow failures (a rejected