spree_api 6.0.0.beta4 → 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 (531) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +4 -48
  3. data/app/controllers/concerns/spree/api/v3/admin/email_template_lookup.rb +139 -0
  4. data/app/controllers/concerns/spree/api/v3/admin/product_membership.rb +10 -0
  5. data/app/controllers/concerns/spree/api/v3/admin/stock_receipt_actions.rb +26 -4
  6. data/app/controllers/concerns/spree/api/v3/admin/store_context.rb +1 -1
  7. data/app/controllers/concerns/spree/api/v3/admin/subclassed_resource.rb +15 -29
  8. data/app/controllers/concerns/spree/api/v3/admin/validation_details.rb +1 -1
  9. data/app/controllers/concerns/spree/api/v3/cart_resolvable.rb +10 -2
  10. data/app/controllers/concerns/spree/api/v3/channel_resolution.rb +3 -3
  11. data/app/controllers/concerns/spree/api/v3/company_address_writes.rb +3 -1
  12. data/app/controllers/concerns/spree/api/v3/current_password_confirmation.rb +1 -1
  13. data/app/controllers/concerns/spree/api/v3/error_handler.rb +55 -4
  14. data/app/controllers/concerns/spree/api/v3/file_uploads.rb +35 -0
  15. data/app/controllers/concerns/spree/api/v3/http_caching.rb +44 -11
  16. data/app/controllers/concerns/spree/api/v3/idempotent.rb +20 -5
  17. data/app/controllers/concerns/spree/api/v3/items_payload.rb +1 -1
  18. data/app/controllers/concerns/spree/api/v3/money_params.rb +52 -0
  19. data/app/controllers/concerns/spree/api/v3/order_lock.rb +2 -2
  20. data/app/controllers/concerns/spree/api/v3/orders/claim_actions.rb +1 -5
  21. data/app/controllers/concerns/spree/api/v3/orders/delivery_actions.rb +7 -11
  22. data/app/controllers/concerns/spree/api/v3/orders/exchange_actions.rb +1 -4
  23. data/app/controllers/concerns/spree/api/v3/orders/fulfillment_actions.rb +3 -15
  24. data/app/controllers/concerns/spree/api/v3/orders/post_sale_actions.rb +2 -10
  25. data/app/controllers/concerns/spree/api/v3/orders/return_actions.rb +1 -4
  26. data/app/controllers/concerns/spree/api/v3/orders/shipping_label_actions.rb +8 -28
  27. data/app/controllers/concerns/spree/api/v3/params_normalizer.rb +5 -0
  28. data/app/controllers/concerns/spree/api/v3/permission_serialization.rb +9 -1
  29. data/app/controllers/concerns/spree/api/v3/purchase_serialization.rb +26 -0
  30. data/app/controllers/concerns/spree/api/v3/request_params.rb +65 -0
  31. data/app/controllers/concerns/spree/api/v3/seller/seller_context.rb +1 -1
  32. data/app/controllers/concerns/spree/api/v3/store/storefront_products.rb +5 -4
  33. data/app/controllers/concerns/spree/api/v3/storefront_gating.rb +11 -5
  34. data/app/controllers/concerns/spree/api/v3/strict_money_params.rb +94 -0
  35. data/app/controllers/spree/api/v3/admin/admin_users_controller.rb +8 -4
  36. data/app/controllers/spree/api/v3/admin/allowed_origins_controller.rb +8 -1
  37. data/app/controllers/spree/api/v3/admin/api_keys_controller.rb +16 -8
  38. data/app/controllers/spree/api/v3/admin/base_controller.rb +1 -0
  39. data/app/controllers/spree/api/v3/admin/catalogs/order_minimums_controller.rb +2 -6
  40. data/app/controllers/spree/api/v3/admin/catalogs/quantity_rules_controller.rb +7 -9
  41. data/app/controllers/spree/api/v3/admin/catalogs_controller.rb +61 -34
  42. data/app/controllers/spree/api/v3/admin/categories/products_controller.rb +4 -1
  43. data/app/controllers/spree/api/v3/admin/categories_controller.rb +40 -20
  44. data/app/controllers/spree/api/v3/admin/channels_controller.rb +39 -10
  45. data/app/controllers/spree/api/v3/admin/claim_reasons_controller.rb +5 -1
  46. data/app/controllers/spree/api/v3/admin/collections/products_controller.rb +5 -3
  47. data/app/controllers/spree/api/v3/admin/collections_controller.rb +44 -15
  48. data/app/controllers/spree/api/v3/admin/commission_rates_controller.rb +62 -14
  49. data/app/controllers/spree/api/v3/admin/companies/addresses_controller.rb +11 -4
  50. data/app/controllers/spree/api/v3/admin/companies/invitations_controller.rb +1 -5
  51. data/app/controllers/spree/api/v3/admin/companies/memberships_controller.rb +9 -5
  52. data/app/controllers/spree/api/v3/admin/companies/tax_exemption_certificates_controller.rb +20 -27
  53. data/app/controllers/spree/api/v3/admin/companies/tax_identifiers_controller.rb +6 -5
  54. data/app/controllers/spree/api/v3/admin/companies_controller.rb +17 -7
  55. data/app/controllers/spree/api/v3/admin/countries_controller.rb +6 -2
  56. data/app/controllers/spree/api/v3/admin/coupon_codes_controller.rb +0 -4
  57. data/app/controllers/spree/api/v3/admin/custom_field_definitions_controller.rb +22 -4
  58. data/app/controllers/spree/api/v3/admin/custom_fields_controller.rb +12 -9
  59. data/app/controllers/spree/api/v3/admin/customer_groups_controller.rb +9 -5
  60. data/app/controllers/spree/api/v3/admin/customers/addresses_controller.rb +12 -11
  61. data/app/controllers/spree/api/v3/admin/customers/credit_cards_controller.rb +0 -4
  62. data/app/controllers/spree/api/v3/admin/customers/store_credits_controller.rb +11 -13
  63. data/app/controllers/spree/api/v3/admin/customers/tax_identifiers_controller.rb +6 -1
  64. data/app/controllers/spree/api/v3/admin/customers_controller.rb +37 -9
  65. data/app/controllers/spree/api/v3/admin/data_requests_controller.rb +8 -0
  66. data/app/controllers/spree/api/v3/admin/delivery_method_rules_controller.rb +1 -1
  67. data/app/controllers/spree/api/v3/admin/delivery_methods/rules_controller.rb +16 -8
  68. data/app/controllers/spree/api/v3/admin/delivery_methods_controller.rb +95 -62
  69. data/app/controllers/spree/api/v3/admin/delivery_profiles/origin_groups_controller.rb +8 -1
  70. data/app/controllers/spree/api/v3/admin/delivery_profiles_controller.rb +14 -7
  71. data/app/controllers/spree/api/v3/admin/delivery_zones_controller.rb +21 -5
  72. data/app/controllers/spree/api/v3/admin/email_templates/drafts_controller.rb +53 -0
  73. data/app/controllers/spree/api/v3/admin/email_templates/previews_controller.rb +34 -0
  74. data/app/controllers/spree/api/v3/admin/email_templates/publications_controller.rb +37 -0
  75. data/app/controllers/spree/api/v3/admin/email_templates/restorations_controller.rb +42 -0
  76. data/app/controllers/spree/api/v3/admin/email_templates/revisions_controller.rb +35 -0
  77. data/app/controllers/spree/api/v3/admin/email_templates/sample_records_controller.rb +33 -0
  78. data/app/controllers/spree/api/v3/admin/email_templates/test_emails_controller.rb +44 -0
  79. data/app/controllers/spree/api/v3/admin/email_templates_controller.rb +46 -0
  80. data/app/controllers/spree/api/v3/admin/exports_controller.rb +23 -6
  81. data/app/controllers/spree/api/v3/admin/files_controller.rb +29 -0
  82. data/app/controllers/spree/api/v3/admin/gift_card_batches_controller.rb +20 -1
  83. data/app/controllers/spree/api/v3/admin/gift_cards_controller.rb +19 -1
  84. data/app/controllers/spree/api/v3/admin/imports_controller.rb +37 -11
  85. data/app/controllers/spree/api/v3/admin/integrations_controller.rb +13 -1
  86. data/app/controllers/spree/api/v3/admin/invitation_acceptances_controller.rb +9 -2
  87. data/app/controllers/spree/api/v3/admin/invitations_controller.rb +8 -8
  88. data/app/controllers/spree/api/v3/admin/locales_controller.rb +1 -1
  89. data/app/controllers/spree/api/v3/admin/markets_controller.rb +30 -9
  90. data/app/controllers/spree/api/v3/admin/me_controller.rb +13 -4
  91. data/app/controllers/spree/api/v3/admin/media_controller.rb +22 -9
  92. data/app/controllers/spree/api/v3/admin/media_library_controller.rb +9 -5
  93. data/app/controllers/spree/api/v3/admin/option_types_controller.rb +24 -7
  94. data/app/controllers/spree/api/v3/admin/order_cancellation_reasons_controller.rb +5 -1
  95. data/app/controllers/spree/api/v3/admin/order_routing_rules_controller.rb +13 -5
  96. data/app/controllers/spree/api/v3/admin/orders/claims_controller.rb +39 -1
  97. data/app/controllers/spree/api/v3/admin/orders/deliveries_controller.rb +20 -6
  98. data/app/controllers/spree/api/v3/admin/orders/discount_codes_controller.rb +6 -2
  99. data/app/controllers/spree/api/v3/admin/orders/discounts_controller.rb +30 -6
  100. data/app/controllers/spree/api/v3/admin/orders/exchanges_controller.rb +36 -1
  101. data/app/controllers/spree/api/v3/admin/orders/fees_controller.rb +22 -1
  102. data/app/controllers/spree/api/v3/admin/orders/fulfillments_controller.rb +83 -22
  103. data/app/controllers/spree/api/v3/admin/orders/gift_cards_controller.rb +9 -5
  104. data/app/controllers/spree/api/v3/admin/orders/items_controller.rb +11 -1
  105. data/app/controllers/spree/api/v3/admin/orders/labels_controller.rb +37 -12
  106. data/app/controllers/spree/api/v3/admin/orders/payments_controller.rb +18 -19
  107. data/app/controllers/spree/api/v3/admin/orders/refunds_controller.rb +7 -5
  108. data/app/controllers/spree/api/v3/admin/orders/returns_controller.rb +37 -1
  109. data/app/controllers/spree/api/v3/admin/orders/store_credits_controller.rb +6 -3
  110. data/app/controllers/spree/api/v3/admin/orders_controller.rb +76 -62
  111. data/app/controllers/spree/api/v3/admin/package_types_controller.rb +30 -5
  112. data/app/controllers/spree/api/v3/admin/password_resets_controller.rb +26 -7
  113. data/app/controllers/spree/api/v3/admin/payment_methods_controller.rb +38 -22
  114. data/app/controllers/spree/api/v3/admin/policies_controller.rb +8 -4
  115. data/app/controllers/spree/api/v3/admin/price_lists_controller.rb +32 -67
  116. data/app/controllers/spree/api/v3/admin/prices_controller.rb +51 -8
  117. data/app/controllers/spree/api/v3/admin/product_types_controller.rb +25 -8
  118. data/app/controllers/spree/api/v3/admin/products/digital_assets_controller.rb +29 -16
  119. data/app/controllers/spree/api/v3/admin/products/variants_controller.rb +9 -18
  120. data/app/controllers/spree/api/v3/admin/products_controller.rb +122 -71
  121. data/app/controllers/spree/api/v3/admin/promotion_actions_controller.rb +11 -6
  122. data/app/controllers/spree/api/v3/admin/promotion_rules_controller.rb +10 -5
  123. data/app/controllers/spree/api/v3/admin/promotions_controller.rb +50 -14
  124. data/app/controllers/spree/api/v3/admin/purchase_orders_controller.rb +55 -8
  125. data/app/controllers/spree/api/v3/admin/refund_reasons_controller.rb +5 -1
  126. data/app/controllers/spree/api/v3/admin/reporting/saved_reports_controller.rb +9 -1
  127. data/app/controllers/spree/api/v3/admin/reporting_controller.rb +34 -0
  128. data/app/controllers/spree/api/v3/admin/resource_controller.rb +2 -1
  129. data/app/controllers/spree/api/v3/admin/return_reasons_controller.rb +5 -1
  130. data/app/controllers/spree/api/v3/admin/roles_controller.rb +13 -1
  131. data/app/controllers/spree/api/v3/admin/seller_payouts_controller.rb +7 -9
  132. data/app/controllers/spree/api/v3/admin/seller_requirement_submissions_controller.rb +17 -10
  133. data/app/controllers/spree/api/v3/admin/seller_requirements_controller.rb +32 -6
  134. data/app/controllers/spree/api/v3/admin/seller_transfers_controller.rb +0 -4
  135. data/app/controllers/spree/api/v3/admin/sellers/invitations_controller.rb +1 -1
  136. data/app/controllers/spree/api/v3/admin/sellers/payouts_controller.rb +1 -1
  137. data/app/controllers/spree/api/v3/admin/sellers_controller.rb +77 -32
  138. data/app/controllers/spree/api/v3/admin/setup_controller.rb +54 -23
  139. data/app/controllers/spree/api/v3/admin/stock_levels_controller.rb +38 -9
  140. data/app/controllers/spree/api/v3/admin/stock_locations_controller.rb +41 -9
  141. data/app/controllers/spree/api/v3/admin/stock_transfers_controller.rb +49 -8
  142. data/app/controllers/spree/api/v3/admin/store_controller.rb +122 -48
  143. data/app/controllers/spree/api/v3/admin/store_credits_controller.rb +1 -7
  144. data/app/controllers/spree/api/v3/admin/suppliers_controller.rb +16 -6
  145. data/app/controllers/spree/api/v3/admin/tags_controller.rb +8 -5
  146. data/app/controllers/spree/api/v3/admin/tax_categories_controller.rb +7 -4
  147. data/app/controllers/spree/api/v3/admin/tax_rates_controller.rb +21 -3
  148. data/app/controllers/spree/api/v3/admin/tracking_carriers_controller.rb +4 -0
  149. data/app/controllers/spree/api/v3/admin/translations/batches_controller.rb +17 -9
  150. data/app/controllers/spree/api/v3/admin/translations_controller.rb +4 -0
  151. data/app/controllers/spree/api/v3/admin/translations_coverage_controller.rb +5 -0
  152. data/app/controllers/spree/api/v3/admin/updates_controller.rb +39 -0
  153. data/app/controllers/spree/api/v3/admin/webhook_endpoints_controller.rb +40 -13
  154. data/app/controllers/spree/api/v3/admin/webhook_events_controller.rb +25 -0
  155. data/app/controllers/spree/api/v3/base_controller.rb +12 -0
  156. data/app/controllers/spree/api/v3/resource_controller.rb +99 -3
  157. data/app/controllers/spree/api/v3/seller/auth_controller.rb +10 -2
  158. data/app/controllers/spree/api/v3/seller/base_controller.rb +1 -0
  159. data/app/controllers/spree/api/v3/seller/countries_controller.rb +3 -3
  160. data/app/controllers/spree/api/v3/seller/delivery_methods_controller.rb +49 -60
  161. data/app/controllers/spree/api/v3/seller/exports_controller.rb +21 -4
  162. data/app/controllers/spree/api/v3/seller/files_controller.rb +27 -0
  163. data/app/controllers/spree/api/v3/seller/imports_controller.rb +25 -9
  164. data/app/controllers/spree/api/v3/seller/invitation_acceptances_controller.rb +12 -4
  165. data/app/controllers/spree/api/v3/seller/invitations_controller.rb +1 -1
  166. data/app/controllers/spree/api/v3/seller/me_controller.rb +15 -4
  167. data/app/controllers/spree/api/v3/seller/onboarding_controller.rb +11 -0
  168. data/app/controllers/spree/api/v3/seller/orders/claims_controller.rb +35 -0
  169. data/app/controllers/spree/api/v3/seller/orders/deliveries_controller.rb +12 -0
  170. data/app/controllers/spree/api/v3/seller/orders/exchanges_controller.rb +33 -0
  171. data/app/controllers/spree/api/v3/seller/orders/fulfillments_controller.rb +28 -2
  172. data/app/controllers/spree/api/v3/seller/orders/labels_controller.rb +23 -2
  173. data/app/controllers/spree/api/v3/seller/orders/notes_controller.rb +8 -1
  174. data/app/controllers/spree/api/v3/seller/orders/returns_controller.rb +32 -0
  175. data/app/controllers/spree/api/v3/seller/orders_controller.rb +35 -14
  176. data/app/controllers/spree/api/v3/seller/package_types_controller.rb +21 -9
  177. data/app/controllers/spree/api/v3/seller/password_resets_controller.rb +20 -11
  178. data/app/controllers/spree/api/v3/seller/policies_controller.rb +12 -4
  179. data/app/controllers/spree/api/v3/seller/products_controller.rb +115 -28
  180. data/app/controllers/spree/api/v3/seller/profile_controller.rb +33 -10
  181. data/app/controllers/spree/api/v3/seller/requirement_submissions_controller.rb +13 -6
  182. data/app/controllers/spree/api/v3/seller/resource_controller.rb +12 -0
  183. data/app/controllers/spree/api/v3/seller/stock_locations_controller.rb +44 -13
  184. data/app/controllers/spree/api/v3/seller/tax_identifiers_controller.rb +10 -1
  185. data/app/controllers/spree/api/v3/seller/team_controller.rb +5 -1
  186. data/app/controllers/spree/api/v3/store/auth_controller.rb +10 -0
  187. data/app/controllers/spree/api/v3/store/carts/discount_codes_controller.rb +9 -2
  188. data/app/controllers/spree/api/v3/store/carts/fulfillments_controller.rb +11 -11
  189. data/app/controllers/spree/api/v3/store/carts/gift_cards_controller.rb +13 -4
  190. data/app/controllers/spree/api/v3/store/carts/items_controller.rb +23 -7
  191. data/app/controllers/spree/api/v3/store/carts/payment_sessions_controller.rb +21 -7
  192. data/app/controllers/spree/api/v3/store/carts/payments_controller.rb +16 -3
  193. data/app/controllers/spree/api/v3/store/carts/po_documents_controller.rb +26 -28
  194. data/app/controllers/spree/api/v3/store/carts/store_credits_controller.rb +9 -1
  195. data/app/controllers/spree/api/v3/store/carts/tax_identifiers_controller.rb +5 -1
  196. data/app/controllers/spree/api/v3/store/carts_controller.rb +64 -52
  197. data/app/controllers/spree/api/v3/store/companies/addresses_controller.rb +12 -8
  198. data/app/controllers/spree/api/v3/store/companies/invitations_controller.rb +1 -5
  199. data/app/controllers/spree/api/v3/store/companies/members_controller.rb +4 -0
  200. data/app/controllers/spree/api/v3/store/companies_controller.rb +5 -1
  201. data/app/controllers/spree/api/v3/store/company_invitations_controller.rb +10 -2
  202. data/app/controllers/spree/api/v3/store/customer/addresses_controller.rb +8 -11
  203. data/app/controllers/spree/api/v3/store/customer/credit_cards_controller.rb +0 -4
  204. data/app/controllers/spree/api/v3/store/customer/data_requests_controller.rb +5 -5
  205. data/app/controllers/spree/api/v3/store/customer/digital_links_controller.rb +0 -4
  206. data/app/controllers/spree/api/v3/store/customer/gift_cards_controller.rb +0 -4
  207. data/app/controllers/spree/api/v3/store/customer/orders_controller.rb +0 -4
  208. data/app/controllers/spree/api/v3/store/customer/password_resets_controller.rb +25 -6
  209. data/app/controllers/spree/api/v3/store/customer/payment_setup_sessions_controller.rb +10 -9
  210. data/app/controllers/spree/api/v3/store/customer/store_credits_controller.rb +0 -5
  211. data/app/controllers/spree/api/v3/store/customer/tax_identifiers_controller.rb +5 -1
  212. data/app/controllers/spree/api/v3/store/customers_controller.rb +28 -2
  213. data/app/controllers/spree/api/v3/store/data_request_downloads_controller.rb +1 -1
  214. data/app/controllers/spree/api/v3/store/delivery_methods_controller.rb +1 -1
  215. data/app/controllers/spree/api/v3/store/newsletter_subscribers_controller.rb +27 -14
  216. data/app/controllers/spree/api/v3/store/orders/claims_controller.rb +12 -7
  217. data/app/controllers/spree/api/v3/store/orders/returns_controller.rb +11 -6
  218. data/app/controllers/spree/api/v3/store/orders_controller.rb +47 -10
  219. data/app/controllers/spree/api/v3/store/products_controller.rb +8 -0
  220. data/app/controllers/spree/api/v3/store/wishlist_items_controller.rb +10 -8
  221. data/app/controllers/spree/api/v3/store/wishlists_controller.rb +12 -4
  222. data/app/request_schemas/spree/api/v3/address_request_schema.rb +27 -0
  223. data/app/request_schemas/spree/api/v3/admin/address_request_schema.rb +13 -0
  224. data/app/request_schemas/spree/api/v3/admin/bulk_tags_request_schema.rb +17 -0
  225. data/app/request_schemas/spree/api/v3/admin/catalog_order_minimum_request_schema.rb +17 -0
  226. data/app/request_schemas/spree/api/v3/admin/email_template_language_request_schema.rb +17 -0
  227. data/app/request_schemas/spree/api/v3/admin/email_template_preview_request_schema.rb +32 -0
  228. data/app/request_schemas/spree/api/v3/admin/price_adjustment_tier_request_schema.rb +21 -0
  229. data/app/request_schemas/spree/api/v3/admin/price_list_price_request_schema.rb +21 -0
  230. data/app/request_schemas/spree/api/v3/admin/price_list_rule_request_schema.rb +19 -0
  231. data/app/request_schemas/spree/api/v3/admin/product_membership_reposition_request_schema.rb +17 -0
  232. data/app/request_schemas/spree/api/v3/admin/promotion_action_calculator_request_schema.rb +18 -0
  233. data/app/request_schemas/spree/api/v3/admin/promotion_action_line_item_request_schema.rb +15 -0
  234. data/app/request_schemas/spree/api/v3/admin/promotion_action_request_schema.rb +19 -0
  235. data/app/request_schemas/spree/api/v3/admin/promotion_rule_request_schema.rb +22 -0
  236. data/app/request_schemas/spree/api/v3/admin/reason_request_schema.rb +14 -0
  237. data/app/request_schemas/spree/api/v3/admin/tax_identifier_request_schema.rb +15 -0
  238. data/app/request_schemas/spree/api/v3/custom_field_value_request_schema.rb +15 -0
  239. data/app/request_schemas/spree/api/v3/file_upload_request_schema.rb +20 -0
  240. data/app/request_schemas/spree/api/v3/media_request_schema.rb +27 -0
  241. data/app/request_schemas/spree/api/v3/price_request_schema.rb +17 -0
  242. data/app/request_schemas/spree/api/v3/stock_level_request_schema.rb +18 -0
  243. data/app/request_schemas/spree/api/v3/store/address_request_schema.rb +29 -0
  244. data/app/request_schemas/spree/api/v3/tax_identifier_request_schema.rb +18 -0
  245. data/app/request_schemas/spree/api/v3/variant_option_request_schema.rb +13 -0
  246. data/app/request_schemas/spree/api/v3/variant_request_schema.rb +52 -0
  247. data/app/serializers/concerns/spree/api/v3/purchase_summary.rb +48 -0
  248. data/app/serializers/spree/api/v3/address_serializer.rb +4 -2
  249. data/app/serializers/spree/api/v3/admin/address_serializer.rb +8 -7
  250. data/app/serializers/spree/api/v3/admin/api_key_serializer.rb +2 -6
  251. data/app/serializers/spree/api/v3/admin/applied_promotion_serializer.rb +3 -1
  252. data/app/serializers/spree/api/v3/admin/cart_serializer.rb +3 -1
  253. data/app/serializers/spree/api/v3/admin/catalog_assignment_serializer.rb +1 -3
  254. data/app/serializers/spree/api/v3/admin/catalog_order_minimum_serializer.rb +3 -8
  255. data/app/serializers/spree/api/v3/admin/catalog_price_serializer.rb +3 -4
  256. data/app/serializers/spree/api/v3/admin/catalog_price_tier_serializer.rb +4 -3
  257. data/app/serializers/spree/api/v3/admin/catalog_product_term_serializer.rb +1 -3
  258. data/app/serializers/spree/api/v3/admin/catalog_quantity_rule_serializer.rb +1 -3
  259. data/app/serializers/spree/api/v3/admin/channel_serializer.rb +7 -10
  260. data/app/serializers/spree/api/v3/admin/claim_line_item_serializer.rb +7 -0
  261. data/app/serializers/spree/api/v3/admin/claim_reason_serializer.rb +1 -3
  262. data/app/serializers/spree/api/v3/admin/claim_serializer.rb +5 -0
  263. data/app/serializers/spree/api/v3/admin/commission_line_serializer.rb +7 -18
  264. data/app/serializers/spree/api/v3/admin/commission_rate_serializer.rb +7 -11
  265. data/app/serializers/spree/api/v3/admin/commission_rule_serializer.rb +1 -5
  266. data/app/serializers/spree/api/v3/admin/country_serializer.rb +4 -0
  267. data/app/serializers/spree/api/v3/admin/coupon_code_serializer.rb +1 -7
  268. data/app/serializers/spree/api/v3/admin/credit_card_serializer.rb +1 -7
  269. data/app/serializers/spree/api/v3/admin/custom_field_definition_serializer.rb +6 -2
  270. data/app/serializers/spree/api/v3/admin/customer_serializer.rb +5 -17
  271. data/app/serializers/spree/api/v3/admin/data_request_serializer.rb +2 -6
  272. data/app/serializers/spree/api/v3/admin/delivery_method_rule_serializer.rb +0 -2
  273. data/app/serializers/spree/api/v3/admin/delivery_method_serializer.rb +20 -30
  274. data/app/serializers/spree/api/v3/admin/delivery_method_service_serializer.rb +9 -1
  275. data/app/serializers/spree/api/v3/admin/delivery_origin_group_serializer.rb +1 -3
  276. data/app/serializers/spree/api/v3/admin/delivery_rate_serializer.rb +8 -0
  277. data/app/serializers/spree/api/v3/admin/delivery_serializer.rb +1 -3
  278. data/app/serializers/spree/api/v3/admin/delivery_zone_serializer.rb +1 -7
  279. data/app/serializers/spree/api/v3/admin/digital_asset_serializer.rb +4 -2
  280. data/app/serializers/spree/api/v3/admin/discount_serializer.rb +3 -1
  281. data/app/serializers/spree/api/v3/admin/email_template_draft_serializer.rb +19 -0
  282. data/app/serializers/spree/api/v3/admin/email_template_preview_serializer.rb +38 -0
  283. data/app/serializers/spree/api/v3/admin/email_template_revision_serializer.rb +18 -0
  284. data/app/serializers/spree/api/v3/admin/email_template_sample_record_serializer.rb +13 -0
  285. data/app/serializers/spree/api/v3/admin/email_template_serializer.rb +61 -0
  286. data/app/serializers/spree/api/v3/admin/exchange_line_item_serializer.rb +5 -0
  287. data/app/serializers/spree/api/v3/admin/exchange_serializer.rb +6 -3
  288. data/app/serializers/spree/api/v3/admin/export_serializer.rb +1 -7
  289. data/app/serializers/spree/api/v3/admin/fee_serializer.rb +3 -1
  290. data/app/serializers/spree/api/v3/admin/file_upload_serializer.rb +11 -0
  291. data/app/serializers/spree/api/v3/admin/file_upload_target_serializer.rb +10 -0
  292. data/app/serializers/spree/api/v3/admin/fulfillment_item_serializer.rb +1 -7
  293. data/app/serializers/spree/api/v3/admin/fulfillment_serializer.rb +13 -17
  294. data/app/serializers/spree/api/v3/admin/gift_card_serializer.rb +4 -10
  295. data/app/serializers/spree/api/v3/admin/import_serializer.rb +2 -2
  296. data/app/serializers/spree/api/v3/admin/integration_serializer.rb +1 -3
  297. data/app/serializers/spree/api/v3/admin/line_item_serializer.rb +14 -18
  298. data/app/serializers/spree/api/v3/admin/locale_serializer.rb +13 -0
  299. data/app/serializers/spree/api/v3/admin/market_serializer.rb +7 -2
  300. data/app/serializers/spree/api/v3/admin/media_serializer.rb +4 -5
  301. data/app/serializers/spree/api/v3/admin/order_cancellation_reason_serializer.rb +1 -3
  302. data/app/serializers/spree/api/v3/admin/order_group_serializer.rb +5 -9
  303. data/app/serializers/spree/api/v3/admin/order_routing_rule_serializer.rb +2 -6
  304. data/app/serializers/spree/api/v3/admin/order_serializer.rb +38 -48
  305. data/app/serializers/spree/api/v3/admin/package_type_serializer.rb +1 -3
  306. data/app/serializers/spree/api/v3/admin/payment_method_serializer.rb +7 -4
  307. data/app/serializers/spree/api/v3/admin/payment_serializer.rb +6 -8
  308. data/app/serializers/spree/api/v3/admin/payment_split_serializer.rb +8 -9
  309. data/app/serializers/spree/api/v3/admin/permission_serializer.rb +4 -4
  310. data/app/serializers/spree/api/v3/admin/price_adjustment_tier_serializer.rb +3 -6
  311. data/app/serializers/spree/api/v3/admin/price_history_serializer.rb +5 -2
  312. data/app/serializers/spree/api/v3/admin/price_list_serializer.rb +1 -5
  313. data/app/serializers/spree/api/v3/admin/price_rule_serializer.rb +2 -6
  314. data/app/serializers/spree/api/v3/admin/price_serializer.rb +2 -0
  315. data/app/serializers/spree/api/v3/admin/product_serializer.rb +4 -10
  316. data/app/serializers/spree/api/v3/admin/product_submission_serializer.rb +2 -10
  317. data/app/serializers/spree/api/v3/admin/product_type_serializer.rb +1 -3
  318. data/app/serializers/spree/api/v3/admin/promotion_action_serializer.rb +5 -9
  319. data/app/serializers/spree/api/v3/admin/promotion_rule_serializer.rb +1 -5
  320. data/app/serializers/spree/api/v3/admin/purchase_order_item_serializer.rb +6 -25
  321. data/app/serializers/spree/api/v3/admin/purchase_order_serializer.rb +4 -17
  322. data/app/serializers/spree/api/v3/admin/refund_reason_serializer.rb +1 -3
  323. data/app/serializers/spree/api/v3/admin/refund_serializer.rb +7 -0
  324. data/app/serializers/spree/api/v3/admin/reporting_result_serializer.rb +9 -2
  325. data/app/serializers/spree/api/v3/admin/return_line_item_serializer.rb +9 -0
  326. data/app/serializers/spree/api/v3/admin/return_reason_serializer.rb +1 -3
  327. data/app/serializers/spree/api/v3/admin/return_serializer.rb +8 -12
  328. data/app/serializers/spree/api/v3/admin/saved_report_serializer.rb +1 -3
  329. data/app/serializers/spree/api/v3/admin/seller_balance_serializer.rb +15 -10
  330. data/app/serializers/spree/api/v3/admin/seller_payout_serializer.rb +7 -7
  331. data/app/serializers/spree/api/v3/admin/seller_requirement_status_serializer.rb +2 -6
  332. data/app/serializers/spree/api/v3/admin/seller_requirement_submission_serializer.rb +1 -7
  333. data/app/serializers/spree/api/v3/admin/seller_serializer.rb +8 -16
  334. data/app/serializers/spree/api/v3/admin/seller_transfer_serializer.rb +11 -10
  335. data/app/serializers/spree/api/v3/admin/shipping_label_serializer.rb +8 -21
  336. data/app/serializers/spree/api/v3/admin/stock_level_serializer.rb +1 -3
  337. data/app/serializers/spree/api/v3/admin/stock_location_serializer.rb +4 -3
  338. data/app/serializers/spree/api/v3/admin/stock_movement_serializer.rb +3 -9
  339. data/app/serializers/spree/api/v3/admin/stock_receipt_item_serializer.rb +1 -7
  340. data/app/serializers/spree/api/v3/admin/stock_receipt_serializer.rb +1 -3
  341. data/app/serializers/spree/api/v3/admin/stock_reservation_serializer.rb +1 -3
  342. data/app/serializers/spree/api/v3/admin/stock_transfer_item_serializer.rb +1 -3
  343. data/app/serializers/spree/api/v3/admin/store_credit_event_serializer.rb +6 -3
  344. data/app/serializers/spree/api/v3/admin/store_credit_serializer.rb +11 -20
  345. data/app/serializers/spree/api/v3/admin/store_serializer.rb +21 -84
  346. data/app/serializers/spree/api/v3/admin/supplier_serializer.rb +2 -4
  347. data/app/serializers/spree/api/v3/admin/tax_exemption_certificate_serializer.rb +6 -10
  348. data/app/serializers/spree/api/v3/admin/tax_identifier_serializer.rb +1 -3
  349. data/app/serializers/spree/api/v3/admin/tax_line_serializer.rb +9 -3
  350. data/app/serializers/spree/api/v3/admin/tax_rate_serializer.rb +3 -19
  351. data/app/serializers/spree/api/v3/admin/update_status_serializer.rb +28 -0
  352. data/app/serializers/spree/api/v3/admin/variant_serializer.rb +13 -10
  353. data/app/serializers/spree/api/v3/admin/webhook_delivery_serializer.rb +1 -3
  354. data/app/serializers/spree/api/v3/admin/webhook_event_serializer.rb +23 -0
  355. data/app/serializers/spree/api/v3/applied_promotion_serializer.rb +2 -4
  356. data/app/serializers/spree/api/v3/base_serializer.rb +132 -7
  357. data/app/serializers/spree/api/v3/cart_serializer.rb +20 -66
  358. data/app/serializers/spree/api/v3/category_serializer.rb +5 -15
  359. data/app/serializers/spree/api/v3/claim_line_item_serializer.rb +6 -29
  360. data/app/serializers/spree/api/v3/claim_serializer.rb +2 -16
  361. data/app/serializers/spree/api/v3/collection_serializer.rb +1 -3
  362. data/app/serializers/spree/api/v3/company_serializer.rb +1 -3
  363. data/app/serializers/spree/api/v3/country_serializer.rb +2 -1
  364. data/app/serializers/spree/api/v3/currency_serializer.rb +9 -1
  365. data/app/serializers/spree/api/v3/custom_field_serializer.rb +1 -2
  366. data/app/serializers/spree/api/v3/customer_serializer.rb +3 -2
  367. data/app/serializers/spree/api/v3/delivery_rate_serializer.rb +8 -32
  368. data/app/serializers/spree/api/v3/delivery_zone_member_serializer.rb +1 -1
  369. data/app/serializers/spree/api/v3/digital_asset_serializer.rb +1 -3
  370. data/app/serializers/spree/api/v3/digital_link_serializer.rb +3 -9
  371. data/app/serializers/spree/api/v3/discount_serializer.rb +4 -12
  372. data/app/serializers/spree/api/v3/exchange_line_item_serializer.rb +6 -30
  373. data/app/serializers/spree/api/v3/exchange_serializer.rb +2 -16
  374. data/app/serializers/spree/api/v3/export_serializer.rb +1 -3
  375. data/app/serializers/spree/api/v3/fee_serializer.rb +2 -10
  376. data/app/serializers/spree/api/v3/file_upload_serializer.rb +28 -0
  377. data/app/serializers/spree/api/v3/file_upload_target_serializer.rb +17 -0
  378. data/app/serializers/spree/api/v3/fulfillment_serializer.rb +4 -11
  379. data/app/serializers/spree/api/v3/gift_card_batch_serializer.rb +3 -7
  380. data/app/serializers/spree/api/v3/gift_card_serializer.rb +7 -17
  381. data/app/serializers/spree/api/v3/import_row_serializer.rb +2 -6
  382. data/app/serializers/spree/api/v3/import_serializer.rb +3 -26
  383. data/app/serializers/spree/api/v3/invitation_serializer.rb +2 -19
  384. data/app/serializers/spree/api/v3/line_item_serializer.rb +19 -23
  385. data/app/serializers/spree/api/v3/locale_serializer.rb +3 -1
  386. data/app/serializers/spree/api/v3/market_serializer.rb +5 -5
  387. data/app/serializers/spree/api/v3/media_event_serializer.rb +1 -3
  388. data/app/serializers/spree/api/v3/media_serializer.rb +8 -5
  389. data/app/serializers/spree/api/v3/newsletter_subscriber_request_event_serializer.rb +35 -0
  390. data/app/serializers/spree/api/v3/newsletter_subscriber_serializer.rb +2 -6
  391. data/app/serializers/spree/api/v3/option_value_serializer.rb +1 -3
  392. data/app/serializers/spree/api/v3/order_group_serializer.rb +12 -25
  393. data/app/serializers/spree/api/v3/order_serializer.rb +14 -58
  394. data/app/serializers/spree/api/v3/password_reset_requested_event_serializer.rb +29 -0
  395. data/app/serializers/spree/api/v3/payment_method_serializer.rb +2 -6
  396. data/app/serializers/spree/api/v3/payment_serializer.rb +5 -10
  397. data/app/serializers/spree/api/v3/payment_session_serializer.rb +5 -13
  398. data/app/serializers/spree/api/v3/payment_setup_session_serializer.rb +3 -11
  399. data/app/serializers/spree/api/v3/policy_serializer.rb +1 -3
  400. data/app/serializers/spree/api/v3/price_history_serializer.rb +6 -8
  401. data/app/serializers/spree/api/v3/price_serializer.rb +7 -12
  402. data/app/serializers/spree/api/v3/product_filter_price_range_serializer.rb +10 -4
  403. data/app/serializers/spree/api/v3/product_publication_serializer.rb +1 -7
  404. data/app/serializers/spree/api/v3/product_serializer.rb +10 -24
  405. data/app/serializers/spree/api/v3/product_submission_serializer.rb +26 -0
  406. data/app/serializers/spree/api/v3/purchase_order_event_serializer.rb +23 -4
  407. data/app/serializers/spree/api/v3/refund_serializer.rb +11 -16
  408. data/app/serializers/spree/api/v3/return_line_item_serializer.rb +6 -21
  409. data/app/serializers/spree/api/v3/return_serializer.rb +4 -16
  410. data/app/serializers/spree/api/v3/saved_report_event_serializer.rb +23 -0
  411. data/app/serializers/spree/api/v3/seller/address_serializer.rb +12 -0
  412. data/app/serializers/spree/api/v3/seller/balance_serializer.rb +15 -10
  413. data/app/serializers/spree/api/v3/seller/claim_line_item_serializer.rb +7 -0
  414. data/app/serializers/spree/api/v3/seller/claim_serializer.rb +5 -0
  415. data/app/serializers/spree/api/v3/seller/country_serializer.rb +19 -0
  416. data/app/serializers/spree/api/v3/seller/delivery_method_rule_serializer.rb +1 -3
  417. data/app/serializers/spree/api/v3/seller/delivery_method_serializer.rb +5 -15
  418. data/app/serializers/spree/api/v3/seller/delivery_rate_serializer.rb +8 -13
  419. data/app/serializers/spree/api/v3/seller/delivery_serializer.rb +1 -3
  420. data/app/serializers/spree/api/v3/seller/delivery_zone_serializer.rb +1 -3
  421. data/app/serializers/spree/api/v3/seller/exchange_line_item_serializer.rb +5 -0
  422. data/app/serializers/spree/api/v3/seller/exchange_serializer.rb +6 -3
  423. data/app/serializers/spree/api/v3/seller/file_upload_serializer.rb +11 -0
  424. data/app/serializers/spree/api/v3/seller/file_upload_target_serializer.rb +10 -0
  425. data/app/serializers/spree/api/v3/seller/fulfillment_item_serializer.rb +1 -7
  426. data/app/serializers/spree/api/v3/seller/fulfillment_serializer.rb +2 -6
  427. data/app/serializers/spree/api/v3/seller/import_serializer.rb +2 -2
  428. data/app/serializers/spree/api/v3/seller/invitation_serializer.rb +1 -3
  429. data/app/serializers/spree/api/v3/seller/media_serializer.rb +2 -5
  430. data/app/serializers/spree/api/v3/seller/order_line_item_serializer.rb +8 -13
  431. data/app/serializers/spree/api/v3/seller/order_serializer.rb +19 -40
  432. data/app/serializers/spree/api/v3/seller/payment_split_serializer.rb +8 -9
  433. data/app/serializers/spree/api/v3/seller/payout_serializer.rb +6 -6
  434. data/app/serializers/spree/api/v3/seller/price_history_serializer.rb +11 -0
  435. data/app/serializers/spree/api/v3/seller/price_serializer.rb +11 -0
  436. data/app/serializers/spree/api/v3/seller/product_serializer.rb +3 -7
  437. data/app/serializers/spree/api/v3/seller/product_submission_serializer.rb +1 -21
  438. data/app/serializers/spree/api/v3/seller/profile_serializer.rb +9 -13
  439. data/app/serializers/spree/api/v3/seller/requirement_status_serializer.rb +3 -9
  440. data/app/serializers/spree/api/v3/seller/return_line_item_serializer.rb +8 -0
  441. data/app/serializers/spree/api/v3/seller/return_serializer.rb +8 -17
  442. data/app/serializers/spree/api/v3/seller/state_serializer.rb +10 -0
  443. data/app/serializers/spree/api/v3/seller/stock_location_serializer.rb +3 -0
  444. data/app/serializers/spree/api/v3/seller/transfer_serializer.rb +10 -9
  445. data/app/serializers/spree/api/v3/seller/variant_serializer.rb +8 -4
  446. data/app/serializers/spree/api/v3/seller_serializer.rb +1 -3
  447. data/app/serializers/spree/api/v3/shipping_label_event_serializer.rb +22 -4
  448. data/app/serializers/spree/api/v3/stock_level_serializer.rb +1 -7
  449. data/app/serializers/spree/api/v3/stock_location_serializer.rb +8 -1
  450. data/app/serializers/spree/api/v3/stock_movement_serializer.rb +1 -3
  451. data/app/serializers/spree/api/v3/stock_receipt_event_serializer.rb +20 -4
  452. data/app/serializers/spree/api/v3/stock_transfer_serializer.rb +1 -7
  453. data/app/serializers/spree/api/v3/store_credit_event_serializer.rb +2 -13
  454. data/app/serializers/spree/api/v3/store_credit_serializer.rb +3 -27
  455. data/app/serializers/spree/api/v3/supplier_event_serializer.rb +6 -4
  456. data/app/serializers/spree/api/v3/tax_line_serializer.rb +11 -23
  457. data/app/serializers/spree/api/v3/variant_serializer.rb +10 -24
  458. data/app/serializers/spree/api/v3/wishlist_item_serializer.rb +1 -11
  459. data/app/serializers/spree/api/v3/wishlist_serializer.rb +2 -6
  460. data/app/services/spree/api/v3/filter_predicates.rb +29 -0
  461. data/app/services/spree/api/v3/filter_table.rb +337 -0
  462. data/app/services/spree/api/v3/filters_aggregator.rb +2 -2
  463. data/app/services/spree/api/v3/request_schema.rb +430 -0
  464. data/app/services/spree/webhooks/deliver_webhook.rb +7 -3
  465. data/app/subscribers/spree/webhook_event_subscriber.rb +3 -10
  466. data/config/initializers/pagy.rb +1 -1
  467. data/config/initializers/typelizer.rb +7 -9
  468. data/config/locales/ar.yml +15 -0
  469. data/config/locales/be.yml +15 -0
  470. data/config/locales/bg.yml +15 -0
  471. data/config/locales/ca.yml +15 -0
  472. data/config/locales/cs.yml +15 -0
  473. data/config/locales/da.yml +15 -0
  474. data/config/locales/de-CH.yml +11 -0
  475. data/config/locales/de.yml +15 -0
  476. data/config/locales/el.yml +15 -0
  477. data/config/locales/en.yml +5 -40
  478. data/config/locales/es-CL.yml +10 -0
  479. data/config/locales/es-EC.yml +11 -0
  480. data/config/locales/es-MX.yml +12 -0
  481. data/config/locales/es.yml +15 -0
  482. data/config/locales/et.yml +15 -0
  483. data/config/locales/fa.yml +15 -0
  484. data/config/locales/fi.yml +15 -0
  485. data/config/locales/fr.yml +15 -0
  486. data/config/locales/hu.yml +15 -0
  487. data/config/locales/id.yml +15 -0
  488. data/config/locales/it.yml +15 -0
  489. data/config/locales/ja.yml +15 -0
  490. data/config/locales/km.yml +15 -0
  491. data/config/locales/ko.yml +15 -0
  492. data/config/locales/ku.yml +15 -0
  493. data/config/locales/lt.yml +15 -0
  494. data/config/locales/lv.yml +15 -0
  495. data/config/locales/nb.yml +15 -0
  496. data/config/locales/ne.yml +15 -0
  497. data/config/locales/nl.yml +15 -0
  498. data/config/locales/pl.yml +15 -0
  499. data/config/locales/pt-BR.yml +13 -0
  500. data/config/locales/pt.yml +15 -0
  501. data/config/locales/ro.yml +15 -0
  502. data/config/locales/ru.yml +15 -0
  503. data/config/locales/sk.yml +15 -0
  504. data/config/locales/sl-SI.yml +15 -0
  505. data/config/locales/sv.yml +15 -0
  506. data/config/locales/th.yml +15 -0
  507. data/config/locales/tr.yml +15 -0
  508. data/config/locales/uk.yml +15 -0
  509. data/config/locales/vi.yml +15 -0
  510. data/config/locales/zh-CN.yml +15 -0
  511. data/config/locales/zh-TW.yml +15 -0
  512. data/config/routes.rb +54 -102
  513. data/lib/spree/api/configuration.rb +5 -0
  514. data/lib/spree/api/dependencies.rb +54 -274
  515. data/lib/spree/api/middleware/request_size_limit.rb +24 -3
  516. data/lib/spree/api/openapi/filter_documentation.rb +136 -0
  517. data/lib/spree/api/openapi/schema_helper.rb +127 -81
  518. data/lib/spree/api/preference_families.rb +46 -0
  519. data/lib/spree/api/preference_types.rb +138 -0
  520. data/lib/spree/api/typelizer_generation.rb +39 -0
  521. data/lib/spree/api/webhook_event_types.rb +140 -0
  522. data/lib/spree/api.rb +0 -2
  523. data/lib/tasks/filters.rake +12 -0
  524. data/lib/typelizer/open_enums.rb +10 -0
  525. metadata +125 -40
  526. data/app/controllers/concerns/spree/api/v3/address_params.rb +0 -17
  527. data/app/controllers/concerns/spree/api/v3/direct_uploads.rb +0 -35
  528. data/app/controllers/spree/api/v3/admin/direct_uploads_controller.rb +0 -54
  529. data/app/controllers/spree/api/v3/seller/direct_uploads_controller.rb +0 -21
  530. data/config/i18n-tasks.yml +0 -40
  531. data/config/initializers/alba.rb +0 -5
@@ -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,10 +45,10 @@ 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
- message: Spree.t('shipping_labels.errors.file_required'),
51
+ message: I18n.t('spree.shipping_labels.errors.file_required'),
31
52
  status: :unprocessable_content
32
53
  )
33
54
  end
@@ -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
@@ -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
@@ -15,6 +15,8 @@ module Spree
15
15
  include Spree::Api::V3::Seller::AuthCookies
16
16
  include Spree::Api::V3::JwtAuthentication
17
17
 
18
+ RESET_REQUESTED_EVENT = 'seller_user.password_reset_requested'.freeze
19
+
18
20
  # No `skip_scope_check!`: this extends the plain v3 base, which has
19
21
  # no authentication or scope gate to lift. The emailed token is the
20
22
  # only credential, exactly as on the admin twin.
@@ -23,6 +25,16 @@ module Spree
23
25
  store: Rails.cache,
24
26
  with: RATE_LIMIT_RESPONSE
25
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
+
26
38
  # POST /api/v3/seller/auth/password_resets
27
39
  def create
28
40
  user = Spree.admin_user_class.find_by(email: params[:email])
@@ -32,12 +44,12 @@ module Spree
32
44
  # them a seller reset link would be an invitation to a session they
33
45
  # cannot hold.
34
46
  if user&.seller_member?
35
- user.publish_event('seller_user.password_reset_requested', event_payload(user))
47
+ user.publish_event(RESET_REQUESTED_EVENT, event_payload(user))
36
48
  end
37
49
 
38
50
  # Always 202, whether or not anything matched — this endpoint must
39
51
  # not become a way to discover which addresses exist.
40
- render json: { message: Spree.t(:password_reset_requested, scope: :api) }, status: :accepted
52
+ render json: { message: I18n.t('spree.api.password_reset_requested') }, status: :accepted
41
53
  end
42
54
 
43
55
  # PATCH /api/v3/seller/auth/password_resets/:id
@@ -79,7 +91,7 @@ module Spree
79
91
  def render_token_invalid
80
92
  render_error(
81
93
  code: ErrorHandler::ERROR_CODES[:password_reset_token_invalid],
82
- message: Spree.t(:password_reset_token_invalid, scope: :api),
94
+ message: I18n.t('spree.api.password_reset_token_invalid'),
83
95
  status: :unprocessable_content
84
96
  )
85
97
  end
@@ -88,14 +100,11 @@ module Spree
88
100
  # right panel origin and locale without a request to read them from.
89
101
  def event_payload(user)
90
102
  store = seller_store(user)
91
- payload = {
92
- reset_token: user.generate_token_for(:password_reset),
93
- email: user.email,
94
- store_id: store&.prefixed_id
95
- }
96
- redirect_url = validated_redirect_url(store)
97
- payload[:redirect_url] = redirect_url if redirect_url.present?
98
- payload
103
+ user.event_payload_for(
104
+ RESET_REQUESTED_EVENT,
105
+ reset_token: user.generate_token_for(:password_reset), store: store,
106
+ redirect_url: validated_redirect_url(store).presence
107
+ )
99
108
  end
100
109
 
101
110
  # Which store's panel to send them to.
@@ -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
 
@@ -107,7 +220,7 @@ module Spree
107
220
  if resolve_workflow.nil?
108
221
  return render_error(
109
222
  code: 'invalid_status',
110
- message: Spree.t(:invalid_status, scope: 'errors.messages', default: 'Invalid status'),
223
+ message: I18n.t('spree.errors.messages.invalid_status'),
111
224
  status: :unprocessable_content
112
225
  )
113
226
  end
@@ -165,33 +278,7 @@ module Spree
165
278
  end
166
279
 
167
280
  def permitted_params
168
- attrs = params.permit(
169
- :name, :description, :slug,
170
- :meta_title, :meta_description, :meta_keywords,
171
- :product_type_id, :delivery_profile_id,
172
- metadata: {},
173
- prices: [:amount, :compare_at_amount, :currency],
174
- # Inline media, the same shape the operator sends. `external_url`
175
- # stays out for the same reason it does there — it would make the
176
- # server fetch a URL the caller chose.
177
- media: [*Spree::Media::WRITABLE_ATTRIBUTES, :id, :signed_id, { variant_ids: [] }],
178
- # A seller's variants. Narrower than the operator's set:
179
- # `seller_id` would let a payload hand a variant to somebody else,
180
- # and `tax_category_id`/`delivery_profile_id` are marketplace
181
- # configuration.
182
- variants: [
183
- :id, :sku, :barcode,
184
- :cost_price, :cost_currency,
185
- :weight, :height, :width, :depth, :weight_unit, :dimensions_unit,
186
- :hs_code, :country_of_origin, :customs_description,
187
- :minimum_order_quantity, :order_multiple, :purchase_unit, :units_per_carton,
188
- :carton_package_type_id, :carton_weight, :cartons_per_pallet,
189
- :track_inventory, :preorderable, :preorder_ships_at, :backorder_limit, :position,
190
- options: [:name, :value],
191
- prices: [:amount, :compare_at_amount, :currency],
192
- stock_levels: [:id, :stock_location_id, :count_on_hand, :backorderable]
193
- ]
194
- )
281
+ attrs = params.permit(*permitted_attributes)
195
282
 
196
283
  # Assigned only when present: writing a nil `prices` or
197
284
  # `stock_levels` key reaches the association setter as nil, which