spree_api 6.0.0.rc1 → 6.0.0.rc3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (371) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +0 -17
  3. data/app/controllers/concerns/spree/api/v3/admin/product_membership.rb +10 -0
  4. data/app/controllers/concerns/spree/api/v3/admin/stock_receipt_actions.rb +26 -4
  5. data/app/controllers/concerns/spree/api/v3/admin/subclassed_resource.rb +14 -28
  6. data/app/controllers/concerns/spree/api/v3/admin/validation_details.rb +1 -1
  7. data/app/controllers/concerns/spree/api/v3/cart_resolvable.rb +3 -2
  8. data/app/controllers/concerns/spree/api/v3/channel_resolution.rb +1 -1
  9. data/app/controllers/concerns/spree/api/v3/company_address_writes.rb +3 -1
  10. data/app/controllers/concerns/spree/api/v3/error_handler.rb +48 -2
  11. data/app/controllers/concerns/spree/api/v3/file_uploads.rb +35 -0
  12. data/app/controllers/concerns/spree/api/v3/money_params.rb +52 -0
  13. data/app/controllers/concerns/spree/api/v3/orders/claim_actions.rb +1 -5
  14. data/app/controllers/concerns/spree/api/v3/orders/delivery_actions.rb +6 -6
  15. data/app/controllers/concerns/spree/api/v3/orders/exchange_actions.rb +1 -4
  16. data/app/controllers/concerns/spree/api/v3/orders/fulfillment_actions.rb +1 -5
  17. data/app/controllers/concerns/spree/api/v3/orders/return_actions.rb +1 -4
  18. data/app/controllers/concerns/spree/api/v3/orders/shipping_label_actions.rb +5 -21
  19. data/app/controllers/concerns/spree/api/v3/params_normalizer.rb +5 -0
  20. data/app/controllers/concerns/spree/api/v3/purchase_serialization.rb +26 -0
  21. data/app/controllers/concerns/spree/api/v3/request_params.rb +65 -0
  22. data/app/controllers/concerns/spree/api/v3/store/search_provider_support.rb +8 -3
  23. data/app/controllers/concerns/spree/api/v3/strict_money_params.rb +94 -0
  24. data/app/controllers/spree/api/v3/admin/admin_users_controller.rb +10 -1
  25. data/app/controllers/spree/api/v3/admin/allowed_origins_controller.rb +8 -1
  26. data/app/controllers/spree/api/v3/admin/api_keys_controller.rb +15 -7
  27. data/app/controllers/spree/api/v3/admin/base_controller.rb +1 -0
  28. data/app/controllers/spree/api/v3/admin/catalogs/order_minimums_controller.rb +3 -1
  29. data/app/controllers/spree/api/v3/admin/catalogs/quantity_rules_controller.rb +7 -5
  30. data/app/controllers/spree/api/v3/admin/catalogs_controller.rb +60 -33
  31. data/app/controllers/spree/api/v3/admin/categories/products_controller.rb +4 -1
  32. data/app/controllers/spree/api/v3/admin/categories_controller.rb +40 -20
  33. data/app/controllers/spree/api/v3/admin/channels_controller.rb +39 -6
  34. data/app/controllers/spree/api/v3/admin/claim_reasons_controller.rb +5 -1
  35. data/app/controllers/spree/api/v3/admin/collections/products_controller.rb +4 -1
  36. data/app/controllers/spree/api/v3/admin/collections_controller.rb +44 -15
  37. data/app/controllers/spree/api/v3/admin/commission_rates_controller.rb +60 -12
  38. data/app/controllers/spree/api/v3/admin/companies/addresses_controller.rb +11 -0
  39. data/app/controllers/spree/api/v3/admin/companies/memberships_controller.rb +9 -1
  40. data/app/controllers/spree/api/v3/admin/companies/tax_exemption_certificates_controller.rb +19 -18
  41. data/app/controllers/spree/api/v3/admin/companies/tax_identifiers_controller.rb +6 -1
  42. data/app/controllers/spree/api/v3/admin/companies_controller.rb +17 -3
  43. data/app/controllers/spree/api/v3/admin/countries_controller.rb +5 -1
  44. data/app/controllers/spree/api/v3/admin/custom_field_definitions_controller.rb +21 -11
  45. data/app/controllers/spree/api/v3/admin/custom_fields_controller.rb +12 -5
  46. data/app/controllers/spree/api/v3/admin/customer_groups_controller.rb +9 -1
  47. data/app/controllers/spree/api/v3/admin/customers/addresses_controller.rb +12 -7
  48. data/app/controllers/spree/api/v3/admin/customers/store_credits_controller.rb +11 -9
  49. data/app/controllers/spree/api/v3/admin/customers/tax_identifiers_controller.rb +6 -1
  50. data/app/controllers/spree/api/v3/admin/customers_controller.rb +35 -7
  51. data/app/controllers/spree/api/v3/admin/data_requests_controller.rb +8 -0
  52. data/app/controllers/spree/api/v3/admin/delivery_method_rules_controller.rb +1 -1
  53. data/app/controllers/spree/api/v3/admin/delivery_methods/rules_controller.rb +15 -7
  54. data/app/controllers/spree/api/v3/admin/delivery_methods_controller.rb +92 -57
  55. data/app/controllers/spree/api/v3/admin/delivery_profiles/origin_groups_controller.rb +8 -1
  56. data/app/controllers/spree/api/v3/admin/delivery_profiles_controller.rb +13 -1
  57. data/app/controllers/spree/api/v3/admin/delivery_zones_controller.rb +21 -5
  58. data/app/controllers/spree/api/v3/admin/email_templates/drafts_controller.rb +14 -1
  59. data/app/controllers/spree/api/v3/admin/email_templates/previews_controller.rb +4 -0
  60. data/app/controllers/spree/api/v3/admin/email_templates/publications_controller.rb +7 -0
  61. data/app/controllers/spree/api/v3/admin/email_templates/restorations_controller.rb +8 -0
  62. data/app/controllers/spree/api/v3/admin/email_templates/test_emails_controller.rb +4 -0
  63. data/app/controllers/spree/api/v3/admin/exports_controller.rb +23 -6
  64. data/app/controllers/spree/api/v3/admin/files_controller.rb +29 -0
  65. data/app/controllers/spree/api/v3/admin/gift_card_batches_controller.rb +20 -1
  66. data/app/controllers/spree/api/v3/admin/gift_cards_controller.rb +19 -1
  67. data/app/controllers/spree/api/v3/admin/imports_controller.rb +36 -9
  68. data/app/controllers/spree/api/v3/admin/integrations_controller.rb +13 -1
  69. data/app/controllers/spree/api/v3/admin/invitation_acceptances_controller.rb +9 -2
  70. data/app/controllers/spree/api/v3/admin/invitations_controller.rb +8 -1
  71. data/app/controllers/spree/api/v3/admin/locales_controller.rb +1 -1
  72. data/app/controllers/spree/api/v3/admin/markets_controller.rb +30 -9
  73. data/app/controllers/spree/api/v3/admin/me_controller.rb +12 -3
  74. data/app/controllers/spree/api/v3/admin/media_controller.rb +22 -9
  75. data/app/controllers/spree/api/v3/admin/media_library_controller.rb +4 -0
  76. data/app/controllers/spree/api/v3/admin/option_types_controller.rb +24 -7
  77. data/app/controllers/spree/api/v3/admin/order_cancellation_reasons_controller.rb +5 -1
  78. data/app/controllers/spree/api/v3/admin/order_routing_rules_controller.rb +13 -1
  79. data/app/controllers/spree/api/v3/admin/orders/claims_controller.rb +39 -1
  80. data/app/controllers/spree/api/v3/admin/orders/deliveries_controller.rb +19 -1
  81. data/app/controllers/spree/api/v3/admin/orders/discount_codes_controller.rb +5 -1
  82. data/app/controllers/spree/api/v3/admin/orders/discounts_controller.rb +29 -5
  83. data/app/controllers/spree/api/v3/admin/orders/exchanges_controller.rb +36 -1
  84. data/app/controllers/spree/api/v3/admin/orders/fees_controller.rb +22 -1
  85. data/app/controllers/spree/api/v3/admin/orders/fulfillments_controller.rb +66 -7
  86. data/app/controllers/spree/api/v3/admin/orders/gift_cards_controller.rb +6 -2
  87. data/app/controllers/spree/api/v3/admin/orders/items_controller.rb +11 -1
  88. data/app/controllers/spree/api/v3/admin/orders/labels_controller.rb +35 -2
  89. data/app/controllers/spree/api/v3/admin/orders/payments_controller.rb +16 -5
  90. data/app/controllers/spree/api/v3/admin/orders/refunds_controller.rb +6 -0
  91. data/app/controllers/spree/api/v3/admin/orders/returns_controller.rb +37 -1
  92. data/app/controllers/spree/api/v3/admin/orders/store_credits_controller.rb +6 -3
  93. data/app/controllers/spree/api/v3/admin/orders_controller.rb +74 -60
  94. data/app/controllers/spree/api/v3/admin/package_types_controller.rb +30 -5
  95. data/app/controllers/spree/api/v3/admin/password_resets_controller.rb +17 -0
  96. data/app/controllers/spree/api/v3/admin/payment_methods_controller.rb +38 -22
  97. data/app/controllers/spree/api/v3/admin/policies_controller.rb +8 -4
  98. data/app/controllers/spree/api/v3/admin/price_lists_controller.rb +27 -15
  99. data/app/controllers/spree/api/v3/admin/prices_controller.rb +51 -4
  100. data/app/controllers/spree/api/v3/admin/product_types_controller.rb +25 -8
  101. data/app/controllers/spree/api/v3/admin/products/digital_assets_controller.rb +27 -10
  102. data/app/controllers/spree/api/v3/admin/products/variants_controller.rb +9 -14
  103. data/app/controllers/spree/api/v3/admin/products_controller.rb +121 -70
  104. data/app/controllers/spree/api/v3/admin/promotion_actions_controller.rb +11 -2
  105. data/app/controllers/spree/api/v3/admin/promotion_rules_controller.rb +10 -1
  106. data/app/controllers/spree/api/v3/admin/promotions_controller.rb +50 -14
  107. data/app/controllers/spree/api/v3/admin/purchase_orders_controller.rb +54 -7
  108. data/app/controllers/spree/api/v3/admin/refund_reasons_controller.rb +5 -1
  109. data/app/controllers/spree/api/v3/admin/reporting/saved_reports_controller.rb +9 -1
  110. data/app/controllers/spree/api/v3/admin/reporting_controller.rb +34 -0
  111. data/app/controllers/spree/api/v3/admin/resource_controller.rb +1 -0
  112. data/app/controllers/spree/api/v3/admin/return_reasons_controller.rb +5 -1
  113. data/app/controllers/spree/api/v3/admin/roles_controller.rb +13 -1
  114. data/app/controllers/spree/api/v3/admin/seller_payouts_controller.rb +6 -0
  115. data/app/controllers/spree/api/v3/admin/seller_requirement_submissions_controller.rb +15 -0
  116. data/app/controllers/spree/api/v3/admin/seller_requirements_controller.rb +32 -6
  117. data/app/controllers/spree/api/v3/admin/sellers_controller.rb +75 -22
  118. data/app/controllers/spree/api/v3/admin/setup_controller.rb +54 -15
  119. data/app/controllers/spree/api/v3/admin/stock_levels_controller.rb +38 -9
  120. data/app/controllers/spree/api/v3/admin/stock_locations_controller.rb +41 -9
  121. data/app/controllers/spree/api/v3/admin/stock_transfers_controller.rb +48 -7
  122. data/app/controllers/spree/api/v3/admin/store_controller.rb +122 -53
  123. data/app/controllers/spree/api/v3/admin/store_credits_controller.rb +1 -7
  124. data/app/controllers/spree/api/v3/admin/suppliers_controller.rb +16 -6
  125. data/app/controllers/spree/api/v3/admin/tax_categories_controller.rb +7 -4
  126. data/app/controllers/spree/api/v3/admin/tax_rates_controller.rb +21 -3
  127. data/app/controllers/spree/api/v3/admin/tracking_carriers_controller.rb +4 -0
  128. data/app/controllers/spree/api/v3/admin/translations/batches_controller.rb +17 -9
  129. data/app/controllers/spree/api/v3/admin/translations_controller.rb +4 -0
  130. data/app/controllers/spree/api/v3/admin/translations_coverage_controller.rb +5 -0
  131. data/app/controllers/spree/api/v3/admin/updates_controller.rb +39 -0
  132. data/app/controllers/spree/api/v3/admin/webhook_endpoints_controller.rb +23 -1
  133. data/app/controllers/spree/api/v3/base_controller.rb +2 -0
  134. data/app/controllers/spree/api/v3/resource_controller.rb +63 -10
  135. data/app/controllers/spree/api/v3/seller/auth_controller.rb +8 -0
  136. data/app/controllers/spree/api/v3/seller/base_controller.rb +1 -0
  137. data/app/controllers/spree/api/v3/seller/countries_controller.rb +2 -2
  138. data/app/controllers/spree/api/v3/seller/delivery_methods_controller.rb +49 -60
  139. data/app/controllers/spree/api/v3/seller/exports_controller.rb +18 -1
  140. data/app/controllers/spree/api/v3/seller/files_controller.rb +27 -0
  141. data/app/controllers/spree/api/v3/seller/imports_controller.rb +25 -9
  142. data/app/controllers/spree/api/v3/seller/invitation_acceptances_controller.rb +9 -1
  143. data/app/controllers/spree/api/v3/seller/me_controller.rb +14 -3
  144. data/app/controllers/spree/api/v3/seller/onboarding_controller.rb +11 -0
  145. data/app/controllers/spree/api/v3/seller/orders/claims_controller.rb +35 -0
  146. data/app/controllers/spree/api/v3/seller/orders/deliveries_controller.rb +12 -0
  147. data/app/controllers/spree/api/v3/seller/orders/exchanges_controller.rb +33 -0
  148. data/app/controllers/spree/api/v3/seller/orders/fulfillments_controller.rb +28 -2
  149. data/app/controllers/spree/api/v3/seller/orders/labels_controller.rb +22 -1
  150. data/app/controllers/spree/api/v3/seller/orders/notes_controller.rb +8 -1
  151. data/app/controllers/spree/api/v3/seller/orders/returns_controller.rb +32 -0
  152. data/app/controllers/spree/api/v3/seller/orders_controller.rb +35 -14
  153. data/app/controllers/spree/api/v3/seller/package_types_controller.rb +21 -9
  154. data/app/controllers/spree/api/v3/seller/password_resets_controller.rb +10 -0
  155. data/app/controllers/spree/api/v3/seller/policies_controller.rb +12 -4
  156. data/app/controllers/spree/api/v3/seller/products_controller.rb +114 -28
  157. data/app/controllers/spree/api/v3/seller/profile_controller.rb +33 -10
  158. data/app/controllers/spree/api/v3/seller/requirement_submissions_controller.rb +12 -5
  159. data/app/controllers/spree/api/v3/seller/resource_controller.rb +12 -0
  160. data/app/controllers/spree/api/v3/seller/stock_locations_controller.rb +44 -13
  161. data/app/controllers/spree/api/v3/seller/tax_identifiers_controller.rb +10 -1
  162. data/app/controllers/spree/api/v3/seller/team_controller.rb +4 -0
  163. data/app/controllers/spree/api/v3/store/auth_controller.rb +10 -0
  164. data/app/controllers/spree/api/v3/store/carts/discount_codes_controller.rb +8 -1
  165. data/app/controllers/spree/api/v3/store/carts/fulfillments_controller.rb +10 -2
  166. data/app/controllers/spree/api/v3/store/carts/gift_cards_controller.rb +8 -1
  167. data/app/controllers/spree/api/v3/store/carts/items_controller.rb +17 -5
  168. data/app/controllers/spree/api/v3/store/carts/payment_sessions_controller.rb +20 -6
  169. data/app/controllers/spree/api/v3/store/carts/payments_controller.rb +11 -0
  170. data/app/controllers/spree/api/v3/store/carts/po_documents_controller.rb +24 -26
  171. data/app/controllers/spree/api/v3/store/carts/store_credits_controller.rb +19 -1
  172. data/app/controllers/spree/api/v3/store/carts/tax_identifiers_controller.rb +5 -1
  173. data/app/controllers/spree/api/v3/store/carts_controller.rb +54 -47
  174. data/app/controllers/spree/api/v3/store/companies/addresses_controller.rb +12 -4
  175. data/app/controllers/spree/api/v3/store/companies/members_controller.rb +4 -0
  176. data/app/controllers/spree/api/v3/store/companies_controller.rb +5 -1
  177. data/app/controllers/spree/api/v3/store/company_invitations_controller.rb +9 -1
  178. data/app/controllers/spree/api/v3/store/customer/addresses_controller.rb +8 -7
  179. data/app/controllers/spree/api/v3/store/customer/data_requests_controller.rb +5 -0
  180. data/app/controllers/spree/api/v3/store/customer/password_resets_controller.rb +17 -0
  181. data/app/controllers/spree/api/v3/store/customer/payment_setup_sessions_controller.rb +10 -5
  182. data/app/controllers/spree/api/v3/store/customer/tax_identifiers_controller.rb +5 -1
  183. data/app/controllers/spree/api/v3/store/customers_controller.rb +28 -2
  184. data/app/controllers/spree/api/v3/store/newsletter_subscribers_controller.rb +22 -0
  185. data/app/controllers/spree/api/v3/store/orders/claims_controller.rb +11 -2
  186. data/app/controllers/spree/api/v3/store/orders/returns_controller.rb +10 -1
  187. data/app/controllers/spree/api/v3/store/orders_controller.rb +47 -10
  188. data/app/controllers/spree/api/v3/store/products_controller.rb +8 -0
  189. data/app/controllers/spree/api/v3/store/wishlist_items_controller.rb +10 -4
  190. data/app/controllers/spree/api/v3/store/wishlists_controller.rb +12 -4
  191. data/app/request_schemas/spree/api/v3/address_request_schema.rb +27 -0
  192. data/app/request_schemas/spree/api/v3/admin/address_request_schema.rb +13 -0
  193. data/app/request_schemas/spree/api/v3/admin/bulk_tags_request_schema.rb +17 -0
  194. data/app/request_schemas/spree/api/v3/admin/catalog_order_minimum_request_schema.rb +17 -0
  195. data/app/request_schemas/spree/api/v3/admin/email_template_language_request_schema.rb +17 -0
  196. data/app/request_schemas/spree/api/v3/admin/email_template_preview_request_schema.rb +32 -0
  197. data/app/request_schemas/spree/api/v3/admin/price_adjustment_tier_request_schema.rb +21 -0
  198. data/app/request_schemas/spree/api/v3/admin/price_list_price_request_schema.rb +21 -0
  199. data/app/request_schemas/spree/api/v3/admin/price_list_rule_request_schema.rb +19 -0
  200. data/app/request_schemas/spree/api/v3/admin/product_membership_reposition_request_schema.rb +17 -0
  201. data/app/request_schemas/spree/api/v3/admin/promotion_action_calculator_request_schema.rb +18 -0
  202. data/app/request_schemas/spree/api/v3/admin/promotion_action_line_item_request_schema.rb +15 -0
  203. data/app/request_schemas/spree/api/v3/admin/promotion_action_request_schema.rb +19 -0
  204. data/app/request_schemas/spree/api/v3/admin/promotion_rule_request_schema.rb +22 -0
  205. data/app/request_schemas/spree/api/v3/admin/reason_request_schema.rb +14 -0
  206. data/app/request_schemas/spree/api/v3/admin/tax_identifier_request_schema.rb +15 -0
  207. data/app/request_schemas/spree/api/v3/custom_field_value_request_schema.rb +15 -0
  208. data/app/request_schemas/spree/api/v3/file_upload_request_schema.rb +20 -0
  209. data/app/request_schemas/spree/api/v3/media_request_schema.rb +27 -0
  210. data/app/request_schemas/spree/api/v3/price_request_schema.rb +17 -0
  211. data/app/request_schemas/spree/api/v3/stock_level_request_schema.rb +18 -0
  212. data/app/request_schemas/spree/api/v3/store/address_request_schema.rb +31 -0
  213. data/app/request_schemas/spree/api/v3/tax_identifier_request_schema.rb +18 -0
  214. data/app/request_schemas/spree/api/v3/variant_option_request_schema.rb +13 -0
  215. data/app/request_schemas/spree/api/v3/variant_request_schema.rb +52 -0
  216. data/app/serializers/concerns/spree/api/v3/purchase_summary.rb +48 -0
  217. data/app/serializers/spree/api/v3/address_serializer.rb +4 -2
  218. data/app/serializers/spree/api/v3/admin/address_serializer.rb +3 -0
  219. data/app/serializers/spree/api/v3/admin/applied_promotion_serializer.rb +3 -1
  220. data/app/serializers/spree/api/v3/admin/cart_serializer.rb +3 -1
  221. data/app/serializers/spree/api/v3/admin/catalog_order_minimum_serializer.rb +3 -2
  222. data/app/serializers/spree/api/v3/admin/catalog_price_serializer.rb +3 -4
  223. data/app/serializers/spree/api/v3/admin/catalog_price_tier_serializer.rb +4 -3
  224. data/app/serializers/spree/api/v3/admin/channel_serializer.rb +5 -7
  225. data/app/serializers/spree/api/v3/admin/claim_line_item_serializer.rb +7 -0
  226. data/app/serializers/spree/api/v3/admin/claim_serializer.rb +5 -0
  227. data/app/serializers/spree/api/v3/admin/commission_line_serializer.rb +7 -18
  228. data/app/serializers/spree/api/v3/admin/commission_rate_serializer.rb +7 -11
  229. data/app/serializers/spree/api/v3/admin/commission_rule_serializer.rb +0 -2
  230. data/app/serializers/spree/api/v3/admin/country_serializer.rb +4 -0
  231. data/app/serializers/spree/api/v3/admin/customer_serializer.rb +3 -7
  232. data/app/serializers/spree/api/v3/admin/delivery_method_rule_serializer.rb +0 -2
  233. data/app/serializers/spree/api/v3/admin/delivery_method_serializer.rb +14 -10
  234. data/app/serializers/spree/api/v3/admin/delivery_method_service_serializer.rb +9 -1
  235. data/app/serializers/spree/api/v3/admin/delivery_rate_serializer.rb +8 -0
  236. data/app/serializers/spree/api/v3/admin/discount_serializer.rb +3 -1
  237. data/app/serializers/spree/api/v3/admin/exchange_line_item_serializer.rb +5 -0
  238. data/app/serializers/spree/api/v3/admin/exchange_serializer.rb +5 -0
  239. data/app/serializers/spree/api/v3/admin/fee_serializer.rb +3 -1
  240. data/app/serializers/spree/api/v3/admin/file_upload_serializer.rb +11 -0
  241. data/app/serializers/spree/api/v3/admin/file_upload_target_serializer.rb +10 -0
  242. data/app/serializers/spree/api/v3/admin/fulfillment_serializer.rb +13 -11
  243. data/app/serializers/spree/api/v3/admin/gift_card_serializer.rb +3 -3
  244. data/app/serializers/spree/api/v3/admin/import_serializer.rb +2 -2
  245. data/app/serializers/spree/api/v3/admin/integration_serializer.rb +1 -3
  246. data/app/serializers/spree/api/v3/admin/line_item_serializer.rb +12 -12
  247. data/app/serializers/spree/api/v3/admin/locale_serializer.rb +13 -0
  248. data/app/serializers/spree/api/v3/admin/market_serializer.rb +3 -0
  249. data/app/serializers/spree/api/v3/admin/media_serializer.rb +3 -2
  250. data/app/serializers/spree/api/v3/admin/order_group_serializer.rb +2 -0
  251. data/app/serializers/spree/api/v3/admin/order_routing_rule_serializer.rb +1 -3
  252. data/app/serializers/spree/api/v3/admin/order_serializer.rb +33 -33
  253. data/app/serializers/spree/api/v3/admin/payment_method_serializer.rb +1 -4
  254. data/app/serializers/spree/api/v3/admin/payment_serializer.rb +6 -3
  255. data/app/serializers/spree/api/v3/admin/payment_split_serializer.rb +8 -9
  256. data/app/serializers/spree/api/v3/admin/price_adjustment_tier_serializer.rb +3 -6
  257. data/app/serializers/spree/api/v3/admin/price_history_serializer.rb +6 -2
  258. data/app/serializers/spree/api/v3/admin/price_list_serializer.rb +1 -5
  259. data/app/serializers/spree/api/v3/admin/price_rule_serializer.rb +1 -3
  260. data/app/serializers/spree/api/v3/admin/price_serializer.rb +4 -0
  261. data/app/serializers/spree/api/v3/admin/product_serializer.rb +2 -0
  262. data/app/serializers/spree/api/v3/admin/promotion_action_serializer.rb +4 -6
  263. data/app/serializers/spree/api/v3/admin/promotion_rule_serializer.rb +0 -2
  264. data/app/serializers/spree/api/v3/admin/purchase_order_item_serializer.rb +5 -11
  265. data/app/serializers/spree/api/v3/admin/purchase_order_serializer.rb +4 -4
  266. data/app/serializers/spree/api/v3/admin/refund_serializer.rb +7 -3
  267. data/app/serializers/spree/api/v3/admin/reporting_result_serializer.rb +9 -2
  268. data/app/serializers/spree/api/v3/admin/return_line_item_serializer.rb +8 -0
  269. data/app/serializers/spree/api/v3/admin/return_serializer.rb +8 -4
  270. data/app/serializers/spree/api/v3/admin/seller_balance_serializer.rb +15 -10
  271. data/app/serializers/spree/api/v3/admin/seller_payout_serializer.rb +3 -5
  272. data/app/serializers/spree/api/v3/admin/seller_serializer.rb +3 -1
  273. data/app/serializers/spree/api/v3/admin/seller_transfer_serializer.rb +7 -8
  274. data/app/serializers/spree/api/v3/admin/shipping_label_serializer.rb +4 -4
  275. data/app/serializers/spree/api/v3/admin/stock_location_serializer.rb +3 -0
  276. data/app/serializers/spree/api/v3/admin/stock_movement_serializer.rb +2 -6
  277. data/app/serializers/spree/api/v3/admin/store_credit_event_serializer.rb +5 -0
  278. data/app/serializers/spree/api/v3/admin/store_credit_serializer.rb +9 -4
  279. data/app/serializers/spree/api/v3/admin/store_serializer.rb +17 -98
  280. data/app/serializers/spree/api/v3/admin/supplier_serializer.rb +1 -1
  281. data/app/serializers/spree/api/v3/admin/tax_exemption_certificate_serializer.rb +3 -1
  282. data/app/serializers/spree/api/v3/admin/tax_line_serializer.rb +4 -2
  283. data/app/serializers/spree/api/v3/admin/tax_rate_serializer.rb +2 -12
  284. data/app/serializers/spree/api/v3/admin/update_status_serializer.rb +28 -0
  285. data/app/serializers/spree/api/v3/admin/variant_serializer.rb +7 -3
  286. data/app/serializers/spree/api/v3/base_serializer.rb +112 -7
  287. data/app/serializers/spree/api/v3/cart_serializer.rb +16 -30
  288. data/app/serializers/spree/api/v3/claim_line_item_serializer.rb +5 -13
  289. data/app/serializers/spree/api/v3/claim_serializer.rb +2 -3
  290. data/app/serializers/spree/api/v3/country_serializer.rb +2 -1
  291. data/app/serializers/spree/api/v3/currency_serializer.rb +9 -1
  292. data/app/serializers/spree/api/v3/customer_serializer.rb +3 -2
  293. data/app/serializers/spree/api/v3/delivery_rate_serializer.rb +8 -12
  294. data/app/serializers/spree/api/v3/delivery_zone_member_serializer.rb +1 -1
  295. data/app/serializers/spree/api/v3/discount_serializer.rb +4 -1
  296. data/app/serializers/spree/api/v3/exchange_line_item_serializer.rb +2 -8
  297. data/app/serializers/spree/api/v3/exchange_serializer.rb +2 -3
  298. data/app/serializers/spree/api/v3/file_upload_serializer.rb +28 -0
  299. data/app/serializers/spree/api/v3/file_upload_target_serializer.rb +17 -0
  300. data/app/serializers/spree/api/v3/gift_card_batch_serializer.rb +2 -4
  301. data/app/serializers/spree/api/v3/gift_card_serializer.rb +4 -2
  302. data/app/serializers/spree/api/v3/import_serializer.rb +0 -12
  303. data/app/serializers/spree/api/v3/line_item_serializer.rb +15 -5
  304. data/app/serializers/spree/api/v3/locale_serializer.rb +3 -1
  305. data/app/serializers/spree/api/v3/market_serializer.rb +5 -5
  306. data/app/serializers/spree/api/v3/media_serializer.rb +7 -2
  307. data/app/serializers/spree/api/v3/order_group_serializer.rb +12 -4
  308. data/app/serializers/spree/api/v3/order_serializer.rb +5 -23
  309. data/app/serializers/spree/api/v3/payment_session_serializer.rb +2 -4
  310. data/app/serializers/spree/api/v3/price_history_serializer.rb +11 -6
  311. data/app/serializers/spree/api/v3/price_serializer.rb +17 -10
  312. data/app/serializers/spree/api/v3/product_filter_price_range_serializer.rb +10 -4
  313. data/app/serializers/spree/api/v3/product_serializer.rb +3 -3
  314. data/app/serializers/spree/api/v3/refund_serializer.rb +8 -5
  315. data/app/serializers/spree/api/v3/return_line_item_serializer.rb +3 -11
  316. data/app/serializers/spree/api/v3/return_serializer.rb +3 -6
  317. data/app/serializers/spree/api/v3/seller/address_serializer.rb +12 -0
  318. data/app/serializers/spree/api/v3/seller/balance_serializer.rb +15 -10
  319. data/app/serializers/spree/api/v3/seller/claim_line_item_serializer.rb +7 -0
  320. data/app/serializers/spree/api/v3/seller/claim_serializer.rb +5 -0
  321. data/app/serializers/spree/api/v3/seller/country_serializer.rb +19 -0
  322. data/app/serializers/spree/api/v3/seller/delivery_method_rule_serializer.rb +1 -3
  323. data/app/serializers/spree/api/v3/seller/delivery_method_serializer.rb +4 -8
  324. data/app/serializers/spree/api/v3/seller/delivery_rate_serializer.rb +9 -8
  325. data/app/serializers/spree/api/v3/seller/exchange_line_item_serializer.rb +5 -0
  326. data/app/serializers/spree/api/v3/seller/exchange_serializer.rb +5 -0
  327. data/app/serializers/spree/api/v3/seller/file_upload_serializer.rb +11 -0
  328. data/app/serializers/spree/api/v3/seller/file_upload_target_serializer.rb +10 -0
  329. data/app/serializers/spree/api/v3/seller/import_serializer.rb +2 -2
  330. data/app/serializers/spree/api/v3/seller/media_serializer.rb +2 -5
  331. data/app/serializers/spree/api/v3/seller/order_line_item_serializer.rb +4 -3
  332. data/app/serializers/spree/api/v3/seller/order_serializer.rb +16 -16
  333. data/app/serializers/spree/api/v3/seller/payment_split_serializer.rb +8 -9
  334. data/app/serializers/spree/api/v3/seller/payout_serializer.rb +2 -4
  335. data/app/serializers/spree/api/v3/seller/price_history_serializer.rb +12 -0
  336. data/app/serializers/spree/api/v3/seller/price_serializer.rb +13 -0
  337. data/app/serializers/spree/api/v3/seller/product_serializer.rb +2 -0
  338. data/app/serializers/spree/api/v3/seller/profile_serializer.rb +7 -7
  339. data/app/serializers/spree/api/v3/seller/return_line_item_serializer.rb +8 -0
  340. data/app/serializers/spree/api/v3/seller/return_serializer.rb +8 -5
  341. data/app/serializers/spree/api/v3/seller/state_serializer.rb +10 -0
  342. data/app/serializers/spree/api/v3/seller/stock_location_serializer.rb +3 -0
  343. data/app/serializers/spree/api/v3/seller/transfer_serializer.rb +6 -7
  344. data/app/serializers/spree/api/v3/seller/variant_serializer.rb +8 -4
  345. data/app/serializers/spree/api/v3/stock_location_serializer.rb +8 -1
  346. data/app/serializers/spree/api/v3/store_credit_event_serializer.rb +1 -3
  347. data/app/serializers/spree/api/v3/store_credit_serializer.rb +3 -5
  348. data/app/serializers/spree/api/v3/tax_line_serializer.rb +2 -4
  349. data/app/serializers/spree/api/v3/variant_serializer.rb +3 -3
  350. data/app/services/spree/api/v3/filter_predicates.rb +29 -0
  351. data/app/services/spree/api/v3/filter_table.rb +337 -0
  352. data/app/services/spree/api/v3/filters_aggregator.rb +2 -2
  353. data/app/services/spree/api/v3/request_schema.rb +430 -0
  354. data/app/services/spree/webhooks/deliver_webhook.rb +7 -3
  355. data/config/initializers/typelizer.rb +1 -1
  356. data/config/routes.rb +5 -3
  357. data/lib/spree/api/configuration.rb +5 -0
  358. data/lib/spree/api/dependencies.rb +7 -6
  359. data/lib/spree/api/middleware/request_size_limit.rb +24 -3
  360. data/lib/spree/api/openapi/filter_documentation.rb +136 -0
  361. data/lib/spree/api/openapi/schema_helper.rb +126 -80
  362. data/lib/spree/api/preference_families.rb +46 -0
  363. data/lib/spree/api/preference_types.rb +138 -0
  364. data/lib/spree/api/typelizer_generation.rb +4 -0
  365. data/lib/tasks/filters.rake +12 -0
  366. data/lib/typelizer/open_enums.rb +10 -0
  367. metadata +60 -10
  368. data/app/controllers/concerns/spree/api/v3/address_params.rb +0 -17
  369. data/app/controllers/concerns/spree/api/v3/direct_uploads.rb +0 -35
  370. data/app/controllers/spree/api/v3/admin/direct_uploads_controller.rb +0 -54
  371. data/app/controllers/spree/api/v3/seller/direct_uploads_controller.rb +0 -21
@@ -5,6 +5,88 @@ module Spree
5
5
  class DeliveryMethodsController < ResourceController
6
6
  scoped_resource :delivery_methods
7
7
 
8
+ # A single POST/PATCH can ship eligibility rules and carrier service
9
+ # rows alongside the basics; `DeliveryMethod#rules=` / `#services=`
10
+ # reconcile to the desired set, so the dashboard saves the whole
11
+ # sheet in one round-trip.
12
+ request_params :delivery_method do |body|
13
+ body.attribute :name, :string, required: true, on: :create, example: 'Express'
14
+ body.attribute :admin_name, :string, nullable: true
15
+ body.attribute :code, :string, nullable: true
16
+ body.attribute :fulfillment_provider, :string,
17
+ example: 'manual',
18
+ description: 'Fulfillment provider shorthand (see the fulfillment providers endpoint), e.g. `manual`.'
19
+ body.attribute :pickup_point_provider, :string, nullable: true
20
+ body.attribute :rate_provider, :string,
21
+ nullable: true,
22
+ description: 'Rate provider shorthand (see the rate providers endpoint), e.g. `easy_post`. Omit or send null for the built-in provider, which prices through the method\'s calculator.'
23
+ body.attribute :storefront_visible, :boolean
24
+ body.attribute :available_to_sellers, :boolean,
25
+ description: "Marketplace only: whether a seller's packages may be quoted by this method. Off by default, and refused on a method that belongs to a seller."
26
+ body.attribute :tracking_url, :string, nullable: true
27
+ body.attribute :estimated_transit_business_days_min, :integer, nullable: true
28
+ body.attribute :estimated_transit_business_days_max, :integer, nullable: true
29
+ body.attribute :tax_category_id, :id,
30
+ nullable: true,
31
+ description: 'Prefixed tax category ID (`taxcat_...`), or null to clear.'
32
+ body.attribute :markup_flat, :decimal,
33
+ nullable: true,
34
+ description: 'Method-level flat handling fee added on top of provider-quoted rates.'
35
+ body.attribute :markup_percent, :decimal,
36
+ nullable: true,
37
+ description: 'Method-level percentage handling fee added on top of provider-quoted rates. Ignored for calculator-priced methods.'
38
+ body.attribute :delivery_profile_id, :id,
39
+ example: 'fp_86Rf07xd4z',
40
+ description: 'Delivery profile this method belongs to (`fp_...`); defaults to the store default profile.'
41
+ body.attribute :delivery_origin_group_id, :id,
42
+ description: "Origin group offering this method (`og_...`); defaults to the zone's group, else the profile's default group."
43
+ body.attribute :delivery_zone_id, :id,
44
+ nullable: true,
45
+ description: "Delivery zone narrowing destinations (`dz_...`), or null for no restriction. Must belong to the method's profile."
46
+ body.attribute :stock_location_ids, :array, of: :id,
47
+ description: 'Pickup locations (`sloc_...`); replaces the full set.'
48
+ body.attribute :calculator, :object,
49
+ description: "How the method prices a shipment: a type from the calculators endpoint and its preferences, matching that type's `schema`." do |calculator|
50
+ calculator.attribute :type, :string, example: 'flat_rate'
51
+ calculator.attribute :preferences, :hash, example: { amount: '12.5' }
52
+ end
53
+ # Permitted by `rule_attributes`, which adds the association-backed
54
+ # config each registered rule kind declares.
55
+ body.attribute :rules, :array,
56
+ permit: false,
57
+ description: 'Eligibility rules. Replaces the full set: omitted rules are removed.' do |rule|
58
+ rule.attribute :id, :id
59
+ rule.attribute :type, :string, description: 'A rule kind from the delivery method rule types endpoint.'
60
+ rule.attribute :active, :boolean
61
+ rule.attribute :preferences, :hash
62
+ rule.attribute :product_ids, :array, of: :id,
63
+ description: 'Products an association-backed rule (`excluded_products_rule`) applies to.'
64
+ end
65
+ body.attribute :services, :array,
66
+ as: 'DeliveryMethodServiceParams',
67
+ description: 'Carrier service rows: which provider services this method offers. Replaces the full set: omitted rows are removed; no rows means every service the provider returns is offered.' do |service|
68
+ service.attribute :id, :id, description: 'Prefixed row ID (`dms_...`) when updating an existing row.'
69
+ service.attribute :carrier, :string,
70
+ required: true,
71
+ example: 'UPS',
72
+ description: "Carrier identifier as the provider's API knows it."
73
+ service.attribute :service, :string,
74
+ required: true,
75
+ example: 'Ground',
76
+ description: "Service identifier as the provider's API knows it."
77
+ service.attribute :label, :string,
78
+ nullable: true,
79
+ description: 'Display label shown to customers instead of the carrier-derived name.'
80
+ service.attribute :markup_flat, :decimal,
81
+ nullable: true,
82
+ description: 'Overrides the method-level flat markup for this service.'
83
+ service.attribute :markup_percent, :decimal,
84
+ nullable: true,
85
+ description: 'Overrides the method-level percentage markup for this service.'
86
+ service.attribute :position, :integer
87
+ end
88
+ end
89
+
8
90
  # GET /api/v3/admin/delivery_methods/calculators
9
91
  # Registered delivery calculator classes with their preference
10
92
  # schemas, so admin UIs can render configuration forms.
@@ -15,7 +97,7 @@ module Spree
15
97
  {
16
98
  type: calculator_class.api_type,
17
99
  name: calculator_class.description,
18
- preference_schema: calculator_class.respond_to?(:serialized_preference_schema) ? calculator_class.serialized_preference_schema : []
100
+ schema: calculator_class.preference_json_schema
19
101
  }
20
102
  end
21
103
 
@@ -80,9 +162,9 @@ module Spree
80
162
  def create
81
163
  @resource = model_class.new(assignable_params)
82
164
  authorize_resource!(@resource, :create)
83
- assign_calculator(@resource)
165
+ @resource.assign_calculator_attributes(permitted_params[:calculator])
84
166
 
85
- if @resource.errors.empty? && @resource.save
167
+ if @resource.save
86
168
  render json: serialize_resource(@resource), status: :created
87
169
  else
88
170
  render_validation_error(@resource.errors)
@@ -90,10 +172,12 @@ module Spree
90
172
  end
91
173
 
92
174
  def update
93
- @resource.assign_attributes(assignable_params)
94
- assign_calculator(@resource)
175
+ saved = save_atomically do
176
+ @resource.assign_attributes(assignable_params)
177
+ @resource.assign_calculator_attributes(permitted_params[:calculator])
178
+ end
95
179
 
96
- if @resource.errors.empty? && @resource.save
180
+ if saved
97
181
  render json: serialize_resource(@resource)
98
182
  else
99
183
  render_validation_error(@resource.errors)
@@ -118,23 +202,8 @@ module Spree
118
202
  Spree.api.admin_delivery_method_serializer
119
203
  end
120
204
 
121
- # A single POST/PATCH can ship eligibility rules and carrier service
122
- # rows alongside the basics; `DeliveryMethod#rules=` / `#services=`
123
- # reconcile to the desired set, so the dashboard saves the whole
124
- # sheet in one round-trip.
125
205
  def permitted_params
126
- params.permit(
127
- *model_additional_permitted_attributes,
128
- :name, :admin_name, :code, :fulfillment_provider,
129
- :pickup_point_provider, :rate_provider, :storefront_visible, :tracking_url,
130
- :available_to_sellers,
131
- :estimated_transit_business_days_min, :estimated_transit_business_days_max,
132
- :tax_category_id, :calculator_type, :markup_flat, :markup_percent,
133
- :delivery_profile_id, :delivery_origin_group_id, :delivery_zone_id,
134
- stock_location_ids: [], calculator_preferences: {},
135
- rules: rule_attributes,
136
- services: [:id, :carrier, :service, :label, :markup_flat, :markup_percent, :position]
137
- )
206
+ params.permit(*permitted_attributes, rules: rule_attributes)
138
207
  end
139
208
 
140
209
  def rule_attributes
@@ -158,7 +227,7 @@ module Spree
158
227
 
159
228
  # Resolves prefixed-ID params to records; calculator handled separately.
160
229
  def assignable_params
161
- attributes = permitted_params.except(:tax_category_id, :delivery_profile_id, :delivery_origin_group_id, :delivery_zone_id, :stock_location_ids, :calculator_type, :calculator_preferences)
230
+ attributes = permitted_params.except(:tax_category_id, :delivery_profile_id, :delivery_origin_group_id, :delivery_zone_id, :stock_location_ids, :calculator)
162
231
  if params.key?(:tax_category_id)
163
232
  attributes[:tax_category] = params[:tax_category_id].present? ? Spree::TaxCategory.accessible_by(current_ability, :show).find_by_prefix_id!(params[:tax_category_id]) : nil
164
233
  end
@@ -200,40 +269,6 @@ module Spree
200
269
  where(id: decode_prefixed_ids(ids)).
201
270
  pluck(:id)
202
271
  end
203
-
204
- def assign_calculator(delivery_method)
205
- calculator_type = permitted_params[:calculator_type]
206
- preferences = permitted_params[:calculator_preferences]
207
-
208
- if calculator_type.present? && delivery_method.calculator&.class&.api_type != calculator_type
209
- selected_calculator_class = Spree::DeliveryMethod.calculators.find do |klass|
210
- klass.api_type == calculator_type
211
- end
212
- unless selected_calculator_class
213
- delivery_method.errors.add(:calculator_type, :invalid)
214
- return
215
- end
216
-
217
- delivery_method.calculator = selected_calculator_class.new
218
- end
219
-
220
- return if preferences.blank?
221
-
222
- # A payload may carry preferences without naming a calculator —
223
- # editing the amount on a method that already has one, or creating
224
- # with the default. The model only builds the default calculator
225
- # at validation, so without this the preferences land on nothing
226
- # and the amount the merchant typed is silently replaced by a free
227
- # rate.
228
- delivery_method.ensure_calculator
229
- return if delivery_method.calculator.nil?
230
-
231
- preferences.each do |key, value|
232
- next unless delivery_method.calculator.has_preference?(key)
233
-
234
- delivery_method.calculator.set_preference(key, value)
235
- end
236
- end
237
272
  end
238
273
  end
239
274
  end
@@ -10,6 +10,13 @@ module Spree
10
10
  class OriginGroupsController < ResourceController
11
11
  scoped_resource :settings
12
12
 
13
+ request_params 'DeliveryOriginGroupParams' do |body|
14
+ body.attribute :name, :string, nullable: true, example: 'EU warehouse'
15
+ body.attribute :position, :integer
16
+ body.attribute :stock_location_ids, :array, of: :id,
17
+ description: 'Prefixed stock location IDs (`sloc_...`); replaces the full set. Empty means every store location.'
18
+ end
19
+
13
20
  def create
14
21
  @resource = scope.new(assignable_params)
15
22
  authorize_resource!(@resource, :create)
@@ -46,7 +53,7 @@ module Spree
46
53
  end
47
54
 
48
55
  def permitted_params
49
- params.permit(*model_additional_permitted_attributes, :name, :position, stock_location_ids: [])
56
+ params.permit(*permitted_attributes)
50
57
  end
51
58
 
52
59
  def collection_includes
@@ -9,6 +9,18 @@ module Spree
9
9
  class DeliveryProfilesController < ResourceController
10
10
  scoped_resource :settings
11
11
 
12
+ request_params :delivery_profile do |body|
13
+ body.attribute :name, :string, required: true, on: :create, example: 'Oversized'
14
+ body.attribute :kind, :string,
15
+ example: 'shipping',
16
+ description: 'Registered profile kind (`shipping`, `digital`, extension kinds) from the kinds endpoint. Read on create only; defaults to shipping.'
17
+ body.attribute :default, :boolean,
18
+ description: 'Promotes this profile to the store default; the previous default is demoted.'
19
+ body.attribute :position, :integer
20
+ body.attribute :stock_location_ids, :array, of: :id,
21
+ description: 'Prefixed stock location IDs (`sloc_...`); replaces the full set. Empty means every store location.'
22
+ end
23
+
12
24
  # GET /api/v3/admin/delivery_profiles/kinds
13
25
  # Registered profile kinds, so admin UIs offer extension-added
14
26
  # kinds without hardcoding the built-ins.
@@ -58,7 +70,7 @@ module Spree
58
70
  end
59
71
 
60
72
  def permitted_params
61
- params.permit(*model_additional_permitted_attributes, :name, :default, :position, :kind, stock_location_ids: [])
73
+ params.permit(*permitted_attributes)
62
74
  end
63
75
 
64
76
  def collection_includes
@@ -8,6 +8,26 @@ module Spree
8
8
  class DeliveryZonesController < ResourceController
9
9
  scoped_resource :settings
10
10
 
11
+ request_params :delivery_zone do |body|
12
+ body.attribute :name, :string, required: true, on: :create, example: 'US North-East'
13
+ body.attribute :description, :string, nullable: true
14
+ body.attribute :delivery_profile_id, :id,
15
+ description: 'Delivery profile this zone belongs to (`fp_...`); defaults to the store default profile.'
16
+ body.attribute :delivery_origin_group_id, :id,
17
+ description: 'Origin group this zone belongs to (`og_...`).'
18
+ body.attribute :members, :array,
19
+ as: 'DeliveryZoneMemberParams',
20
+ description: "Replaces the zone's full member set atomically." do |member|
21
+ member.attribute :member_type, :string, required: true, choices: Spree::DeliveryZoneMember::MEMBER_TYPES
22
+ member.attribute :country_code, :country, example: 'US'
23
+ member.attribute :state_code, :string,
24
+ description: 'A subdivision code or name. Without `country_code` the country is inferred when only one country matches.'
25
+ member.attribute :postal_code_prefix, :string
26
+ member.attribute :postal_code_from, :string
27
+ member.attribute :postal_code_to, :string
28
+ end
29
+ end
30
+
11
31
  def create
12
32
  @resource = model_class.new(zone_params)
13
33
  authorize_resource!(@resource, :create)
@@ -50,11 +70,7 @@ module Spree
50
70
  end
51
71
 
52
72
  def permitted_params
53
- params.permit(
54
- *model_additional_permitted_attributes,
55
- :name, :description, :delivery_profile_id, :delivery_origin_group_id,
56
- members: [:member_type, :country_code, :state_code, :postal_code_prefix, :postal_code_from, :postal_code_to]
57
- )
73
+ params.permit(*permitted_attributes)
58
74
  end
59
75
 
60
76
  def collection_includes
@@ -8,6 +8,19 @@ module Spree
8
8
  class DraftsController < Admin::BaseController
9
9
  include Spree::Api::V3::Admin::EmailTemplateLookup
10
10
 
11
+ request_params 'EmailTemplateDraftParams' do |body|
12
+ body.include_attributes Spree::Api::V3::Admin::EmailTemplateLanguageRequestSchema
13
+ body.attribute :subject, :string, nullable: true, example: 'Your order {{ order.number }} is confirmed'
14
+ body.attribute :body, :string,
15
+ example: '<mj-section><mj-column><mj-text>Thanks, {{ order.customer_name }}!</mj-text></mj-column></mj-section>'
16
+ body.attribute :lock_version, :integer,
17
+ nullable: true,
18
+ example: 0,
19
+ description: 'The `lock_version` the draft was loaded with, or null when there was no draft; a save from an older copy is refused with 409. Omit it to save without checking.'
20
+ body.attribute :rebase, :boolean,
21
+ description: "Marks the draft as based on Spree's current default, after reviewing what changed in it."
22
+ end
23
+
11
24
  # PUT /api/v3/admin/email_templates/:email_template_id/draft
12
25
  #
13
26
  # Send the `lock_version` the draft was loaded with: a save made from
@@ -18,7 +31,7 @@ module Spree
18
31
 
19
32
  result = Spree.email_template_save_draft_workflow.call(
20
33
  store: current_store, key: email_template.key, locale: language, actor: current_actor,
21
- attributes: params.permit(:subject, :body, :lock_version, :rebase).to_h.symbolize_keys
34
+ attributes: params.permit(*declared_permitted_attributes).to_h.symbolize_keys
22
35
  )
23
36
  render_email_template_result(result)
24
37
  end
@@ -6,6 +6,10 @@ module Spree
6
6
  class PreviewsController < Admin::BaseController
7
7
  include Spree::Api::V3::Admin::EmailTemplateLookup
8
8
 
9
+ request_params 'EmailTemplatePreviewParams' do |body|
10
+ body.include_attributes Spree::Api::V3::Admin::EmailTemplatePreviewRequestSchema
11
+ end
12
+
9
13
  before_action :authorize_sample_data!
10
14
 
11
15
  # POST /api/v3/admin/email_templates/:email_template_id/preview
@@ -6,6 +6,13 @@ module Spree
6
6
  class PublicationsController < Admin::BaseController
7
7
  include Spree::Api::V3::Admin::EmailTemplateLookup
8
8
 
9
+ request_params 'EmailTemplateVersionParams' do |body|
10
+ body.include_attributes Spree::Api::V3::Admin::EmailTemplateLanguageRequestSchema
11
+ body.attribute :lock_version, :integer,
12
+ permit: false,
13
+ description: "The draft's `lock_version` as reviewed. A draft saved since is refused with 409."
14
+ end
15
+
9
16
  before_action :authorize_sample_data!
10
17
 
11
18
  # POST /api/v3/admin/email_templates/:email_template_id/publication
@@ -6,6 +6,14 @@ module Spree
6
6
  class RestorationsController < Admin::BaseController
7
7
  include Spree::Api::V3::Admin::EmailTemplateLookup
8
8
 
9
+ request_params 'EmailTemplateRestoreParams' do |body|
10
+ body.include_attributes Spree::Api::V3::Admin::EmailTemplateLanguageRequestSchema
11
+ body.attribute :lock_version, :integer,
12
+ nullable: true,
13
+ permit: false,
14
+ description: "The open draft's `lock_version`, or null when there is none; checked as when saving."
15
+ end
16
+
9
17
  # POST /api/v3/admin/email_templates/:email_template_id/revisions/:revision_id/restoration
10
18
  #
11
19
  # Copies the revision into the language's draft, to be published
@@ -6,6 +6,10 @@ module Spree
6
6
  class TestEmailsController < Admin::BaseController
7
7
  include Spree::Api::V3::Admin::EmailTemplateLookup
8
8
 
9
+ request_params 'EmailTemplatePreviewParams' do |body|
10
+ body.include_attributes Spree::Api::V3::Admin::EmailTemplatePreviewRequestSchema
11
+ end
12
+
9
13
  before_action :authorize_sample_data!
10
14
 
11
15
  # POST /api/v3/admin/email_templates/:email_template_id/test_email
@@ -16,6 +16,26 @@ module Spree
16
16
  # readable ones instead of gating on a single scope.
17
17
  skip_scope_check! only: :index
18
18
 
19
+ request_params :export do |body|
20
+ body.attribute :type, :string,
21
+ required: true, on: :create,
22
+ example: 'products',
23
+ description: 'Which dataset to export, as its shorthand: `products`, `orders`, `customers`, `product_translations`, `gift_cards`, `coupon_codes`, `newsletter_subscribers`, `price_list_prices`, `purchase_orders`, or a type an extension registers.'
24
+ body.attribute :record_selection, :string,
25
+ choices: %w[filtered all],
26
+ example: 'filtered',
27
+ description: '`filtered` (the default) keeps `search_params`; `all` ignores them and exports every record in scope.'
28
+ body.attribute :results_url, :string,
29
+ example: 'https://admin.example.com/store_abc/exports',
30
+ description: "Absolute URL of your admin exports view; the export-done email uses it as the download button target. Only honored when it matches one of the store's allowed origins."
31
+ # Read from the raw params: a Ransack hash nests groupings, which
32
+ # `permit(search_params: {})` rejects.
33
+ body.attribute :search_params, :hash,
34
+ permit: false,
35
+ example: { name_cont: 'shirt' },
36
+ description: 'A Ransack query, with the predicates the list endpoint accepts. A `price_list_prices` export requires `price_list_id_eq` naming a price list of the current store, and refuses `record_selection: "all"`.'
37
+ end
38
+
19
39
  # We stream the CSV inline rather than redirecting to ActiveStorage's
20
40
  # signed-URL endpoint because the SPA's Vite proxy only forwards
21
41
  # `/api/*`. A cross-origin redirect to `/rails/active_storage/...`
@@ -92,13 +112,10 @@ module Spree
92
112
  klass.new(attrs)
93
113
  end
94
114
 
95
- # `search_params` carries an arbitrary Ransack hash with nested
96
- # groupings (`{ g: [{ name_cont: 'foo' }] }`). Rails' `permit(k: {})`
97
- # rejects nested hashes, so we extract via `to_unsafe_h`. `:format`
98
- # is intentionally dropped — only CSV is supported and Rails' request
99
- # format would otherwise overwrite the model's enum.
115
+ # `:format` is intentionally dropped — only CSV is supported and Rails'
116
+ # request format would otherwise overwrite the model's enum.
100
117
  def permitted_params
101
- attrs = params.permit(*model_additional_permitted_attributes, :type, :record_selection, :results_url)
118
+ attrs = params.permit(*permitted_attributes)
102
119
  raw = params[:search_params]
103
120
  attrs[:search_params] = raw.respond_to?(:to_unsafe_h) ? raw.to_unsafe_h : raw if raw.present?
104
121
  attrs
@@ -0,0 +1,29 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ class FilesController < Admin::BaseController
6
+ include Spree::Api::V3::FileUploads
7
+
8
+ # The endpoint that uses a file checks its own scope (`write_customers`
9
+ # for an avatar, and so on), so this gate is the floor, not the only
10
+ # check. `write_products` covers the dominant flow, product media.
11
+ scoped_resource :products
12
+
13
+ skip_before_action :authenticate_user
14
+
15
+ # Permitted by Spree::Api::V3::FileUploads, shared with the seller branch.
16
+ request_params 'FileUploadCreateParams', action: :create do |body|
17
+ body.include_attributes Spree::Api::V3::FileUploadRequestSchema
18
+ end
19
+
20
+ private
21
+
22
+ def file_upload_serializer
23
+ Spree.api.admin_file_upload_serializer
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -11,6 +11,25 @@ module Spree
11
11
  class GiftCardBatchesController < ResourceController
12
12
  scoped_resource :gift_cards
13
13
 
14
+ request_params :gift_card_batch do |body|
15
+ body.attribute :prefix, :string,
16
+ required: true, on: :create,
17
+ example: 'WELCOME',
18
+ description: 'Lowercased and prepended to every generated code.'
19
+ body.attribute :amount, :decimal,
20
+ required: true, on: :create,
21
+ example: '25.00',
22
+ description: 'The amount of each card, greater than zero.'
23
+ body.attribute :codes_count, :integer,
24
+ required: true, on: :create,
25
+ example: 100,
26
+ description: 'How many cards to generate. Capped at `gift_card_batch_limit`; batches over `gift_card_batch_web_limit` generate in the background.'
27
+ body.attribute :currency, :currency,
28
+ example: 'USD',
29
+ description: 'ISO 4217 currency code. Defaults to the store currency.'
30
+ body.attribute :expires_at, :date, nullable: true, example: '2030-12-31'
31
+ end
32
+
14
33
  protected
15
34
 
16
35
  def model_class
@@ -22,7 +41,7 @@ module Spree
22
41
  end
23
42
 
24
43
  def permitted_params
25
- params.permit(*model_additional_permitted_attributes, :prefix, :codes_count, :amount, :expires_at, :currency)
44
+ params.permit(*permitted_attributes)
26
45
  end
27
46
  end
28
47
  end
@@ -13,6 +13,24 @@ module Spree
13
13
  class GiftCardsController < ResourceController
14
14
  scoped_resource :gift_cards
15
15
 
16
+ request_params :gift_card do |body|
17
+ body.attribute :amount, :decimal,
18
+ required: true, on: :create,
19
+ example: '25.00',
20
+ description: 'Greater than zero.'
21
+ body.attribute :currency, :currency,
22
+ example: 'USD',
23
+ description: 'ISO 4217 currency code. Defaults to the store currency.'
24
+ body.attribute :code, :string, example: 'WELCOME50', description: 'Generated when omitted.'
25
+ body.attribute :expires_at, :date, nullable: true, example: '2030-12-31'
26
+ # Resolved through the caller's ability by `resolve_customer`.
27
+ body.attribute :customer_id, :id,
28
+ nullable: true,
29
+ permit: false,
30
+ example: 'cus_UkLWZg9DAJ',
31
+ description: 'The customer the card belongs to. Needs the `read_customers` permission; null detaches it.'
32
+ end
33
+
16
34
  before_action :resolve_customer, only: [:create, :update]
17
35
 
18
36
  protected
@@ -26,7 +44,7 @@ module Spree
26
44
  end
27
45
 
28
46
  def permitted_params
29
- params.permit(*model_additional_permitted_attributes, :code, :amount, :expires_at, :currency).tap do |attributes|
47
+ params.permit(*permitted_attributes).tap do |attributes|
30
48
  attributes[:customer] = @customer if params.key?(:customer_id)
31
49
  end
32
50
  end
@@ -17,10 +17,43 @@ module Spree
17
17
  # writable ones instead of gating on a single scope.
18
18
  skip_scope_check! only: :index
19
19
 
20
+ request_params :import do |body|
21
+ body.attribute :type, :string,
22
+ required: true, on: :create,
23
+ example: 'products',
24
+ description: 'Which dataset to import, as its shorthand: `products`, `customers`, `product_translations`, `price_list_prices`, `purchase_orders`, or a type an extension registers.'
25
+ body.attribute :attachment_signed_id, :string,
26
+ required: true, on: :create,
27
+ description: 'The `signed_id` of the uploaded CSV, from `files.upload()` with `visibility: "private"`.'
28
+ body.attribute :delimiter, :string,
29
+ choices: [',', ';', '|', "\t"],
30
+ example: ',',
31
+ description: 'CSV column separator. Defaults to a comma.'
32
+ body.attribute :results_url, :string,
33
+ example: 'https://admin.example.com/store_abc/settings/imports',
34
+ description: "Absolute URL of your admin imports view; the import-done email links back to it with `?import=<id>` appended. Only honored when it matches one of the store's allowed origins."
35
+ body.attribute :price_list_id, :id,
36
+ description: 'For `price_list_prices` imports: the price list the rows are merged into. Must belong to the current store; other types ignore it.'
37
+ end
38
+
39
+ request_params 'ImportCompleteMappingParams', action: :complete_mapping do |body|
40
+ body.attribute :mappings, :array,
41
+ description: 'Column assignments to apply before processing starts. Omit to accept the ones assigned on create.' do |mapping|
42
+ mapping.attribute :schema_field, :string,
43
+ required: true,
44
+ example: 'slug',
45
+ description: "A schema field name from the import's `schema_fields`."
46
+ mapping.attribute :file_column, :string,
47
+ nullable: true,
48
+ example: 'Product Handle',
49
+ description: 'The CSV header to read the field from; null unmaps the field.'
50
+ end
51
+ end
52
+
20
53
  # POST /api/v3/admin/imports
21
54
  #
22
- # `attachment` is an ActiveStorage signed blob id obtained from
23
- # POST /api/v3/admin/direct_uploads. On success the import advances
55
+ # `attachment_signed_id` is a signed id obtained from
56
+ # POST /api/v3/admin/files. On success the import advances
24
57
  # straight into `mapping` (auto-assigning file columns from the CSV
25
58
  # headers), so the response already carries the mapping payload.
26
59
  def create
@@ -48,12 +81,6 @@ module Spree
48
81
  else
49
82
  render_errors(@resource.errors)
50
83
  end
51
- rescue ActiveSupport::MessageVerifier::InvalidSignature
52
- render_error(
53
- code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:validation_error],
54
- message: 'Invalid attachment signed id',
55
- status: :unprocessable_content
56
- )
57
84
  end
58
85
 
59
86
  # PATCH /api/v3/admin/imports/:id/complete_mapping
@@ -259,7 +286,7 @@ module Spree
259
286
  end
260
287
 
261
288
  def permitted_params
262
- params.permit(*model_additional_permitted_attributes, :type, :attachment, :preferred_delimiter, :results_url, :price_list_id)
289
+ params.permit(*permitted_attributes)
263
290
  end
264
291
 
265
292
  # A price-list import writes into one list, named by its prefixed id.
@@ -15,6 +15,18 @@ module Spree
15
15
  subclassed_via -> { Spree::Integration.registered_classes },
16
16
  unknown_type_error: 'unknown_integration_type'
17
17
 
18
+ request_params :integration do |body|
19
+ body.attribute :type, :string,
20
+ required: true,
21
+ only: :create,
22
+ example: 'carrier',
23
+ description: 'Wire shorthand from the integration types endpoint.'
24
+ body.attribute :active, :boolean,
25
+ description: 'Activating runs the connection check, and a failed check is a 422.'
26
+ body.attribute :preferences, :hash,
27
+ description: 'Credential values. Secret preferences come back masked, and sending a masked value back keeps the stored secret.'
28
+ end
29
+
18
30
  # GET /api/v3/admin/integrations/types
19
31
  # Pure registry discovery — which integrations are installed and how
20
32
  # they're configured. Deliberately carries no per-store connected
@@ -47,7 +59,7 @@ module Spree
47
59
  end
48
60
 
49
61
  def permitted_params
50
- params.permit(*model_additional_permitted_attributes, :type, :active, preferences: {})
62
+ params.permit(*permitted_attributes)
51
63
  end
52
64
 
53
65
  # `types` is read-only discovery — maps to the read scope.
@@ -10,6 +10,14 @@ module Spree
10
10
  skip_scope_check!
11
11
  skip_before_action :authenticate_admin!, only: [:lookup, :accept]
12
12
 
13
+ request_params 'InvitationAcceptParams', action: :accept do |body|
14
+ body.attribute :password, :string,
15
+ description: 'Required when the invitee has no account yet: it creates one. An existing account signs in without it.'
16
+ body.attribute :password_confirmation, :string
17
+ body.attribute :first_name, :string
18
+ body.attribute :last_name, :string
19
+ end
20
+
13
21
  rate_limit to: Spree::Api::Config[:rate_limit_login],
14
22
  within: Spree::Api::Config[:rate_limit_window].seconds,
15
23
  store: Rails.cache,
@@ -24,7 +32,6 @@ module Spree
24
32
  end
25
33
 
26
34
  # POST /api/v3/admin/auth/invitations/:id/accept?token=:token
27
- # Body: { password?, password_confirmation?, first_name?, last_name? }
28
35
  def accept
29
36
  return unless load_invitation
30
37
 
@@ -99,7 +106,7 @@ module Spree
99
106
  end
100
107
 
101
108
  def signup_params(invitation)
102
- params.permit(:password, :password_confirmation, :first_name, :last_name).
109
+ params.permit(*declared_permitted_attributes).
103
110
  merge(email: invitation.email)
104
111
  end
105
112