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
@@ -8,6 +8,82 @@ module Spree
8
8
 
9
9
  scoped_resource :products
10
10
 
11
+ # Product is purely a catalog grouping in API v3: every purchasable
12
+ # attribute lives on variants (docs/plans/6.0-remove-master-variant.md).
13
+ request_params :product do |body|
14
+ body.external_references
15
+ body.attribute :name, :string, required: true, on: :create, example: 'Premium T-Shirt'
16
+ body.attribute :description, :string,
17
+ description: 'Rich text HTML. Reads come back as this (plain text) plus `description_html`.'
18
+ body.attribute :slug, :string
19
+ body.attribute :status, :string, choices: Spree::Product::STATUSES, open: true
20
+ body.attribute :meta_title, :string
21
+ body.attribute :meta_description, :string
22
+ body.attribute :meta_keywords, :string
23
+ body.attribute :tax_category_id, :id
24
+ body.attribute :product_type_id, :id,
25
+ nullable: true,
26
+ description: 'The product type this product is created from (`pt_...`). Its option types and categories seed onto the product and its custom field definitions drive the product form. Editing the type later never rewrites existing products.'
27
+ body.attribute :delivery_profile_id, :id,
28
+ nullable: true,
29
+ description: 'The delivery profile deciding how this product ships (`fp_...`); null falls back to the store default.'
30
+ body.attribute :promotionable, :boolean
31
+ body.attribute :tags, :array, of: :string, example: %w[eco sale]
32
+ body.attribute :category_ids, :array, of: :id
33
+ # Reachable with `write_products` rather than `write_collections`:
34
+ # filing a product into its groupings is part of maintaining it.
35
+ body.attribute :collection_ids, :array, of: :id,
36
+ description: 'Manual collections this product belongs to. Automatic collections are kept as they are, since their rules decide membership.'
37
+ body.attribute :metadata, :hash
38
+ body.attribute :prices, :array, of: Spree::Api::V3::PriceRequestSchema,
39
+ description: "Shorthand for a simple (no-options) product: per-currency prices that forward to the product's sole variant. For products with options, set prices per variant under `variants` instead. Don't pass both."
40
+ body.attribute :custom_fields, :array, of: Spree::Api::V3::CustomFieldValueRequestSchema,
41
+ description: 'Custom field values, each validated against its definition.'
42
+ # `external_url` is left out on purpose: it makes the server fetch
43
+ # a URL the caller chose, so it belongs to trusted importers.
44
+ body.attribute :media, :array,
45
+ as: 'ProductMediaParams',
46
+ description: 'Media written with the product. Entries with `id` update an existing asset; entries with `signed_id` attach a fresh upload; an external video needs only its URL.' do |media_item|
47
+ media_item.attribute :id, :id
48
+ media_item.attribute :signed_id, :string, description: 'A `signed_id` from `files.upload()`.'
49
+ media_item.attribute :source_media_id, :id, description: 'Copies an asset from the media library.'
50
+ media_item.include_attributes Spree::Api::V3::MediaRequestSchema
51
+ media_item.attribute :variant_ids, :array, of: :id,
52
+ description: 'Replaces the variants this media is linked to. An empty list clears them.'
53
+ end
54
+ body.attribute :digital_assets, :array,
55
+ as: 'ProductDigitalAssetParams',
56
+ description: 'Downloadable files written with the product. Each entry carries a `signed_id` (an upload to private storage) or a `provider_type` (a provider-backed asset), and attaches to the default variant unless `variant_id` is given. An `id` updates that asset in place, so replaying the list does not duplicate it; removal uses the nested digital assets endpoint.' do |digital_asset|
57
+ digital_asset.attribute :id, :id
58
+ digital_asset.attribute :signed_id, :string
59
+ digital_asset.attribute :variant_id, :id
60
+ digital_asset.attribute :provider_type, :string,
61
+ description: 'A provider shorthand from the digital asset providers endpoint.'
62
+ digital_asset.attribute :provider_settings, :hash,
63
+ description: "Values for the provider's settings schema, keyed by field name."
64
+ digital_asset.attribute :authorized_clicks, :integer,
65
+ nullable: true,
66
+ description: "Null means the store's download settings apply."
67
+ digital_asset.attribute :authorized_days, :integer,
68
+ nullable: true,
69
+ description: "Null means the store's download settings apply."
70
+ end
71
+ body.attribute :product_publications, :array, as: 'ProductPublicationParams' do |product_publication|
72
+ product_publication.attribute :id, :id
73
+ product_publication.attribute :channel_id, :id
74
+ product_publication.attribute :published_at, :datetime, nullable: true
75
+ product_publication.attribute :unpublished_at, :datetime, nullable: true
76
+ end
77
+ body.attribute :variants, :array,
78
+ as: 'ProductVariantParams',
79
+ description: 'Every purchasable attribute (sku, prices, stock, weight, dimensions) lives on variants. An entry without `options` upserts onto the default variant of a simple product; pass `id` to update an existing variant.' do |variant|
80
+ variant.attribute :id, :id
81
+ variant.include_attributes Spree::Api::V3::VariantRequestSchema
82
+ variant.attribute :options, :array, of: Spree::Api::V3::VariantOptionRequestSchema,
83
+ description: 'One pair per option type the variant takes part in (size, color). Option types and values are created when missing.'
84
+ end
85
+ end
86
+
11
87
  before_action :require_ids!, only: [
12
88
  :bulk_status_update,
13
89
  :bulk_add_to_categories,
@@ -19,6 +95,42 @@ module Spree
19
95
  :bulk_destroy
20
96
  ]
21
97
 
98
+ request_params 'ProductRejectParams', action: :reject do |body|
99
+ body.attribute :reason, :string,
100
+ description: 'Why the submission was turned down. Sent back to the seller.'
101
+ end
102
+
103
+ request_params 'ProductBulkStatusParams', action: :bulk_status_update do |body|
104
+ body.attribute :ids, :array, of: :id, required: true, example: ['prod_UkLWZg9DAJ']
105
+ body.attribute :status, :string,
106
+ required: true,
107
+ choices: Spree::Product::STATUSES,
108
+ description: 'Products in review are skipped and counted in `skipped_in_review_count`.'
109
+ end
110
+
111
+ {
112
+ 'ProductBulkCategoriesParams' => [:category_ids, %i[bulk_add_to_categories bulk_remove_from_categories]],
113
+ 'ProductBulkCollectionsParams' => [:collection_ids, %i[bulk_add_to_collections bulk_remove_from_collections]],
114
+ 'ProductBulkChannelsParams' => [:channel_ids, %i[bulk_add_to_channels bulk_remove_from_channels]]
115
+ }.each do |name, (field, actions)|
116
+ actions.each do |action|
117
+ request_params(name, action: action) do |body|
118
+ body.attribute :ids, :array, of: :id, required: true
119
+ body.attribute field, :array, of: :id, required: true
120
+ end
121
+ end
122
+ end
123
+
124
+ %i[bulk_add_tags bulk_remove_tags].each do |action|
125
+ request_params('BulkTagsParams', action: action) { |body| body.include_attributes Spree::Api::V3::Admin::BulkTagsRequestSchema }
126
+ end
127
+
128
+ request_params 'ProductBulkDestroyParams', action: :bulk_destroy do |body|
129
+ body.attribute :ids, :array, of: :id,
130
+ required: true,
131
+ description: 'Products the caller cannot delete are skipped.'
132
+ end
133
+
22
134
  # POST /api/v3/admin/products/:id/clone
23
135
  def clone
24
136
  @resource = find_resource
@@ -54,7 +166,7 @@ module Spree
54
166
  unless Spree::Product::STATUSES.include?(params[:status].to_s)
55
167
  return render_error(
56
168
  code: 'invalid_status',
57
- message: Spree.t(:invalid_status, scope: 'errors.messages', default: 'Invalid status'),
169
+ message: I18n.t('spree.errors.messages.invalid_status'),
58
170
  status: :unprocessable_content
59
171
  )
60
172
  end
@@ -155,6 +267,14 @@ module Spree
155
267
 
156
268
  protected
157
269
 
270
+ def additional_sort_fields
271
+ Spree::SearchProvider::Base::SORT_FIELDS
272
+ end
273
+
274
+ def custom_field_filters?
275
+ true
276
+ end
277
+
158
278
  def model_class
159
279
  Spree::Product
160
280
  end
@@ -201,76 +321,7 @@ module Spree
201
321
  end
202
322
 
203
323
  def permitted_params
204
- # Product is purely a catalog grouping in API v3. All purchasable
205
- # attributes (sku, barcode, price, weight, dimensions, stock,
206
- # track_inventory) live on variants. See
207
- # docs/plans/6.0-remove-master-variant.md.
208
- #
209
- # Top-level `prices` is a convenience for simple (no-options)
210
- # products: the merchant doesn't need to know about the default
211
- # variant, so they ship prices alongside name/status and the
212
- # `Spree::Product#prices=` setter forwards them to it.
213
- params.permit(
214
- *model_additional_permitted_attributes,
215
- :name, :description, :slug, :status,
216
- :meta_title, :meta_description, :meta_keywords,
217
- :tax_category_id, :product_type_id, :delivery_profile_id,
218
- :promotionable,
219
- tags: [],
220
- category_ids: [],
221
- # Manual collection membership only — the model setter ignores
222
- # incoming automatic collections and preserves the product's
223
- # existing ones, since those are materialized from their rules.
224
- #
225
- # Deliberately reachable with `write_products` rather than
226
- # `write_collections`: filing a product into its groupings is part
227
- # of maintaining the product, which is why `category_ids` and the
228
- # bulk membership endpoints have always worked this way too.
229
- # Creating or configuring a collection still needs
230
- # `write_collections`.
231
- collection_ids: [],
232
- metadata: {},
233
- prices: [:amount, :compare_at_amount, :currency],
234
- # Inline custom field values keyed by definition id. The model
235
- # setter (`Spree::HasCustomFields#custom_fields=`) validates each
236
- # entry against its definition. We permit `value` as a scalar AND
237
- # as `value: []` / `value: {}` so JSON custom_fields round-trip
238
- # whether the parsed payload is an array or an object, while
239
- # text/number/boolean ship scalars.
240
- custom_fields: [:id, :custom_field_definition_id, :value, { value: [] }, { value: {} }],
241
- # Inline media. Entries with `id` patch an existing asset.
242
- # Entries with `signed_id` create + attach a fresh upload; an
243
- # external video creates with a URL and no file. Lets the
244
- # dashboard ship media changes alongside the rest of the product
245
- # form. See `Spree::Products::NestedAttributes`.
246
- #
247
- # `external_url` is deliberately not permitted here: it makes the
248
- # server fetch a URL the caller chose, so it belongs to trusted
249
- # importers rather than to a request body.
250
- media: [*Spree::Media::WRITABLE_ATTRIBUTES, :id, :signed_id, :source_media_id, { variant_ids: [] }],
251
- # Inline digital files, so a new product ships its downloadable
252
- # files in the same request. Additive: an entry carries a
253
- # `signed_id` (uploaded file) or a `provider_type` (provider-backed
254
- # asset), and an `id` patches that asset in place rather than
255
- # building a duplicate — so replaying a product's list on update
256
- # does not accumulate copies. Removal uses the nested
257
- # digital_assets endpoint. See `Spree::Product#digital_assets=`.
258
- digital_assets: [:id, :signed_id, :variant_id, :provider_type, :authorized_clicks, :authorized_days, provider_settings: {}],
259
- product_publications: [:id, :channel_id, :published_at, :unpublished_at],
260
- variants: [
261
- :id, :sku, :barcode,
262
- :cost_price, :cost_currency,
263
- :weight, :height, :width, :depth, :weight_unit, :dimensions_unit,
264
- :hs_code, :country_of_origin, :customs_description,
265
- :minimum_order_quantity, :order_multiple, :purchase_unit, :units_per_carton,
266
- :carton_package_type_id, :carton_weight, :cartons_per_pallet,
267
- :seller_id, :delivery_profile_id,
268
- :track_inventory, :preorderable, :preorder_ships_at, :backorder_limit, :tax_category_id, :position,
269
- options: [:name, :value],
270
- prices: [:amount, :compare_at_amount, :currency],
271
- stock_levels: [:id, :stock_location_id, :count_on_hand, :backorderable]
272
- ]
273
- ).tap { |attrs| attrs.delete(:status) if review_status?(attrs[:status]) }
324
+ params.permit(*permitted_attributes).tap { |attrs| attrs.delete(:status) if review_status?(attrs[:status]) }
274
325
  end
275
326
 
276
327
  # A review status is an outcome, not a value to assign: `proposed`
@@ -13,6 +13,15 @@ module Spree
13
13
  subclassed_via -> { Spree.promotions.actions },
14
14
  unknown_type_error: 'unknown_promotion_action_type'
15
15
 
16
+ request_params :promotion_action do |body|
17
+ body.attribute :type, :string,
18
+ required: true, on: :create,
19
+ only: :create,
20
+ example: 'free_shipping',
21
+ description: 'The action kind, from `GET /promotion_actions/types`.'
22
+ body.include_attributes Spree::Api::V3::Admin::PromotionActionRequestSchema
23
+ end
24
+
16
25
  def types
17
26
  authorize! :read, model_class
18
27
 
@@ -38,7 +47,7 @@ module Spree
38
47
  {
39
48
  type: calc.api_type,
40
49
  label: calc.respond_to?(:description) ? calc.description : calc.to_s.demodulize.titleize,
41
- preference_schema: calc.respond_to?(:serialized_preference_schema) ? calc.serialized_preference_schema : []
50
+ schema: calc.preference_json_schema
42
51
  }
43
52
  end.sort_by { |entry| entry[:label].to_s }
44
53
 
@@ -56,7 +65,7 @@ module Spree
56
65
  end
57
66
 
58
67
  def permitted_params
59
- params.permit(*model_additional_permitted_attributes, :type, preferences: {})
68
+ params.permit(*permitted_attributes)
60
69
  end
61
70
 
62
71
  # `types`/`calculators` are read-only discovery — read scope + :show ability.
@@ -71,10 +80,6 @@ module Spree
71
80
  .find_by_prefix_id!(params[:promotion_id])
72
81
  end
73
82
 
74
- def parent_association
75
- :promotion_actions
76
- end
77
-
78
83
  private
79
84
 
80
85
  def build_subclassed_resource(klass, attrs)
@@ -13,6 +13,15 @@ module Spree
13
13
  subclassed_via -> { Spree.promotions.rules },
14
14
  unknown_type_error: 'unknown_promotion_rule_type'
15
15
 
16
+ request_params :promotion_rule do |body|
17
+ body.attribute :type, :string,
18
+ required: true, on: :create,
19
+ only: :create,
20
+ example: 'currency',
21
+ description: 'The rule kind, from `GET /promotion_rules/types`.'
22
+ body.include_attributes Spree::Api::V3::Admin::PromotionRuleRequestSchema
23
+ end
24
+
16
25
  def types
17
26
  authorize! :read, model_class
18
27
 
@@ -30,7 +39,7 @@ module Spree
30
39
  end
31
40
 
32
41
  def permitted_params
33
- params.permit(*model_additional_permitted_attributes, :type, preferences: {})
42
+ params.permit(*permitted_attributes)
34
43
  end
35
44
 
36
45
  # `types` is read-only discovery — maps to the read scope + :show ability.
@@ -45,10 +54,6 @@ module Spree
45
54
  .find_by_prefix_id!(params[:promotion_id])
46
55
  end
47
56
 
48
- def parent_association
49
- :promotion_rules
50
- end
51
-
52
57
  private
53
58
 
54
59
  def build_subclassed_resource(klass, attrs)
@@ -5,6 +5,51 @@ module Spree
5
5
  class PromotionsController < ResourceController
6
6
  scoped_resource :promotions
7
7
 
8
+ request_params :promotion do |body|
9
+ body.attribute :name, :string, required: true, on: :create
10
+ body.attribute :description, :string, nullable: true
11
+ body.attribute :code, :string,
12
+ nullable: true,
13
+ description: 'Required for single-code coupon promotions. Ignored when `multi_codes` is true.'
14
+ body.attribute :path, :string, nullable: true
15
+ body.attribute :starts_at, :datetime, nullable: true
16
+ body.attribute :expires_at, :datetime, nullable: true
17
+ body.attribute :usage_limit, :integer, nullable: true
18
+ body.attribute :match_policy, :string, choices: Spree::Promotion::MATCH_POLICIES
19
+ body.attribute :kind, :string,
20
+ choices: Spree::Promotion.kinds.keys,
21
+ description: '`coupon_code` needs a code (or `multi_codes`); `automatic` applies without one.'
22
+ body.attribute :multi_codes, :boolean,
23
+ description: 'Generates `number_of_codes` codes starting with `code_prefix`.'
24
+ body.attribute :number_of_codes, :integer, nullable: true
25
+ body.attribute :code_prefix, :string, nullable: true
26
+ body.attribute :promotion_category_id, :id, nullable: true
27
+ # Rules and actions are permitted below, with the keys each
28
+ # registered kind adds.
29
+ body.attribute :rules, :array,
30
+ permit: false,
31
+ as: 'PromotionRuleDraftParams',
32
+ description: 'The rules the promotion should have: entries with `id` update, entries without are created, and rules left out are removed.' do |rule|
33
+ rule.attribute :id, :id
34
+ rule.attribute :type, :string,
35
+ required: true,
36
+ example: 'currency',
37
+ description: 'The rule kind, from `GET /promotion_rules/types`.'
38
+ rule.include_attributes Spree::Api::V3::Admin::PromotionRuleRequestSchema
39
+ end
40
+ body.attribute :actions, :array,
41
+ permit: false,
42
+ as: 'PromotionActionDraftParams',
43
+ description: 'The actions the promotion should have, matched the same way as `rules`.' do |action|
44
+ action.attribute :id, :id
45
+ action.attribute :type, :string,
46
+ required: true,
47
+ example: 'free_shipping',
48
+ description: 'The action kind, from `GET /promotion_actions/types`.'
49
+ action.include_attributes Spree::Api::V3::Admin::PromotionActionRequestSchema
50
+ end
51
+ end
52
+
8
53
  protected
9
54
 
10
55
  def model_class
@@ -23,21 +68,12 @@ module Spree
23
68
  promotion_includes
24
69
  end
25
70
 
26
- # A single POST/PATCH /promotions can ship rules and actions
27
- # alongside the basics; `Promotion#rules=` / `actions=` reconcile
28
- # to the desired set. The nested allowlist below is the union of
29
- # every built-in rule/action's expected keys. Plugin-defined
30
- # subclasses can add to it — see `additional_permitted_attributes`
31
- # below.
71
+ # `Promotion#rules=` / `actions=` reconcile to the desired set. The
72
+ # nested allowlists are the union of every registered rule/action
73
+ # kind's keys, so plugin-defined kinds add to them through
74
+ # `additional_permitted_attributes`.
32
75
  def resource_permitted_attributes
33
- [
34
- :name, :description, :code, :path,
35
- :starts_at, :expires_at, :usage_limit, :match_policy,
36
- :kind, :multi_codes, :number_of_codes, :code_prefix,
37
- :promotion_category_id,
38
- rules: rule_attributes,
39
- actions: action_attributes
40
- ]
76
+ [*super, { rules: rule_attributes, actions: action_attributes }]
41
77
  end
42
78
 
43
79
  def rule_attributes
@@ -16,6 +16,53 @@ module Spree
16
16
 
17
17
  scoped_resource :purchasing
18
18
 
19
+ # The supplier, the warehouse and the lines are read from the raw
20
+ # params and resolved through the store (see ReceivableActions), so
21
+ # only the document's own fields are permitted.
22
+ request_params :purchase_order do |body|
23
+ body.attribute :supplier_id, :id, required: true, on: :create, permit: false, example: 'sup_1234567890'
24
+ body.attribute :destination_location_id, :id,
25
+ required: true, on: :create,
26
+ permit: false,
27
+ example: 'sloc_1234567890'
28
+ body.attribute :currency, :currency,
29
+ nullable: true,
30
+ example: 'USD',
31
+ description: "Defaults to the store's currency; set it for a foreign-currency order."
32
+ body.attribute :expected_at, :date,
33
+ nullable: true,
34
+ example: '2026-10-01',
35
+ description: 'The day the supplier promised. `null` clears it.'
36
+ body.attribute :cancel_by, :date,
37
+ nullable: true,
38
+ description: 'The day after which the goods are no longer wanted. `null` clears it.'
39
+ body.attribute :reference, :string,
40
+ nullable: true,
41
+ description: "The supplier's own order number. `null` clears it."
42
+ body.attribute :notes, :string, nullable: true
43
+ body.attribute :items, :array,
44
+ permit: false,
45
+ as: 'PurchaseOrderItemParams',
46
+ description: 'Sending the list replaces whatever the order currently holds.' do |item|
47
+ item.attribute :variant_id, :id, required: true, example: 'variant_1234567890'
48
+ item.attribute :quantity_ordered, :integer, required: true, example: 100
49
+ item.attribute :unit_cost, :decimal,
50
+ example: '12.50',
51
+ description: 'What the merchant agreed to pay per unit.'
52
+ end
53
+ body.attribute :metadata, :hash, nullable: true
54
+ end
55
+
56
+ request_params 'ReceivableCloseParams', action: :close do |body|
57
+ body.attribute :reason, :string, nullable: true, description: 'Why the balance is not coming.'
58
+ end
59
+
60
+ request_params 'PurchaseOrderCancelParams', action: :cancel do |body|
61
+ body.attribute :reason, :string,
62
+ example: 'Supplier went under',
63
+ description: "Appended to the order's notes."
64
+ end
65
+
19
66
  # The base registers this for show/update/destroy; a second
20
67
  # `before_action :set_resource` replaces that registration rather than
21
68
  # adding to it, so those three are listed again here.
@@ -31,7 +78,7 @@ module Spree
31
78
 
32
79
  render_error(
33
80
  code: 'invalid_status',
34
- message: Spree.t('purchase_order.errors.only_draft_can_be_deleted'),
81
+ message: I18n.t('spree.purchase_order.errors.only_draft_can_be_deleted'),
35
82
  status: :unprocessable_content
36
83
  )
37
84
  end
@@ -109,6 +156,7 @@ module Spree
109
156
  cancel_by: params[:cancel_by],
110
157
  reference: params[:reference],
111
158
  notes: params[:notes],
159
+ metadata: metadata_from_params,
112
160
  created_by: try_spree_current_user
113
161
  }
114
162
  end
@@ -121,13 +169,6 @@ module Spree
121
169
  }
122
170
  end
123
171
 
124
- # The supplier and the warehouse are resolved through the store
125
- # instead, since an id the payload names has to be proved to belong
126
- # here.
127
- def resource_permitted_attributes
128
- [:currency, :expected_at, :cancel_by, :reference, :notes, { metadata: {} }]
129
- end
130
-
131
172
  def editable_attributes
132
173
  attributes = permitted_params.to_h.symbolize_keys
133
174
  attributes[:supplier] = supplier_from_params if params.key?(:supplier_id)
@@ -143,6 +184,12 @@ module Spree
143
184
 
144
185
  private
145
186
 
187
+ # Merchant data, stored as sent: never through the prefixed-id decoding
188
+ # `permitted_params` applies.
189
+ def metadata_from_params
190
+ params.permit(*declared_permitted_attributes)[:metadata]&.to_h
191
+ end
192
+
146
193
  # Read through `current_store` rather than the model constant: a
147
194
  # supplier id belonging to another store must 404, which no ability
148
195
  # check would catch.
@@ -5,6 +5,10 @@ module Spree
5
5
  class RefundReasonsController < ResourceController
6
6
  scoped_resource :settings
7
7
 
8
+ request_params :reason do |body|
9
+ body.include_attributes Spree::Api::V3::Admin::ReasonRequestSchema
10
+ end
11
+
8
12
  protected
9
13
 
10
14
  def model_class
@@ -16,7 +20,7 @@ module Spree
16
20
  end
17
21
 
18
22
  def permitted_params
19
- params.permit(*model_additional_permitted_attributes, :name, :active)
23
+ params.permit(*permitted_attributes)
20
24
  end
21
25
  end
22
26
  end
@@ -11,6 +11,14 @@ module Spree
11
11
  class SavedReportsController < ResourceController
12
12
  scoped_resource :reports
13
13
 
14
+ request_params :saved_report do |body|
15
+ body.attribute :name, :string, required: true, on: :create
16
+ body.attribute :description, :string, nullable: true
17
+ body.attribute :query, :hash,
18
+ required: true, on: :create,
19
+ description: 'A reporting query, validated against the reporting registry on save.'
20
+ end
21
+
14
22
  protected
15
23
 
16
24
  def model_class
@@ -31,7 +39,7 @@ module Spree
31
39
  # nested hashes — they would be decoded to integers on save and
32
40
  # never resolve again. Extension attributes are splatted in.
33
41
  def permitted_params
34
- params.permit(:name, :description, *model_additional_permitted_attributes, query: {})
42
+ params.permit(*permitted_attributes)
35
43
  end
36
44
 
37
45
  def build_resource
@@ -14,6 +14,40 @@ module Spree
14
14
 
15
15
  QUERY_KEYS = %w[metrics dimensions filters metric_filters time_range compare sort limit currency].freeze
16
16
 
17
+ request_params 'ReportingQueryParams', action: :query do |body|
18
+ body.attribute :metrics, :array, of: :string,
19
+ required: true,
20
+ description: 'Registered metric names, from the reporting schema endpoint.'
21
+ body.attribute :dimensions, :array, of: :any, permit: false, description: <<~TEXT.squish
22
+ Up to #{Spree::Reporting::Query::MAX_DIMENSIONS} dimensions to break the metrics down by. Each is a dimension
23
+ name, or `{ name, grain, include_empty }`: `grain` (`hour`, `day`, `week`, `month`) buckets a time
24
+ dimension, and `include_empty` lists members with no matching rows where the schema entry supports it.
25
+ TEXT
26
+ body.attribute :filters, :array, description: 'Narrows the rows by dimension value.' do |filter|
27
+ filter.attribute :dimension, :string, required: true
28
+ filter.attribute :op, :string, required: true, choices: Spree::Reporting::Query::FILTER_OPS
29
+ filter.attribute :value, :any, required: true, description: 'One value for `eq`, a list for `in`.'
30
+ end
31
+ body.attribute :metric_filters, :array,
32
+ description: "Filters on an aggregate, such as `units_sold = 0`. Narrows the rows only; the totals stay the period's real figure. The metric must also appear in `metrics`, and cannot be a derived one." do |metric_filter|
33
+ metric_filter.attribute :metric, :string, required: true
34
+ metric_filter.attribute :op, :string,
35
+ required: true,
36
+ choices: Spree::Reporting::Query::METRIC_FILTER_OPS
37
+ metric_filter.attribute :value, :number, required: true
38
+ end
39
+ body.attribute :time_range, :object,
40
+ description: "A named preset (`last_month`, `week_to_date`, any `last_<n>_<days|weeks|months>`), or ISO 8601 dates or times in `since` and `until` (a bare date covers the store's whole day). Defaults to the last 30 days, in the store's time zone." do |time_range|
41
+ time_range.attribute :preset, :string
42
+ time_range.attribute :since, :string
43
+ time_range.attribute :until, :string
44
+ end
45
+ body.attribute :compare, :string, choices: Spree::Reporting::Query::COMPARE_MODES
46
+ body.attribute :sort, :string, description: 'A metric name; prefix it with `-` to sort descending.'
47
+ body.attribute :limit, :integer, description: "At most #{Spree::Reporting::Query::MAX_LIMIT}."
48
+ body.attribute :currency, :currency
49
+ end
50
+
17
51
  # POST /api/v3/admin/reporting/query
18
52
  def query
19
53
  reporting_query = Spree::Reporting::Query.new(store: current_store, params: query_params)
@@ -9,6 +9,7 @@ module Spree
9
9
  include Spree::Api::V3::Admin::StoreContext
10
10
  include Spree::Api::V3::AdminAuthentication
11
11
  include Spree::Api::V3::ScopedAuthorization
12
+ include Spree::Api::V3::StrictMoneyParams
12
13
  # External-identity addressing for every admin resource whose model
13
14
  # opts in via Spree::HasExternalReferences — the concern's guards
14
15
  # no-op for everything else. Sitting here rather than per controller
@@ -84,7 +85,7 @@ module Spree
84
85
  def render_invalid_position
85
86
  render_error(
86
87
  code: ERROR_CODES[:validation_error],
87
- message: Spree.t('api.errors.invalid_position', default: 'new_position must be an integer'),
88
+ message: I18n.t('spree.api.errors.invalid_position'),
88
89
  status: :unprocessable_content
89
90
  )
90
91
  end
@@ -5,6 +5,10 @@ module Spree
5
5
  class ReturnReasonsController < ResourceController
6
6
  scoped_resource :settings
7
7
 
8
+ request_params :reason do |body|
9
+ body.include_attributes Spree::Api::V3::Admin::ReasonRequestSchema
10
+ end
11
+
8
12
  protected
9
13
 
10
14
  def model_class
@@ -16,7 +20,7 @@ module Spree
16
20
  end
17
21
 
18
22
  def permitted_params
19
- params.permit(*model_additional_permitted_attributes, :name, :active)
23
+ params.permit(*permitted_attributes)
20
24
  end
21
25
  end
22
26
  end
@@ -13,6 +13,18 @@ module Spree
13
13
 
14
14
  scoped_resource :staff
15
15
 
16
+ request_params :role do |body|
17
+ body.attribute :name, :string,
18
+ required: true, on: :create,
19
+ example: 'order_manager',
20
+ description: 'Unique role name, the machine identifier shown capitalized in the dashboard.'
21
+ body.attribute :description, :string, nullable: true, example: 'Handles daily orders'
22
+ # A caller may only grant permissions they hold themselves.
23
+ body.attribute :permissions, :array, of: :string,
24
+ example: %w[write_orders read_customers],
25
+ description: 'Permission keys (`read_orders`, `write_products`, ...) from the permissions endpoint. You can only grant keys you hold yourself.'
26
+ end
27
+
16
28
  # POST /api/v3/admin/roles
17
29
  # A caller may only grant permissions they effectively hold — the
18
30
  # same anti-amplification rule as role grants and API-key minting.
@@ -58,7 +70,7 @@ module Spree
58
70
  end
59
71
 
60
72
  def permitted_params
61
- params.permit(*model_additional_permitted_attributes, :name, :description, permissions: [])
73
+ params.permit(*permitted_attributes)
62
74
  end
63
75
 
64
76
  private