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
@@ -13,6 +13,13 @@ module Spree
13
13
  # grantable separately from store configuration (6.0-admin-rbac.md).
14
14
  scoped_resource :staff
15
15
 
16
+ request_params :invitation do |body|
17
+ body.attribute :email, :string, required: true, on: :create
18
+ body.attribute :role_id, :id,
19
+ required: true, on: :create,
20
+ description: 'The role (`role_...`) the invitee gets on accepting.'
21
+ end
22
+
16
23
  # POST /api/v3/admin/invitations
17
24
  # Guards against inviting a new staff member straight into the admin
18
25
  # super-role unless the inviter already holds it.
@@ -65,7 +72,7 @@ module Spree
65
72
  # No extension union: an invitation carries only the role grant, which is
66
73
  # the authorization surface itself, not extensible resource data.
67
74
  def permitted_params
68
- attrs = params.permit(:email, :role_id)
75
+ attrs = params.permit(*declared_permitted_attributes)
69
76
  if attrs[:role_id].present? && Spree::PrefixedId.prefixed_id?(attrs[:role_id])
70
77
  attrs[:role_id] = Spree::PrefixedId.decode_prefixed_id(attrs[:role_id])
71
78
  end
@@ -14,7 +14,7 @@ module Spree
14
14
  def index
15
15
  render json: {
16
16
  data: current_store.supported_locales.map do |locale|
17
- Spree.api.locale_serializer.new(locale).to_h
17
+ Spree.api.admin_locale_serializer.new(locale).to_h
18
18
  end
19
19
  }
20
20
  end
@@ -13,6 +13,36 @@ module Spree
13
13
  class MarketsController < ResourceController
14
14
  scoped_resource :settings
15
15
 
16
+ request_params :market do |body|
17
+ body.attribute :name, :string,
18
+ required: true, on: :create,
19
+ example: 'Europe',
20
+ description: 'Display name, unique within the store.'
21
+ body.attribute :currency, :currency,
22
+ required: true, on: :create,
23
+ example: 'EUR',
24
+ description: 'ISO 4217 currency code.'
25
+ body.attribute :default_locale, :locale,
26
+ required: true, on: :create,
27
+ example: 'de',
28
+ description: 'Locale used as the market default. Always part of `supported_locales`.'
29
+ body.attribute :tax_inclusive, :boolean, description: 'Display prices with tax included.'
30
+ body.attribute :tax_provider, :string,
31
+ nullable: true,
32
+ example: 'internal',
33
+ description: 'Shorthand of the tax engine that prices this market, from the tax providers endpoint. Null uses the installation default.'
34
+ body.attribute :default, :boolean,
35
+ description: 'Setting true demotes the previous default market of the store.'
36
+ body.attribute :position, :integer, description: 'Sort order within the store; lower comes first.'
37
+ body.attribute :supported_locales, :array, of: :locale,
38
+ example: %w[de en],
39
+ description: 'Locales available in this market. The default locale is always included.'
40
+ body.attribute :country_codes, :array, of: :country,
41
+ required: true, on: :create,
42
+ example: %w[DE FR],
43
+ description: 'ISO 3166-1 alpha-2 codes of the countries in this market. At least one is required.'
44
+ end
45
+
16
46
  protected
17
47
 
18
48
  def model_class
@@ -30,15 +60,6 @@ module Spree
30
60
  def scope
31
61
  super.ordered
32
62
  end
33
-
34
- def permitted_params
35
- normalize_params(
36
- params.permit(
37
- :name, :currency, :default_locale, :tax_inclusive, :tax_provider,
38
- :default, :position, supported_locales: [], country_codes: []
39
- )
40
- )
41
- end
42
63
  end
43
64
  end
44
65
  end
@@ -7,6 +7,15 @@ module Spree
7
7
 
8
8
  skip_scope_check!
9
9
 
10
+ request_params :me do |body|
11
+ body.attribute :selected_locale, :string, example: 'de', description: 'The dashboard display language.'
12
+ body.attribute :first_name, :string
13
+ body.attribute :last_name, :string
14
+ body.attribute :avatar_signed_id, :string,
15
+ nullable: true,
16
+ description: 'A `signed_id` from `files.upload()` to set the avatar, or null to remove it. Omit it to keep the current photo.'
17
+ end
18
+
10
19
  before_action :require_current_user!
11
20
 
12
21
  # GET /api/v3/admin/me
@@ -33,8 +42,8 @@ module Spree
33
42
  # name, admin UI language, and avatar) — it operates on `current_user`
34
43
  # directly, so it needs no per-record authorization. Distinct from
35
44
  # PATCH /admin_users/:id, which is store-scoped staff management of
36
- # *other* users. `avatar` accepts an ActiveStorage direct-upload
37
- # signed id to set the photo, or `null` to remove it.
45
+ # *other* users. `avatar_signed_id` takes a signed id from
46
+ # POST /files to set the photo, or `null` to remove it.
38
47
  def update
39
48
  if current_user.update(permitted_params)
40
49
  render json: me_response
@@ -70,7 +79,7 @@ module Spree
70
79
  end
71
80
 
72
81
  def permitted_params
73
- params.permit(:selected_locale, :first_name, :last_name, :avatar)
82
+ params.permit(*declared_permitted_attributes)
74
83
  end
75
84
 
76
85
  def me_response
@@ -5,6 +5,27 @@ module Spree
5
5
  class MediaController < ResourceController
6
6
  scoped_resource :products
7
7
 
8
+ # The media file, a URL to fetch one from, and the library row to copy
9
+ # are transport, not attributes (+media_attributes+ drops them).
10
+ request_params :media do |body|
11
+ body.external_references
12
+ body.include_attributes Spree::Api::V3::MediaRequestSchema
13
+ body.attribute :attachment, :string,
14
+ description: 'The file itself, sent as multipart form data. JSON clients upload first and send `signed_id`.'
15
+ # How the file arrives, so creating only: an update keeps its file.
16
+ body.attribute :url, :string,
17
+ only: :create,
18
+ description: 'Fetch an image from this URL, in the background. Images only: an external video uses `external_video_url`.'
19
+ body.attribute :signed_id, :string,
20
+ only: :create,
21
+ description: 'A `signed_id` from `files.upload()` for the media file itself.'
22
+ body.attribute :source_media_id, :id,
23
+ only: :create,
24
+ description: 'Place a file that is already in the library. The new row shares the source file rather than copying it, and takes its own alt, position and variant links from here.'
25
+ body.attribute :variant_ids, :array, of: :id,
26
+ description: 'Variants to link this product-level media to. Variants of other products are dropped.'
27
+ end
28
+
8
29
  def create
9
30
  # An external video has no file, so it takes the plain create path
10
31
  # even though a URL is present — `url` means "fetch this image from
@@ -91,16 +112,8 @@ module Spree
91
112
  permitted_params.except(:attachment, :url, :signed_id, :source_media_id)
92
113
  end
93
114
 
94
- # The media file, a URL to fetch one from, and the library row to copy
95
- # are transport, not attributes — everything a client can set lives on
96
- # the model.
97
115
  def permitted_params
98
- params.permit(
99
- *model_additional_permitted_attributes,
100
- *Spree::Media::WRITABLE_ATTRIBUTES,
101
- :attachment, :url, :signed_id, :source_media_id,
102
- variant_ids: []
103
- )
116
+ params.permit(*permitted_attributes)
104
117
  end
105
118
 
106
119
  def external_video_request?
@@ -19,6 +19,10 @@ module Spree
19
19
  # `products` — those are one product's own media, reached through a
20
20
  # product the caller can already see.
21
21
  scoped_resource :media
22
+
23
+ request_params :media_library do |body|
24
+ body.include_attributes MediaController.request_params_schema
25
+ end
22
26
  # Restates the base class's member actions with `usage` added — a
23
27
  # second `before_action :set_resource` would replace that filter
24
28
  # rather than extend it, leaving show/update/destroy without a record.
@@ -5,6 +5,29 @@ module Spree
5
5
  class OptionTypesController < ResourceController
6
6
  scoped_resource :products
7
7
 
8
+ request_params :option_type do |body|
9
+ body.attribute :name, :string, required: true, on: :create, example: 'color'
10
+ body.attribute :label, :string, required: true, on: :create, example: 'Color'
11
+ body.attribute :position, :integer
12
+ body.attribute :filterable, :boolean
13
+ body.attribute :kind, :string, choices: Spree::OptionType::KINDS
14
+ body.attribute :option_values, :array,
15
+ as: 'OptionValueParams',
16
+ description: 'Inline option values. Values left out of the list on update are destroyed, so send the full set every time.' do |option_value|
17
+ option_value.attribute :id, :id, description: 'Present for existing values. Omit to create a new one.'
18
+ option_value.attribute :name, :string, example: 'red'
19
+ option_value.attribute :label, :string, example: 'Red'
20
+ option_value.attribute :position, :integer
21
+ option_value.attribute :color_code, :string,
22
+ nullable: true,
23
+ example: '#FF0000',
24
+ description: "Hex color. Only meaningful when the option type's `kind` is `color_swatch`."
25
+ option_value.attribute :image_signed_id, :string,
26
+ nullable: true,
27
+ description: 'A `signed_id` from `files.upload()`, or null to remove the image.'
28
+ end
29
+ end
30
+
8
31
  protected
9
32
 
10
33
  def model_class
@@ -20,13 +43,7 @@ module Spree
20
43
  end
21
44
 
22
45
  def permitted_params
23
- params.permit(
24
- *model_additional_permitted_attributes,
25
- :name, :label, :position, :filterable, :kind,
26
- option_values: [
27
- :id, :name, :label, :position, :color_code, :image
28
- ]
29
- )
46
+ params.permit(*permitted_attributes)
30
47
  end
31
48
  end
32
49
  end
@@ -5,6 +5,10 @@ module Spree
5
5
  class OrderCancellationReasonsController < ResourceController
6
6
  scoped_resource :settings
7
7
 
8
+ request_params :reason do |body|
9
+ body.include_attributes Spree::Api::V3::Admin::ReasonRequestSchema
10
+ end
11
+
8
12
  protected
9
13
 
10
14
  def model_class
@@ -16,7 +20,7 @@ module Spree
16
20
  end
17
21
 
18
22
  def permitted_params
19
- params.permit(*model_additional_permitted_attributes, :name, :active)
23
+ params.permit(*permitted_attributes)
20
24
  end
21
25
  end
22
26
  end
@@ -13,6 +13,18 @@ module Spree
13
13
  subclassed_via -> { Spree.order_routing.rules },
14
14
  unknown_type_error: 'unknown_order_routing_rule_type'
15
15
 
16
+ request_params :order_routing_rule do |body|
17
+ body.attribute :type, :string,
18
+ required: true,
19
+ only: :create,
20
+ example: 'preferred_location',
21
+ description: 'Wire shorthand for the rule kind, from the order routing rule types endpoint.'
22
+ body.attribute :active, :boolean
23
+ body.attribute :position, :integer,
24
+ description: "1-based priority in the channel's rule list. Omitted on create, the rule goes last; a new position reorders the rest of the list around it."
25
+ body.attribute :preferences, :hash, description: "Values for the rule kind's preference schema."
26
+ end
27
+
16
28
  def types
17
29
  authorize! :read, model_class
18
30
 
@@ -30,7 +42,7 @@ module Spree
30
42
  end
31
43
 
32
44
  def permitted_params
33
- params.permit(*model_additional_permitted_attributes, :type, :active, :position, preferences: {})
45
+ params.permit(*permitted_attributes)
34
46
  end
35
47
 
36
48
  # `types` is read-only discovery — maps to the read scope + :show ability.
@@ -12,6 +12,44 @@ module Spree
12
12
  # would name a key no catalog knows.
13
13
  scoped_resource :orders
14
14
 
15
+ request_params :claim do |body|
16
+ body.attribute :items, :array,
17
+ required: true, on: :create,
18
+ only: :create,
19
+ description: 'Affected items, and how each should be made right.' do |item|
20
+ item.attribute :line_item_id, :id, required: true
21
+ item.attribute :quantity, :integer, required: true
22
+ item.attribute :description, :string
23
+ item.attribute :send_replacement, :boolean
24
+ item.attribute :replacement_variant_id, :id, description: 'Defaults to the variant that was bought.'
25
+ item.attribute :refund_amount, :decimal
26
+ end
27
+ body.attribute :reason_id, :id, description: "One of the store's claim reasons."
28
+ body.attribute :memo, :string
29
+ body.attribute :metadata, :hash, only: :update
30
+ end
31
+
32
+ request_params 'ClaimResolveParams', action: :resolve do |body|
33
+ body.attribute :resolution, :string,
34
+ required: true,
35
+ choices: Spree::Claim::RESOLUTIONS,
36
+ description: 'Money back, a replacement shipment, or both.'
37
+ body.attribute :refund_method, :string,
38
+ choices: Spree::RefundMethods::METHODS,
39
+ description: 'Defaults to `store_credit`.'
40
+ body.attribute :amount, :decimal, description: 'Defaults to the claim total.'
41
+ body.attribute :replacement_line_item_ids, :array, of: :id,
42
+ description: 'Which claim lines to send a replacement for. Omit to keep what the claim was opened with.'
43
+ end
44
+
45
+ request_params 'ClaimDenyParams', action: :deny do |body|
46
+ body.attribute :reason, :string, description: 'Recorded on the claim for the customer.'
47
+ end
48
+
49
+ request_params 'ClaimCancelParams', action: :cancel do |body|
50
+ body.attribute :reason, :string, description: 'A note on why the claim was canceled.'
51
+ end
52
+
15
53
  before_action :set_resource, only: [:show, :update, :approve, :resolve, :deny, :cancel]
16
54
 
17
55
  # PATCH /api/v3/admin/orders/:order_id/claims/:id
@@ -36,7 +74,7 @@ module Spree
36
74
  end
37
75
 
38
76
  def permitted_params
39
- params.permit(:memo, :reason_id, metadata: {})
77
+ params.permit(*permitted_attributes)
40
78
  end
41
79
 
42
80
  private
@@ -13,6 +13,24 @@ module Spree
13
13
  class DeliveriesController < BaseController
14
14
  include Spree::Api::V3::Orders::DeliveryActions
15
15
 
16
+ # The permit list itself lives in DeliveryActions, shared with the
17
+ # seller branch; this declaration documents it.
18
+ request_params :delivery do |body|
19
+ body.attribute :tracking_number, :string,
20
+ required: true, on: :create,
21
+ description: 'A carrier tracking number, a freight PRO or container number, or a full tracking link. A corrected number resets the carrier status to `pending`.'
22
+ body.attribute :carrier, :string,
23
+ description: "Free text; detected from the number's format when omitted."
24
+ body.attribute :service, :string
25
+ body.attribute :tracking_url, :string
26
+ end
27
+
28
+ request_params 'DeliveryMarkDeliveredParams', action: :mark_delivered do |body|
29
+ body.attribute :delivered_at, :datetime, description: 'When it arrived. Defaults to now.'
30
+ body.attribute :notify_customer, :boolean,
31
+ description: 'Whether the customer gets a delivery notification once the parcel completes. Defaults to true.'
32
+ end
33
+
16
34
  before_action :set_resource, only: [:show, :update, :destroy, :mark_delivered]
17
35
 
18
36
  # PATCH .../deliveries/:id/mark_delivered — staff saying this one
@@ -47,7 +65,7 @@ module Spree
47
65
  private
48
66
 
49
67
  def mark_delivered_params
50
- @mark_delivered_params ||= params.permit(:delivered_at, :notify_customer)
68
+ @mark_delivered_params ||= params.permit(*declared_permitted_attributes)
51
69
  end
52
70
 
53
71
  # Only an explicit false suppresses the email.
@@ -10,6 +10,10 @@ module Spree
10
10
  # orders are frozen; their discounts change only through manual rows
11
11
  # (see DiscountsController).
12
12
  class DiscountCodesController < BaseController
13
+ request_params 'DiscountCodeApplyParams' do |body|
14
+ body.attribute :code, :string, required: true
15
+ end
16
+
13
17
  skip_before_action :set_resource, raise: false
14
18
 
15
19
  # POST /api/v3/admin/orders/:order_id/discount_codes
@@ -76,7 +80,7 @@ module Spree
76
80
  end
77
81
 
78
82
  def permitted_params
79
- params.permit(:code)
83
+ params.permit(*declared_permitted_attributes)
80
84
  end
81
85
  end
82
86
  end
@@ -11,23 +11,47 @@ module Spree
11
11
  class DiscountsController < BaseController
12
12
  scoped_resource :orders
13
13
 
14
+ request_params :discount do |body|
15
+ body.attribute :label, :string, required: true, on: :create, example: 'Customer appeasement'
16
+ body.attribute :value, :decimal,
17
+ required: true, on: :create,
18
+ only: :create,
19
+ example: '10.00',
20
+ description: 'An amount in the order currency for a `flat` discount, or a percentage for a `percent` one.'
21
+ body.attribute :amount, :decimal,
22
+ only: :update,
23
+ description: 'The new amount of the row, in the order currency.'
24
+ body.attribute :value_type, :string,
25
+ only: :create,
26
+ choices: %w[flat percent],
27
+ description: 'Defaults to `flat`.'
28
+ body.attribute :line_item_id, :id,
29
+ only: :create,
30
+ nullable: true,
31
+ description: 'The line item the discount applies to. Omitted, the value is distributed across the line items.'
32
+ end
33
+
14
34
  # POST /api/v3/admin/orders/:order_id/discounts
15
35
  def create
16
36
  with_order_lock do
17
37
  line_item = @parent.line_items.find_by_prefix_id!(params[:line_item_id]) if params[:line_item_id].present?
18
38
 
39
+ value_type = params[:value_type].presence || 'flat'
40
+ # A flat discount is money in the order's currency; a percentage is a rate.
41
+ value = value_type == 'percent' ? decimal_param(:value) : money_param(:value, @parent.currency)
42
+
19
43
  result = Spree.order_discount_create_service.call(
20
44
  order: @parent,
21
45
  label: params[:label],
22
- value: params[:value].presence || params[:amount],
23
- value_type: params[:value_type].presence || 'flat',
46
+ value: value,
47
+ value_type: value_type,
24
48
  line_item: line_item
25
49
  )
26
50
 
27
51
  if result.success?
28
52
  render json: { data: serialize_collection(result.value) }, status: :created
29
53
  else
30
- render_error(code: ERROR_CODES[:validation_error], message: result.error.to_s, status: :unprocessable_entity)
54
+ render_error(code: ERROR_CODES[:validation_error], message: result.error.to_s, status: :unprocessable_content)
31
55
  end
32
56
  end
33
57
  end
@@ -75,7 +99,7 @@ module Spree
75
99
  end
76
100
 
77
101
  def permitted_params
78
- params.permit(:label, :amount)
102
+ params.permit(*permitted_attributes)
79
103
  end
80
104
 
81
105
  def collection_includes
@@ -88,7 +112,7 @@ module Spree
88
112
  render_error(
89
113
  code: ERROR_CODES[:discount_not_editable],
90
114
  message: I18n.t('spree.errors.messages.promotion_discount_not_editable'),
91
- status: :unprocessable_entity
115
+ status: :unprocessable_content
92
116
  )
93
117
  end
94
118
  end
@@ -13,6 +13,41 @@ module Spree
13
13
  # would name a key no catalog knows.
14
14
  scoped_resource :orders
15
15
 
16
+ request_params :exchange do |body|
17
+ body.attribute :items, :array,
18
+ required: true, on: :create,
19
+ only: :create,
20
+ description: 'Items coming back, and what goes out in their place.' do |item|
21
+ item.attribute :fulfillment_item_id, :id, required: true
22
+ item.attribute :new_variant_id, :id, required: true
23
+ item.attribute :quantity, :integer, required: true
24
+ end
25
+ body.attribute :stock_location_id, :id, description: 'Where the goods come back to.'
26
+ body.attribute :reason_id, :id, description: "One of the store's return reasons."
27
+ body.attribute :memo, :string
28
+ body.attribute :metadata, :hash, only: :update
29
+ end
30
+
31
+ request_params 'ExchangeReceiveParams', action: :receive do |body|
32
+ body.attribute :items, :array,
33
+ description: 'What actually arrived. Omit to receive everything as requested and resellable.' do |item|
34
+ item.attribute :exchange_line_item_id, :id, required: true
35
+ item.attribute :quantity, :integer, required: true
36
+ item.attribute :resellable, :boolean,
37
+ description: 'Goods that cannot be resold are received but never restocked. Defaults to true.'
38
+ end
39
+ end
40
+
41
+ request_params 'ExchangeFulfillParams', action: :fulfill do |body|
42
+ body.attribute :refund_method, :string,
43
+ choices: Spree::RefundMethods::METHODS,
44
+ description: 'How a credit is returned when the replacements cost less than what came back. Defaults to `store_credit`. A balance the customer owes is left for the merchant to collect.'
45
+ end
46
+
47
+ request_params 'ExchangeCancelParams', action: :cancel do |body|
48
+ body.attribute :reason, :string, description: 'A note on why the exchange was canceled.'
49
+ end
50
+
16
51
  before_action :set_resource, only: [:show, :update, :approve, :receive, :fulfill, :cancel]
17
52
 
18
53
  # PATCH /api/v3/admin/orders/:order_id/exchanges/:id
@@ -37,7 +72,7 @@ module Spree
37
72
  end
38
73
 
39
74
  def permitted_params
40
- params.permit(:memo, :reason_id, :stock_location_id, metadata: {})
75
+ params.permit(*permitted_attributes)
41
76
  end
42
77
 
43
78
  private
@@ -11,6 +11,27 @@ module Spree
11
11
  class FeesController < BaseController
12
12
  scoped_resource :orders
13
13
 
14
+ request_params :fee do |body|
15
+ body.attribute :label, :string, required: true, on: :create, example: 'Gift wrap'
16
+ body.attribute :amount, :decimal, required: true, on: :create, example: '4.00'
17
+ body.attribute :kind, :string,
18
+ choices: Spree::Fee::KINDS,
19
+ open: true,
20
+ example: 'gift_wrap',
21
+ description: 'Defaults to `surcharge`.'
22
+ # Resolved through the order by the controller, never assigned.
23
+ body.attribute :line_item_id, :id,
24
+ only: :create,
25
+ nullable: true,
26
+ permit: false,
27
+ description: 'The line item or fulfillment the fee belongs to. Omitted, the fee is order-level.'
28
+ body.attribute :fulfillment_id, :id,
29
+ only: :create,
30
+ nullable: true,
31
+ permit: false,
32
+ description: 'The line item or fulfillment the fee belongs to. Omitted, the fee is order-level.'
33
+ end
34
+
14
35
  # POST /api/v3/admin/orders/:order_id/fees
15
36
  def create
16
37
  with_order_lock do
@@ -60,7 +81,7 @@ module Spree
60
81
  end
61
82
 
62
83
  def permitted_params
63
- params.permit(:label, :amount, :kind)
84
+ params.permit(*permitted_attributes)
64
85
  end
65
86
 
66
87
  def collection_includes
@@ -14,6 +14,69 @@ module Spree
14
14
 
15
15
  scoped_resource :fulfillments
16
16
 
17
+ request_params :fulfillment do |body|
18
+ body.attribute :stock_location_id, :id,
19
+ required: true, on: :create,
20
+ description: "The location the fulfillment ships from. On update, moving it re-prices the fulfillment against that location's rates."
21
+ body.attribute :source_fulfillment_id, :id,
22
+ only: :create,
23
+ description: "The only fulfillment of this order to move units from, its exchange and claim replacements included: how a canceled replacement is sent again. Omitted, the customer's bought units are taken from every unshipped fulfillment."
24
+ body.attribute :tracking, :string,
25
+ description: 'Carrier tracking number, or a full `https://` tracking link, which is served back as `tracking_url` unchanged.'
26
+ body.attribute :tracking_carrier, :string,
27
+ only: :update,
28
+ description: "Which carrier the tracking number belongs to: a slug from the tracking carriers endpoint. Left blank, it is detected from the number's format where possible."
29
+ body.attribute :selected_delivery_rate_id, :id, only: :update
30
+ body.attribute :delivery_method_id, :id,
31
+ only: :create,
32
+ description: 'Delivery method attached as the selected rate. Defaults to the delivery method of the fully drained source fulfillments.'
33
+ body.attribute :cost, :decimal,
34
+ only: :create,
35
+ example: '7.42',
36
+ description: 'Explicit shipping cost, such as the 3PL price. Defaults to the summed cost of the fully drained source fulfillments, which keeps the order total unchanged. Persists only with `status: shipped`; pending fulfillments are re-priced by the rate engine.'
37
+ body.attribute :status, :string,
38
+ only: :create,
39
+ choices: %w[shipped],
40
+ description: 'Pass `shipped` to register an already-shipped external fulfillment.'
41
+ body.attribute :metadata, :hash, only: :create
42
+ body.attribute :items, :array,
43
+ only: :create,
44
+ description: 'Line item quantities to fulfill. Omit to fulfill every unit not yet shipped.' do |item|
45
+ item.attribute :item_id, :id, required: true
46
+ item.attribute :quantity, :integer, required: true
47
+ end
48
+ end
49
+
50
+ request_params 'FulfillmentFulfillParams', action: :fulfill do |body|
51
+ body.attribute :items, :array,
52
+ description: 'Line item quantities to ship. Omit to ship everything the fulfillment holds; a subset is split onto a new fulfillment, which is the one that ships.' do |item|
53
+ item.attribute :item_id, :id, required: true
54
+ item.attribute :quantity, :integer, required: true
55
+ end
56
+ body.attribute :tracking, :string,
57
+ description: 'Carrier tracking number or a full `https://` tracking link, stored on the fulfillment that ships.'
58
+ body.attribute :tracking_carrier, :string,
59
+ description: 'Which carrier the number belongs to; detected from the number when omitted.'
60
+ body.attribute :notify_customer, :boolean,
61
+ description: 'Whether the customer gets the shipment email. Defaults to true; pass false to suppress it for this dispatch only.'
62
+ body.attribute :force, :boolean,
63
+ description: 'Hand the goods over even though the order is unpaid or holds backordered units.'
64
+ end
65
+
66
+ request_params 'FulfillmentMarkDeliveredParams', action: :mark_delivered do |body|
67
+ body.attribute :delivered_at, :datetime,
68
+ description: 'When it arrived. Defaults to now; return windows run from this time.'
69
+ body.attribute :notify_customer, :boolean,
70
+ description: 'Whether the customer gets a delivery notification. Defaults to true.'
71
+ end
72
+
73
+ request_params 'FulfillmentSplitParams', action: :split do |body|
74
+ body.attribute :variant_id, :id, required: true, description: 'The variant being moved out.'
75
+ body.attribute :quantity, :integer, required: true
76
+ body.attribute :stock_location_id, :id,
77
+ description: "Origin of the new fulfillment. Defaults to the source fulfillment's location."
78
+ end
79
+
17
80
  before_action :set_resource, only: [:show, :update, :fulfill, :mark_delivered, :cancel, :split]
18
81
 
19
82
  # POST /api/v3/admin/orders/:order_id/fulfillments
@@ -74,16 +137,12 @@ module Spree
74
137
  end
75
138
 
76
139
  def permitted_params
77
- params.permit(:tracking, :tracking_carrier, :selected_delivery_rate_id, :stock_location_id)
140
+ params.permit(*permitted_attributes)
78
141
  end
79
142
 
80
143
  private
81
144
 
82
145
  # Forcing past a stock or payment guard is the operator's call.
83
- def fulfill_permitted_keys
84
- super + [:force]
85
- end
86
-
87
146
  def fulfill_workflow_options
88
147
  { force: fulfill_params[:force].to_b }
89
148
  end
@@ -101,11 +160,11 @@ module Spree
101
160
  end
102
161
 
103
162
  def create_params
104
- @create_params ||= params.permit(:stock_location_id, :source_fulfillment_id, :tracking, :delivery_method_id, :cost, :status, metadata: {}, items: [:item_id, :quantity])
163
+ @create_params ||= params.permit(*declared_permitted_attributes)
105
164
  end
106
165
 
107
166
  def mark_delivered_params
108
- @mark_delivered_params ||= params.permit(:delivered_at, :notify_customer)
167
+ @mark_delivered_params ||= params.permit(*declared_permitted_attributes)
109
168
  end
110
169
 
111
170
  def find_stock_location!(id)
@@ -6,9 +6,13 @@ module Spree
6
6
  class GiftCardsController < BaseController
7
7
  skip_before_action :set_resource, raise: false
8
8
 
9
+ request_params 'GiftCardApplyParams' do |body|
10
+ body.attribute :code, :string,
11
+ required: true,
12
+ description: 'The gift card code; matched case-insensitively.'
13
+ end
14
+
9
15
  # POST /api/v3/admin/orders/:order_id/gift_cards
10
- #
11
- # Body: { code: String }
12
16
  def create
13
17
  with_order_lock do
14
18
  gift_card = find_gift_card!