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
@@ -9,6 +9,22 @@ module Spree
9
9
 
10
10
  before_action :find_cart!
11
11
 
12
+ request_params 'AddLineItemParams', action: :create do |body|
13
+ body.attribute :variant_id, :id, required: true, example: 'variant_abc123'
14
+ body.attribute :quantity, :integer, example: 2, description: 'Defaults to 1.'
15
+ body.attribute :metadata, :hash,
16
+ example: { gift_message: 'Happy Birthday!' },
17
+ description: 'Write-only key-value metadata.'
18
+ body.attribute :options, :hash, description: 'Values for line item attributes an extension adds.'
19
+ end
20
+
21
+ request_params 'UpdateLineItemParams', action: :update do |body|
22
+ body.attribute :quantity, :integer, example: 5, description: 'At least 1. Remove an item with DELETE.'
23
+ body.attribute :metadata, :hash,
24
+ example: { engraving: 'J.D.' },
25
+ description: 'Write-only key-value metadata, merged with what the line item has.'
26
+ end
27
+
12
28
  # POST /api/v3/store/carts/:cart_id/items
13
29
  def create
14
30
  with_order_lock do
@@ -113,11 +129,7 @@ module Spree
113
129
  end
114
130
 
115
131
  def permitted_params
116
- params.permit(
117
- :id, :variant_id, :quantity,
118
- *Spree::LineItem.additional_permitted_attributes,
119
- { metadata: {}, options: {} }
120
- )
132
+ params.permit(*declared_permitted_attributes, *Spree::LineItem.additional_permitted_attributes)
121
133
  end
122
134
  end
123
135
  end
@@ -10,6 +10,24 @@ module Spree
10
10
  before_action :find_cart!
11
11
  before_action :set_payment_session, only: [:show, :update, :complete]
12
12
 
13
+ request_params 'CreatePaymentSessionParams', action: :create do |body|
14
+ body.attribute :payment_method_id, :id, required: true, example: 'pm_abc123'
15
+ body.attribute :amount, :decimal,
16
+ example: '99.99',
17
+ description: 'Defaults to the order total minus store credits.'
18
+ body.attribute :external_data, :hash, description: 'Provider-specific data passed to the gateway.'
19
+ end
20
+
21
+ request_params 'UpdatePaymentSessionParams', action: :update do |body|
22
+ body.attribute :amount, :decimal, example: '50.00'
23
+ body.attribute :external_data, :hash, description: 'Provider-specific data to update.'
24
+ end
25
+
26
+ request_params 'CompletePaymentSessionParams', action: :complete do |body|
27
+ body.attribute :session_result, :string, description: 'Provider-specific session result token.'
28
+ body.attribute :external_data, :hash, description: 'Provider-specific completion data.'
29
+ end
30
+
13
31
  # POST /api/v3/store/carts/:cart_id/payment_sessions
14
32
  def create
15
33
  with_order_lock do
@@ -94,15 +112,11 @@ module Spree
94
112
  end
95
113
 
96
114
  def permitted_params
97
- params.permit(
98
- :amount, :payment_method_id,
99
- *Spree::PaymentSession.additional_permitted_attributes,
100
- { external_data: {} }
101
- )
115
+ params.permit(*declared_permitted_attributes, *Spree::PaymentSession.additional_permitted_attributes)
102
116
  end
103
117
 
104
118
  def complete_params
105
- params.permit(:session_result, { external_data: {} })
119
+ params.permit(*declared_permitted_attributes)
106
120
  end
107
121
 
108
122
  private
@@ -8,6 +8,17 @@ module Spree
8
8
 
9
9
  before_action :find_cart!
10
10
 
11
+ request_params 'CreatePaymentParams', action: :create do |body|
12
+ body.attribute :payment_method_id, :id,
13
+ required: true,
14
+ example: 'pm_abc123',
15
+ description: 'A payment method that needs no payment session.'
16
+ body.attribute :amount, :decimal,
17
+ example: '99.99',
18
+ description: 'Defaults to the order total minus store credits.'
19
+ body.attribute :metadata, :hash, description: 'Key-value metadata to attach to the payment.'
20
+ end
21
+
11
22
  # POST /api/v3/store/carts/:cart_id/payments
12
23
  # Creates a payment for non-session payment methods (e.g. Check, Cash on Delivery, Bank Transfer)
13
24
  def create
@@ -12,7 +12,7 @@ module Spree
12
12
  # unconditional presigner would let anyone holding one mint blobs in
13
13
  # the merchant's bucket. Reaching this action means holding the cart.
14
14
  #
15
- # Blobs are minted on private storage, because attaching a signed id
15
+ # Files are minted on private storage, because attaching a signed id
16
16
  # never moves a blob between services and a purchase order carries the
17
17
  # buyer's prices, terms and internal cost codes.
18
18
  class PoDocumentsController < Store::BaseController
@@ -21,10 +21,20 @@ module Spree
21
21
 
22
22
  before_action :find_cart!
23
23
 
24
+ request_params 'CreatePoDocumentParams', action: :create do |body|
25
+ body.attribute :filename, :string, required: true
26
+ body.attribute :content_type, :string, required: true
27
+ body.attribute :byte_size, :integer, required: true
28
+ body.attribute :checksum, :string,
29
+ required: true,
30
+ description: 'Base64-encoded MD5 digest of the file; the storage service checks the bytes against it.'
31
+ end
32
+
24
33
  # POST /api/v3/store/carts/:cart_id/po_document
25
34
  #
26
- # Exchanges blob metadata for an upload URL. The returned signed id
27
- # is then sent back as `po_document` on a cart update, which is what
35
+ # Takes the same flat request as the Admin API's `POST /files` and
36
+ # answers with the same shape. The returned signed id is then sent
37
+ # back as `po_document_signed_id` on a cart update, which is what
28
38
  # actually attaches it.
29
39
  #
30
40
  # The declared size and type are checked here, before any URL is
@@ -34,20 +44,20 @@ module Spree
34
44
  # only runs once the bytes are already stored. It is a gate on the
35
45
  # cheap lie, not a substitute: the attach-time check still reads
36
46
  # the stored object, which is what catches an under-declared size.
47
+ # Bytes in the request itself are not accepted here: a publishable
48
+ # key is public.
37
49
  def create
38
- return render_po_document_invalid unless acceptable_upload?
39
-
40
- blob = ActiveStorage::Blob.create_before_direct_upload!(
41
- service_name: Spree.private_storage_service_name, **blob_params
50
+ file_upload = Spree::FileUpload.new(
51
+ store: current_store,
52
+ visibility: 'private',
53
+ max_byte_size: Spree::Purchase::PurchaseOrder::MAX_PO_DOCUMENT_SIZE,
54
+ allowed_content_types: Spree::Purchase::PurchaseOrder::PO_DOCUMENT_CONTENT_TYPES,
55
+ **params.permit(*declared_permitted_attributes).to_h.symbolize_keys
42
56
  )
43
57
 
44
- render json: {
45
- direct_upload: {
46
- url: blob.service_url_for_direct_upload,
47
- headers: blob.service_headers_for_direct_upload
48
- },
49
- signed_id: blob.signed_id
50
- }, status: :created
58
+ return render_po_document_invalid unless file_upload.save
59
+
60
+ render json: Spree.api.file_upload_serializer.new(file_upload, params: serializer_params).to_h, status: :created
51
61
  end
52
62
 
53
63
  # GET /api/v3/store/carts/:cart_id/po_document
@@ -79,18 +89,6 @@ module Spree
79
89
 
80
90
  private
81
91
 
82
- def blob_params
83
- params.require(:blob).permit(:filename, :byte_size, :checksum, :content_type).to_h.symbolize_keys
84
- end
85
-
86
- def acceptable_upload?
87
- declared_size = Integer(blob_params[:byte_size].to_s, exception: false)
88
-
89
- declared_size&.positive? &&
90
- declared_size <= Spree::Purchase::PurchaseOrder::MAX_PO_DOCUMENT_SIZE &&
91
- Spree::Purchase::PurchaseOrder::PO_DOCUMENT_CONTENT_TYPES.include?(blob_params[:content_type])
92
- end
93
-
94
92
  def render_po_document_invalid
95
93
  render_error(
96
94
  code: ERROR_CODES[:parameter_invalid],
@@ -9,13 +9,20 @@ module Spree
9
9
 
10
10
  before_action :require_authentication!
11
11
  before_action :find_cart!
12
+ before_action :stringify_numeric_amount, only: :create
13
+
14
+ request_params 'ApplyStoreCreditParams', action: :create do |body|
15
+ body.attribute :amount, :decimal,
16
+ example: '10.00',
17
+ description: 'Defaults to as much as the cart can use. A JSON number is still read until 6.1, with a deprecation warning.'
18
+ end
12
19
 
13
20
  # POST /api/v3/store/carts/:cart_id/store_credits
14
21
  def create
15
22
  with_order_lock do
16
23
  result = Spree.store_credit_apply_service.call(
17
24
  order: @cart,
18
- amount: params[:amount].try(:to_f)
25
+ amount: money_param(:amount, @cart.currency)
19
26
  )
20
27
 
21
28
  if result.success?
@@ -40,6 +47,17 @@ module Spree
40
47
  end
41
48
  end
42
49
  end
50
+
51
+ private
52
+
53
+ # 5.6 storefronts sent a JSON number; read it through its text so no
54
+ # float reaches the money math.
55
+ def stringify_numeric_amount
56
+ return unless params[:amount].is_a?(Numeric)
57
+
58
+ Spree::Deprecation.warn('Sending the store credit amount as a JSON number is deprecated and will be refused in Spree 6.1. Send a decimal string such as "25.00".')
59
+ params[:amount] = params[:amount].to_s
60
+ end
43
61
  end
44
62
  end
45
63
  end
@@ -25,6 +25,10 @@ module Spree
25
25
  # frozen onto the order at completion.
26
26
  before_action :require_kind_and_value!, only: :update
27
27
 
28
+ request_params('TaxIdentifierParams', action: :update) do |body|
29
+ body.include_attributes Spree::Api::V3::TaxIdentifierRequestSchema
30
+ end
31
+
28
32
  # GET /api/v3/store/carts/:cart_id/tax_identifier
29
33
  #
30
34
  # The registration this cart will be taxed against — the override
@@ -73,7 +77,7 @@ module Spree
73
77
  end
74
78
 
75
79
  def permitted_params
76
- params.permit(:kind, :value)
80
+ params.permit(*declared_permitted_attributes)
77
81
  end
78
82
 
79
83
  private
@@ -5,15 +5,64 @@ module Spree
5
5
  class CartsController < Store::ResourceController
6
6
  include Spree::Api::V3::CartResolvable
7
7
  include Spree::Api::V3::OrderLock
8
- # The cart accepts a `po_document` signed blob id.
8
+ # The cart accepts a `po_document_signed_id`.
9
9
  include ActiveStorage::SetCurrent
10
10
 
11
- # A tampered signed id would otherwise surface as a 500.
12
- rescue_from ActiveSupport::MessageVerifier::InvalidSignature, with: :render_invalid_po_document
13
-
14
11
  skip_before_action :set_resource
15
12
  prepend_before_action :require_authentication!, only: [:index, :associate]
16
13
 
14
+ CART_ADDRESS = Spree::Api::V3::RequestSchema.shape('CartAddressParams') do |schema|
15
+ schema.attribute :id, :id,
16
+ description: 'An existing address of the customer to use. The other fields are then ignored.'
17
+ schema.include_attributes Spree::Api::V3::Store::AddressRequestSchema
18
+ end
19
+
20
+ # Creating and updating a cart accept the same fields.
21
+ CART_FIELDS = Spree::Api::V3::RequestSchema.new do |schema|
22
+ schema.attribute :email, :string, format: :email, example: 'customer@example.com'
23
+ schema.attribute :customer_note, :string, example: 'Leave at door'
24
+ schema.attribute :market_id, :id
25
+ schema.attribute :currency, :currency
26
+ schema.attribute :locale, :locale
27
+ schema.attribute :shipping_address_id, :id,
28
+ description: 'An existing address to ship to.',
29
+ example: 'addr_abc123'
30
+ schema.attribute :billing_address_id, :id,
31
+ description: 'An existing address to bill.',
32
+ example: 'addr_def456'
33
+ schema.attribute :preferred_stock_location_id, :id
34
+ schema.attribute :company_id, :id, nullable: true, description: <<~TEXT.squish
35
+ The company node this purchase is for. The buyer must have standing over it: a membership
36
+ on that node or one of its ancestors. Null clears it, and with it the company's catalog,
37
+ pricing and tax anchoring.
38
+ TEXT
39
+ schema.attribute :po_number, :string, nullable: true, description: <<~TEXT.squish
40
+ The buyer's own purchase-order reference. Their accounting reconciles the order, the
41
+ invoice and the payment against it. Blank clears it.
42
+ TEXT
43
+ schema.attribute :po_document_signed_id, :string, nullable: true, description: <<~TEXT.squish
44
+ The `signed_id` of the buyer's purchase order, from `POST /store/carts/:id/po_document`.
45
+ Blank detaches the document.
46
+ TEXT
47
+ schema.attribute :use_shipping, :boolean,
48
+ description: 'When true, copies the shipping address to the billing address.'
49
+ schema.attribute :shipping_address, :object, shape: CART_ADDRESS, description: 'A new shipping address.'
50
+ schema.attribute :billing_address, :object, shape: CART_ADDRESS, description: 'A new billing address.'
51
+ schema.attribute :metadata, :hash,
52
+ description: 'Write-only key-value metadata, merged with what the cart has.'
53
+ schema.attribute :items, :array,
54
+ as: 'LineItemInputParams',
55
+ description: 'Items to upsert: sets the quantity of a variant already in the cart, adds the others.' do |item|
56
+ item.attribute :variant_id, :id, required: true, example: 'variant_abc123'
57
+ item.attribute :quantity, :integer, example: 2, description: 'Defaults to 1.'
58
+ item.attribute :metadata, :hash, description: 'Key-value metadata, merged with what the line item has.'
59
+ item.attribute :options, :hash
60
+ end
61
+ end
62
+
63
+ request_params('CreateCartParams', action: :create) { |body| body.include_attributes CART_FIELDS }
64
+ request_params('UpdateCartParams', action: :update) { |body| body.include_attributes CART_FIELDS }
65
+
17
66
  # GET /api/v3/store/carts/:id
18
67
  # Returns cart by prefixed ID
19
68
  # Auto-advances the checkout state machine so that shipments and
@@ -184,50 +233,8 @@ module Spree
184
233
 
185
234
  private
186
235
 
187
- def render_invalid_po_document
188
- render_error(
189
- code: ERROR_CODES[:validation_error],
190
- message: I18n.t('spree.po_document_invalid_signed_id'),
191
- status: :unprocessable_content
192
- )
193
- end
194
-
195
236
  def permitted_params
196
- params.permit(
197
- *model_additional_permitted_attributes,
198
- :email,
199
- :customer_note,
200
- :market_id,
201
- :currency,
202
- :locale,
203
- :shipping_address_id,
204
- :billing_address_id,
205
- :preferred_stock_location_id,
206
- :company_id,
207
- # The buyer's own purchase-order reference, and the signed blob id
208
- # of the document behind it (from POST .../carts/:id/po_document).
209
- :po_number,
210
- :po_document,
211
- :use_shipping,
212
- shipping_address: address_params,
213
- billing_address: address_params,
214
- metadata: {},
215
- items: item_params
216
- )
217
- end
218
-
219
- def address_params
220
- [
221
- :id, :first_name, :last_name,
222
- :address1, :address2,
223
- :city, :postal_code, :phone, :company,
224
- # country_iso and state_abbr are the legacy write names, accepted until 6.1.
225
- :country_code, :country_iso, :state_code, :state_abbr, :state_name, :quick_checkout
226
- ]
227
- end
228
-
229
- def item_params
230
- [:variant_id, :quantity, { metadata: {}, options: {} }]
237
+ params.permit(*permitted_attributes)
231
238
  end
232
239
 
233
240
  # Find incomplete cart for associate action.
@@ -9,6 +9,18 @@ module Spree
9
9
  class AddressesController < BaseController
10
10
  include Spree::Api::V3::CompanyAddressWrites
11
11
 
12
+ request_params :company_address do |body|
13
+ body.include_attributes Spree::Api::V3::AddressRequestSchema
14
+ body.require_attributes :first_name, :last_name, :address1, :city, :country_code, on: :create
15
+ body.attribute :zipcode, :string, deprecated: 'Use `postal_code`. Removed in 6.1.'
16
+ body.attribute :default_billing, :boolean,
17
+ permit: false,
18
+ description: "True makes this the node's default billing address, false gives that up, and leaving it out changes nothing."
19
+ body.attribute :default_shipping, :boolean,
20
+ permit: false,
21
+ description: "True makes this the node's default shipping address, false gives that up, and leaving it out changes nothing."
22
+ end
23
+
12
24
  # POST /api/v3/store/companies/:company_id/addresses
13
25
  def create
14
26
  result = Spree.address_create_service.call(
@@ -65,10 +77,6 @@ module Spree
65
77
  def scope
66
78
  action_name == 'index' ? @parent.address_book : @parent.addresses
67
79
  end
68
-
69
- def permitted_params
70
- params.permit(:label, *Spree::Api::V3::AddressParams::ADDRESS_KEYS)
71
- end
72
80
  end
73
81
  end
74
82
  end
@@ -11,6 +11,10 @@ module Spree
11
11
  # email has an account. Any member can invite; restraint is
12
12
  # Enterprise's policy layer.
13
13
  class MembersController < BaseController
14
+ request_params 'AddCompanyMemberParams', action: :create do |body|
15
+ body.attribute :customer_email, :string, required: true, example: 'colleague@acme.test'
16
+ end
17
+
14
18
  # POST /api/v3/store/companies/:company_id/members
15
19
  def create
16
20
  result = Spree.company_add_member_service.call(
@@ -10,6 +10,10 @@ module Spree
10
10
  class CompaniesController < ResourceController
11
11
  prepend_before_action :require_authentication!
12
12
 
13
+ request_params 'UpdateCompanyParams', action: :update do |body|
14
+ body.attribute :name, :string, example: 'Acme Industrial Group'
15
+ end
16
+
13
17
  # PATCH /api/v3/store/companies/:id
14
18
  def update
15
19
  authorize_storefront_write!(@resource)
@@ -38,7 +42,7 @@ module Spree
38
42
  end
39
43
 
40
44
  def permitted_params
41
- params.permit(:name)
45
+ params.permit(*declared_permitted_attributes)
42
46
  end
43
47
  end
44
48
  end
@@ -17,6 +17,14 @@ module Spree
17
17
  # standing scope would 404 the unauthenticated invitee.
18
18
  skip_before_action :set_resource
19
19
 
20
+ request_params 'AcceptCompanyInvitationParams', action: :accept do |body|
21
+ body.attribute :first_name, :string, example: 'Ada'
22
+ body.attribute :last_name, :string, example: 'Lovelace'
23
+ body.attribute :phone, :string
24
+ body.attribute :password, :string, example: 'a-strong-password'
25
+ body.attribute :password_confirmation, :string, example: 'a-strong-password'
26
+ end
27
+
20
28
  # GET /api/v3/store/company_invitations/:token — what is being
21
29
  # joined. Expired and revoked tokens 404.
22
30
  def show
@@ -81,7 +89,7 @@ module Spree
81
89
  end
82
90
 
83
91
  def registration_params
84
- params.permit(:first_name, :last_name, :phone, :password, :password_confirmation)
92
+ params.permit(*declared_permitted_attributes)
85
93
  end
86
94
  end
87
95
  end
@@ -7,6 +7,13 @@ module Spree
7
7
  prepend_before_action :require_authentication!
8
8
  before_action :set_resource, only: [:show, :update, :destroy]
9
9
 
10
+ request_params :address do |body|
11
+ body.include_attributes Spree::Api::V3::Store::AddressRequestSchema
12
+ body.require_attributes :first_name, :last_name, :address1, :city, :country_code, on: :create
13
+ body.attribute :is_default_billing, :boolean, description: 'Makes this the default billing address.'
14
+ body.attribute :is_default_shipping, :boolean, description: 'Makes this the default shipping address.'
15
+ end
16
+
10
17
  # POST /api/v3/store/customers/me/addresses
11
18
  def create
12
19
  result = Spree.address_create_service.call(
@@ -58,13 +65,7 @@ module Spree
58
65
  end
59
66
 
60
67
  def permitted_params
61
- params.permit(
62
- *model_additional_permitted_attributes,
63
- :first_name, :last_name, :address1, :address2, :city,
64
- # country_iso and state_abbr are the legacy write names, accepted until 6.1.
65
- :postal_code, :phone, :company, :country_code, :country_iso, :state_code, :state_abbr, :state_name,
66
- :is_default_billing, :is_default_shipping
67
- )
68
+ params.permit(*permitted_attributes)
68
69
  end
69
70
  end
70
71
  end
@@ -15,6 +15,11 @@ module Spree
15
15
 
16
16
  prepend_before_action :require_authentication!
17
17
 
18
+ request_params 'CreateDataRequestParams', action: :create do |body|
19
+ body.attribute :kind, :string, choices: Spree::DataRequest::KINDS, description: 'Defaults to `access`.'
20
+ body.attribute :current_password, :string, description: 'Required for `erasure`.'
21
+ end
22
+
18
23
  # POST /api/v3/store/customers/me/data_requests
19
24
  def create
20
25
  return render_current_password_invalid if erasure? && !valid_current_password?
@@ -14,6 +14,23 @@ module Spree
14
14
 
15
15
  skip_before_action :authenticate_user
16
16
 
17
+ request_params 'RequestPasswordResetParams', action: :create do |body|
18
+ body.attribute :email, :string,
19
+ required: true,
20
+ format: :email,
21
+ example: 'customer@example.com',
22
+ description: 'The email of the account to reset.'
23
+ body.attribute :redirect_url, :string,
24
+ format: :uri,
25
+ example: 'https://myshop.com/reset-password',
26
+ description: "Where the reset link sends the customer. Ignored unless it matches one of the store's allowed origins."
27
+ end
28
+
29
+ request_params 'ResetPasswordParams', action: :update do |body|
30
+ body.attribute :password, :string, required: true, example: 'newsecurepassword'
31
+ body.attribute :password_confirmation, :string, required: true, example: 'newsecurepassword'
32
+ end
33
+
17
34
  # POST /api/v3/store/password_resets
18
35
  def create
19
36
  redirect_url = params[:redirect_url]
@@ -9,6 +9,15 @@ module Spree
9
9
  skip_before_action :set_resource
10
10
  before_action :set_payment_setup_session, only: [:show, :complete]
11
11
 
12
+ request_params 'CreatePaymentSetupSessionParams', action: :create do |body|
13
+ body.attribute :payment_method_id, :id, required: true, example: 'pm_abc123'
14
+ body.attribute :external_data, :hash, description: 'Provider-specific data passed to the gateway.'
15
+ end
16
+
17
+ request_params 'CompletePaymentSetupSessionParams', action: :complete do |body|
18
+ body.attribute :external_data, :hash, description: 'Provider-specific completion data.'
19
+ end
20
+
12
21
  # POST /api/v3/store/customer/payment_setup_sessions
13
22
  def create
14
23
  payment_method = current_store.payment_methods.find_by_prefix_id!(params[:payment_method_id])
@@ -58,12 +67,8 @@ module Spree
58
67
  Spree.api.payment_setup_session_serializer
59
68
  end
60
69
 
61
- def resource_permitted_attributes
62
- [:payment_method_id, { external_data: {} }]
63
- end
64
-
65
70
  def complete_params
66
- params.permit({ external_data: {} })
71
+ params.permit(*declared_permitted_attributes)
67
72
  end
68
73
 
69
74
  private
@@ -18,6 +18,10 @@ module Spree
18
18
  # the buyer never named and could not predict.
19
19
  before_action :require_kind!, only: %i[show update destroy]
20
20
 
21
+ request_params('TaxIdentifierParams', action: :update) do |body|
22
+ body.include_attributes Spree::Api::V3::TaxIdentifierRequestSchema
23
+ end
24
+
21
25
  # GET /api/v3/store/customers/me/tax_identifiers
22
26
  #
23
27
  # Everything the buyer could choose between at checkout. Small and
@@ -65,7 +69,7 @@ module Spree
65
69
  end
66
70
 
67
71
  def permitted_params
68
- params.permit(:kind, :value)
72
+ params.permit(*declared_permitted_attributes)
69
73
  end
70
74
 
71
75
  private
@@ -11,6 +11,33 @@ module Spree
11
11
  skip_before_action :authenticate_user, only: [:create]
12
12
  prepend_before_action :require_authentication!, only: [:show, :update]
13
13
 
14
+ CUSTOMER_FIELDS = Spree::Api::V3::RequestSchema.new do |schema|
15
+ schema.attribute :first_name, :string, example: 'John'
16
+ schema.attribute :last_name, :string, example: 'Doe'
17
+ schema.attribute :phone, :string, example: '+1 555 123 4567'
18
+ schema.attribute :accepts_email_marketing, :boolean
19
+ schema.attribute :metadata, :hash, description: 'Write-only key-value metadata.'
20
+ end
21
+
22
+ request_params 'RegisterParams', action: :create do |body|
23
+ body.attribute :email, :string, required: true, format: :email, example: 'newuser@example.com'
24
+ body.attribute :password, :string, required: true, example: 'password123'
25
+ body.attribute :password_confirmation, :string, example: 'password123'
26
+ body.include_attributes CUSTOMER_FIELDS
27
+ body.attribute :terms_of_service, :boolean,
28
+ permit: false,
29
+ description: "Whether the customer ticked the storefront's terms of service box. Recorded as their consent."
30
+ end
31
+
32
+ request_params 'UpdateCustomerParams', action: :update do |body|
33
+ body.attribute :email, :string, format: :email, example: 'customer@example.com'
34
+ body.attribute :password, :string
35
+ body.attribute :password_confirmation, :string
36
+ body.attribute :current_password, :string,
37
+ description: 'Required when changing the email or the password.'
38
+ body.include_attributes CUSTOMER_FIELDS
39
+ end
40
+
14
41
  # POST /api/v3/store/customers
15
42
  # Registration runs through the customer_create_workflow seam
16
43
  # (password requirement, newsletter-subscriber linking, registration
@@ -83,8 +110,7 @@ module Spree
83
110
  end
84
111
 
85
112
  def permitted_params
86
- params.permit(:email, :password, :password_confirmation, :first_name, :last_name,
87
- :accepts_email_marketing, :phone, :current_password, metadata: {})
113
+ params.permit(*declared_permitted_attributes)
88
114
  end
89
115
 
90
116
  private
@@ -10,6 +10,28 @@ module Spree
10
10
  only: [:create, :verify, :request_unsubscribe],
11
11
  with: -> { render_rate_limited(limit: Spree::Api::Config[:rate_limit_register]) }
12
12
 
13
+ request_params 'CreateNewsletterSubscriberParams', action: :create do |body|
14
+ body.attribute :email, :string, required: true, format: :email, example: 'subscriber@example.com'
15
+ body.attribute :redirect_url, :string,
16
+ format: :uri,
17
+ example: 'https://your-store.com/newsletter/confirm',
18
+ description: "The storefront URL the verification token is appended to. Left out of the webhook payload unless it matches one of the store's allowed origins."
19
+ end
20
+
21
+ request_params 'VerifyNewsletterSubscriberParams', action: :verify do |body|
22
+ body.attribute :token, :string,
23
+ required: true,
24
+ example: 'abc123def456',
25
+ description: 'The verification token from the confirmation email.'
26
+ end
27
+
28
+ request_params 'RequestNewsletterUnsubscribeParams', action: :request_unsubscribe do |body|
29
+ body.attribute :email, :string, format: :email, example: 'subscriber@example.com'
30
+ body.attribute :redirect_url, :string,
31
+ format: :uri,
32
+ description: "The storefront URL the unsubscribe token is appended to in the email. Left out of the event payload unless it matches one of the store's allowed origins."
33
+ end
34
+
13
35
  # POST /api/v3/store/newsletter_subscribers
14
36
  def create
15
37
  subscriber = Spree::NewsletterSubscriber.subscribe(