spree_api 6.0.0.rc1 → 6.0.0.rc2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (370) 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/strict_money_params.rb +94 -0
  23. data/app/controllers/spree/api/v3/admin/admin_users_controller.rb +10 -1
  24. data/app/controllers/spree/api/v3/admin/allowed_origins_controller.rb +8 -1
  25. data/app/controllers/spree/api/v3/admin/api_keys_controller.rb +15 -7
  26. data/app/controllers/spree/api/v3/admin/base_controller.rb +1 -0
  27. data/app/controllers/spree/api/v3/admin/catalogs/order_minimums_controller.rb +3 -1
  28. data/app/controllers/spree/api/v3/admin/catalogs/quantity_rules_controller.rb +7 -5
  29. data/app/controllers/spree/api/v3/admin/catalogs_controller.rb +60 -33
  30. data/app/controllers/spree/api/v3/admin/categories/products_controller.rb +4 -1
  31. data/app/controllers/spree/api/v3/admin/categories_controller.rb +40 -20
  32. data/app/controllers/spree/api/v3/admin/channels_controller.rb +39 -6
  33. data/app/controllers/spree/api/v3/admin/claim_reasons_controller.rb +5 -1
  34. data/app/controllers/spree/api/v3/admin/collections/products_controller.rb +4 -1
  35. data/app/controllers/spree/api/v3/admin/collections_controller.rb +44 -15
  36. data/app/controllers/spree/api/v3/admin/commission_rates_controller.rb +60 -12
  37. data/app/controllers/spree/api/v3/admin/companies/addresses_controller.rb +11 -0
  38. data/app/controllers/spree/api/v3/admin/companies/memberships_controller.rb +9 -1
  39. data/app/controllers/spree/api/v3/admin/companies/tax_exemption_certificates_controller.rb +19 -18
  40. data/app/controllers/spree/api/v3/admin/companies/tax_identifiers_controller.rb +6 -1
  41. data/app/controllers/spree/api/v3/admin/companies_controller.rb +17 -3
  42. data/app/controllers/spree/api/v3/admin/countries_controller.rb +5 -1
  43. data/app/controllers/spree/api/v3/admin/custom_field_definitions_controller.rb +21 -11
  44. data/app/controllers/spree/api/v3/admin/custom_fields_controller.rb +12 -5
  45. data/app/controllers/spree/api/v3/admin/customer_groups_controller.rb +9 -1
  46. data/app/controllers/spree/api/v3/admin/customers/addresses_controller.rb +12 -7
  47. data/app/controllers/spree/api/v3/admin/customers/store_credits_controller.rb +11 -9
  48. data/app/controllers/spree/api/v3/admin/customers/tax_identifiers_controller.rb +6 -1
  49. data/app/controllers/spree/api/v3/admin/customers_controller.rb +35 -7
  50. data/app/controllers/spree/api/v3/admin/data_requests_controller.rb +8 -0
  51. data/app/controllers/spree/api/v3/admin/delivery_method_rules_controller.rb +1 -1
  52. data/app/controllers/spree/api/v3/admin/delivery_methods/rules_controller.rb +15 -7
  53. data/app/controllers/spree/api/v3/admin/delivery_methods_controller.rb +92 -57
  54. data/app/controllers/spree/api/v3/admin/delivery_profiles/origin_groups_controller.rb +8 -1
  55. data/app/controllers/spree/api/v3/admin/delivery_profiles_controller.rb +13 -1
  56. data/app/controllers/spree/api/v3/admin/delivery_zones_controller.rb +21 -5
  57. data/app/controllers/spree/api/v3/admin/email_templates/drafts_controller.rb +14 -1
  58. data/app/controllers/spree/api/v3/admin/email_templates/previews_controller.rb +4 -0
  59. data/app/controllers/spree/api/v3/admin/email_templates/publications_controller.rb +7 -0
  60. data/app/controllers/spree/api/v3/admin/email_templates/restorations_controller.rb +8 -0
  61. data/app/controllers/spree/api/v3/admin/email_templates/test_emails_controller.rb +4 -0
  62. data/app/controllers/spree/api/v3/admin/exports_controller.rb +23 -6
  63. data/app/controllers/spree/api/v3/admin/files_controller.rb +29 -0
  64. data/app/controllers/spree/api/v3/admin/gift_card_batches_controller.rb +20 -1
  65. data/app/controllers/spree/api/v3/admin/gift_cards_controller.rb +19 -1
  66. data/app/controllers/spree/api/v3/admin/imports_controller.rb +36 -9
  67. data/app/controllers/spree/api/v3/admin/integrations_controller.rb +13 -1
  68. data/app/controllers/spree/api/v3/admin/invitation_acceptances_controller.rb +9 -2
  69. data/app/controllers/spree/api/v3/admin/invitations_controller.rb +8 -1
  70. data/app/controllers/spree/api/v3/admin/locales_controller.rb +1 -1
  71. data/app/controllers/spree/api/v3/admin/markets_controller.rb +30 -9
  72. data/app/controllers/spree/api/v3/admin/me_controller.rb +12 -3
  73. data/app/controllers/spree/api/v3/admin/media_controller.rb +22 -9
  74. data/app/controllers/spree/api/v3/admin/media_library_controller.rb +4 -0
  75. data/app/controllers/spree/api/v3/admin/option_types_controller.rb +24 -7
  76. data/app/controllers/spree/api/v3/admin/order_cancellation_reasons_controller.rb +5 -1
  77. data/app/controllers/spree/api/v3/admin/order_routing_rules_controller.rb +13 -1
  78. data/app/controllers/spree/api/v3/admin/orders/claims_controller.rb +39 -1
  79. data/app/controllers/spree/api/v3/admin/orders/deliveries_controller.rb +19 -1
  80. data/app/controllers/spree/api/v3/admin/orders/discount_codes_controller.rb +5 -1
  81. data/app/controllers/spree/api/v3/admin/orders/discounts_controller.rb +29 -5
  82. data/app/controllers/spree/api/v3/admin/orders/exchanges_controller.rb +36 -1
  83. data/app/controllers/spree/api/v3/admin/orders/fees_controller.rb +22 -1
  84. data/app/controllers/spree/api/v3/admin/orders/fulfillments_controller.rb +66 -7
  85. data/app/controllers/spree/api/v3/admin/orders/gift_cards_controller.rb +6 -2
  86. data/app/controllers/spree/api/v3/admin/orders/items_controller.rb +11 -1
  87. data/app/controllers/spree/api/v3/admin/orders/labels_controller.rb +35 -2
  88. data/app/controllers/spree/api/v3/admin/orders/payments_controller.rb +16 -5
  89. data/app/controllers/spree/api/v3/admin/orders/refunds_controller.rb +6 -0
  90. data/app/controllers/spree/api/v3/admin/orders/returns_controller.rb +37 -1
  91. data/app/controllers/spree/api/v3/admin/orders/store_credits_controller.rb +6 -3
  92. data/app/controllers/spree/api/v3/admin/orders_controller.rb +74 -60
  93. data/app/controllers/spree/api/v3/admin/package_types_controller.rb +30 -5
  94. data/app/controllers/spree/api/v3/admin/password_resets_controller.rb +17 -0
  95. data/app/controllers/spree/api/v3/admin/payment_methods_controller.rb +38 -22
  96. data/app/controllers/spree/api/v3/admin/policies_controller.rb +8 -4
  97. data/app/controllers/spree/api/v3/admin/price_lists_controller.rb +27 -15
  98. data/app/controllers/spree/api/v3/admin/prices_controller.rb +51 -4
  99. data/app/controllers/spree/api/v3/admin/product_types_controller.rb +25 -8
  100. data/app/controllers/spree/api/v3/admin/products/digital_assets_controller.rb +27 -10
  101. data/app/controllers/spree/api/v3/admin/products/variants_controller.rb +9 -14
  102. data/app/controllers/spree/api/v3/admin/products_controller.rb +121 -70
  103. data/app/controllers/spree/api/v3/admin/promotion_actions_controller.rb +11 -2
  104. data/app/controllers/spree/api/v3/admin/promotion_rules_controller.rb +10 -1
  105. data/app/controllers/spree/api/v3/admin/promotions_controller.rb +50 -14
  106. data/app/controllers/spree/api/v3/admin/purchase_orders_controller.rb +54 -7
  107. data/app/controllers/spree/api/v3/admin/refund_reasons_controller.rb +5 -1
  108. data/app/controllers/spree/api/v3/admin/reporting/saved_reports_controller.rb +9 -1
  109. data/app/controllers/spree/api/v3/admin/reporting_controller.rb +34 -0
  110. data/app/controllers/spree/api/v3/admin/resource_controller.rb +1 -0
  111. data/app/controllers/spree/api/v3/admin/return_reasons_controller.rb +5 -1
  112. data/app/controllers/spree/api/v3/admin/roles_controller.rb +13 -1
  113. data/app/controllers/spree/api/v3/admin/seller_payouts_controller.rb +6 -0
  114. data/app/controllers/spree/api/v3/admin/seller_requirement_submissions_controller.rb +15 -0
  115. data/app/controllers/spree/api/v3/admin/seller_requirements_controller.rb +32 -6
  116. data/app/controllers/spree/api/v3/admin/sellers_controller.rb +75 -22
  117. data/app/controllers/spree/api/v3/admin/setup_controller.rb +54 -15
  118. data/app/controllers/spree/api/v3/admin/stock_levels_controller.rb +38 -9
  119. data/app/controllers/spree/api/v3/admin/stock_locations_controller.rb +41 -9
  120. data/app/controllers/spree/api/v3/admin/stock_transfers_controller.rb +48 -7
  121. data/app/controllers/spree/api/v3/admin/store_controller.rb +122 -53
  122. data/app/controllers/spree/api/v3/admin/store_credits_controller.rb +1 -7
  123. data/app/controllers/spree/api/v3/admin/suppliers_controller.rb +16 -6
  124. data/app/controllers/spree/api/v3/admin/tax_categories_controller.rb +7 -4
  125. data/app/controllers/spree/api/v3/admin/tax_rates_controller.rb +21 -3
  126. data/app/controllers/spree/api/v3/admin/tracking_carriers_controller.rb +4 -0
  127. data/app/controllers/spree/api/v3/admin/translations/batches_controller.rb +17 -9
  128. data/app/controllers/spree/api/v3/admin/translations_controller.rb +4 -0
  129. data/app/controllers/spree/api/v3/admin/translations_coverage_controller.rb +5 -0
  130. data/app/controllers/spree/api/v3/admin/updates_controller.rb +39 -0
  131. data/app/controllers/spree/api/v3/admin/webhook_endpoints_controller.rb +23 -1
  132. data/app/controllers/spree/api/v3/base_controller.rb +2 -0
  133. data/app/controllers/spree/api/v3/resource_controller.rb +63 -10
  134. data/app/controllers/spree/api/v3/seller/auth_controller.rb +8 -0
  135. data/app/controllers/spree/api/v3/seller/base_controller.rb +1 -0
  136. data/app/controllers/spree/api/v3/seller/countries_controller.rb +2 -2
  137. data/app/controllers/spree/api/v3/seller/delivery_methods_controller.rb +49 -60
  138. data/app/controllers/spree/api/v3/seller/exports_controller.rb +18 -1
  139. data/app/controllers/spree/api/v3/seller/files_controller.rb +27 -0
  140. data/app/controllers/spree/api/v3/seller/imports_controller.rb +25 -9
  141. data/app/controllers/spree/api/v3/seller/invitation_acceptances_controller.rb +9 -1
  142. data/app/controllers/spree/api/v3/seller/me_controller.rb +14 -3
  143. data/app/controllers/spree/api/v3/seller/onboarding_controller.rb +11 -0
  144. data/app/controllers/spree/api/v3/seller/orders/claims_controller.rb +35 -0
  145. data/app/controllers/spree/api/v3/seller/orders/deliveries_controller.rb +12 -0
  146. data/app/controllers/spree/api/v3/seller/orders/exchanges_controller.rb +33 -0
  147. data/app/controllers/spree/api/v3/seller/orders/fulfillments_controller.rb +28 -2
  148. data/app/controllers/spree/api/v3/seller/orders/labels_controller.rb +22 -1
  149. data/app/controllers/spree/api/v3/seller/orders/notes_controller.rb +8 -1
  150. data/app/controllers/spree/api/v3/seller/orders/returns_controller.rb +32 -0
  151. data/app/controllers/spree/api/v3/seller/orders_controller.rb +35 -14
  152. data/app/controllers/spree/api/v3/seller/package_types_controller.rb +21 -9
  153. data/app/controllers/spree/api/v3/seller/password_resets_controller.rb +10 -0
  154. data/app/controllers/spree/api/v3/seller/policies_controller.rb +12 -4
  155. data/app/controllers/spree/api/v3/seller/products_controller.rb +114 -28
  156. data/app/controllers/spree/api/v3/seller/profile_controller.rb +33 -10
  157. data/app/controllers/spree/api/v3/seller/requirement_submissions_controller.rb +12 -5
  158. data/app/controllers/spree/api/v3/seller/resource_controller.rb +12 -0
  159. data/app/controllers/spree/api/v3/seller/stock_locations_controller.rb +44 -13
  160. data/app/controllers/spree/api/v3/seller/tax_identifiers_controller.rb +10 -1
  161. data/app/controllers/spree/api/v3/seller/team_controller.rb +4 -0
  162. data/app/controllers/spree/api/v3/store/auth_controller.rb +10 -0
  163. data/app/controllers/spree/api/v3/store/carts/discount_codes_controller.rb +8 -1
  164. data/app/controllers/spree/api/v3/store/carts/fulfillments_controller.rb +10 -2
  165. data/app/controllers/spree/api/v3/store/carts/gift_cards_controller.rb +8 -1
  166. data/app/controllers/spree/api/v3/store/carts/items_controller.rb +17 -5
  167. data/app/controllers/spree/api/v3/store/carts/payment_sessions_controller.rb +20 -6
  168. data/app/controllers/spree/api/v3/store/carts/payments_controller.rb +11 -0
  169. data/app/controllers/spree/api/v3/store/carts/po_documents_controller.rb +24 -26
  170. data/app/controllers/spree/api/v3/store/carts/store_credits_controller.rb +7 -1
  171. data/app/controllers/spree/api/v3/store/carts/tax_identifiers_controller.rb +5 -1
  172. data/app/controllers/spree/api/v3/store/carts_controller.rb +56 -47
  173. data/app/controllers/spree/api/v3/store/companies/addresses_controller.rb +12 -4
  174. data/app/controllers/spree/api/v3/store/companies/members_controller.rb +4 -0
  175. data/app/controllers/spree/api/v3/store/companies_controller.rb +5 -1
  176. data/app/controllers/spree/api/v3/store/company_invitations_controller.rb +9 -1
  177. data/app/controllers/spree/api/v3/store/customer/addresses_controller.rb +8 -7
  178. data/app/controllers/spree/api/v3/store/customer/data_requests_controller.rb +5 -0
  179. data/app/controllers/spree/api/v3/store/customer/password_resets_controller.rb +17 -0
  180. data/app/controllers/spree/api/v3/store/customer/payment_setup_sessions_controller.rb +10 -5
  181. data/app/controllers/spree/api/v3/store/customer/tax_identifiers_controller.rb +5 -1
  182. data/app/controllers/spree/api/v3/store/customers_controller.rb +28 -2
  183. data/app/controllers/spree/api/v3/store/newsletter_subscribers_controller.rb +22 -0
  184. data/app/controllers/spree/api/v3/store/orders/claims_controller.rb +11 -2
  185. data/app/controllers/spree/api/v3/store/orders/returns_controller.rb +10 -1
  186. data/app/controllers/spree/api/v3/store/orders_controller.rb +47 -10
  187. data/app/controllers/spree/api/v3/store/products_controller.rb +8 -0
  188. data/app/controllers/spree/api/v3/store/wishlist_items_controller.rb +10 -4
  189. data/app/controllers/spree/api/v3/store/wishlists_controller.rb +12 -4
  190. data/app/request_schemas/spree/api/v3/address_request_schema.rb +27 -0
  191. data/app/request_schemas/spree/api/v3/admin/address_request_schema.rb +13 -0
  192. data/app/request_schemas/spree/api/v3/admin/bulk_tags_request_schema.rb +17 -0
  193. data/app/request_schemas/spree/api/v3/admin/catalog_order_minimum_request_schema.rb +17 -0
  194. data/app/request_schemas/spree/api/v3/admin/email_template_language_request_schema.rb +17 -0
  195. data/app/request_schemas/spree/api/v3/admin/email_template_preview_request_schema.rb +32 -0
  196. data/app/request_schemas/spree/api/v3/admin/price_adjustment_tier_request_schema.rb +21 -0
  197. data/app/request_schemas/spree/api/v3/admin/price_list_price_request_schema.rb +21 -0
  198. data/app/request_schemas/spree/api/v3/admin/price_list_rule_request_schema.rb +19 -0
  199. data/app/request_schemas/spree/api/v3/admin/product_membership_reposition_request_schema.rb +17 -0
  200. data/app/request_schemas/spree/api/v3/admin/promotion_action_calculator_request_schema.rb +18 -0
  201. data/app/request_schemas/spree/api/v3/admin/promotion_action_line_item_request_schema.rb +15 -0
  202. data/app/request_schemas/spree/api/v3/admin/promotion_action_request_schema.rb +19 -0
  203. data/app/request_schemas/spree/api/v3/admin/promotion_rule_request_schema.rb +22 -0
  204. data/app/request_schemas/spree/api/v3/admin/reason_request_schema.rb +14 -0
  205. data/app/request_schemas/spree/api/v3/admin/tax_identifier_request_schema.rb +15 -0
  206. data/app/request_schemas/spree/api/v3/custom_field_value_request_schema.rb +15 -0
  207. data/app/request_schemas/spree/api/v3/file_upload_request_schema.rb +20 -0
  208. data/app/request_schemas/spree/api/v3/media_request_schema.rb +27 -0
  209. data/app/request_schemas/spree/api/v3/price_request_schema.rb +17 -0
  210. data/app/request_schemas/spree/api/v3/stock_level_request_schema.rb +18 -0
  211. data/app/request_schemas/spree/api/v3/store/address_request_schema.rb +29 -0
  212. data/app/request_schemas/spree/api/v3/tax_identifier_request_schema.rb +18 -0
  213. data/app/request_schemas/spree/api/v3/variant_option_request_schema.rb +13 -0
  214. data/app/request_schemas/spree/api/v3/variant_request_schema.rb +52 -0
  215. data/app/serializers/concerns/spree/api/v3/purchase_summary.rb +48 -0
  216. data/app/serializers/spree/api/v3/address_serializer.rb +4 -2
  217. data/app/serializers/spree/api/v3/admin/address_serializer.rb +3 -0
  218. data/app/serializers/spree/api/v3/admin/applied_promotion_serializer.rb +3 -1
  219. data/app/serializers/spree/api/v3/admin/cart_serializer.rb +3 -1
  220. data/app/serializers/spree/api/v3/admin/catalog_order_minimum_serializer.rb +3 -2
  221. data/app/serializers/spree/api/v3/admin/catalog_price_serializer.rb +3 -4
  222. data/app/serializers/spree/api/v3/admin/catalog_price_tier_serializer.rb +4 -3
  223. data/app/serializers/spree/api/v3/admin/channel_serializer.rb +5 -7
  224. data/app/serializers/spree/api/v3/admin/claim_line_item_serializer.rb +7 -0
  225. data/app/serializers/spree/api/v3/admin/claim_serializer.rb +5 -0
  226. data/app/serializers/spree/api/v3/admin/commission_line_serializer.rb +7 -18
  227. data/app/serializers/spree/api/v3/admin/commission_rate_serializer.rb +7 -11
  228. data/app/serializers/spree/api/v3/admin/commission_rule_serializer.rb +0 -2
  229. data/app/serializers/spree/api/v3/admin/country_serializer.rb +4 -0
  230. data/app/serializers/spree/api/v3/admin/customer_serializer.rb +3 -7
  231. data/app/serializers/spree/api/v3/admin/delivery_method_rule_serializer.rb +0 -2
  232. data/app/serializers/spree/api/v3/admin/delivery_method_serializer.rb +14 -10
  233. data/app/serializers/spree/api/v3/admin/delivery_method_service_serializer.rb +9 -1
  234. data/app/serializers/spree/api/v3/admin/delivery_rate_serializer.rb +8 -0
  235. data/app/serializers/spree/api/v3/admin/discount_serializer.rb +3 -1
  236. data/app/serializers/spree/api/v3/admin/exchange_line_item_serializer.rb +5 -0
  237. data/app/serializers/spree/api/v3/admin/exchange_serializer.rb +5 -0
  238. data/app/serializers/spree/api/v3/admin/fee_serializer.rb +3 -1
  239. data/app/serializers/spree/api/v3/admin/file_upload_serializer.rb +11 -0
  240. data/app/serializers/spree/api/v3/admin/file_upload_target_serializer.rb +10 -0
  241. data/app/serializers/spree/api/v3/admin/fulfillment_serializer.rb +13 -11
  242. data/app/serializers/spree/api/v3/admin/gift_card_serializer.rb +3 -3
  243. data/app/serializers/spree/api/v3/admin/import_serializer.rb +2 -2
  244. data/app/serializers/spree/api/v3/admin/integration_serializer.rb +1 -3
  245. data/app/serializers/spree/api/v3/admin/line_item_serializer.rb +12 -12
  246. data/app/serializers/spree/api/v3/admin/locale_serializer.rb +13 -0
  247. data/app/serializers/spree/api/v3/admin/market_serializer.rb +3 -0
  248. data/app/serializers/spree/api/v3/admin/media_serializer.rb +3 -2
  249. data/app/serializers/spree/api/v3/admin/order_group_serializer.rb +2 -0
  250. data/app/serializers/spree/api/v3/admin/order_routing_rule_serializer.rb +1 -3
  251. data/app/serializers/spree/api/v3/admin/order_serializer.rb +33 -33
  252. data/app/serializers/spree/api/v3/admin/payment_method_serializer.rb +1 -4
  253. data/app/serializers/spree/api/v3/admin/payment_serializer.rb +6 -3
  254. data/app/serializers/spree/api/v3/admin/payment_split_serializer.rb +8 -9
  255. data/app/serializers/spree/api/v3/admin/price_adjustment_tier_serializer.rb +3 -6
  256. data/app/serializers/spree/api/v3/admin/price_history_serializer.rb +5 -2
  257. data/app/serializers/spree/api/v3/admin/price_list_serializer.rb +1 -5
  258. data/app/serializers/spree/api/v3/admin/price_rule_serializer.rb +1 -3
  259. data/app/serializers/spree/api/v3/admin/price_serializer.rb +2 -0
  260. data/app/serializers/spree/api/v3/admin/product_serializer.rb +2 -0
  261. data/app/serializers/spree/api/v3/admin/promotion_action_serializer.rb +4 -6
  262. data/app/serializers/spree/api/v3/admin/promotion_rule_serializer.rb +0 -2
  263. data/app/serializers/spree/api/v3/admin/purchase_order_item_serializer.rb +5 -11
  264. data/app/serializers/spree/api/v3/admin/purchase_order_serializer.rb +4 -4
  265. data/app/serializers/spree/api/v3/admin/refund_serializer.rb +7 -3
  266. data/app/serializers/spree/api/v3/admin/reporting_result_serializer.rb +9 -2
  267. data/app/serializers/spree/api/v3/admin/return_line_item_serializer.rb +8 -0
  268. data/app/serializers/spree/api/v3/admin/return_serializer.rb +8 -4
  269. data/app/serializers/spree/api/v3/admin/seller_balance_serializer.rb +15 -10
  270. data/app/serializers/spree/api/v3/admin/seller_payout_serializer.rb +3 -5
  271. data/app/serializers/spree/api/v3/admin/seller_serializer.rb +3 -1
  272. data/app/serializers/spree/api/v3/admin/seller_transfer_serializer.rb +7 -8
  273. data/app/serializers/spree/api/v3/admin/shipping_label_serializer.rb +4 -4
  274. data/app/serializers/spree/api/v3/admin/stock_location_serializer.rb +3 -0
  275. data/app/serializers/spree/api/v3/admin/stock_movement_serializer.rb +2 -6
  276. data/app/serializers/spree/api/v3/admin/store_credit_event_serializer.rb +5 -0
  277. data/app/serializers/spree/api/v3/admin/store_credit_serializer.rb +9 -4
  278. data/app/serializers/spree/api/v3/admin/store_serializer.rb +17 -98
  279. data/app/serializers/spree/api/v3/admin/supplier_serializer.rb +1 -1
  280. data/app/serializers/spree/api/v3/admin/tax_exemption_certificate_serializer.rb +3 -1
  281. data/app/serializers/spree/api/v3/admin/tax_line_serializer.rb +4 -2
  282. data/app/serializers/spree/api/v3/admin/tax_rate_serializer.rb +2 -12
  283. data/app/serializers/spree/api/v3/admin/update_status_serializer.rb +28 -0
  284. data/app/serializers/spree/api/v3/admin/variant_serializer.rb +7 -3
  285. data/app/serializers/spree/api/v3/base_serializer.rb +112 -7
  286. data/app/serializers/spree/api/v3/cart_serializer.rb +11 -29
  287. data/app/serializers/spree/api/v3/claim_line_item_serializer.rb +5 -13
  288. data/app/serializers/spree/api/v3/claim_serializer.rb +2 -3
  289. data/app/serializers/spree/api/v3/country_serializer.rb +2 -1
  290. data/app/serializers/spree/api/v3/currency_serializer.rb +9 -1
  291. data/app/serializers/spree/api/v3/customer_serializer.rb +3 -2
  292. data/app/serializers/spree/api/v3/delivery_rate_serializer.rb +8 -12
  293. data/app/serializers/spree/api/v3/delivery_zone_member_serializer.rb +1 -1
  294. data/app/serializers/spree/api/v3/discount_serializer.rb +4 -1
  295. data/app/serializers/spree/api/v3/exchange_line_item_serializer.rb +2 -8
  296. data/app/serializers/spree/api/v3/exchange_serializer.rb +2 -3
  297. data/app/serializers/spree/api/v3/file_upload_serializer.rb +28 -0
  298. data/app/serializers/spree/api/v3/file_upload_target_serializer.rb +17 -0
  299. data/app/serializers/spree/api/v3/gift_card_batch_serializer.rb +2 -4
  300. data/app/serializers/spree/api/v3/gift_card_serializer.rb +4 -2
  301. data/app/serializers/spree/api/v3/import_serializer.rb +0 -12
  302. data/app/serializers/spree/api/v3/line_item_serializer.rb +15 -5
  303. data/app/serializers/spree/api/v3/locale_serializer.rb +3 -1
  304. data/app/serializers/spree/api/v3/market_serializer.rb +5 -5
  305. data/app/serializers/spree/api/v3/media_serializer.rb +7 -2
  306. data/app/serializers/spree/api/v3/order_group_serializer.rb +12 -4
  307. data/app/serializers/spree/api/v3/order_serializer.rb +5 -23
  308. data/app/serializers/spree/api/v3/payment_session_serializer.rb +2 -4
  309. data/app/serializers/spree/api/v3/price_history_serializer.rb +5 -5
  310. data/app/serializers/spree/api/v3/price_serializer.rb +6 -9
  311. data/app/serializers/spree/api/v3/product_filter_price_range_serializer.rb +10 -4
  312. data/app/serializers/spree/api/v3/product_serializer.rb +3 -3
  313. data/app/serializers/spree/api/v3/refund_serializer.rb +8 -5
  314. data/app/serializers/spree/api/v3/return_line_item_serializer.rb +3 -11
  315. data/app/serializers/spree/api/v3/return_serializer.rb +3 -6
  316. data/app/serializers/spree/api/v3/seller/address_serializer.rb +12 -0
  317. data/app/serializers/spree/api/v3/seller/balance_serializer.rb +15 -10
  318. data/app/serializers/spree/api/v3/seller/claim_line_item_serializer.rb +7 -0
  319. data/app/serializers/spree/api/v3/seller/claim_serializer.rb +5 -0
  320. data/app/serializers/spree/api/v3/seller/country_serializer.rb +19 -0
  321. data/app/serializers/spree/api/v3/seller/delivery_method_rule_serializer.rb +1 -3
  322. data/app/serializers/spree/api/v3/seller/delivery_method_serializer.rb +4 -8
  323. data/app/serializers/spree/api/v3/seller/delivery_rate_serializer.rb +9 -8
  324. data/app/serializers/spree/api/v3/seller/exchange_line_item_serializer.rb +5 -0
  325. data/app/serializers/spree/api/v3/seller/exchange_serializer.rb +5 -0
  326. data/app/serializers/spree/api/v3/seller/file_upload_serializer.rb +11 -0
  327. data/app/serializers/spree/api/v3/seller/file_upload_target_serializer.rb +10 -0
  328. data/app/serializers/spree/api/v3/seller/import_serializer.rb +2 -2
  329. data/app/serializers/spree/api/v3/seller/media_serializer.rb +2 -5
  330. data/app/serializers/spree/api/v3/seller/order_line_item_serializer.rb +4 -3
  331. data/app/serializers/spree/api/v3/seller/order_serializer.rb +16 -16
  332. data/app/serializers/spree/api/v3/seller/payment_split_serializer.rb +8 -9
  333. data/app/serializers/spree/api/v3/seller/payout_serializer.rb +2 -4
  334. data/app/serializers/spree/api/v3/seller/price_history_serializer.rb +11 -0
  335. data/app/serializers/spree/api/v3/seller/price_serializer.rb +11 -0
  336. data/app/serializers/spree/api/v3/seller/product_serializer.rb +2 -0
  337. data/app/serializers/spree/api/v3/seller/profile_serializer.rb +7 -7
  338. data/app/serializers/spree/api/v3/seller/return_line_item_serializer.rb +8 -0
  339. data/app/serializers/spree/api/v3/seller/return_serializer.rb +8 -5
  340. data/app/serializers/spree/api/v3/seller/state_serializer.rb +10 -0
  341. data/app/serializers/spree/api/v3/seller/stock_location_serializer.rb +3 -0
  342. data/app/serializers/spree/api/v3/seller/transfer_serializer.rb +6 -7
  343. data/app/serializers/spree/api/v3/seller/variant_serializer.rb +8 -4
  344. data/app/serializers/spree/api/v3/stock_location_serializer.rb +8 -1
  345. data/app/serializers/spree/api/v3/store_credit_event_serializer.rb +1 -3
  346. data/app/serializers/spree/api/v3/store_credit_serializer.rb +3 -5
  347. data/app/serializers/spree/api/v3/tax_line_serializer.rb +2 -4
  348. data/app/serializers/spree/api/v3/variant_serializer.rb +3 -3
  349. data/app/services/spree/api/v3/filter_predicates.rb +29 -0
  350. data/app/services/spree/api/v3/filter_table.rb +337 -0
  351. data/app/services/spree/api/v3/filters_aggregator.rb +2 -2
  352. data/app/services/spree/api/v3/request_schema.rb +430 -0
  353. data/app/services/spree/webhooks/deliver_webhook.rb +7 -3
  354. data/config/initializers/typelizer.rb +1 -1
  355. data/config/routes.rb +5 -3
  356. data/lib/spree/api/configuration.rb +5 -0
  357. data/lib/spree/api/dependencies.rb +7 -6
  358. data/lib/spree/api/middleware/request_size_limit.rb +24 -3
  359. data/lib/spree/api/openapi/filter_documentation.rb +136 -0
  360. data/lib/spree/api/openapi/schema_helper.rb +126 -80
  361. data/lib/spree/api/preference_families.rb +46 -0
  362. data/lib/spree/api/preference_types.rb +138 -0
  363. data/lib/spree/api/typelizer_generation.rb +4 -0
  364. data/lib/tasks/filters.rake +12 -0
  365. data/lib/typelizer/open_enums.rb +10 -0
  366. metadata +60 -10
  367. data/app/controllers/concerns/spree/api/v3/address_params.rb +0 -17
  368. data/app/controllers/concerns/spree/api/v3/direct_uploads.rb +0 -35
  369. data/app/controllers/spree/api/v3/admin/direct_uploads_controller.rb +0 -54
  370. data/app/controllers/spree/api/v3/seller/direct_uploads_controller.rb +0 -21
@@ -21,6 +21,39 @@ module Spree
21
21
 
22
22
  scoped_resource :orders
23
23
 
24
+ ADDRESS = Spree::Api::V3::RequestSchema.shape('OrderAddressParams') do |schema|
25
+ schema.attribute :first_name, :string
26
+ schema.attribute :last_name, :string
27
+ schema.attribute :address1, :string
28
+ schema.attribute :city, :string
29
+ schema.attribute :postal_code, :string
30
+ schema.attribute :company, :string, nullable: true
31
+ schema.attribute :address2, :string, nullable: true
32
+ schema.attribute :phone, :string, nullable: true
33
+ schema.attribute :alternative_phone, :string, nullable: true
34
+ schema.attribute :state_code, :string, nullable: true
35
+ schema.attribute :state_name, :string, nullable: true
36
+ schema.attribute :label, :string, nullable: true
37
+ schema.attribute :country_code, :country, example: 'US'
38
+ end
39
+
40
+ request_params 'OrderCancelParams', action: :cancel do |body|
41
+ body.attribute :cancel_reason_id, :id,
42
+ nullable: true,
43
+ description: 'A reason from the order cancellation reasons endpoint.'
44
+ body.attribute :cancel_note, :string, nullable: true, description: 'Free text beside the reason.'
45
+ body.attribute :refund_payments, :boolean,
46
+ description: "Hand back what the buyer paid for this order's goods."
47
+ body.attribute :notify_customer, :boolean, description: 'Email the customer about the cancellation.'
48
+ end
49
+
50
+ request_params 'OrderAddressCorrectionParams', action: :address do |body|
51
+ body.attribute :shipping_address, :object, shape: ADDRESS,
52
+ description: 'Only the lines that change; the rest of the address is carried over.'
53
+ body.attribute :billing_address, :object, shape: ADDRESS,
54
+ description: 'Only the lines that change; the rest of the address is carried over.'
55
+ end
56
+
24
57
  before_action :set_resource, only: [:show, :cancel, :address]
25
58
 
26
59
  # PATCH /api/v3/seller/orders/:id/cancel
@@ -124,10 +157,8 @@ module Spree
124
157
  # files the address in their book and makes it their default for
125
158
  # every later checkout on the marketplace.
126
159
  def sent_addresses
127
- @sent_addresses ||= params.permit(
128
- shipping_address: address_permitted_keys,
129
- billing_address: address_permitted_keys
130
- ).slice(:shipping_address, :billing_address).reject { |_key, value| value.blank? }
160
+ @sent_addresses ||= params.permit(*declared_permitted_attributes).
161
+ slice(:shipping_address, :billing_address).reject { |_key, value| value.blank? }
131
162
  end
132
163
 
133
164
  def corrected_addresses
@@ -148,16 +179,6 @@ module Spree
148
179
  (address&.snapshot || Spree::Address.new).tap { |copy| copy.assign_attributes(sent.to_h.except('label', :label)) }
149
180
  end
150
181
 
151
- def address_permitted_keys
152
- [
153
- :firstname, :lastname, :first_name, :last_name,
154
- :address1, :address2, :city,
155
- :country_code, :state_code,
156
- :zipcode, :postal_code, :phone, :alternative_phone,
157
- :state_name, :company, :label
158
- ]
159
- end
160
-
161
182
  # A request naming neither address has asked for nothing; saying so
162
183
  # beats a 200 that changed nothing.
163
184
  def missing_address_errors
@@ -18,6 +18,27 @@ module Spree
18
18
  class PackageTypesController < Seller::ResourceController
19
19
  scoped_resource :package_types
20
20
 
21
+ # The same set the operator's controller permits — a seller measures
22
+ # their own packaging, so every field on the shared form is theirs
23
+ # to set. `seller_id` is deliberately absent: ownership comes from
24
+ # the authenticated seller, never the payload.
25
+ request_params :package_type do |body|
26
+ body.attribute :name, :string, required: true, on: :create
27
+ body.attribute :kind, :string, choices: Spree::PackageType::KINDS
28
+ body.attribute :length, :number, nullable: true
29
+ body.attribute :width, :number, nullable: true
30
+ body.attribute :height, :number, nullable: true
31
+ body.attribute :dimensions_unit, :string, nullable: true, choices: Spree::Variant::DIMENSION_UNITS
32
+ body.attribute :weight, :number,
33
+ nullable: true,
34
+ description: "The empty package's own weight, added to every quote."
35
+ body.attribute :max_weight, :number, nullable: true
36
+ body.attribute :weight_unit, :string, nullable: true, choices: Spree::Variant::WEIGHT_UNITS
37
+ body.attribute :default, :boolean,
38
+ description: "Makes this the box this seller's parcels are quoted with. One default per seller, so it never displaces the marketplace's."
39
+ body.attribute :metadata, :hash, nullable: true
40
+ end
41
+
21
42
  protected
22
43
 
23
44
  def model_class
@@ -84,15 +105,6 @@ module Spree
84
105
  Spree::PackageType.arel_table[:name].asc
85
106
  )
86
107
  end
87
-
88
- # The same set the operator's controller permits — a seller measures
89
- # their own packaging, so every field on the shared form is theirs
90
- # to set. `seller_id` is deliberately absent: ownership comes from
91
- # the authenticated seller, never the payload.
92
- def resource_permitted_attributes
93
- [:name, :kind, :length, :width, :height, :dimensions_unit,
94
- :weight, :max_weight, :weight_unit, :default, { metadata: {} }]
95
- end
96
108
  end
97
109
  end
98
110
  end
@@ -25,6 +25,16 @@ module Spree
25
25
  store: Rails.cache,
26
26
  with: RATE_LIMIT_RESPONSE
27
27
 
28
+ request_params :password_reset do |body|
29
+ body.attribute :email, :string, required: true, only: :create, example: 'seller@acme.test'
30
+ body.attribute :redirect_url, :string,
31
+ only: :create,
32
+ example: 'https://sellers.your-store.com/reset-password',
33
+ description: 'Must match an allowed origin of the store; ignored otherwise.'
34
+ body.attribute :password, :string, required: true, only: :update, example: 'new-password-123'
35
+ body.attribute :password_confirmation, :string, required: true, only: :update, example: 'new-password-123'
36
+ end
37
+
28
38
  # POST /api/v3/seller/auth/password_resets
29
39
  def create
30
40
  user = Spree.admin_user_class.find_by(email: params[:email])
@@ -11,6 +11,18 @@ module Spree
11
11
  class PoliciesController < Seller::ResourceController
12
12
  scoped_resource :seller_profile
13
13
 
14
+ request_params :policy do |body|
15
+ body.attribute :name, :string,
16
+ required: true, on: :create,
17
+ example: 'Shipping Policy',
18
+ description: 'When the marketplace requires a named policy, use that exact name: the onboarding check matches on it.'
19
+ body.attribute :slug, :string, example: 'shipping-policy'
20
+ body.attribute :body, :string,
21
+ nullable: true,
22
+ example: '<p>Orders leave the workshop within two working days.</p>',
23
+ description: 'HTML, sanitized before it is stored. `body_html` on the response is the rendering of what was stored.'
24
+ end
25
+
14
26
  protected
15
27
 
16
28
  def model_class
@@ -21,10 +33,6 @@ module Spree
21
33
  Spree.api.seller_policy_serializer
22
34
  end
23
35
 
24
- def resource_permitted_attributes
25
- [:name, :slug, :body]
26
- end
27
-
28
36
  # Accept slug or prefixed ID, matching the storefront's lookup.
29
37
  def find_resource
30
38
  if params[:id].to_s.start_with?('pol_')
@@ -41,8 +41,121 @@ module Spree
41
41
  'archived' => -> { Spree.product_archive_workflow }
42
42
  }.freeze
43
43
 
44
+ # The operator's price shape, except `currency` may be left out: the
45
+ # store's currency is assumed (see `default_price_currencies`).
46
+ PRICE = Spree::Api::V3::RequestSchema.new do |schema|
47
+ schema.attribute :currency, :currency,
48
+ example: 'USD',
49
+ description: "Omit to price in the store's currency. A seller has no currency of their own."
50
+ schema.attribute :amount, :decimal,
51
+ required: true,
52
+ example: '24.00',
53
+ description: 'A canonical decimal string (`"1234.56"`: period decimal, no grouping). The API does not parse localized input.'
54
+ schema.attribute :compare_at_amount, :decimal, nullable: true, example: '30.00'
55
+ end
56
+
44
57
  scoped_resource :products
45
58
 
59
+ request_params :product do |body|
60
+ body.attribute :name, :string, required: true, on: :create, example: 'Hand-thrown mug'
61
+ body.attribute :description, :string
62
+ body.attribute :slug, :string, example: 'hand-thrown-mug'
63
+ body.attribute :meta_title, :string
64
+ body.attribute :meta_description, :string
65
+ body.attribute :meta_keywords, :string
66
+ body.attribute :metadata, :hash
67
+ body.attribute :product_type_id, :id,
68
+ nullable: true,
69
+ description: "The marketplace's product type this product is listed against, from the product types endpoint. Null detaches it. Saving with a type seeds its option types onto the product."
70
+ body.attribute :delivery_profile_id, :id,
71
+ description: "Which of the marketplace's delivery profiles the product ships under. A new product sent without one lands on the profile marked default."
72
+ body.attribute :prices, :array, of: PRICE,
73
+ description: "Shorthand for a simple (no-options) product: per-currency prices that forward to the product's sole variant."
74
+ # `external_url` stays out for the same reason it does on the
75
+ # operator's endpoint: it would make the server fetch a URL the
76
+ # caller chose.
77
+ body.attribute :media, :array,
78
+ as: 'SellerProductMediaParams',
79
+ description: 'The gallery, as a whole: a file absent from the list is removed. `signed_id` attaches a fresh upload; `id` updates one already there.' do |media_item|
80
+ media_item.attribute :id, :id
81
+ media_item.attribute :signed_id, :string, description: 'A `signed_id` from `POST /files`.'
82
+ media_item.include_attributes Spree::Api::V3::MediaRequestSchema
83
+ media_item.attribute :variant_ids, :array, of: :id,
84
+ description: 'Replaces the variants this media is linked to. An empty list clears them.'
85
+ end
86
+ # Narrower than the operator's variant set: `seller_id` would let a
87
+ # payload hand a variant to somebody else, and
88
+ # `tax_category_id`/`delivery_profile_id` are marketplace
89
+ # configuration.
90
+ body.attribute :variants, :array,
91
+ as: 'SellerProductVariantParams',
92
+ description: 'The variants, as a whole: one absent from the list is removed. Pass `id` to update an existing variant.' do |variant|
93
+ variant.attribute :id, :id
94
+ variant.attribute :sku, :string
95
+ variant.attribute :barcode, :string
96
+ variant.attribute :cost_price, :decimal, nullable: true
97
+ variant.attribute :cost_currency, :currency
98
+ variant.attribute :weight, :number, nullable: true
99
+ variant.attribute :height, :number, nullable: true
100
+ variant.attribute :width, :number, nullable: true
101
+ variant.attribute :depth, :number, nullable: true
102
+ variant.attribute :weight_unit, :string, choices: Spree::Variant::WEIGHT_UNITS
103
+ variant.attribute :dimensions_unit, :string, choices: Spree::Variant::DIMENSION_UNITS
104
+ variant.attribute :hs_code, :string
105
+ variant.attribute :customs_description, :string
106
+ variant.attribute :country_of_origin, :country
107
+ variant.attribute :minimum_order_quantity, :integer, nullable: true
108
+ variant.attribute :order_multiple, :integer, nullable: true
109
+ variant.attribute :purchase_unit, :string
110
+ variant.attribute :units_per_carton, :integer,
111
+ nullable: true,
112
+ description: 'How many units fill one carton.'
113
+ variant.attribute :carton_package_type_id, :id,
114
+ nullable: true,
115
+ description: 'The carton this variant is packed into: a package type of kind `carton`.'
116
+ variant.attribute :carton_weight, :number,
117
+ nullable: true,
118
+ description: "What one packed carton weighs, in the variant's weight unit."
119
+ variant.attribute :cartons_per_pallet, :integer,
120
+ nullable: true,
121
+ description: 'How many cartons stack on one pallet.'
122
+ variant.attribute :track_inventory, :boolean
123
+ variant.attribute :preorderable, :boolean
124
+ variant.attribute :preorder_ships_at, :datetime,
125
+ nullable: true,
126
+ description: 'The "ships by" date shown to customers while the variant is a pre-order. Null clears it.'
127
+ variant.attribute :backorder_limit, :integer,
128
+ nullable: true,
129
+ description: 'Maximum units sellable beyond available stock, capping backorders and pre-orders. Null is unlimited.'
130
+ variant.attribute :position, :integer
131
+ variant.attribute :options, :array, of: Spree::Api::V3::VariantOptionRequestSchema,
132
+ description: 'One pair per option type the variant takes part in (size, color).'
133
+ variant.attribute :prices, :array, of: PRICE, description: 'Per-currency prices. Upserted by currency.'
134
+ variant.attribute :stock_levels, :array, of: Spree::Api::V3::StockLevelRequestSchema,
135
+ description: "Stock per location, at this seller's own locations only: a location belonging to anyone else is ignored."
136
+ end
137
+ end
138
+
139
+ request_params 'ProductBulkSubmitParams', action: :bulk_submit do |body|
140
+ body.attribute :ids, :array, of: :id,
141
+ required: true,
142
+ description: 'Only drafts and rejected listings are submitted; the rest are counted in `skipped_count`.'
143
+ end
144
+
145
+ request_params 'ProductBulkDestroyParams', action: :bulk_destroy do |body|
146
+ body.attribute :ids, :array, of: :id,
147
+ required: true,
148
+ description: "Ids outside this seller's catalog are ignored; products the store refuses to delete are counted in `skipped_count`."
149
+ end
150
+
151
+ request_params 'ProductBulkStatusParams', action: :bulk_status_update do |body|
152
+ body.attribute :ids, :array, of: :id, required: true, example: ['prod_UkLWZg9DAJ']
153
+ body.attribute :status, :string,
154
+ required: true,
155
+ choices: SELLER_BULK_STATUS_WORKFLOWS.keys,
156
+ description: 'A listing goes on sale only when the marketplace approves it, so there is no bulk route onto `active`.'
157
+ end
158
+
46
159
  before_action :set_status_resource, only: [:submit, :draft, :archive]
47
160
  before_action :require_ids!, only: [:bulk_submit, :bulk_status_update, :bulk_destroy]
48
161
 
@@ -165,34 +278,7 @@ module Spree
165
278
  end
166
279
 
167
280
  def permitted_params
168
- attrs = params.permit(
169
- *model_class.additional_seller_permitted_attributes,
170
- :name, :description, :slug,
171
- :meta_title, :meta_description, :meta_keywords,
172
- :product_type_id, :delivery_profile_id,
173
- metadata: {},
174
- prices: [:amount, :compare_at_amount, :currency],
175
- # Inline media, the same shape the operator sends. `external_url`
176
- # stays out for the same reason it does there — it would make the
177
- # server fetch a URL the caller chose.
178
- media: [*Spree::Media::WRITABLE_ATTRIBUTES, :id, :signed_id, { variant_ids: [] }],
179
- # A seller's variants. Narrower than the operator's set:
180
- # `seller_id` would let a payload hand a variant to somebody else,
181
- # and `tax_category_id`/`delivery_profile_id` are marketplace
182
- # configuration.
183
- variants: [
184
- :id, :sku, :barcode,
185
- :cost_price, :cost_currency,
186
- :weight, :height, :width, :depth, :weight_unit, :dimensions_unit,
187
- :hs_code, :country_of_origin, :customs_description,
188
- :minimum_order_quantity, :order_multiple, :purchase_unit, :units_per_carton,
189
- :carton_package_type_id, :carton_weight, :cartons_per_pallet,
190
- :track_inventory, :preorderable, :preorder_ships_at, :backorder_limit, :position,
191
- options: [:name, :value],
192
- prices: [:amount, :compare_at_amount, :currency],
193
- stock_levels: [:id, :stock_location_id, :count_on_hand, :backorderable]
194
- ]
195
- )
281
+ attrs = params.permit(*permitted_attributes)
196
282
 
197
283
  # Assigned only when present: writing a nil `prices` or
198
284
  # `stock_levels` key reaches the association setter as nil, which
@@ -20,6 +20,38 @@ module Spree
20
20
 
21
21
  scoped_resource :seller_profile
22
22
 
23
+ # Enumerated rather than borrowing the legacy global list, which
24
+ # permits :id, :user_id and :deleted_at.
25
+ request_params 'ProfileUpdateParams' do |body|
26
+ body.attribute :name, :string, example: 'Acme Supplies'
27
+ body.attribute :contact_email, :string, nullable: true, format: :email
28
+ body.attribute :billing_email, :string, nullable: true, format: :email
29
+ body.attribute :about, :string,
30
+ nullable: true,
31
+ description: "Sanitized HTML: the seller's public description."
32
+ body.attribute :legal_name, :string,
33
+ nullable: true,
34
+ description: 'The business a commission invoice is made out to.'
35
+ body.attribute :registration_number, :string, nullable: true
36
+ body.attribute :logo_signed_id, :string,
37
+ nullable: true,
38
+ description: 'A `signed_id` from `POST /files`; `null` removes the image.'
39
+ body.attribute :square_logo_signed_id, :string,
40
+ nullable: true,
41
+ description: 'A `signed_id` from `POST /files`; `null` removes the image.'
42
+ body.attribute :cover_photo_signed_id, :string,
43
+ nullable: true,
44
+ description: 'A `signed_id` from `POST /files`; `null` removes the image.'
45
+ body.attribute :billing_address, :object, as: 'SellerAddressParams' do |billing_address|
46
+ billing_address.include_attributes Spree::Api::V3::AddressRequestSchema
47
+ end
48
+ body.attribute :custom_fields, :array, of: Spree::Api::V3::CustomFieldValueRequestSchema,
49
+ description: "Answers to the custom fields this marketplace's onboarding asks for. A field nothing asked for is ignored rather than written."
50
+ body.attribute :accept_terms, :boolean,
51
+ permit: false,
52
+ description: "Stamps the moment the seller accepted the marketplace's terms. One-way: sending `false` does not unmake the stamp."
53
+ end
54
+
23
55
  def show
24
56
  render json: serialize_seller
25
57
  end
@@ -54,8 +86,6 @@ module Spree
54
86
  %w[show]
55
87
  end
56
88
 
57
- # Enumerated rather than borrowing the legacy global list, which
58
- # permits :id, :user_id and :deleted_at.
59
89
  # Accepting the marketplace's terms is a profile write, not an endpoint
60
90
  # of its own: `accept_terms: true` stamps the time, which is what the
61
91
  # AcceptTerms requirement reads.
@@ -104,14 +134,7 @@ module Spree
104
134
  end
105
135
 
106
136
  def permitted_params
107
- normalize_params(
108
- params.permit(:name, :contact_email, :billing_email, :about,
109
- :legal_name, :registration_number,
110
- :logo, :square_logo, :cover_photo,
111
- billing_address: Spree::Api::V3::AddressParams::ADDRESS_KEYS,
112
- custom_fields: [:id, :custom_field_definition_id, :value,
113
- { value: [] }, { value: {} }])
114
- )
137
+ normalize_params(params.permit(*declared_permitted_attributes))
115
138
  end
116
139
 
117
140
  private
@@ -12,6 +12,16 @@ module Spree
12
12
  class RequirementSubmissionsController < Seller::BaseController
13
13
  scoped_resource :seller_profile
14
14
 
15
+ # `file_signed_id` comes from POST /files, so the bytes are already in
16
+ # storage by the time this runs.
17
+ request_params 'RequirementSubmissionParams' do |body|
18
+ body.attribute :note, :string, description: 'Anything the seller wants to say alongside the submission.'
19
+ body.attribute :reference, :string,
20
+ description: 'A reference number or external identifier, for requirements that ask for one.'
21
+ body.attribute :file_signed_id, :string,
22
+ description: 'A `signed_id` from `POST /files`, for requirements that ask for a document.'
23
+ end
24
+
15
25
  before_action :set_requirement, only: [:create]
16
26
  before_action :set_submission, only: [:download]
17
27
 
@@ -24,7 +34,7 @@ module Spree
24
34
  requirement: @requirement,
25
35
  note: attributes[:note],
26
36
  reference: attributes[:reference],
27
- file: attributes[:file],
37
+ file: attributes[:file_signed_id],
28
38
  submitted_by: try_spree_current_user
29
39
  )
30
40
 
@@ -57,11 +67,8 @@ module Spree
57
67
 
58
68
  protected
59
69
 
60
- # What a seller may say about a requirement. `file` is a direct-upload
61
- # signed id, so it is a string like the rest — the bytes are already
62
- # in storage by the time this runs.
63
70
  def permitted_params
64
- params.permit(:note, :reference, :file)
71
+ params.permit(*declared_permitted_attributes)
65
72
  end
66
73
 
67
74
  def read_actions
@@ -11,6 +11,7 @@ module Spree
11
11
  include Spree::Api::V3::Seller::SellerContext
12
12
  include Spree::Api::V3::SellerAuthentication
13
13
  include Spree::Api::V3::ScopedAuthorization
14
+ include Spree::Api::V3::StrictMoneyParams
14
15
 
15
16
  protected
16
17
 
@@ -65,6 +66,17 @@ module Spree
65
66
  model_class.table_name.delete_prefix('spree_').to_sym
66
67
  end
67
68
 
69
+ # What extensions opened to sellers, never the operator-level list:
70
+ # an attribute opened to operators must not become seller-writable
71
+ # by accident.
72
+ def model_additional_permitted_attributes
73
+ return [] unless respond_to?(:model_class, true)
74
+
75
+ Array(model_class.try(:additional_seller_permitted_attributes))
76
+ rescue NotImplementedError
77
+ []
78
+ end
79
+
68
80
  def authorize_resource!(resource = @resource, action = action_name.to_sym)
69
81
  authorize!(action, resource)
70
82
  end
@@ -24,6 +24,49 @@ module Spree
24
24
  # stock.
25
25
  scoped_resource :stock
26
26
 
27
+ # The same set the operator's controller permits: a seller runs
28
+ # their own warehouse, so every field on the shared form is theirs to
29
+ # set. Anything missing here is dropped by `permit` without a word,
30
+ # and the form would appear to save while quietly discarding it.
31
+ request_params :stock_location do |body|
32
+ body.attribute :name, :string, required: true, on: :create, example: 'Main warehouse'
33
+ body.attribute :admin_name, :string, nullable: true
34
+ body.attribute :active, :boolean, description: 'Set `false` to retire a location: there is no delete.'
35
+ body.attribute :default, :boolean
36
+ body.attribute :kind, :string,
37
+ choices: Spree::StockLocation::KINDS,
38
+ open: true,
39
+ example: 'warehouse',
40
+ description: 'Categorizes the location.'
41
+ body.attribute :propagate_all_variants, :boolean
42
+ body.attribute :backorderable_default, :boolean
43
+ body.attribute :address1, :string, nullable: true
44
+ body.attribute :address2, :string, nullable: true
45
+ body.attribute :city, :string, nullable: true
46
+ body.attribute :zipcode, :string, nullable: true
47
+ body.attribute :phone, :string, nullable: true
48
+ body.attribute :company, :string, nullable: true
49
+ body.attribute :country_code, :country,
50
+ nullable: true,
51
+ example: 'US',
52
+ description: 'ISO-3166 alpha-2 country code.'
53
+ body.attribute :state_code, :string,
54
+ nullable: true,
55
+ example: 'OR',
56
+ description: "State or province abbreviation, resolved against the selected country's states."
57
+ body.attribute :state_name, :string,
58
+ nullable: true,
59
+ description: "Free-text state for countries that don't have a states list."
60
+ body.attribute :pickup_enabled, :boolean
61
+ body.attribute :pickup_stock_policy, :string,
62
+ choices: Spree::StockLocation::PICKUP_STOCK_POLICIES,
63
+ description: '`local` collects only items at this location; `any` lets items transfer in from other locations (ship-to-store).'
64
+ body.attribute :pickup_ready_in_minutes, :integer, nullable: true
65
+ body.attribute :returns_enabled, :boolean,
66
+ description: 'Whether customers may send returns to this location.'
67
+ body.attribute :pickup_instructions, :string, nullable: true
68
+ end
69
+
27
70
  protected
28
71
 
29
72
  def model_class
@@ -34,20 +77,8 @@ module Spree
34
77
  Spree.api.seller_stock_location_serializer
35
78
  end
36
79
 
37
- # The same set the operator's controller permits: a seller runs
38
- # their own warehouse, so every field on the shared form is theirs to
39
- # set. Anything missing here is dropped by `permit` without a word,
40
- # and the form would appear to save while quietly discarding it.
41
80
  def permitted_params
42
- params.permit(
43
- *model_additional_permitted_attributes,
44
- :name, :admin_name, :active, :default,
45
- :kind, :propagate_all_variants, :backorderable_default,
46
- :address1, :address2, :city, :zipcode, :phone, :company,
47
- :country_code, :state_code, :state_name,
48
- :pickup_enabled, :pickup_stock_policy, :returns_enabled,
49
- :pickup_ready_in_minutes, :pickup_instructions
50
- )
81
+ params.permit(*permitted_attributes)
51
82
  end
52
83
  end
53
84
  end
@@ -24,6 +24,15 @@ module Spree
24
24
  # standard actions have to be listed alongside the custom one.
25
25
  before_action :set_resource, only: [:show, :update, :destroy, :validate]
26
26
 
27
+ request_params :seller_tax_identifier do |body|
28
+ body.attribute :kind, :string, required: true, on: :create,
29
+ example: 'eu_vat',
30
+ description: "#{Spree::Api::V3::TaxIdentifierRequestSchema::KIND_DESCRIPTION} One registration per kind."
31
+ body.attribute :value, :string, required: true, on: :create,
32
+ example: 'DE100000008',
33
+ description: 'A number the validator for its kind refuses is rejected rather than stored.'
34
+ end
35
+
27
36
  protected
28
37
 
29
38
  def model_class
@@ -39,7 +48,7 @@ module Spree
39
48
  end
40
49
 
41
50
  def permitted_params
42
- params.permit(:kind, :value)
51
+ params.permit(*declared_permitted_attributes)
43
52
  end
44
53
  end
45
54
  end
@@ -16,6 +16,10 @@ module Spree
16
16
 
17
17
  before_action :set_member, only: [:destroy]
18
18
 
19
+ request_params :team_member do |body|
20
+ body.attribute :email, :string, required: true, example: 'colleague@acme.test'
21
+ end
22
+
19
23
  def index
20
24
  render json: { data: members.map { |member| serialize_member(member) } }
21
25
  end
@@ -16,6 +16,16 @@ module Spree
16
16
 
17
17
  skip_before_action :authenticate_user, only: [:create, :refresh, :logout]
18
18
 
19
+ request_params 'RefreshTokenParams', action: :refresh do |body|
20
+ body.attribute :refresh_token, :string,
21
+ required: true,
22
+ description: 'The refresh token from the login response.'
23
+ end
24
+
25
+ request_params 'LogoutParams', action: :logout do |body|
26
+ body.attribute :refresh_token, :string, description: 'The refresh token to revoke.'
27
+ end
28
+
19
29
  # POST /api/v3/store/auth/login
20
30
  # Supports multiple authentication providers via :provider param
21
31
  # Example:
@@ -9,6 +9,13 @@ module Spree
9
9
 
10
10
  before_action :find_cart!
11
11
 
12
+ request_params 'ApplyDiscountCodeParams', action: :create do |body|
13
+ body.attribute :code, :string,
14
+ required: true,
15
+ example: 'SAVE10',
16
+ description: 'The promotion code to apply.'
17
+ end
18
+
12
19
  # POST /api/v3/store/carts/:cart_id/discount_codes
13
20
  # Applies a discount code. A real-but-not-yet-eligible code is
14
21
  # accepted and persisted — recalculation activates the discount
@@ -69,7 +76,7 @@ module Spree
69
76
  end
70
77
 
71
78
  def permitted_params
72
- params.permit(:code)
79
+ params.permit(*declared_permitted_attributes)
73
80
  end
74
81
  end
75
82
  end
@@ -9,6 +9,14 @@ module Spree
9
9
 
10
10
  before_action :find_cart!
11
11
 
12
+ request_params 'UpdateFulfillmentParams', action: :update do |body|
13
+ body.attribute :selected_delivery_rate_id, :id,
14
+ example: 'dr_abc123',
15
+ description: 'The delivery rate to select.'
16
+ body.attribute :pickup_point_external_id, :string,
17
+ description: "For a pickup point delivery method: the provider's id of the point to collect from."
18
+ end
19
+
12
20
  # PATCH /api/v3/store/carts/:cart_id/fulfillments/:id
13
21
  # Selects a delivery rate, and for pickup_point methods a concrete
14
22
  # pickup point (validated against the provider, then frozen into
@@ -35,7 +43,7 @@ module Spree
35
43
  private
36
44
 
37
45
  def permitted_params
38
- params.permit(:selected_delivery_rate_id, :pickup_point_external_id)
46
+ params.permit(*declared_permitted_attributes)
39
47
  end
40
48
 
41
49
  def recalculate
@@ -55,7 +63,7 @@ module Spree
55
63
  render_error(
56
64
  code: ERROR_CODES[:validation_error],
57
65
  message: I18n.t('spree.errors.messages.no_pickup_point_provider'),
58
- status: :unprocessable_entity
66
+ status: :unprocessable_content
59
67
  )
60
68
  return false
61
69
  end
@@ -9,6 +9,13 @@ module Spree
9
9
 
10
10
  before_action :find_cart!
11
11
 
12
+ request_params 'ApplyGiftCardParams', action: :create do |body|
13
+ body.attribute :code, :string,
14
+ required: true,
15
+ example: 'GC-ABCD-1234',
16
+ description: 'The gift card code to apply.'
17
+ end
18
+
12
19
  # POST /api/v3/store/carts/:cart_id/gift_cards
13
20
  def create
14
21
  with_order_lock do
@@ -64,7 +71,7 @@ module Spree
64
71
  end
65
72
 
66
73
  def permitted_params
67
- params.permit(:code)
74
+ params.permit(*declared_permitted_attributes)
68
75
  end
69
76
  end
70
77
  end