spree_api 6.0.0.rc1 → 6.0.0.rc3

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 (371) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +0 -17
  3. data/app/controllers/concerns/spree/api/v3/admin/product_membership.rb +10 -0
  4. data/app/controllers/concerns/spree/api/v3/admin/stock_receipt_actions.rb +26 -4
  5. data/app/controllers/concerns/spree/api/v3/admin/subclassed_resource.rb +14 -28
  6. data/app/controllers/concerns/spree/api/v3/admin/validation_details.rb +1 -1
  7. data/app/controllers/concerns/spree/api/v3/cart_resolvable.rb +3 -2
  8. data/app/controllers/concerns/spree/api/v3/channel_resolution.rb +1 -1
  9. data/app/controllers/concerns/spree/api/v3/company_address_writes.rb +3 -1
  10. data/app/controllers/concerns/spree/api/v3/error_handler.rb +48 -2
  11. data/app/controllers/concerns/spree/api/v3/file_uploads.rb +35 -0
  12. data/app/controllers/concerns/spree/api/v3/money_params.rb +52 -0
  13. data/app/controllers/concerns/spree/api/v3/orders/claim_actions.rb +1 -5
  14. data/app/controllers/concerns/spree/api/v3/orders/delivery_actions.rb +6 -6
  15. data/app/controllers/concerns/spree/api/v3/orders/exchange_actions.rb +1 -4
  16. data/app/controllers/concerns/spree/api/v3/orders/fulfillment_actions.rb +1 -5
  17. data/app/controllers/concerns/spree/api/v3/orders/return_actions.rb +1 -4
  18. data/app/controllers/concerns/spree/api/v3/orders/shipping_label_actions.rb +5 -21
  19. data/app/controllers/concerns/spree/api/v3/params_normalizer.rb +5 -0
  20. data/app/controllers/concerns/spree/api/v3/purchase_serialization.rb +26 -0
  21. data/app/controllers/concerns/spree/api/v3/request_params.rb +65 -0
  22. data/app/controllers/concerns/spree/api/v3/store/search_provider_support.rb +8 -3
  23. data/app/controllers/concerns/spree/api/v3/strict_money_params.rb +94 -0
  24. data/app/controllers/spree/api/v3/admin/admin_users_controller.rb +10 -1
  25. data/app/controllers/spree/api/v3/admin/allowed_origins_controller.rb +8 -1
  26. data/app/controllers/spree/api/v3/admin/api_keys_controller.rb +15 -7
  27. data/app/controllers/spree/api/v3/admin/base_controller.rb +1 -0
  28. data/app/controllers/spree/api/v3/admin/catalogs/order_minimums_controller.rb +3 -1
  29. data/app/controllers/spree/api/v3/admin/catalogs/quantity_rules_controller.rb +7 -5
  30. data/app/controllers/spree/api/v3/admin/catalogs_controller.rb +60 -33
  31. data/app/controllers/spree/api/v3/admin/categories/products_controller.rb +4 -1
  32. data/app/controllers/spree/api/v3/admin/categories_controller.rb +40 -20
  33. data/app/controllers/spree/api/v3/admin/channels_controller.rb +39 -6
  34. data/app/controllers/spree/api/v3/admin/claim_reasons_controller.rb +5 -1
  35. data/app/controllers/spree/api/v3/admin/collections/products_controller.rb +4 -1
  36. data/app/controllers/spree/api/v3/admin/collections_controller.rb +44 -15
  37. data/app/controllers/spree/api/v3/admin/commission_rates_controller.rb +60 -12
  38. data/app/controllers/spree/api/v3/admin/companies/addresses_controller.rb +11 -0
  39. data/app/controllers/spree/api/v3/admin/companies/memberships_controller.rb +9 -1
  40. data/app/controllers/spree/api/v3/admin/companies/tax_exemption_certificates_controller.rb +19 -18
  41. data/app/controllers/spree/api/v3/admin/companies/tax_identifiers_controller.rb +6 -1
  42. data/app/controllers/spree/api/v3/admin/companies_controller.rb +17 -3
  43. data/app/controllers/spree/api/v3/admin/countries_controller.rb +5 -1
  44. data/app/controllers/spree/api/v3/admin/custom_field_definitions_controller.rb +21 -11
  45. data/app/controllers/spree/api/v3/admin/custom_fields_controller.rb +12 -5
  46. data/app/controllers/spree/api/v3/admin/customer_groups_controller.rb +9 -1
  47. data/app/controllers/spree/api/v3/admin/customers/addresses_controller.rb +12 -7
  48. data/app/controllers/spree/api/v3/admin/customers/store_credits_controller.rb +11 -9
  49. data/app/controllers/spree/api/v3/admin/customers/tax_identifiers_controller.rb +6 -1
  50. data/app/controllers/spree/api/v3/admin/customers_controller.rb +35 -7
  51. data/app/controllers/spree/api/v3/admin/data_requests_controller.rb +8 -0
  52. data/app/controllers/spree/api/v3/admin/delivery_method_rules_controller.rb +1 -1
  53. data/app/controllers/spree/api/v3/admin/delivery_methods/rules_controller.rb +15 -7
  54. data/app/controllers/spree/api/v3/admin/delivery_methods_controller.rb +92 -57
  55. data/app/controllers/spree/api/v3/admin/delivery_profiles/origin_groups_controller.rb +8 -1
  56. data/app/controllers/spree/api/v3/admin/delivery_profiles_controller.rb +13 -1
  57. data/app/controllers/spree/api/v3/admin/delivery_zones_controller.rb +21 -5
  58. data/app/controllers/spree/api/v3/admin/email_templates/drafts_controller.rb +14 -1
  59. data/app/controllers/spree/api/v3/admin/email_templates/previews_controller.rb +4 -0
  60. data/app/controllers/spree/api/v3/admin/email_templates/publications_controller.rb +7 -0
  61. data/app/controllers/spree/api/v3/admin/email_templates/restorations_controller.rb +8 -0
  62. data/app/controllers/spree/api/v3/admin/email_templates/test_emails_controller.rb +4 -0
  63. data/app/controllers/spree/api/v3/admin/exports_controller.rb +23 -6
  64. data/app/controllers/spree/api/v3/admin/files_controller.rb +29 -0
  65. data/app/controllers/spree/api/v3/admin/gift_card_batches_controller.rb +20 -1
  66. data/app/controllers/spree/api/v3/admin/gift_cards_controller.rb +19 -1
  67. data/app/controllers/spree/api/v3/admin/imports_controller.rb +36 -9
  68. data/app/controllers/spree/api/v3/admin/integrations_controller.rb +13 -1
  69. data/app/controllers/spree/api/v3/admin/invitation_acceptances_controller.rb +9 -2
  70. data/app/controllers/spree/api/v3/admin/invitations_controller.rb +8 -1
  71. data/app/controllers/spree/api/v3/admin/locales_controller.rb +1 -1
  72. data/app/controllers/spree/api/v3/admin/markets_controller.rb +30 -9
  73. data/app/controllers/spree/api/v3/admin/me_controller.rb +12 -3
  74. data/app/controllers/spree/api/v3/admin/media_controller.rb +22 -9
  75. data/app/controllers/spree/api/v3/admin/media_library_controller.rb +4 -0
  76. data/app/controllers/spree/api/v3/admin/option_types_controller.rb +24 -7
  77. data/app/controllers/spree/api/v3/admin/order_cancellation_reasons_controller.rb +5 -1
  78. data/app/controllers/spree/api/v3/admin/order_routing_rules_controller.rb +13 -1
  79. data/app/controllers/spree/api/v3/admin/orders/claims_controller.rb +39 -1
  80. data/app/controllers/spree/api/v3/admin/orders/deliveries_controller.rb +19 -1
  81. data/app/controllers/spree/api/v3/admin/orders/discount_codes_controller.rb +5 -1
  82. data/app/controllers/spree/api/v3/admin/orders/discounts_controller.rb +29 -5
  83. data/app/controllers/spree/api/v3/admin/orders/exchanges_controller.rb +36 -1
  84. data/app/controllers/spree/api/v3/admin/orders/fees_controller.rb +22 -1
  85. data/app/controllers/spree/api/v3/admin/orders/fulfillments_controller.rb +66 -7
  86. data/app/controllers/spree/api/v3/admin/orders/gift_cards_controller.rb +6 -2
  87. data/app/controllers/spree/api/v3/admin/orders/items_controller.rb +11 -1
  88. data/app/controllers/spree/api/v3/admin/orders/labels_controller.rb +35 -2
  89. data/app/controllers/spree/api/v3/admin/orders/payments_controller.rb +16 -5
  90. data/app/controllers/spree/api/v3/admin/orders/refunds_controller.rb +6 -0
  91. data/app/controllers/spree/api/v3/admin/orders/returns_controller.rb +37 -1
  92. data/app/controllers/spree/api/v3/admin/orders/store_credits_controller.rb +6 -3
  93. data/app/controllers/spree/api/v3/admin/orders_controller.rb +74 -60
  94. data/app/controllers/spree/api/v3/admin/package_types_controller.rb +30 -5
  95. data/app/controllers/spree/api/v3/admin/password_resets_controller.rb +17 -0
  96. data/app/controllers/spree/api/v3/admin/payment_methods_controller.rb +38 -22
  97. data/app/controllers/spree/api/v3/admin/policies_controller.rb +8 -4
  98. data/app/controllers/spree/api/v3/admin/price_lists_controller.rb +27 -15
  99. data/app/controllers/spree/api/v3/admin/prices_controller.rb +51 -4
  100. data/app/controllers/spree/api/v3/admin/product_types_controller.rb +25 -8
  101. data/app/controllers/spree/api/v3/admin/products/digital_assets_controller.rb +27 -10
  102. data/app/controllers/spree/api/v3/admin/products/variants_controller.rb +9 -14
  103. data/app/controllers/spree/api/v3/admin/products_controller.rb +121 -70
  104. data/app/controllers/spree/api/v3/admin/promotion_actions_controller.rb +11 -2
  105. data/app/controllers/spree/api/v3/admin/promotion_rules_controller.rb +10 -1
  106. data/app/controllers/spree/api/v3/admin/promotions_controller.rb +50 -14
  107. data/app/controllers/spree/api/v3/admin/purchase_orders_controller.rb +54 -7
  108. data/app/controllers/spree/api/v3/admin/refund_reasons_controller.rb +5 -1
  109. data/app/controllers/spree/api/v3/admin/reporting/saved_reports_controller.rb +9 -1
  110. data/app/controllers/spree/api/v3/admin/reporting_controller.rb +34 -0
  111. data/app/controllers/spree/api/v3/admin/resource_controller.rb +1 -0
  112. data/app/controllers/spree/api/v3/admin/return_reasons_controller.rb +5 -1
  113. data/app/controllers/spree/api/v3/admin/roles_controller.rb +13 -1
  114. data/app/controllers/spree/api/v3/admin/seller_payouts_controller.rb +6 -0
  115. data/app/controllers/spree/api/v3/admin/seller_requirement_submissions_controller.rb +15 -0
  116. data/app/controllers/spree/api/v3/admin/seller_requirements_controller.rb +32 -6
  117. data/app/controllers/spree/api/v3/admin/sellers_controller.rb +75 -22
  118. data/app/controllers/spree/api/v3/admin/setup_controller.rb +54 -15
  119. data/app/controllers/spree/api/v3/admin/stock_levels_controller.rb +38 -9
  120. data/app/controllers/spree/api/v3/admin/stock_locations_controller.rb +41 -9
  121. data/app/controllers/spree/api/v3/admin/stock_transfers_controller.rb +48 -7
  122. data/app/controllers/spree/api/v3/admin/store_controller.rb +122 -53
  123. data/app/controllers/spree/api/v3/admin/store_credits_controller.rb +1 -7
  124. data/app/controllers/spree/api/v3/admin/suppliers_controller.rb +16 -6
  125. data/app/controllers/spree/api/v3/admin/tax_categories_controller.rb +7 -4
  126. data/app/controllers/spree/api/v3/admin/tax_rates_controller.rb +21 -3
  127. data/app/controllers/spree/api/v3/admin/tracking_carriers_controller.rb +4 -0
  128. data/app/controllers/spree/api/v3/admin/translations/batches_controller.rb +17 -9
  129. data/app/controllers/spree/api/v3/admin/translations_controller.rb +4 -0
  130. data/app/controllers/spree/api/v3/admin/translations_coverage_controller.rb +5 -0
  131. data/app/controllers/spree/api/v3/admin/updates_controller.rb +39 -0
  132. data/app/controllers/spree/api/v3/admin/webhook_endpoints_controller.rb +23 -1
  133. data/app/controllers/spree/api/v3/base_controller.rb +2 -0
  134. data/app/controllers/spree/api/v3/resource_controller.rb +63 -10
  135. data/app/controllers/spree/api/v3/seller/auth_controller.rb +8 -0
  136. data/app/controllers/spree/api/v3/seller/base_controller.rb +1 -0
  137. data/app/controllers/spree/api/v3/seller/countries_controller.rb +2 -2
  138. data/app/controllers/spree/api/v3/seller/delivery_methods_controller.rb +49 -60
  139. data/app/controllers/spree/api/v3/seller/exports_controller.rb +18 -1
  140. data/app/controllers/spree/api/v3/seller/files_controller.rb +27 -0
  141. data/app/controllers/spree/api/v3/seller/imports_controller.rb +25 -9
  142. data/app/controllers/spree/api/v3/seller/invitation_acceptances_controller.rb +9 -1
  143. data/app/controllers/spree/api/v3/seller/me_controller.rb +14 -3
  144. data/app/controllers/spree/api/v3/seller/onboarding_controller.rb +11 -0
  145. data/app/controllers/spree/api/v3/seller/orders/claims_controller.rb +35 -0
  146. data/app/controllers/spree/api/v3/seller/orders/deliveries_controller.rb +12 -0
  147. data/app/controllers/spree/api/v3/seller/orders/exchanges_controller.rb +33 -0
  148. data/app/controllers/spree/api/v3/seller/orders/fulfillments_controller.rb +28 -2
  149. data/app/controllers/spree/api/v3/seller/orders/labels_controller.rb +22 -1
  150. data/app/controllers/spree/api/v3/seller/orders/notes_controller.rb +8 -1
  151. data/app/controllers/spree/api/v3/seller/orders/returns_controller.rb +32 -0
  152. data/app/controllers/spree/api/v3/seller/orders_controller.rb +35 -14
  153. data/app/controllers/spree/api/v3/seller/package_types_controller.rb +21 -9
  154. data/app/controllers/spree/api/v3/seller/password_resets_controller.rb +10 -0
  155. data/app/controllers/spree/api/v3/seller/policies_controller.rb +12 -4
  156. data/app/controllers/spree/api/v3/seller/products_controller.rb +114 -28
  157. data/app/controllers/spree/api/v3/seller/profile_controller.rb +33 -10
  158. data/app/controllers/spree/api/v3/seller/requirement_submissions_controller.rb +12 -5
  159. data/app/controllers/spree/api/v3/seller/resource_controller.rb +12 -0
  160. data/app/controllers/spree/api/v3/seller/stock_locations_controller.rb +44 -13
  161. data/app/controllers/spree/api/v3/seller/tax_identifiers_controller.rb +10 -1
  162. data/app/controllers/spree/api/v3/seller/team_controller.rb +4 -0
  163. data/app/controllers/spree/api/v3/store/auth_controller.rb +10 -0
  164. data/app/controllers/spree/api/v3/store/carts/discount_codes_controller.rb +8 -1
  165. data/app/controllers/spree/api/v3/store/carts/fulfillments_controller.rb +10 -2
  166. data/app/controllers/spree/api/v3/store/carts/gift_cards_controller.rb +8 -1
  167. data/app/controllers/spree/api/v3/store/carts/items_controller.rb +17 -5
  168. data/app/controllers/spree/api/v3/store/carts/payment_sessions_controller.rb +20 -6
  169. data/app/controllers/spree/api/v3/store/carts/payments_controller.rb +11 -0
  170. data/app/controllers/spree/api/v3/store/carts/po_documents_controller.rb +24 -26
  171. data/app/controllers/spree/api/v3/store/carts/store_credits_controller.rb +19 -1
  172. data/app/controllers/spree/api/v3/store/carts/tax_identifiers_controller.rb +5 -1
  173. data/app/controllers/spree/api/v3/store/carts_controller.rb +54 -47
  174. data/app/controllers/spree/api/v3/store/companies/addresses_controller.rb +12 -4
  175. data/app/controllers/spree/api/v3/store/companies/members_controller.rb +4 -0
  176. data/app/controllers/spree/api/v3/store/companies_controller.rb +5 -1
  177. data/app/controllers/spree/api/v3/store/company_invitations_controller.rb +9 -1
  178. data/app/controllers/spree/api/v3/store/customer/addresses_controller.rb +8 -7
  179. data/app/controllers/spree/api/v3/store/customer/data_requests_controller.rb +5 -0
  180. data/app/controllers/spree/api/v3/store/customer/password_resets_controller.rb +17 -0
  181. data/app/controllers/spree/api/v3/store/customer/payment_setup_sessions_controller.rb +10 -5
  182. data/app/controllers/spree/api/v3/store/customer/tax_identifiers_controller.rb +5 -1
  183. data/app/controllers/spree/api/v3/store/customers_controller.rb +28 -2
  184. data/app/controllers/spree/api/v3/store/newsletter_subscribers_controller.rb +22 -0
  185. data/app/controllers/spree/api/v3/store/orders/claims_controller.rb +11 -2
  186. data/app/controllers/spree/api/v3/store/orders/returns_controller.rb +10 -1
  187. data/app/controllers/spree/api/v3/store/orders_controller.rb +47 -10
  188. data/app/controllers/spree/api/v3/store/products_controller.rb +8 -0
  189. data/app/controllers/spree/api/v3/store/wishlist_items_controller.rb +10 -4
  190. data/app/controllers/spree/api/v3/store/wishlists_controller.rb +12 -4
  191. data/app/request_schemas/spree/api/v3/address_request_schema.rb +27 -0
  192. data/app/request_schemas/spree/api/v3/admin/address_request_schema.rb +13 -0
  193. data/app/request_schemas/spree/api/v3/admin/bulk_tags_request_schema.rb +17 -0
  194. data/app/request_schemas/spree/api/v3/admin/catalog_order_minimum_request_schema.rb +17 -0
  195. data/app/request_schemas/spree/api/v3/admin/email_template_language_request_schema.rb +17 -0
  196. data/app/request_schemas/spree/api/v3/admin/email_template_preview_request_schema.rb +32 -0
  197. data/app/request_schemas/spree/api/v3/admin/price_adjustment_tier_request_schema.rb +21 -0
  198. data/app/request_schemas/spree/api/v3/admin/price_list_price_request_schema.rb +21 -0
  199. data/app/request_schemas/spree/api/v3/admin/price_list_rule_request_schema.rb +19 -0
  200. data/app/request_schemas/spree/api/v3/admin/product_membership_reposition_request_schema.rb +17 -0
  201. data/app/request_schemas/spree/api/v3/admin/promotion_action_calculator_request_schema.rb +18 -0
  202. data/app/request_schemas/spree/api/v3/admin/promotion_action_line_item_request_schema.rb +15 -0
  203. data/app/request_schemas/spree/api/v3/admin/promotion_action_request_schema.rb +19 -0
  204. data/app/request_schemas/spree/api/v3/admin/promotion_rule_request_schema.rb +22 -0
  205. data/app/request_schemas/spree/api/v3/admin/reason_request_schema.rb +14 -0
  206. data/app/request_schemas/spree/api/v3/admin/tax_identifier_request_schema.rb +15 -0
  207. data/app/request_schemas/spree/api/v3/custom_field_value_request_schema.rb +15 -0
  208. data/app/request_schemas/spree/api/v3/file_upload_request_schema.rb +20 -0
  209. data/app/request_schemas/spree/api/v3/media_request_schema.rb +27 -0
  210. data/app/request_schemas/spree/api/v3/price_request_schema.rb +17 -0
  211. data/app/request_schemas/spree/api/v3/stock_level_request_schema.rb +18 -0
  212. data/app/request_schemas/spree/api/v3/store/address_request_schema.rb +31 -0
  213. data/app/request_schemas/spree/api/v3/tax_identifier_request_schema.rb +18 -0
  214. data/app/request_schemas/spree/api/v3/variant_option_request_schema.rb +13 -0
  215. data/app/request_schemas/spree/api/v3/variant_request_schema.rb +52 -0
  216. data/app/serializers/concerns/spree/api/v3/purchase_summary.rb +48 -0
  217. data/app/serializers/spree/api/v3/address_serializer.rb +4 -2
  218. data/app/serializers/spree/api/v3/admin/address_serializer.rb +3 -0
  219. data/app/serializers/spree/api/v3/admin/applied_promotion_serializer.rb +3 -1
  220. data/app/serializers/spree/api/v3/admin/cart_serializer.rb +3 -1
  221. data/app/serializers/spree/api/v3/admin/catalog_order_minimum_serializer.rb +3 -2
  222. data/app/serializers/spree/api/v3/admin/catalog_price_serializer.rb +3 -4
  223. data/app/serializers/spree/api/v3/admin/catalog_price_tier_serializer.rb +4 -3
  224. data/app/serializers/spree/api/v3/admin/channel_serializer.rb +5 -7
  225. data/app/serializers/spree/api/v3/admin/claim_line_item_serializer.rb +7 -0
  226. data/app/serializers/spree/api/v3/admin/claim_serializer.rb +5 -0
  227. data/app/serializers/spree/api/v3/admin/commission_line_serializer.rb +7 -18
  228. data/app/serializers/spree/api/v3/admin/commission_rate_serializer.rb +7 -11
  229. data/app/serializers/spree/api/v3/admin/commission_rule_serializer.rb +0 -2
  230. data/app/serializers/spree/api/v3/admin/country_serializer.rb +4 -0
  231. data/app/serializers/spree/api/v3/admin/customer_serializer.rb +3 -7
  232. data/app/serializers/spree/api/v3/admin/delivery_method_rule_serializer.rb +0 -2
  233. data/app/serializers/spree/api/v3/admin/delivery_method_serializer.rb +14 -10
  234. data/app/serializers/spree/api/v3/admin/delivery_method_service_serializer.rb +9 -1
  235. data/app/serializers/spree/api/v3/admin/delivery_rate_serializer.rb +8 -0
  236. data/app/serializers/spree/api/v3/admin/discount_serializer.rb +3 -1
  237. data/app/serializers/spree/api/v3/admin/exchange_line_item_serializer.rb +5 -0
  238. data/app/serializers/spree/api/v3/admin/exchange_serializer.rb +5 -0
  239. data/app/serializers/spree/api/v3/admin/fee_serializer.rb +3 -1
  240. data/app/serializers/spree/api/v3/admin/file_upload_serializer.rb +11 -0
  241. data/app/serializers/spree/api/v3/admin/file_upload_target_serializer.rb +10 -0
  242. data/app/serializers/spree/api/v3/admin/fulfillment_serializer.rb +13 -11
  243. data/app/serializers/spree/api/v3/admin/gift_card_serializer.rb +3 -3
  244. data/app/serializers/spree/api/v3/admin/import_serializer.rb +2 -2
  245. data/app/serializers/spree/api/v3/admin/integration_serializer.rb +1 -3
  246. data/app/serializers/spree/api/v3/admin/line_item_serializer.rb +12 -12
  247. data/app/serializers/spree/api/v3/admin/locale_serializer.rb +13 -0
  248. data/app/serializers/spree/api/v3/admin/market_serializer.rb +3 -0
  249. data/app/serializers/spree/api/v3/admin/media_serializer.rb +3 -2
  250. data/app/serializers/spree/api/v3/admin/order_group_serializer.rb +2 -0
  251. data/app/serializers/spree/api/v3/admin/order_routing_rule_serializer.rb +1 -3
  252. data/app/serializers/spree/api/v3/admin/order_serializer.rb +33 -33
  253. data/app/serializers/spree/api/v3/admin/payment_method_serializer.rb +1 -4
  254. data/app/serializers/spree/api/v3/admin/payment_serializer.rb +6 -3
  255. data/app/serializers/spree/api/v3/admin/payment_split_serializer.rb +8 -9
  256. data/app/serializers/spree/api/v3/admin/price_adjustment_tier_serializer.rb +3 -6
  257. data/app/serializers/spree/api/v3/admin/price_history_serializer.rb +6 -2
  258. data/app/serializers/spree/api/v3/admin/price_list_serializer.rb +1 -5
  259. data/app/serializers/spree/api/v3/admin/price_rule_serializer.rb +1 -3
  260. data/app/serializers/spree/api/v3/admin/price_serializer.rb +4 -0
  261. data/app/serializers/spree/api/v3/admin/product_serializer.rb +2 -0
  262. data/app/serializers/spree/api/v3/admin/promotion_action_serializer.rb +4 -6
  263. data/app/serializers/spree/api/v3/admin/promotion_rule_serializer.rb +0 -2
  264. data/app/serializers/spree/api/v3/admin/purchase_order_item_serializer.rb +5 -11
  265. data/app/serializers/spree/api/v3/admin/purchase_order_serializer.rb +4 -4
  266. data/app/serializers/spree/api/v3/admin/refund_serializer.rb +7 -3
  267. data/app/serializers/spree/api/v3/admin/reporting_result_serializer.rb +9 -2
  268. data/app/serializers/spree/api/v3/admin/return_line_item_serializer.rb +8 -0
  269. data/app/serializers/spree/api/v3/admin/return_serializer.rb +8 -4
  270. data/app/serializers/spree/api/v3/admin/seller_balance_serializer.rb +15 -10
  271. data/app/serializers/spree/api/v3/admin/seller_payout_serializer.rb +3 -5
  272. data/app/serializers/spree/api/v3/admin/seller_serializer.rb +3 -1
  273. data/app/serializers/spree/api/v3/admin/seller_transfer_serializer.rb +7 -8
  274. data/app/serializers/spree/api/v3/admin/shipping_label_serializer.rb +4 -4
  275. data/app/serializers/spree/api/v3/admin/stock_location_serializer.rb +3 -0
  276. data/app/serializers/spree/api/v3/admin/stock_movement_serializer.rb +2 -6
  277. data/app/serializers/spree/api/v3/admin/store_credit_event_serializer.rb +5 -0
  278. data/app/serializers/spree/api/v3/admin/store_credit_serializer.rb +9 -4
  279. data/app/serializers/spree/api/v3/admin/store_serializer.rb +17 -98
  280. data/app/serializers/spree/api/v3/admin/supplier_serializer.rb +1 -1
  281. data/app/serializers/spree/api/v3/admin/tax_exemption_certificate_serializer.rb +3 -1
  282. data/app/serializers/spree/api/v3/admin/tax_line_serializer.rb +4 -2
  283. data/app/serializers/spree/api/v3/admin/tax_rate_serializer.rb +2 -12
  284. data/app/serializers/spree/api/v3/admin/update_status_serializer.rb +28 -0
  285. data/app/serializers/spree/api/v3/admin/variant_serializer.rb +7 -3
  286. data/app/serializers/spree/api/v3/base_serializer.rb +112 -7
  287. data/app/serializers/spree/api/v3/cart_serializer.rb +16 -30
  288. data/app/serializers/spree/api/v3/claim_line_item_serializer.rb +5 -13
  289. data/app/serializers/spree/api/v3/claim_serializer.rb +2 -3
  290. data/app/serializers/spree/api/v3/country_serializer.rb +2 -1
  291. data/app/serializers/spree/api/v3/currency_serializer.rb +9 -1
  292. data/app/serializers/spree/api/v3/customer_serializer.rb +3 -2
  293. data/app/serializers/spree/api/v3/delivery_rate_serializer.rb +8 -12
  294. data/app/serializers/spree/api/v3/delivery_zone_member_serializer.rb +1 -1
  295. data/app/serializers/spree/api/v3/discount_serializer.rb +4 -1
  296. data/app/serializers/spree/api/v3/exchange_line_item_serializer.rb +2 -8
  297. data/app/serializers/spree/api/v3/exchange_serializer.rb +2 -3
  298. data/app/serializers/spree/api/v3/file_upload_serializer.rb +28 -0
  299. data/app/serializers/spree/api/v3/file_upload_target_serializer.rb +17 -0
  300. data/app/serializers/spree/api/v3/gift_card_batch_serializer.rb +2 -4
  301. data/app/serializers/spree/api/v3/gift_card_serializer.rb +4 -2
  302. data/app/serializers/spree/api/v3/import_serializer.rb +0 -12
  303. data/app/serializers/spree/api/v3/line_item_serializer.rb +15 -5
  304. data/app/serializers/spree/api/v3/locale_serializer.rb +3 -1
  305. data/app/serializers/spree/api/v3/market_serializer.rb +5 -5
  306. data/app/serializers/spree/api/v3/media_serializer.rb +7 -2
  307. data/app/serializers/spree/api/v3/order_group_serializer.rb +12 -4
  308. data/app/serializers/spree/api/v3/order_serializer.rb +5 -23
  309. data/app/serializers/spree/api/v3/payment_session_serializer.rb +2 -4
  310. data/app/serializers/spree/api/v3/price_history_serializer.rb +11 -6
  311. data/app/serializers/spree/api/v3/price_serializer.rb +17 -10
  312. data/app/serializers/spree/api/v3/product_filter_price_range_serializer.rb +10 -4
  313. data/app/serializers/spree/api/v3/product_serializer.rb +3 -3
  314. data/app/serializers/spree/api/v3/refund_serializer.rb +8 -5
  315. data/app/serializers/spree/api/v3/return_line_item_serializer.rb +3 -11
  316. data/app/serializers/spree/api/v3/return_serializer.rb +3 -6
  317. data/app/serializers/spree/api/v3/seller/address_serializer.rb +12 -0
  318. data/app/serializers/spree/api/v3/seller/balance_serializer.rb +15 -10
  319. data/app/serializers/spree/api/v3/seller/claim_line_item_serializer.rb +7 -0
  320. data/app/serializers/spree/api/v3/seller/claim_serializer.rb +5 -0
  321. data/app/serializers/spree/api/v3/seller/country_serializer.rb +19 -0
  322. data/app/serializers/spree/api/v3/seller/delivery_method_rule_serializer.rb +1 -3
  323. data/app/serializers/spree/api/v3/seller/delivery_method_serializer.rb +4 -8
  324. data/app/serializers/spree/api/v3/seller/delivery_rate_serializer.rb +9 -8
  325. data/app/serializers/spree/api/v3/seller/exchange_line_item_serializer.rb +5 -0
  326. data/app/serializers/spree/api/v3/seller/exchange_serializer.rb +5 -0
  327. data/app/serializers/spree/api/v3/seller/file_upload_serializer.rb +11 -0
  328. data/app/serializers/spree/api/v3/seller/file_upload_target_serializer.rb +10 -0
  329. data/app/serializers/spree/api/v3/seller/import_serializer.rb +2 -2
  330. data/app/serializers/spree/api/v3/seller/media_serializer.rb +2 -5
  331. data/app/serializers/spree/api/v3/seller/order_line_item_serializer.rb +4 -3
  332. data/app/serializers/spree/api/v3/seller/order_serializer.rb +16 -16
  333. data/app/serializers/spree/api/v3/seller/payment_split_serializer.rb +8 -9
  334. data/app/serializers/spree/api/v3/seller/payout_serializer.rb +2 -4
  335. data/app/serializers/spree/api/v3/seller/price_history_serializer.rb +12 -0
  336. data/app/serializers/spree/api/v3/seller/price_serializer.rb +13 -0
  337. data/app/serializers/spree/api/v3/seller/product_serializer.rb +2 -0
  338. data/app/serializers/spree/api/v3/seller/profile_serializer.rb +7 -7
  339. data/app/serializers/spree/api/v3/seller/return_line_item_serializer.rb +8 -0
  340. data/app/serializers/spree/api/v3/seller/return_serializer.rb +8 -5
  341. data/app/serializers/spree/api/v3/seller/state_serializer.rb +10 -0
  342. data/app/serializers/spree/api/v3/seller/stock_location_serializer.rb +3 -0
  343. data/app/serializers/spree/api/v3/seller/transfer_serializer.rb +6 -7
  344. data/app/serializers/spree/api/v3/seller/variant_serializer.rb +8 -4
  345. data/app/serializers/spree/api/v3/stock_location_serializer.rb +8 -1
  346. data/app/serializers/spree/api/v3/store_credit_event_serializer.rb +1 -3
  347. data/app/serializers/spree/api/v3/store_credit_serializer.rb +3 -5
  348. data/app/serializers/spree/api/v3/tax_line_serializer.rb +2 -4
  349. data/app/serializers/spree/api/v3/variant_serializer.rb +3 -3
  350. data/app/services/spree/api/v3/filter_predicates.rb +29 -0
  351. data/app/services/spree/api/v3/filter_table.rb +337 -0
  352. data/app/services/spree/api/v3/filters_aggregator.rb +2 -2
  353. data/app/services/spree/api/v3/request_schema.rb +430 -0
  354. data/app/services/spree/webhooks/deliver_webhook.rb +7 -3
  355. data/config/initializers/typelizer.rb +1 -1
  356. data/config/routes.rb +5 -3
  357. data/lib/spree/api/configuration.rb +5 -0
  358. data/lib/spree/api/dependencies.rb +7 -6
  359. data/lib/spree/api/middleware/request_size_limit.rb +24 -3
  360. data/lib/spree/api/openapi/filter_documentation.rb +136 -0
  361. data/lib/spree/api/openapi/schema_helper.rb +126 -80
  362. data/lib/spree/api/preference_families.rb +46 -0
  363. data/lib/spree/api/preference_types.rb +138 -0
  364. data/lib/spree/api/typelizer_generation.rb +4 -0
  365. data/lib/tasks/filters.rake +12 -0
  366. data/lib/typelizer/open_enums.rb +10 -0
  367. metadata +60 -10
  368. data/app/controllers/concerns/spree/api/v3/address_params.rb +0 -17
  369. data/app/controllers/concerns/spree/api/v3/direct_uploads.rb +0 -35
  370. data/app/controllers/spree/api/v3/admin/direct_uploads_controller.rb +0 -54
  371. data/app/controllers/spree/api/v3/seller/direct_uploads_controller.rb +0 -21
@@ -12,8 +12,65 @@ module Spree
12
12
  # seller audience, because a seller must never see, let alone set, what
13
13
  # anyone is charged.
14
14
  class CommissionRatesController < ResourceController
15
+ # `value` is a percentage, a name too general to be in StrictMoneyParams' list.
16
+ before_action -> { decimal_param(:value) }, only: %i[create update]
15
17
  scoped_resource :commissions
16
18
 
19
+ request_params :commission_rate do |body|
20
+ body.attribute :name, :string, required: true, on: :create, example: 'Audio sellers'
21
+ body.attribute :code, :string,
22
+ nullable: true,
23
+ example: 'audio',
24
+ description: 'Your own identifier for this rate; unique per store.'
25
+ body.attribute :enabled, :boolean
26
+ body.attribute :position, :integer,
27
+ example: 1,
28
+ description: 'Place in the list. Rates resolve top-down and the first whose rules match wins, so 1 is tried first. New rates are created at the top; send this to move one. A rate with no rules matches every sale, so the marketplace default belongs at the bottom.'
29
+ body.attribute :kind, :string,
30
+ required: true, on: :create,
31
+ choices: Spree::CommissionRate::KINDS,
32
+ example: 'percentage',
33
+ description: '`percentage` charges a share of the sale; `fixed` charges a flat fee.'
34
+ body.attribute :value, :decimal,
35
+ required: true, on: :create,
36
+ example: '12.5',
37
+ description: 'A percentage (10 = 10%) or a flat amount, per `kind`.'
38
+ body.attribute :tax_inclusive, :boolean,
39
+ description: "Charge on the price including the customer's VAT. Left off, commission is charged on the seller's net revenue, which is the usual basis where the fee is taxed as its own supply."
40
+ body.attribute :include_shipping, :boolean,
41
+ description: "Also charge commission on the seller's delivery revenue. Percentage rates only."
42
+ body.attribute :commission_tax_rate, :decimal,
43
+ nullable: true,
44
+ example: '0.21',
45
+ description: "VAT on the commission itself, as a fraction rather than a percentage. Null lets the store's tax engine answer for the seller's jurisdiction."
46
+ body.attribute :metadata, :hash
47
+ body.attribute :amounts, :hash,
48
+ example: { USD: '2.50', EUR: '2.00' },
49
+ description: 'What a flat fee charges, keyed by currency, as decimal strings. A sale in a currency with no amount falls to the next matching rate. Replaces the whole set.'
50
+ body.attribute :bounds, :hash,
51
+ example: { USD: { min_amount: '1.00', max_amount: '50.00' } },
52
+ description: 'The floor and cap a percentage charges within, keyed by currency: `{ min_amount, max_amount }` decimal strings. A sale in a currency with no bounds is charged unbounded. Replaces the whole set.'
53
+ # Permitted in `permitted_params`, with the keys each registered
54
+ # rule kind adds.
55
+ body.attribute :rules, :array,
56
+ permit: false,
57
+ as: 'CommissionRuleDraftParams',
58
+ description: 'The full targeting; what you send replaces what the rate holds.' do |rule|
59
+ rule.attribute :id, :id,
60
+ nullable: true,
61
+ description: 'Present for an existing rule; omit to create one.'
62
+ rule.attribute :type, :string,
63
+ required: true,
64
+ example: 'seller_rule',
65
+ description: 'A kind from `GET /commission_rates/rule_types`.'
66
+ rule.attribute :preferences, :hash,
67
+ example: { seller_ids: ['sel_a1b2c3'] },
68
+ description: "Configuration for the kind, per its type's `schema`."
69
+ rule.attribute :product_ids, :array, of: :id,
70
+ description: 'For kinds that name products, which are kept outside preferences.'
71
+ end
72
+ end
73
+
17
74
  # GET /api/v3/admin/commission_rates/rule_types
18
75
  #
19
76
  # Every registered rule kind with its configuration schema, so a
@@ -27,7 +84,7 @@ module Spree
27
84
  type: klass.api_type,
28
85
  name: klass.human_name,
29
86
  description: klass.human_description,
30
- preference_schema: klass.serialized_preference_schema,
87
+ schema: klass.preference_json_schema,
31
88
  # Config a rule takes beyond its preferences — a catalog-scale
32
89
  # reference list lives in its own table, not the blob, and an
33
90
  # editor has to know to render a picker for it.
@@ -81,17 +138,8 @@ module Spree
81
138
 
82
139
  def permitted_params
83
140
  attributes = normalize_params(
84
- params.permit(
85
- :name, :code, :enabled, :position, :kind, :value,
86
- :tax_inclusive, :include_shipping, :commission_tax_rate,
87
- metadata: {},
88
- amounts: {},
89
- # Nested one level deeper than +amounts+ — currency => floor and
90
- # cap — so the whole subtree is permitted rather than its keys,
91
- # which are currency codes and not knowable here.
92
- bounds: {},
93
- rules: [:id, :type, { preferences: {} }, *rule_association_attributes]
94
- )
141
+ params.permit(*declared_permitted_attributes,
142
+ rules: [:id, :type, { preferences: {} }, *rule_association_attributes])
95
143
  )
96
144
 
97
145
  attributes[:rules] = resolved_rule_rows(attributes[:rules]) if attributes.key?(:rules)
@@ -8,6 +8,17 @@ module Spree
8
8
  class AddressesController < BaseController
9
9
  include Spree::Api::V3::CompanyAddressWrites
10
10
 
11
+ request_params :company_address do |body|
12
+ body.include_attributes Spree::Api::V3::AddressRequestSchema
13
+ body.require_attributes :first_name, :last_name, :address1, :city, :country_code, on: :create
14
+ body.attribute :default_billing, :boolean,
15
+ permit: false,
16
+ description: 'True makes this the default address of that kind, false gives the slot up, and leaving it out keeps the current default.'
17
+ body.attribute :default_shipping, :boolean,
18
+ permit: false,
19
+ description: 'True makes this the default address of that kind, false gives the slot up, and leaving it out keeps the current default.'
20
+ end
21
+
11
22
  before_action :authorize_parent_access!
12
23
 
13
24
  # POST /api/v3/admin/companies/:company_id/addresses
@@ -13,6 +13,14 @@ module Spree
13
13
  # who buys for a node — and memberships carry customer emails.
14
14
  before_action :authorize_parent_access!
15
15
 
16
+ request_params :company_membership do |body|
17
+ body.attribute :customer_email, :string,
18
+ required: true, on: :create,
19
+ example: 'buyer@example.com',
20
+ description: 'An existing customer becomes a member immediately; an unknown email becomes an invitation, and the response is an invitation instead of a membership.'
21
+ body.attribute :metadata, :hash
22
+ end
23
+
16
24
  # POST /api/v3/admin/companies/:company_id/memberships
17
25
  def create
18
26
  result = Spree.company_add_member_service.call(
@@ -52,7 +60,7 @@ module Spree
52
60
  end
53
61
 
54
62
  def permitted_params
55
- params.permit(:customer_email, metadata: {})
63
+ params.permit(*declared_permitted_attributes)
56
64
  end
57
65
  end
58
66
  end
@@ -9,14 +9,29 @@ module Spree
9
9
  class TaxExemptionCertificatesController < BaseController
10
10
  include ActiveStorage::SetCurrent
11
11
 
12
+ request_params :tax_exemption_certificate do |body|
13
+ body.attribute :certificate_number, :string, required: true, on: :create,
14
+ example: 'DE-RESALE-7'
15
+ body.attribute :reason_code, :string, required: true, on: :create,
16
+ example: 'resale',
17
+ description: "Becomes the tax provider's entity use code."
18
+ body.attribute :issuing_authority, :string, nullable: true, example: 'Finanzamt Berlin'
19
+ body.attribute :issued_at, :datetime, nullable: true
20
+ body.attribute :expires_at, :datetime, nullable: true
21
+ body.attribute :country_code, :country,
22
+ nullable: true,
23
+ description: 'Where the certificate holds. Omit it and `state_code` for one valid everywhere.'
24
+ body.attribute :state_code, :string, nullable: true
25
+ body.attribute :document_signed_id, :string,
26
+ description: "A `signed_id` from `files.upload()` with `visibility: 'private'`."
27
+ body.attribute :metadata, :hash
28
+ end
29
+
12
30
  before_action :authorize_parent_access!
13
31
  # Re-declaring the filter replaces the inherited options, so the
14
32
  # standard actions have to be listed alongside the custom ones.
15
33
  before_action :set_resource, only: [:show, :update, :destroy, :verify, :revoke, :download]
16
34
 
17
- # A tampered signed id would otherwise surface as a 500.
18
- rescue_from ActiveSupport::MessageVerifier::InvalidSignature, with: :render_invalid_signature
19
-
20
35
  # PATCH /api/v3/admin/companies/:company_id/tax_exemption_certificates/:id/verify
21
36
  def verify
22
37
  result = Spree.tax_exemption_certificate_verify_workflow.call(
@@ -88,12 +103,8 @@ module Spree
88
103
  [{ document_attachment: :blob }]
89
104
  end
90
105
 
91
- # `document` is an ActiveStorage signed blob id from
92
- # POST /api/v3/admin/direct_uploads.
93
106
  def permitted_params
94
- params.permit(:certificate_number, :reason_code, :issuing_authority,
95
- :issued_at, :expires_at, :country_code, :state_code, :document,
96
- metadata: {})
107
+ params.permit(*declared_permitted_attributes)
97
108
  end
98
109
 
99
110
  def build_resource
@@ -111,16 +122,6 @@ module Spree
111
122
 
112
123
  authorize!(mapped, resource)
113
124
  end
114
-
115
- private
116
-
117
- def render_invalid_signature
118
- render_error(
119
- code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:validation_error],
120
- message: 'Invalid document signed id',
121
- status: :unprocessable_content
122
- )
123
- end
124
125
  end
125
126
  end
126
127
  end
@@ -12,6 +12,11 @@ module Spree
12
12
  class TaxIdentifiersController < BaseController
13
13
  include Spree::Api::V3::TaxIdentifierValidation
14
14
 
15
+ request_params :tax_identifier do |body|
16
+ body.include_attributes Spree::Api::V3::Admin::TaxIdentifierRequestSchema
17
+ body.require_attributes :kind, :value, on: :create
18
+ end
19
+
15
20
  before_action :authorize_parent_access!
16
21
  # Re-declaring the filter replaces the inherited options, so the
17
22
  # standard actions have to be listed alongside the custom one.
@@ -32,7 +37,7 @@ module Spree
32
37
  end
33
38
 
34
39
  def permitted_params
35
- params.permit(:kind, :value)
40
+ params.permit(*declared_permitted_attributes)
36
41
  end
37
42
  end
38
43
  end
@@ -12,6 +12,22 @@ module Spree
12
12
  class CompaniesController < ResourceController
13
13
  scoped_resource :customers
14
14
 
15
+ request_params :company do |body|
16
+ body.external_references
17
+ body.attribute :name, :string, required: true, on: :create, example: 'Globex Corporation'
18
+ body.attribute :kind, :string,
19
+ choices: Spree::Company::KINDS,
20
+ example: 'company',
21
+ description: '`company` is a legal entity (may hold tax registrations), `division` an organizational unit. Roots must be `company`.'
22
+ body.attribute :parent_id, :id,
23
+ nullable: true,
24
+ example: 'comp_86Rf07xd4z',
25
+ description: 'The parent node. Omit or null for a root.'
26
+ body.attribute :po_number_required, :boolean,
27
+ description: "Whether this buyer's own procurement process demands a PO reference on every order: checkout asks for one and refuses to complete without it."
28
+ body.attribute :metadata, :hash
29
+ end
30
+
15
31
  protected
16
32
 
17
33
  def model_class
@@ -27,9 +43,7 @@ module Spree
27
43
  end
28
44
 
29
45
  def permitted_params
30
- permitted = params.permit(*model_additional_permitted_attributes,
31
- :name, :kind, :parent_id, :po_number_required, metadata: {})
32
- resolve_parent_param(permitted)
46
+ resolve_parent_param(params.permit(*permitted_attributes))
33
47
  end
34
48
 
35
49
  private
@@ -24,6 +24,10 @@ module Spree
24
24
 
25
25
  protected
26
26
 
27
+ def filterable?
28
+ false
29
+ end
30
+
27
31
  def model_class
28
32
  Spree::Country
29
33
  end
@@ -33,7 +37,7 @@ module Spree
33
37
  end
34
38
 
35
39
  def scope
36
- Spree::Country.all.sort_by(&:name)
40
+ Spree::Country.all.sort_by(&:iso)
37
41
  end
38
42
 
39
43
  def find_resource
@@ -10,6 +10,26 @@ module Spree
10
10
  class CustomFieldDefinitionsController < ResourceController
11
11
  scoped_resource :settings
12
12
 
13
+ request_params :custom_field_definition do |body|
14
+ body.attribute :namespace, :string, description: 'Defaults to `custom`.'
15
+ body.attribute :key, :string, required: true, on: :create
16
+ body.attribute :label, :string, description: 'Human-readable name; defaults to the titleized `key`.'
17
+ body.attribute :field_type, :string,
18
+ required: true, on: :create,
19
+ example: 'short_text',
20
+ description: 'Custom field type token (`short_text`, `long_text`, `rich_text`, `number`, …). An extension type that has no token is named by its registered class instead.'
21
+ body.attribute :resource_type, :string,
22
+ required: true, on: :create,
23
+ example: 'product',
24
+ description: 'Shorthand of the resource the field attaches to, from the resource types endpoint.'
25
+ body.attribute :storefront_visible, :boolean,
26
+ description: 'When false, the definition is admin-only and never exposed in the Store API.'
27
+ body.attribute :searchable, :boolean,
28
+ description: 'Include values in storefront product text search. Supported for `short_text`, `long_text` and `number` fields; other types are refused.'
29
+ body.attribute :sortable, :boolean,
30
+ description: 'Allow storefront product listings to sort by this field (`sort=cf_{namespace}_{key}`). Supported for `short_text` and `number` fields; other types are refused.'
31
+ end
32
+
13
33
  # GET /api/v3/admin/custom_field_definitions/resource_types
14
34
  #
15
35
  # What a definition can be attached to, from
@@ -34,17 +54,7 @@ module Spree
34
54
  end
35
55
 
36
56
  def permitted_params
37
- params.permit(*model_additional_permitted_attributes, :namespace, :key, :label, :field_type,
38
- :resource_type, :storefront_visible,
39
- :searchable, :sortable)
40
- end
41
-
42
- # `resource_type` is a plain column rather than a polymorphic
43
- # association, so its filter goes through the model's own normalizer.
44
- def api_type_resolver(attribute)
45
- return super unless attribute == 'resource_type'
46
-
47
- ->(api_type) { model_class.normalize_value_for(:resource_type, api_type) }
57
+ params.permit(*permitted_attributes)
48
58
  end
49
59
 
50
60
  # Pure registry discovery — maps to the read scope.
@@ -7,6 +7,16 @@ module Spree
7
7
  # class is inferred from whichever `<segment>_id` route param matches a
8
8
  # registered owner.
9
9
  class CustomFieldsController < ResourceController
10
+ # Only `value` is mutable. Switching the linked definition is a
11
+ # delete-and-create: the model rejects it (definition + resource
12
+ # uniqueness) and the type wouldn't match.
13
+ request_params :custom_field do |body|
14
+ body.attribute :custom_field_definition_id, :id, required: true, only: :create, example: 'cfdef_abc123'
15
+ body.attribute :value, :any,
16
+ required: true,
17
+ description: "A value matching the definition's `field_type`: a scalar for text, number and boolean fields; a list or a hash for JSON fields."
18
+ end
19
+
10
20
  # POST /api/v3/admin/<parent>/<parent_id>/custom_fields
11
21
  def create
12
22
  @resource = @parent.custom_fields.new(permitted_params)
@@ -20,9 +30,6 @@ module Spree
20
30
  end
21
31
 
22
32
  # PATCH /api/v3/admin/<parent>/<parent_id>/custom_fields/:id
23
- # Only `value` is mutable. Switching the linked definition is a
24
- # delete-and-create — the model rejects it (definition + resource
25
- # uniqueness) and the type wouldn't match.
26
33
  def update
27
34
  authorize_resource!(@resource)
28
35
 
@@ -82,11 +89,11 @@ module Spree
82
89
  # `custom_field_definition_id` is an alias_attribute on Spree::CustomField;
83
90
  # AR resolves the prefixed-ID and the alias to the canonical FK on assign.
84
91
  def permitted_params
85
- params.permit(*model_additional_permitted_attributes, :custom_field_definition_id, :value)
92
+ params.permit(*permitted_attributes)
86
93
  end
87
94
 
88
95
  def update_permitted_params
89
- params.permit(:value)
96
+ params.permit(*declared_permitted_attributes)
90
97
  end
91
98
 
92
99
  private
@@ -7,6 +7,14 @@ module Spree
7
7
  class CustomerGroupsController < ResourceController
8
8
  scoped_resource :customers
9
9
 
10
+ request_params :customer_group do |body|
11
+ body.attribute :name, :string, required: true, on: :create, example: 'Wholesale'
12
+ body.attribute :description, :string, nullable: true, example: 'B2B accounts'
13
+ body.attribute :customer_ids, :array, of: :id,
14
+ example: %w[cus_UkLWZg9DAJ],
15
+ description: "Replaces the group's members."
16
+ end
17
+
10
18
  protected
11
19
 
12
20
  def model_class
@@ -18,7 +26,7 @@ module Spree
18
26
  end
19
27
 
20
28
  def permitted_params
21
- params.permit(*model_additional_permitted_attributes, :name, :description, customer_ids: [])
29
+ params.permit(*permitted_attributes)
22
30
  end
23
31
  end
24
32
  end
@@ -4,6 +4,17 @@ module Spree
4
4
  module Admin
5
5
  module Customers
6
6
  class AddressesController < BaseController
7
+ request_params :customer_address do |body|
8
+ body.include_attributes Spree::Api::V3::Admin::AddressRequestSchema
9
+ body.require_attributes :first_name, :last_name, :address1, :city, :country_code, on: :create
10
+ body.attribute :quick_checkout, :boolean
11
+ body.attribute :is_default_billing, :boolean,
12
+ permit: false,
13
+ description: "Makes this the customer's default address of that kind."
14
+ body.attribute :is_default_shipping, :boolean,
15
+ permit: false,
16
+ description: "Makes this the customer's default address of that kind."
17
+ end
7
18
 
8
19
  # POST /api/v3/admin/customers/:customer_id/addresses
9
20
  def create
@@ -61,13 +72,7 @@ module Spree
61
72
  private
62
73
 
63
74
  def address_attrs
64
- params.permit(
65
- :firstname, :lastname, :first_name, :last_name,
66
- :address1, :address2, :city,
67
- :country_code, :state_code,
68
- :zipcode, :postal_code, :phone, :alternative_phone,
69
- :state_name, :company, :label, :quick_checkout
70
- )
75
+ params.permit(*declared_permitted_attributes)
71
76
  end
72
77
 
73
78
  def default_billing_flag
@@ -9,9 +9,15 @@ module Spree
9
9
  # broad customer access.
10
10
  scoped_resource :store_credits
11
11
 
12
+ request_params :customer_store_credit do |body|
13
+ body.attribute :amount, :decimal, required: true, on: :create, example: '50.00'
14
+ body.attribute :currency, :currency, required: true, on: :create, only: :create, example: 'USD'
15
+ body.attribute :memo, :string
16
+ end
17
+
12
18
  # POST /api/v3/admin/customers/:customer_id/store_credits
13
19
  def create
14
- @resource = @parent.store_credits.new(create_attrs)
20
+ @resource = @parent.store_credits.new(store_credit_attributes)
15
21
  @resource.created_by = try_spree_current_user
16
22
  @resource.store ||= current_store
17
23
  authorize_resource!(@resource, :create)
@@ -27,7 +33,7 @@ module Spree
27
33
  def update
28
34
  authorize_resource!(@resource)
29
35
 
30
- if @resource.amount_used.positive? && update_attrs.key?(:amount)
36
+ if @resource.amount_used.positive? && store_credit_attributes.key?(:amount)
31
37
  render_error(
32
38
  code: 'store_credit_in_use',
33
39
  message: 'Cannot change amount on a store credit that has already been used',
@@ -36,7 +42,7 @@ module Spree
36
42
  return
37
43
  end
38
44
 
39
- if @resource.update(update_attrs)
45
+ if @resource.update(store_credit_attributes)
40
46
  render json: serialize_resource(@resource.reload)
41
47
  else
42
48
  render_validation_error(@resource.errors)
@@ -78,12 +84,8 @@ module Spree
78
84
 
79
85
  private
80
86
 
81
- def create_attrs
82
- params.permit(:amount, :currency, :memo).to_h
83
- end
84
-
85
- def update_attrs
86
- params.permit(:memo, :amount).to_h
87
+ def store_credit_attributes
88
+ params.permit(*declared_permitted_attributes).to_h
87
89
  end
88
90
  end
89
91
  end
@@ -8,6 +8,11 @@ module Spree
8
8
 
9
9
  include Spree::Api::V3::TaxIdentifierValidation
10
10
 
11
+ request_params :tax_identifier do |body|
12
+ body.include_attributes Spree::Api::V3::Admin::TaxIdentifierRequestSchema
13
+ body.require_attributes :kind, :value, on: :create
14
+ end
15
+
11
16
  # Re-declaring the filter replaces the inherited options, so the
12
17
  # standard actions have to be listed alongside the custom one.
13
18
  before_action :set_resource, only: [:show, :update, :destroy, :validate]
@@ -33,7 +38,7 @@ module Spree
33
38
  end
34
39
 
35
40
  def permitted_params
36
- params.permit(:kind, :value)
41
+ params.permit(*declared_permitted_attributes)
37
42
  end
38
43
  end
39
44
  end
@@ -7,6 +7,40 @@ module Spree
7
7
 
8
8
  scoped_resource :customers
9
9
 
10
+ request_params :customer do |body|
11
+ body.attribute :email, :string, required: true, on: :create, example: 'new@example.com'
12
+ body.attribute :first_name, :string
13
+ body.attribute :last_name, :string
14
+ body.attribute :phone, :string
15
+ body.attribute :password, :string,
16
+ description: 'Optional: a customer created without one claims the account through a password reset.'
17
+ body.attribute :password_confirmation, :string,
18
+ description: 'Optional: a customer created without one claims the account through a password reset.'
19
+ body.attribute :selected_locale, :string
20
+ body.attribute :avatar_signed_id, :string, description: 'A `signed_id` from `files.upload()`.'
21
+ body.attribute :accepts_email_marketing, :boolean
22
+ body.attribute :internal_note, :string,
23
+ description: 'Rich text HTML. Reads come back as this plus `internal_note_html`.'
24
+ body.attribute :metadata, :hash
25
+ body.attribute :tags, :array, of: :string
26
+ body.attribute :customer_group_ids, :array, of: :id,
27
+ description: "Replaces the customer's group membership."
28
+ end
29
+
30
+ %i[bulk_add_to_groups bulk_remove_from_groups].each do |action|
31
+ request_params 'CustomerBulkGroupsParams', action: action do |body|
32
+ body.attribute :ids, :array, of: :id, required: true, example: %w[cus_UkLWZg9DAJ cus_QrLWXg9CAJ]
33
+ body.attribute :customer_group_ids, :array, of: :id,
34
+ required: true,
35
+ example: %w[cg_UkLWZg9DAJ],
36
+ description: 'Groups from other stores are ignored.'
37
+ end
38
+ end
39
+
40
+ %i[bulk_add_tags bulk_remove_tags].each do |action|
41
+ request_params('BulkTagsParams', action: action) { |body| body.include_attributes Spree::Api::V3::Admin::BulkTagsRequestSchema }
42
+ end
43
+
10
44
  # Re-declaring a `before_action` for the same method REPLACES the
11
45
  # inherited registration rather than adding to it, so the inherited
12
46
  # actions have to be repeated here or show/update/destroy silently
@@ -258,13 +292,7 @@ module Spree
258
292
  end
259
293
 
260
294
  def permitted_params
261
- params.permit(
262
- *model_additional_permitted_attributes,
263
- :email, :first_name, :last_name, :phone,
264
- :password, :password_confirmation, :selected_locale,
265
- :avatar, :accepts_email_marketing, :internal_note,
266
- metadata: {}, tags: [], customer_group_ids: []
267
- )
295
+ params.permit(*permitted_attributes)
268
296
  end
269
297
 
270
298
  # Authorises bulk group mutation, decodes prefixed IDs, then dispatches
@@ -11,6 +11,14 @@ module Spree
11
11
  class DataRequestsController < ResourceController
12
12
  scoped_resource :customers
13
13
 
14
+ request_params 'DataRequestCreateParams', action: :create do |body|
15
+ body.attribute :customer_id, :id, required: true
16
+ body.attribute :kind, :string,
17
+ required: true,
18
+ choices: Spree::DataRequest::KINDS,
19
+ description: "`access` asks for a copy of the customer's personal data; `erasure` asks for it to be erased."
20
+ end
21
+
14
22
  def create
15
23
  authorize! :create, Spree::DataRequest
16
24
 
@@ -15,7 +15,7 @@ module Spree
15
15
  type: klass.api_type,
16
16
  name: klass.human_name,
17
17
  description: klass.human_description,
18
- preference_schema: klass.serialized_preference_schema,
18
+ schema: klass.preference_json_schema,
19
19
  # Association-backed config (e.g. `product_ids`) a rule accepts
20
20
  # beyond its preferences, so admin UIs can render the right
21
21
  # editor without hardcoding rule types.
@@ -8,6 +8,18 @@ module Spree
8
8
  class RulesController < ResourceController
9
9
  scoped_resource :delivery_methods
10
10
 
11
+ request_params :delivery_method_rule do |body|
12
+ body.attribute :type, :string,
13
+ required: true,
14
+ only: :create,
15
+ example: 'excluded_products_rule',
16
+ description: 'A rule kind from the delivery method rule types endpoint.'
17
+ body.attribute :active, :boolean, description: 'Defaults to true on create.'
18
+ body.attribute :preferences, :hash, description: "Values for the rule kind's preference schema."
19
+ body.attribute :product_ids, :array, of: :id,
20
+ description: 'Products an association-backed rule (`excluded_products_rule`) applies to. An empty list clears them.'
21
+ end
22
+
11
23
  def create
12
24
  rule_class = Spree.delivery_method_rules.detect do |klass|
13
25
  klass.api_type == params[:type].to_s
@@ -17,7 +29,7 @@ module Spree
17
29
  return render_error(
18
30
  code: ERROR_CODES[:validation_error],
19
31
  message: I18n.t('spree.errors.messages.invalid_delivery_method_rule'),
20
- status: :unprocessable_entity
32
+ status: :unprocessable_content
21
33
  )
22
34
  end
23
35
 
@@ -62,7 +74,7 @@ module Spree
62
74
  end
63
75
 
64
76
  def permitted_params
65
- params.permit(*model_additional_permitted_attributes, :type, :active, preferences: {}, product_ids: [])
77
+ params.permit(*permitted_attributes)
66
78
  end
67
79
 
68
80
  private
@@ -86,11 +98,7 @@ module Spree
86
98
  end
87
99
 
88
100
  def assign_rule_preferences(rule)
89
- (permitted_params[:preferences] || {}).each do |key, value|
90
- next unless rule.has_preference?(key)
91
-
92
- rule.set_preference(key, value)
93
- end
101
+ rule.assign_preferences(permitted_params[:preferences]) if permitted_params[:preferences]
94
102
  end
95
103
 
96
104
  # Association-backed rule config (ExcludedProductsRule). Products are