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
@@ -35,6 +35,14 @@ module Spree
35
35
  skip_before_action :set_current_seller_context, only: [:create, :refresh, :logout, :providers]
36
36
  skip_before_action :authenticate_seller!, only: [:create, :refresh, :logout, :providers]
37
37
 
38
+ request_params 'LoginParams' do |body|
39
+ body.attribute :provider, :string,
40
+ choices: %w[email],
41
+ description: 'The authentication method. Defaults to `email`.'
42
+ body.attribute :email, :string, required: true, example: 'seller@example.com'
43
+ body.attribute :password, :string, required: true, example: 'password123'
44
+ end
45
+
38
46
  # POST /api/v3/seller/auth/login
39
47
  def create
40
48
  strategy = authentication_strategy
@@ -18,6 +18,7 @@ module Spree
18
18
  before_action :authenticate_seller!
19
19
 
20
20
  include Spree::Api::V3::ScopedAuthorization
21
+ include Spree::Api::V3::StrictMoneyParams
21
22
  end
22
23
  end
23
24
  end
@@ -16,7 +16,7 @@ module Spree
16
16
  # Unpaginated: there are ~250 countries and an address dropdown needs
17
17
  # them all at once, which Pagy's global client_limit would prevent.
18
18
  def index
19
- countries = Spree::Country.all.sort_by(&:name)
19
+ countries = Spree::Country.all.sort_by(&:iso)
20
20
 
21
21
  render json: {
22
22
  data: countries.map { |country| serialize_country(country) },
@@ -27,7 +27,7 @@ module Spree
27
27
  private
28
28
 
29
29
  def serialize_country(country)
30
- Spree.api.country_serializer.new(
30
+ Spree.api.seller_country_serializer.new(
31
31
  country, params: { store: current_store, expand: ['states'] }
32
32
  ).to_h
33
33
  end
@@ -19,6 +19,42 @@ module Spree
19
19
  class DeliveryMethodsController < Seller::ResourceController
20
20
  scoped_resource :delivery_methods
21
21
 
22
+ # No provider fields: both are fixed for a seller's method, and
23
+ # permitting them would let a write fail validation for a choice the
24
+ # seller was never offered. No markup either — that prices a
25
+ # carrier's quote, and a seller has no carrier.
26
+ request_params :delivery_method do |body|
27
+ body.attribute :name, :string, required: true, on: :create
28
+ body.attribute :admin_name, :string, nullable: true
29
+ body.attribute :code, :string, nullable: true
30
+ body.attribute :delivery_profile_id, :id, description: "One of the marketplace's delivery profiles."
31
+ body.attribute :delivery_zone_id, :id,
32
+ nullable: true,
33
+ description: 'Narrows where the method ships; null serves everywhere the profile reaches.'
34
+ body.attribute :storefront_visible, :boolean
35
+ body.attribute :tracking_url, :string, nullable: true
36
+ body.attribute :estimated_transit_business_days_min, :integer, nullable: true
37
+ body.attribute :estimated_transit_business_days_max, :integer, nullable: true
38
+ body.attribute :calculator, :object,
39
+ description: "How the method is priced: a type from `/delivery_methods/calculators` and its preferences, per that type's `schema`." do |calculator|
40
+ calculator.attribute :type, :string, example: 'flat_rate'
41
+ calculator.attribute :preferences, :hash, example: { amount: '12.5' }
42
+ end
43
+ # Permitted in `permitted_params`, together with the attributes
44
+ # the seller's rule kinds declare on their own classes.
45
+ body.attribute :rules, :array,
46
+ permit: false,
47
+ as: 'DeliveryMethodRuleParams',
48
+ description: 'Replaces the whole set: a rule dropped here is deleted, so re-send surviving rules with their `id`. An empty list clears every condition.' do |rule|
49
+ rule.attribute :id, :id
50
+ rule.attribute :type, :string,
51
+ required: true,
52
+ description: 'A type from `/delivery_methods/rule_types`.'
53
+ rule.attribute :active, :boolean
54
+ rule.attribute :preferences, :hash
55
+ end
56
+ end
57
+
22
58
  # GET /api/v3/seller/delivery_methods/calculators
23
59
  # The ways a seller can price a method, with the preference schema
24
60
  # each one's form is rendered from.
@@ -29,7 +65,7 @@ module Spree
29
65
  {
30
66
  type: calculator_class.api_type,
31
67
  name: calculator_class.description,
32
- preference_schema: calculator_class.respond_to?(:serialized_preference_schema) ? calculator_class.serialized_preference_schema : []
68
+ schema: calculator_class.preference_json_schema
33
69
  }
34
70
  end
35
71
 
@@ -48,7 +84,7 @@ module Spree
48
84
  type: klass.api_type,
49
85
  name: klass.human_name,
50
86
  description: klass.human_description,
51
- preference_schema: klass.serialized_preference_schema
87
+ schema: klass.preference_json_schema
52
88
  }
53
89
  end
54
90
 
@@ -64,9 +100,9 @@ module Spree
64
100
  @resource.assign_attributes(assignable_params)
65
101
  authorize_resource!(@resource, :create)
66
102
  rederive_origin_group(@resource)
67
- assign_calculator(@resource)
103
+ @resource.assign_calculator_attributes(permitted_params[:calculator])
68
104
 
69
- if @resource.errors.empty? && @resource.save
105
+ if @resource.save
70
106
  render json: serialize_resource(@resource), status: :created
71
107
  else
72
108
  render_validation_error(@resource.errors)
@@ -74,11 +110,13 @@ module Spree
74
110
  end
75
111
 
76
112
  def update
77
- @resource.assign_attributes(assignable_params)
78
- rederive_origin_group(@resource)
79
- assign_calculator(@resource)
113
+ saved = save_atomically do
114
+ @resource.assign_attributes(assignable_params)
115
+ rederive_origin_group(@resource)
116
+ @resource.assign_calculator_attributes(permitted_params[:calculator])
117
+ end
80
118
 
81
- if @resource.errors.empty? && @resource.save
119
+ if saved
82
120
  render json: serialize_resource(@resource)
83
121
  else
84
122
  render_validation_error(@resource.errors)
@@ -116,19 +154,10 @@ module Spree
116
154
  action_name == 'show' ? super : resource_scope.find_by_prefix_id!(params[:id])
117
155
  end
118
156
 
119
- # No provider fields: both are fixed for a seller's method, and
120
- # permitting them would let a write fail validation for a choice the
121
- # seller was never offered. No markup either — that prices a
122
- # carrier's quote, and a seller has no carrier.
123
157
  def permitted_params
124
158
  params.permit(
125
- *model_additional_permitted_attributes,
126
- :name, :admin_name, :code, :storefront_visible, :tracking_url,
127
- :estimated_transit_business_days_min, :estimated_transit_business_days_max,
128
- :calculator_type,
129
- :delivery_profile_id, :delivery_zone_id,
130
- calculator_preferences: {},
131
- rules: [:id, :type, :active, { preferences: {} }, *subclassed_rule_attributes]
159
+ *permitted_attributes,
160
+ rules: [*request_params_schema.fields[:rules].schema.permit_list, *subclassed_rule_attributes]
132
161
  )
133
162
  end
134
163
 
@@ -175,7 +204,7 @@ module Spree
175
204
  # resolves its own pickers.
176
205
  def assignable_params
177
206
  attributes = permitted_params.except(
178
- :delivery_profile_id, :delivery_zone_id, :calculator_type, :calculator_preferences, :rules
207
+ :delivery_profile_id, :delivery_zone_id, :calculator, :rules
179
208
  )
180
209
 
181
210
  if params.key?(:delivery_profile_id)
@@ -218,46 +247,6 @@ module Spree
218
247
  row
219
248
  end
220
249
  end
221
-
222
- def assign_calculator(delivery_method)
223
- calculator_type = permitted_params[:calculator_type]
224
- preferences = permitted_params[:calculator_preferences]
225
-
226
- if calculator_type.present? && delivery_method.calculator&.class&.api_type != calculator_type
227
- registered = Spree::DeliveryMethod.calculators.find do |klass|
228
- klass.api_type == calculator_type
229
- end
230
- unless registered
231
- delivery_method.errors.add(:calculator_type, :invalid)
232
- return
233
- end
234
-
235
- # Resolved from the registry entry's OWN name, never the
236
- # request's: nothing user-supplied reaches `constantize`. Going
237
- # back through the name rather than instantiating `registered`
238
- # directly is what survives a reload — in development the
239
- # registry holds a class from an earlier one, and an instance of
240
- # it fails the association's type check.
241
- delivery_method.calculator = registered.to_s.constantize.new
242
- end
243
-
244
- return if preferences.blank?
245
-
246
- # A payload may carry preferences without naming a calculator —
247
- # editing the amount on a method that already has one, or creating
248
- # with the default. The model only builds the default calculator
249
- # at validation, so without this the preferences land on nothing
250
- # and the amount the merchant typed is silently replaced by a free
251
- # rate.
252
- delivery_method.ensure_calculator
253
- return if delivery_method.calculator.nil?
254
-
255
- preferences.each do |key, value|
256
- next unless delivery_method.calculator.has_preference?(key)
257
-
258
- delivery_method.calculator.set_preference(key, value)
259
- end
260
- end
261
250
  end
262
251
  end
263
252
  end
@@ -25,6 +25,23 @@ module Spree
25
25
 
26
26
  scoped_resource :exports
27
27
 
28
+ request_params 'SellerExportCreateParams' do |body|
29
+ body.attribute :type, :string,
30
+ required: true,
31
+ choices: ALLOWED_TYPES,
32
+ description: 'Which dataset to export.'
33
+ body.attribute :record_selection, :string,
34
+ choices: %w[filtered all],
35
+ description: '`filtered` (default) keeps `search_params`; `all` exports everything this seller owns.'
36
+ # Read from the raw params: an arbitrary Ransack hash with nested
37
+ # groupings, which `permit(k: {})` rejects.
38
+ body.attribute :search_params, :hash,
39
+ permit: false,
40
+ description: 'Ransack predicates, the same shape the list endpoints take. Ignored when `record_selection` is `all`.'
41
+ body.attribute :results_url, :string,
42
+ description: "Panel URL the export-done email links back to. Honored only when it matches one of the store's allowed origins."
43
+ end
44
+
28
45
  # POST /api/v3/seller/exports
29
46
  #
30
47
  # Refused before the record is built when the type is not one a
@@ -140,7 +157,7 @@ module Spree
140
157
  # `to_unsafe_h`. `:format` is deliberately dropped: only CSV exists,
141
158
  # and Rails' request format would otherwise overwrite the enum.
142
159
  def permitted_params
143
- attrs = params.permit(*model_additional_permitted_attributes, :type, :record_selection, :results_url)
160
+ attrs = params.permit(*permitted_attributes)
144
161
  raw = params[:search_params]
145
162
  attrs[:search_params] = raw.respond_to?(:to_unsafe_h) ? raw.to_unsafe_h : raw if raw.present?
146
163
  attrs
@@ -0,0 +1,27 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Seller
5
+ # A file stored here is attached to nothing until the seller sends its
6
+ # `signed_id` to an endpoint that checks the target is theirs, so the
7
+ # narrowest meaningful gate is the seller's own profile, which every
8
+ # member of a seller's team holds.
9
+ class FilesController < Seller::BaseController
10
+ include Spree::Api::V3::FileUploads
11
+
12
+ scoped_resource :seller_profile
13
+
14
+ request_params 'FileUploadCreateParams', action: :create do |body|
15
+ body.include_attributes Spree::Api::V3::FileUploadRequestSchema
16
+ end
17
+
18
+ private
19
+
20
+ def file_upload_serializer
21
+ Spree.api.seller_file_upload_serializer
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -32,10 +32,32 @@ module Spree
32
32
 
33
33
  scoped_resource :products
34
34
 
35
+ request_params 'ImportCreateParams' do |body|
36
+ body.attribute :type, :string, required: true, choices: %w[products]
37
+ body.attribute :attachment_signed_id, :string,
38
+ required: true,
39
+ description: "The `signed_id` of the uploaded CSV, from `POST /files` with `visibility: 'private'`."
40
+ body.attribute :delimiter, :string, description: 'CSV column separator. Defaults to a comma.'
41
+ body.attribute :results_url, :string,
42
+ description: "Absolute URL of the panel's imports view; the import-done email links back to it. Honored only when it matches one of the store's allowed origins."
43
+ end
44
+
45
+ request_params 'ImportCompleteMappingParams', action: :complete_mapping do |body|
46
+ body.attribute :mappings, :array,
47
+ permit: false,
48
+ description: 'Column assignments to apply before processing starts.' do |mapping|
49
+ mapping.attribute :schema_field, :string, required: true, description: 'Canonical schema field name.'
50
+ mapping.attribute :file_column, :string,
51
+ required: true,
52
+ nullable: true,
53
+ description: 'CSV header to read the field from; `null` unmaps the field.'
54
+ end
55
+ end
56
+
35
57
  # POST /api/v3/seller/imports
36
58
  #
37
- # `attachment` is an ActiveStorage signed blob id from
38
- # POST /api/v3/seller/direct_uploads. On success the import is
59
+ # `attachment_signed_id` is a signed id from
60
+ # POST /api/v3/seller/files. On success the import is
39
61
  # already in `mapping`, carrying the auto-assigned columns.
40
62
  def create
41
63
  @resource = build_resource
@@ -59,12 +81,6 @@ module Spree
59
81
  else
60
82
  render_errors(@resource.errors)
61
83
  end
62
- rescue ActiveSupport::MessageVerifier::InvalidSignature
63
- render_error(
64
- code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:validation_error],
65
- message: 'Invalid attachment signed id',
66
- status: :unprocessable_content
67
- )
68
84
  end
69
85
 
70
86
  # PATCH /api/v3/seller/imports/:id/complete_mapping
@@ -248,7 +264,7 @@ module Spree
248
264
  end
249
265
 
250
266
  def permitted_params
251
- params.permit(*model_additional_permitted_attributes, :type, :attachment, :preferred_delimiter, :results_url)
267
+ params.permit(*permitted_attributes)
252
268
  end
253
269
 
254
270
  # The registered Import subclass matching `name`, or nil.
@@ -22,6 +22,14 @@ module Spree
22
22
  only: [:lookup, :accept],
23
23
  with: -> { render_rate_limited(limit: Spree::Api::Config[:rate_limit_login]) }
24
24
 
25
+ request_params 'InvitationAcceptParams', action: :accept do |body|
26
+ body.attribute :password, :string,
27
+ description: 'Sets the password of a new account, or confirms the password of an existing one.'
28
+ body.attribute :password_confirmation, :string
29
+ body.attribute :first_name, :string, description: 'Used only when the invitation creates a new account.'
30
+ body.attribute :last_name, :string, description: 'Used only when the invitation creates a new account.'
31
+ end
32
+
25
33
  # GET /api/v3/seller/auth/invitations/:id/lookup?token=:token
26
34
  def lookup
27
35
  return unless load_invitation
@@ -121,7 +129,7 @@ module Spree
121
129
  end
122
130
 
123
131
  def signup_params(invitation)
124
- params.permit(:password, :password_confirmation, :first_name, :last_name).
132
+ params.permit(*declared_permitted_attributes).
125
133
  merge(email: invitation.email)
126
134
  end
127
135
 
@@ -16,6 +16,17 @@ module Spree
16
16
  skip_before_action :set_current_seller_context
17
17
  before_action :require_current_user!
18
18
 
19
+ request_params 'AccountUpdateParams' do |body|
20
+ body.attribute :first_name, :string, example: 'Ada'
21
+ body.attribute :last_name, :string, example: 'Lovelace'
22
+ body.attribute :selected_locale, :string,
23
+ example: 'de',
24
+ description: "The panel's display language, as a code the panel ships."
25
+ body.attribute :avatar_signed_id, :string,
26
+ nullable: true,
27
+ description: 'A `signed_id` from `POST /files` to set the photo, or `null` to remove it. Omit to leave the current one alone.'
28
+ end
29
+
19
30
  def show
20
31
  render json: me_response
21
32
  end
@@ -27,8 +38,8 @@ module Spree
27
38
  # seller they are acting for.
28
39
  #
29
40
  # Distinct from PATCH /profile, which writes the seller business.
30
- # `avatar` accepts an ActiveStorage direct-upload signed id to set
31
- # the photo, or `null` to remove it.
41
+ # `avatar_signed_id` takes a signed id from POST /files to set the
42
+ # photo, or `null` to remove it.
32
43
  def update
33
44
  if current_user.update(permitted_params)
34
45
  render json: me_response
@@ -40,7 +51,7 @@ module Spree
40
51
  private
41
52
 
42
53
  def permitted_params
43
- params.permit(:selected_locale, :first_name, :last_name, :avatar)
54
+ params.permit(*declared_permitted_attributes)
44
55
  end
45
56
 
46
57
  def me_response
@@ -12,6 +12,17 @@ module Spree
12
12
  class OnboardingController < Seller::BaseController
13
13
  scoped_resource :seller_profile
14
14
 
15
+ request_params 'OnboardingPayoutAccountParams', action: :payout_account do |body|
16
+ body.attribute :refresh_url, :string,
17
+ required: true,
18
+ format: :uri,
19
+ description: "Where the provider sends the seller back. Must be on the seller panel's origin; any other address is replaced with the panel's."
20
+ body.attribute :return_url, :string,
21
+ required: true,
22
+ format: :uri,
23
+ description: "Where the provider sends the seller back. Must be on the seller panel's origin; any other address is replaced with the panel's."
24
+ end
25
+
15
26
  # GET /api/v3/seller/onboarding
16
27
  def show
17
28
  render json: onboarding_payload
@@ -17,6 +17,41 @@ module Spree
17
17
 
18
18
  before_action :set_resource, only: [:show, :approve, :resolve, :deny, :cancel]
19
19
 
20
+ request_params :claim do |body|
21
+ body.attribute :items, :array, required: true do |item|
22
+ item.attribute :line_item_id, :id, required: true
23
+ item.attribute :quantity, :integer, required: true
24
+ item.attribute :description, :string, nullable: true
25
+ item.attribute :send_replacement, :boolean
26
+ item.attribute :replacement_variant_id, :id,
27
+ nullable: true,
28
+ description: "One of this seller's own variants."
29
+ item.attribute :refund_amount, :decimal, nullable: true
30
+ end
31
+ body.attribute :reason_id, :id, nullable: true
32
+ body.attribute :memo, :string, nullable: true
33
+ end
34
+
35
+ request_params 'ClaimResolveParams', action: :resolve do |body|
36
+ body.attribute :resolution, :string,
37
+ required: true,
38
+ choices: %w[refund replacement refund_and_replacement]
39
+ body.attribute :refund_method, :string,
40
+ choices: %w[original_payment store_credit],
41
+ description: 'Defaults to `store_credit`.'
42
+ body.attribute :amount, :decimal, nullable: true
43
+ body.attribute :replacement_line_item_ids, :array, of: :id,
44
+ description: 'Which claimed lines to replace. Omit to keep the lines the claim was opened with.'
45
+ end
46
+
47
+ request_params 'ClaimDenyParams', action: :deny do |body|
48
+ body.attribute :reason, :string, description: 'Recorded on the claim for the customer.'
49
+ end
50
+
51
+ request_params 'ClaimCancelParams', action: :cancel do |body|
52
+ body.attribute :reason, :string, description: 'A note on why the claim was canceled.'
53
+ end
54
+
20
55
  protected
21
56
 
22
57
  def serializer_class
@@ -16,6 +16,18 @@ module Spree
16
16
  class DeliveriesController < BaseController
17
17
  include Spree::Api::V3::Orders::DeliveryActions
18
18
 
19
+ # The permit list itself lives in DeliveryActions, shared with the
20
+ # operator's branch; this declaration documents it.
21
+ request_params :delivery do |body|
22
+ body.attribute :tracking_number, :string,
23
+ required: true, on: :create,
24
+ 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`.'
25
+ body.attribute :carrier, :string,
26
+ description: "Free text; detected from the number's format when omitted."
27
+ body.attribute :service, :string
28
+ body.attribute :tracking_url, :string
29
+ end
30
+
19
31
  before_action :set_resource, only: [:show, :update, :destroy]
20
32
 
21
33
  protected
@@ -17,6 +17,39 @@ module Spree
17
17
 
18
18
  before_action :set_resource, only: [:show, :approve, :receive, :fulfill, :cancel]
19
19
 
20
+ request_params :exchange do |body|
21
+ body.attribute :items, :array, required: true do |item|
22
+ item.attribute :fulfillment_item_id, :id, required: true
23
+ item.attribute :new_variant_id, :id, required: true, description: "One of this seller's own variants."
24
+ item.attribute :quantity, :integer, required: true
25
+ end
26
+ body.attribute :reason_id, :id, nullable: true
27
+ body.attribute :stock_location_id, :id,
28
+ nullable: true,
29
+ description: "One of this seller's own stock locations, where the goods are restocked."
30
+ body.attribute :memo, :string, nullable: true
31
+ end
32
+
33
+ request_params 'ExchangeReceiveParams', action: :receive do |body|
34
+ body.attribute :items, :array,
35
+ description: 'What actually arrived. Omit to receive everything as requested and resellable.' do |item|
36
+ item.attribute :exchange_line_item_id, :id, required: true
37
+ item.attribute :quantity, :integer, required: true
38
+ item.attribute :resellable, :boolean,
39
+ description: 'Goods that cannot be resold are received but never restocked. Defaults to true.'
40
+ end
41
+ end
42
+
43
+ request_params 'ExchangeCancelParams', action: :cancel do |body|
44
+ body.attribute :reason, :string, description: 'A note on why the exchange was canceled.'
45
+ end
46
+
47
+ request_params 'ExchangeFulfillParams', action: :fulfill do |body|
48
+ body.attribute :refund_method, :string,
49
+ choices: %w[original_payment store_credit],
50
+ description: 'Defaults to `store_credit`.'
51
+ end
52
+
20
53
  protected
21
54
 
22
55
  def serializer_class
@@ -23,6 +23,33 @@ module Spree
23
23
 
24
24
  before_action :set_resource, only: [:show, :update, :fulfill, :cancel, :split]
25
25
 
26
+ request_params :fulfillment do |body|
27
+ body.attribute :tracking, :string, nullable: true
28
+ body.attribute :tracking_carrier, :string, nullable: true
29
+ body.attribute :stock_location_id, :id,
30
+ description: "One of this seller's own stock locations; the rates requote from there."
31
+ body.attribute :selected_delivery_rate_id, :id,
32
+ description: 'One of the rates quoted for this parcel from its current origin.'
33
+ end
34
+
35
+ request_params 'FulfillmentFulfillParams', action: :fulfill do |body|
36
+ body.attribute :tracking, :string, description: 'Carrier tracking number.'
37
+ body.attribute :tracking_carrier, :string, description: 'Carrier name.'
38
+ body.attribute :notify_customer, :boolean, description: 'Send the dispatch email (default true).'
39
+ body.attribute :items, :array,
40
+ description: 'Ship only these lines; the rest split onto a new fulfillment.' do |item|
41
+ item.attribute :item_id, :id, required: true, description: 'Prefixed line item ID.'
42
+ item.attribute :quantity, :integer, required: true
43
+ end
44
+ end
45
+
46
+ request_params 'FulfillmentSplitParams', action: :split do |body|
47
+ body.attribute :variant_id, :id, required: true, description: 'The variant being moved out.'
48
+ body.attribute :quantity, :integer, required: true
49
+ body.attribute :stock_location_id, :id,
50
+ description: "One of this seller's own stock locations. Defaults to the source fulfillment's location."
51
+ end
52
+
26
53
  protected
27
54
 
28
55
  def serializer_class
@@ -34,8 +61,7 @@ module Spree
34
61
  end
35
62
 
36
63
  def permitted_params
37
- params.permit(:tracking, :tracking_carrier, :stock_location_id,
38
- :selected_delivery_rate_id)
64
+ params.permit(*declared_permitted_attributes)
39
65
  end
40
66
 
41
67
  private
@@ -15,6 +15,27 @@ module Spree
15
15
  class LabelsController < BaseController
16
16
  include Spree::Api::V3::Orders::ShippingLabelActions
17
17
 
18
+ # The permit list itself lives in ShippingLabelActions, shared with
19
+ # the operator's branch; this declaration documents it.
20
+ request_params :shipping_label do |body|
21
+ body.attribute :file_signed_id, :string,
22
+ required: true,
23
+ description: 'A `signed_id` from `files.upload()`.'
24
+ body.attribute :tracking_number, :string,
25
+ required: true,
26
+ description: 'The number printed on the label.'
27
+ body.attribute :carrier, :string,
28
+ description: "Free text; a forwarder's name is as valid as a carrier slug. Detected from the number when omitted."
29
+ body.attribute :service, :string, description: 'Carrier service the label was bought at.'
30
+ body.attribute :cost, :decimal,
31
+ description: "What the seller paid the carrier. Accounting data only; it never touches the order's shipping charge."
32
+ body.attribute :currency, :currency, description: 'Currency of the cost.'
33
+ body.attribute :file_format, :string,
34
+ choices: %w[pdf png zpl],
35
+ description: 'Taken from the file when omitted.'
36
+ body.attribute :tracking_url, :string, description: 'Tracking page for the consignment the label mints.'
37
+ end
38
+
18
39
  before_action :set_resource, only: [:show, :download, :destroy]
19
40
 
20
41
  # POST .../labels
@@ -24,7 +45,7 @@ module Spree
24
45
  def create
25
46
  authorize!(:create, Spree::ShippingLabel)
26
47
 
27
- if label_params[:file].blank?
48
+ if label_params[:file_signed_id].blank?
28
49
  return render_error(
29
50
  code: ERROR_CODES[:validation_error],
30
51
  message: I18n.t('spree.shipping_labels.errors.file_required'),
@@ -17,6 +17,13 @@ module Spree
17
17
  # there is no member record to fetch.
18
18
  skip_before_action :set_resource, raise: false
19
19
 
20
+ request_params 'OrderNotesParams' do |body|
21
+ body.attribute :customer_note, :string, nullable: true, description: 'What the buyer asked for.'
22
+ body.attribute :internal_note, :string,
23
+ nullable: true,
24
+ description: "The seller's own working note, as HTML. Sanitized on save; `internal_note_html` reads it back."
25
+ end
26
+
20
27
  # GET /api/v3/seller/orders/:order_id/notes
21
28
  def show
22
29
  render json: serialize_resource(@order)
@@ -59,7 +66,7 @@ module Spree
59
66
  # model sanitizes — the `_html` reader is its round-trip partner,
60
67
  # never a write.
61
68
  def notes_params
62
- permitted = params.permit(:customer_note, :internal_note)
69
+ permitted = params.permit(*declared_permitted_attributes)
63
70
 
64
71
  {}.tap do |attributes|
65
72
  attributes[:customer_note] = permitted[:customer_note] if params.key?(:customer_note)
@@ -17,6 +17,38 @@ module Spree
17
17
 
18
18
  before_action :set_resource, only: [:show, :approve, :receive, :refund, :cancel]
19
19
 
20
+ request_params :return do |body|
21
+ body.attribute :items, :array, required: true do |item|
22
+ item.attribute :fulfillment_item_id, :id, required: true
23
+ item.attribute :quantity, :integer, required: true
24
+ end
25
+ body.attribute :reason_id, :id, nullable: true
26
+ body.attribute :stock_location_id, :id,
27
+ nullable: true,
28
+ description: "One of this seller's own stock locations, where the goods are restocked."
29
+ body.attribute :memo, :string, nullable: true
30
+ end
31
+
32
+ request_params 'ReturnReceiveParams', action: :receive do |body|
33
+ body.attribute :items, :array,
34
+ description: 'What actually arrived. Omit to receive everything as requested and resellable.' do |item|
35
+ item.attribute :return_line_item_id, :id, required: true
36
+ item.attribute :quantity, :integer, required: true
37
+ item.attribute :resellable, :boolean, description: 'Defaults to true.'
38
+ end
39
+ end
40
+
41
+ request_params 'ReturnRefundParams', action: :refund do |body|
42
+ body.attribute :amount, :decimal, nullable: true
43
+ body.attribute :refund_method, :string,
44
+ choices: %w[original_payment store_credit],
45
+ description: 'Defaults to `original_payment`.'
46
+ end
47
+
48
+ request_params 'ReturnCancelParams', action: :cancel do |body|
49
+ body.attribute :reason, :string, description: 'A note on why the return was canceled.'
50
+ end
51
+
20
52
  protected
21
53
 
22
54
  def serializer_class