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
@@ -10,27 +10,48 @@ module Spree
10
10
  subclassed_via -> { Spree::PaymentMethod.providers },
11
11
  unknown_type_error: 'unknown_payment_method_type'
12
12
 
13
+ request_params :payment_method do |body|
14
+ body.attribute :type, :string,
15
+ required: true,
16
+ only: :create,
17
+ permit: false,
18
+ example: 'check',
19
+ description: 'Wire shorthand from the payment method types endpoint.'
20
+ body.attribute :name, :string, required: true, on: :create
21
+ body.attribute :description, :string, nullable: true
22
+ body.attribute :active, :boolean
23
+ body.attribute :storefront_visible, :boolean,
24
+ description: 'False keeps the method to the dashboard; true also offers it on the storefront.'
25
+ body.attribute :capture_method, :string,
26
+ nullable: true,
27
+ choices: Spree::CaptureMethod::CAPTURE_METHODS,
28
+ description: 'When customers are charged for this method. Null inherits the store setting.'
29
+ body.attribute :position, :integer
30
+ body.attribute :metadata, :hash
31
+ body.attribute :preferences, :hash,
32
+ description: "Values for the provider's preference schema, from the payment method types endpoint."
33
+ end
34
+
13
35
  # Lists available payment provider subclasses for the create form.
14
- # Returns: { data: [{ type, label, description, preference_schema }] }.
15
- # The preference_schema array describes the provider-specific
36
+ # Returns: { data: [{ type, label, description, schema }] }.
37
+ # `schema` is the JSON Schema of the provider-specific
16
38
  # configuration fields, so admin UIs can render a generic
17
39
  # preferences form without hard-coding per-provider knowledge.
18
- # Filters out subclasses already installed in the current store —
19
- # mirrors the legacy admin's "available_payment_methods" helper, so
20
- # admins don't see (and accidentally double-install) the same
21
- # provider twice.
40
+ # Every provider, `installed` when the store already has one: the
41
+ # create picker leaves those out so a provider is not installed
42
+ # twice, and the edit form still finds an installed one's schema.
22
43
  def types
23
- authorize! :create, model_class
44
+ authorize! :show, model_class
24
45
 
25
46
  installed_class_names = current_store.payment_methods.pluck(:type)
26
47
  installed_shorthands = installed_class_names.filter_map do |name|
27
48
  name.safe_constantize&.api_type
28
49
  end
29
- available = model_class.subclasses_with_preference_schema.reject do |entry|
30
- installed_shorthands.include?(entry[:type])
50
+ entries = model_class.subclasses_with_preference_schema.map do |entry|
51
+ entry.merge(installed: installed_shorthands.include?(entry[:type]))
31
52
  end
32
53
 
33
- render json: { data: available }
54
+ render json: { data: entries }
34
55
  end
35
56
 
36
57
  protected
@@ -43,19 +64,14 @@ module Spree
43
64
  Spree.api.admin_payment_method_serializer
44
65
  end
45
66
 
46
- # Explicit allowlist per the v3 convention — flat params. `type` and
47
- # `preferences` are added by `SubclassedResource` on top.
48
- # Deliberately NOT routed through `normalize_params`: gateway
49
- # `preferences` are opaque provider values, and prefixed-ID resolution
50
- # recurses into nested hashes — a Stripe `webhook_endpoint_id` like
51
- # `we_1MqJ8b...` matches the prefixed-ID shape and would be decoded to
52
- # an integer. `type` and `preferences` are added by `SubclassedResource`.
67
+ # `type` is read by `SubclassedResource` from the raw params.
68
+ # Deliberately NOT routed through `normalize_params`: `metadata` holds
69
+ # opaque merchant values, and prefixed-ID resolution recurses into
70
+ # nested hashes — a value like `we_1MqJ8b...` matches the prefixed-ID
71
+ # shape and would be decoded to an integer. `preferences` decode their
72
+ # own ids from their schema.
53
73
  def permitted_params
54
- params.permit(
55
- :name, :description, :active, :storefront_visible, :auto_capture, :capture_method, :position,
56
- *model_additional_permitted_attributes,
57
- metadata: {}, preferences: {}
58
- )
74
+ params.permit(*permitted_attributes)
59
75
  end
60
76
 
61
77
  def scope
@@ -8,6 +8,14 @@ module Spree
8
8
  class PoliciesController < ResourceController
9
9
  scoped_resource :settings
10
10
 
11
+ request_params :policy do |body|
12
+ body.attribute :name, :string, required: true, on: :create, example: 'Wholesale Policy'
13
+ body.attribute :slug, :string, example: 'wholesale-policy'
14
+ body.attribute :body, :string,
15
+ nullable: true,
16
+ example: '<p>Trade orders ship within five working days.</p>'
17
+ end
18
+
11
19
  protected
12
20
 
13
21
  def model_class
@@ -18,10 +26,6 @@ module Spree
18
26
  Spree.api.admin_policy_serializer
19
27
  end
20
28
 
21
- def resource_permitted_attributes
22
- [:name, :slug, :body]
23
- end
24
-
25
29
  # Accept slug (e.g. returns-policy) or prefixed ID (e.g. pol_abc123),
26
30
  # matching the storefront's lookup.
27
31
  def find_resource
@@ -3,8 +3,7 @@ module Spree
3
3
  module V3
4
4
  module Admin
5
5
  # Admin CRUD for `Spree::PriceList`, plus the lifecycle transitions
6
- # (`activate` / `deactivate`) and the spreadsheet's data feed
7
- # (`prices`).
6
+ # (`activate` / `deactivate`).
8
7
  #
9
8
  # Everything writable on the list itself — name, schedule, match
10
9
  # policy, nested rules (`rules: [...]`), and individual price
@@ -25,11 +24,37 @@ module Spree
25
24
  # before_actions by method name, so this would otherwise
26
25
  # *replace* the parent's narrower filter and break the standard
27
26
  # actions. Wrapping it under a different name keeps both.
28
- before_action :load_member_resource, only: [:activate, :deactivate, :prices]
27
+ before_action :load_member_resource, only: [:activate, :deactivate]
28
+
29
+ request_params :price_list do |body|
30
+ body.attribute :name, :string, required: true, on: :create, example: 'EU wholesale'
31
+ body.attribute :description, :string, nullable: true
32
+ body.attribute :position, :integer, example: 1
33
+ body.attribute :starts_at, :datetime,
34
+ nullable: true,
35
+ example: '2026-06-01T00:00:00Z',
36
+ description: 'Pair with `ends_at` to schedule the list: activating a list whose start is in the future marks it `scheduled`.'
37
+ body.attribute :ends_at, :datetime, nullable: true, example: '2026-09-01T00:00:00Z'
38
+ body.attribute :match_policy, :string,
39
+ choices: Spree::PriceList::MATCH_POLICIES,
40
+ example: 'all',
41
+ description: '`all`: every rule must match. `any`: one matching rule is enough.'
42
+ body.attribute :price_adjustment_percentage, :decimal,
43
+ nullable: true,
44
+ example: '-15.0',
45
+ description: 'Signed: negative discounts off base prices, positive marks up.'
46
+ body.attribute :adjust_compare_at, :boolean
47
+ body.attribute :rules, :array, of: Spree::Api::V3::Admin::PriceListRuleRequestSchema,
48
+ description: 'The complete rule set: rules are matched by `id` and updated, new ones are built, and rules left out are removed.'
49
+ body.attribute :price_adjustment_tiers, :array, of: Spree::Api::V3::Admin::PriceAdjustmentTierRequestSchema,
50
+ description: "Quantity bands on the list's percentage. The payload is the whole ladder: a band left out is removed."
51
+ body.attribute :prices, :array, of: Spree::Api::V3::Admin::PriceListPriceRequestSchema,
52
+ description: 'Per-variant price overrides. Each row upserts, so the variants it names become part of the list. Curating whole products goes through the nested products endpoint instead.'
53
+ end
29
54
 
30
55
  # GET /api/v3/admin/price_lists/price_rule_types
31
56
  #
32
- # Returns `[{ type, label, description, preference_schema }]`
57
+ # Returns `[{ type, label, description, schema }]`
33
58
  # for every registered subclass in `Spree.pricing.rules`. The
34
59
  # SPA uses this to build the "Add rule" picker + render a
35
60
  # generic preferences form per subclass. Rules themselves are
@@ -69,29 +94,6 @@ module Spree
69
94
  end
70
95
  end
71
96
 
72
- # GET /api/v3/admin/price_lists/:id/prices
73
- #
74
- # The spreadsheet editor's data source. Returns every Price row
75
- # in this list (filtered by `?currency=`), eager-loading
76
- # `variant.product` + option values so each cell can render
77
- # product name, variant options and SKU without N+1.
78
- def prices
79
- authorize! :read, @resource
80
- currency = params[:currency].presence || current_store.default_currency
81
- prices = @resource.prices
82
- .includes(variant: [:product, { option_values: :option_type }])
83
- .where(currency: currency)
84
- .joins(variant: :product)
85
- .order(Arel.sql("#{Spree::Product.table_name}.name ASC"))
86
- .order(Arel.sql("#{Spree::Variant.table_name}.position ASC"))
87
- .order(min_quantity: :asc)
88
-
89
- render json: {
90
- data: prices.map { |p| serialize_price(p) },
91
- meta: { currency: currency, count: prices.size }
92
- }
93
- end
94
-
95
97
  protected
96
98
 
97
99
  def model_class
@@ -121,53 +123,16 @@ module Spree
121
123
  [:price_adjustment_tiers]
122
124
  end
123
125
 
124
- def permitted_params
125
- normalize_params(
126
- params.permit(
127
- :name, :description, :position,
128
- :starts_at, :ends_at, :match_policy,
129
- :price_adjustment_percentage, :adjust_compare_at,
130
- rules: [:id, :type, { preferences: {} }],
131
- price_adjustment_tiers: [:min_quantity, :percentage],
132
- prices: [:id, :variant_id, :currency, :min_quantity, :amount, :compare_at_amount]
133
- )
134
- )
135
- end
136
-
137
126
  private
138
127
 
139
128
  # Loads the record without the action-derived authorization
140
129
  # `set_resource` runs (which would check `:activate` /
141
- # `:deactivate` / `:prices` — actions that abilities don't
142
- # grant). The per-action methods below explicitly call
143
- # `authorize!` with the standard action that ability rules
144
- # actually mention (`:update` / `:read`).
130
+ # `:deactivate` — actions that abilities don't grant). The
131
+ # per-action methods explicitly call `authorize!` with
132
+ # `:update`, which ability rules actually mention.
145
133
  def load_member_resource
146
134
  @resource = find_resource
147
135
  end
148
-
149
- # Hand-rolled flat shape for the spreadsheet — keeps the payload
150
- # narrow (no nested variant/product/option_value objects) and
151
- # avoids paying for the admin Price serializer when we only need
152
- # ~6 fields per row. The grouping the UI does (rows → product
153
- # header) is driven entirely off `product_id`/`product_name`.
154
- def serialize_price(price)
155
- variant = price.variant
156
- product = variant.product
157
- {
158
- id: price.prefixed_id,
159
- variant_id: variant.prefixed_id,
160
- product_id: product.prefixed_id,
161
- product_name: product.name,
162
- variant_label: variant.options_text.presence,
163
- sku: variant.sku,
164
- currency: price.currency,
165
- min_quantity: price.min_quantity,
166
- amount: price.amount&.to_s,
167
- compare_at_amount: price.compare_at_amount&.to_s
168
- }
169
- end
170
-
171
136
  end
172
137
  end
173
138
  end
@@ -13,6 +13,47 @@ module Spree
13
13
  before_action :require_ids!, only: [:bulk_destroy]
14
14
  before_action :require_prices!, only: [:bulk_upsert]
15
15
 
16
+ # variant_id and price_list_id resolve through the current store's
17
+ # scopes (+permitted_params+), so a foreign or unknown id 404s.
18
+ request_params :price do |body|
19
+ body.attribute :variant_id, :id, required: true, on: :create, example: 'variant_xY9'
20
+ body.attribute :currency, :currency, required: true, on: :create, example: 'USD'
21
+ body.attribute :min_quantity, :integer,
22
+ description: 'The quantity a line must reach for this price to apply. Omit for the bottom rung of the ladder. Anything above 1 requires a `price_list_id`.'
23
+ body.attribute :amount, :decimal, nullable: true, example: '19.99'
24
+ body.attribute :compare_at_amount, :decimal, nullable: true, example: '19.99'
25
+ body.attribute :price_list_id, :id,
26
+ nullable: true,
27
+ example: 'pl_aBc123',
28
+ description: 'Omit or null for a base price; a price list for a list override.'
29
+ end
30
+
31
+ request_params 'PriceBulkUpsertParams', action: :bulk_upsert do |body|
32
+ body.attribute :prices, :array,
33
+ required: true,
34
+ as: 'PriceBulkUpsertRowParams',
35
+ description: 'Send an empty list to change nothing.' do |price|
36
+ price.attribute :id, :id,
37
+ nullable: true,
38
+ example: 'price_aBc123',
39
+ description: 'Present: updates that row. Absent: upserts on `(variant_id, currency, price_list_id, min_quantity)`.'
40
+ price.attribute :variant_id, :id, required: true, example: 'variant_xY9'
41
+ price.attribute :currency, :currency, required: true, example: 'USD'
42
+ price.attribute :price_list_id, :id,
43
+ nullable: true,
44
+ example: 'pl_aBc123',
45
+ description: 'Omit or null for a base price.'
46
+ price.attribute :min_quantity, :integer,
47
+ description: "The rung of the variant's ladder. Omit for the bottom rung; anything above 1 requires a `price_list_id`. A variant carries at most ten rungs on one list per currency."
48
+ price.attribute :amount, :decimal, nullable: true, example: '19.99'
49
+ price.attribute :compare_at_amount, :decimal, nullable: true, example: '19.99'
50
+ end
51
+ end
52
+
53
+ request_params 'PriceBulkDestroyParams', action: :bulk_destroy do |body|
54
+ body.attribute :ids, :array, of: :id, required: true, example: %w[price_aBc123]
55
+ end
56
+
16
57
  # Bulk-upserts prices on the unique key
17
58
  # `(variant_id, currency, price_list_id, min_quantity)` — one row per
18
59
  # rung of a variant's ladder (docs/plans/6.0-volume-pricing.md).
@@ -58,10 +99,6 @@ module Spree
58
99
  # validations (docs/plans/6.0-volume-pricing.md). Each branch is
59
100
  # guarded on the key its own failure carries, so a failure mode the
60
101
  # service grows later is not reported under one of these names.
61
- #
62
- # `I18n.t` rather than `Spree.t` for these: the models raise them
63
- # under `activerecord.errors`, and `Spree.t` would scope the lookup
64
- # to `spree.` and miss the key.
65
102
  if (invalid = result.error&.value.try(:[], :invalid_quantities))
66
103
  return render_error(
67
104
  code: 'invalid_min_quantity',
@@ -71,6 +108,15 @@ module Spree
71
108
  )
72
109
  end
73
110
 
111
+ if (malformed = result.error&.value.try(:[], :malformed_amounts))
112
+ return render_error(
113
+ code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:invalid_money_format],
114
+ message: I18n.t('activerecord.errors.models.spree/price_list.attributes.base.malformed_price').upcase_first,
115
+ status: :unprocessable_content,
116
+ details: { rows: malformed }
117
+ )
118
+ end
119
+
74
120
  if (negative = result.error&.value.try(:[], :invalid_amounts))
75
121
  return render_error(
76
122
  code: 'invalid_amount',
@@ -164,11 +210,8 @@ module Spree
164
210
  false
165
211
  end
166
212
 
167
- # Resolves variant_id / price_list_id through the current store's
168
- # scopes so a foreign or unknown id 404s instead of binding the
169
- # price to another store's record.
170
213
  def permitted_params
171
- permitted = params.permit(*model_additional_permitted_attributes, :variant_id, :currency, :min_quantity, :amount, :compare_at_amount, :price_list_id)
214
+ permitted = params.permit(*permitted_attributes)
172
215
  permitted[:variant_id] = store_variants.find_by_prefix_id!(permitted[:variant_id]).id if permitted[:variant_id].present?
173
216
  permitted[:price_list_id] = store_price_lists.find_by_prefix_id!(permitted[:price_list_id]).id if permitted[:price_list_id].present?
174
217
  permitted
@@ -11,6 +11,30 @@ module Spree
11
11
  class ProductTypesController < ResourceController
12
12
  scoped_resource :product_types
13
13
 
14
+ # The associations are a template for products created with this type:
15
+ # replace-sets that never change the products already carrying it.
16
+ request_params :product_type do |body|
17
+ body.attribute :name, :string, required: true, on: :create, example: 'Hoodie'
18
+ body.attribute :delivery_profile_id, :id,
19
+ nullable: true,
20
+ example: 'fp_86Rf07xd4z',
21
+ description: 'Delivery profile stamped onto products created with this type. Null leaves new products on the store default profile.'
22
+ body.attribute :option_type_ids, :array, of: :id,
23
+ description: 'Option types seeded onto products that get this type. Use apply to products to backfill existing ones.'
24
+ body.attribute :category_ids, :array, of: :id,
25
+ description: 'Categories seeded onto products that get this type. Categories from other stores are ignored.'
26
+ body.attribute :custom_field_definitions, :array,
27
+ as: 'ProductTypeCustomFieldDefinitionParams',
28
+ description: 'The custom field definitions the product form shows. Definitions not listed are removed from the type.' do |custom_field_definition|
29
+ custom_field_definition.attribute :id, :id,
30
+ required: true,
31
+ example: 'cfdef_abc123',
32
+ description: 'The custom field definition.'
33
+ custom_field_definition.attribute :required, :boolean
34
+ custom_field_definition.attribute :sort_order, :integer
35
+ end
36
+ end
37
+
14
38
  # Backfills this type's option types and categories onto the products
15
39
  # that already carry it. Additive and idempotent — nothing is removed.
16
40
  def apply_to_products
@@ -50,14 +74,7 @@ module Spree
50
74
  end
51
75
 
52
76
  def permitted_params
53
- attrs = params.permit(
54
- *model_additional_permitted_attributes,
55
- :name,
56
- :delivery_profile_id,
57
- option_type_ids: [],
58
- category_ids: [],
59
- custom_field_definitions: [:id, :required, :sort_order]
60
- )
77
+ attrs = params.permit(*permitted_attributes)
61
78
  attrs = scope_delivery_profile(attrs)
62
79
  scope_category_ids(attrs)
63
80
  end
@@ -6,6 +6,32 @@ module Spree
6
6
  class DigitalAssetsController < ResourceController
7
7
  scoped_resource :products
8
8
 
9
+ request_params :digital_asset do |body|
10
+ # Names a blob rather than a column, so it is attached
11
+ # separately (+attach_uploaded_file+).
12
+ body.attribute :signed_id, :string,
13
+ permit: false,
14
+ description: "A `signed_id` from `files.upload()` with `visibility: 'private'`. Required for an uploaded file, omitted for a provider-backed asset. On update it replaces the file for everyone who already bought it."
15
+ # Resolved through the parent rather than assigned, so an asset
16
+ # can't be pointed at a variant of another product or store.
17
+ body.attribute :variant_id, :id,
18
+ permit: false,
19
+ description: "Defaults to the product's default variant when omitted."
20
+ # The model validates it names a registered provider.
21
+ body.attribute :provider_type, :string,
22
+ description: 'A provider shorthand from the providers endpoint. Omit for an uploaded file.'
23
+ # Its keys are declared by the provider, so it lands verbatim
24
+ # under one key in the asset's metadata.
25
+ body.attribute :provider_settings, :hash,
26
+ description: "Values for the provider's settings schema, keyed by field name."
27
+ body.attribute :authorized_clicks, :integer,
28
+ nullable: true,
29
+ description: "Null means the store's download settings apply."
30
+ body.attribute :authorized_days, :integer,
31
+ nullable: true,
32
+ description: "Null means the store's download settings apply."
33
+ end
34
+
9
35
  # PATCH /api/v3/admin/products/:product_id/digital_assets/:id
10
36
  #
11
37
  # Replacing the file keeps every already-issued link working, since
@@ -45,7 +71,7 @@ module Spree
45
71
 
46
72
  data = Spree.digital_asset_providers.map do |provider_class|
47
73
  {
48
- type: provider_class.to_s,
74
+ type: provider_class.api_type,
49
75
  name: provider_class.provider_name,
50
76
  requires_attachment: provider_class.requires_attachment?,
51
77
  settings_schema: provider_class.settings_schema
@@ -70,10 +96,6 @@ module Spree
70
96
  authorize!(:show, @parent)
71
97
  end
72
98
 
73
- def parent_association
74
- :digital_assets
75
- end
76
-
77
99
  # The parent association reaches assets through `variants`, which
78
100
  # carries an ORDER BY on the variants table. Combined with the
79
101
  # collection's DISTINCT, PostgreSQL rejects the query outright
@@ -88,17 +110,8 @@ module Spree
88
110
  [:variant, { attachment_attachment: :blob }]
89
111
  end
90
112
 
91
- # variant_id is resolved through the parent rather than assigned:
92
- # mass-assigning it would let a caller point an asset at a variant
93
- # of any product, in any store. signed_id likewise names a blob
94
- # rather than a column, so it is attached separately.
95
- # provider_type is mass-assignable: the model validates it names a
96
- # registered provider, so an unknown value is a 422, not a hazard.
97
- # provider_settings is an open hash — its keys are declared by the
98
- # provider, not fixed here — so it is permitted as arbitrary scalars
99
- # and lands verbatim under one key in the asset's metadata.
100
113
  def permitted_params
101
- params.permit(:authorized_clicks, :authorized_days, :provider_type, provider_settings: {})
114
+ params.permit(*declared_permitted_attributes)
102
115
  end
103
116
 
104
117
  private
@@ -138,7 +151,7 @@ module Spree
138
151
  end
139
152
 
140
153
  def render_private_storage_error
141
- render_validation_error(Spree.t(:digital_assets_attachment_must_be_private))
154
+ render_validation_error(I18n.t('spree.digital_assets_attachment_must_be_private'))
142
155
  end
143
156
  end
144
157
  end
@@ -6,6 +6,14 @@ module Spree
6
6
  class VariantsController < ResourceController
7
7
  scoped_resource :products
8
8
 
9
+ request_params :variant do |body|
10
+ body.external_references
11
+ body.include_attributes Spree::Api::V3::VariantRequestSchema
12
+ body.attribute :options, :array, of: Spree::Api::V3::VariantOptionRequestSchema,
13
+ required: true, on: :create,
14
+ description: 'One pair per option type the variant takes part in (size, color). Option types and values are created when missing. On update, omit to leave the option values untouched.'
15
+ end
16
+
9
17
  protected
10
18
 
11
19
  def model_class
@@ -21,10 +29,6 @@ module Spree
21
29
  authorize!(:show, @parent)
22
30
  end
23
31
 
24
- def parent_association
25
- :variants
26
- end
27
-
28
32
  def scope_includes
29
33
  [:prices, stock_levels: :stock_location]
30
34
  end
@@ -46,20 +50,7 @@ module Spree
46
50
  end
47
51
 
48
52
  def permitted_params
49
- params.permit(
50
- *model_additional_permitted_attributes,
51
- :sku, :barcode,
52
- :cost_price, :cost_currency,
53
- :weight, :height, :width, :depth, :weight_unit, :dimensions_unit,
54
- :hs_code, :country_of_origin, :customs_description,
55
- :minimum_order_quantity, :order_multiple, :purchase_unit, :units_per_carton,
56
- :carton_package_type_id, :carton_weight, :cartons_per_pallet,
57
- :seller_id, :delivery_profile_id,
58
- :track_inventory, :preorderable, :preorder_ships_at, :backorder_limit, :tax_category_id, :position,
59
- options: [:name, :value],
60
- prices: [:amount, :compare_at_amount, :currency],
61
- stock_levels: [:stock_location_id, :count_on_hand, :backorderable]
62
- )
53
+ params.permit(*permitted_attributes)
63
54
  end
64
55
  end
65
56
  end