spree_api 5.6.1 → 6.0.0.beta2

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 (542) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +28 -0
  3. data/Rakefile +1 -1
  4. data/app/controllers/concerns/spree/api/v3/address_params.rb +17 -0
  5. data/app/controllers/concerns/spree/api/v3/admin/product_listing.rb +46 -0
  6. data/app/controllers/concerns/spree/api/v3/admin/product_membership.rb +110 -0
  7. data/app/controllers/concerns/spree/api/v3/admin/receivable_actions.rb +68 -0
  8. data/app/controllers/concerns/spree/api/v3/admin/reporting_authorization.rb +27 -0
  9. data/app/controllers/concerns/spree/api/v3/admin/role_grant_guard.rb +69 -33
  10. data/app/controllers/concerns/spree/api/v3/admin/stock_receipt_actions.rb +86 -0
  11. data/app/controllers/concerns/spree/api/v3/admin/store_context.rb +97 -0
  12. data/app/controllers/concerns/spree/api/v3/admin/subclassed_resource.rb +12 -6
  13. data/app/controllers/concerns/spree/api/v3/admin/validation_details.rb +91 -0
  14. data/app/controllers/concerns/spree/api/v3/admin_authentication.rb +20 -5
  15. data/app/controllers/concerns/spree/api/v3/api_key_authentication.rb +41 -5
  16. data/app/controllers/concerns/spree/api/v3/authentication_strategies.rb +48 -0
  17. data/app/controllers/concerns/spree/api/v3/bulk_operations.rb +4 -6
  18. data/app/controllers/concerns/spree/api/v3/cart_resolvable.rb +52 -16
  19. data/app/controllers/concerns/spree/api/v3/company_address_writes.rb +37 -0
  20. data/app/controllers/concerns/spree/api/v3/current_password_confirmation.rb +41 -0
  21. data/app/controllers/concerns/spree/api/v3/direct_uploads.rb +35 -0
  22. data/app/controllers/concerns/spree/api/v3/error_handler.rb +53 -11
  23. data/app/controllers/concerns/spree/api/v3/idempotent.rb +10 -4
  24. data/app/controllers/concerns/spree/api/v3/items_payload.rb +54 -0
  25. data/app/controllers/concerns/spree/api/v3/jwt_authentication.rb +23 -3
  26. data/app/controllers/concerns/spree/api/v3/key_store_context.rb +31 -0
  27. data/app/controllers/concerns/spree/api/v3/locale_and_currency.rb +3 -3
  28. data/app/controllers/concerns/spree/api/v3/order_lock.rb +22 -3
  29. data/app/controllers/concerns/spree/api/v3/orders/claim_actions.rb +112 -0
  30. data/app/controllers/concerns/spree/api/v3/orders/delivery_actions.rb +105 -0
  31. data/app/controllers/concerns/spree/api/v3/orders/exchange_actions.rb +117 -0
  32. data/app/controllers/concerns/spree/api/v3/orders/fulfillment_actions.rb +157 -0
  33. data/app/controllers/concerns/spree/api/v3/orders/post_sale_actions.rb +76 -0
  34. data/app/controllers/concerns/spree/api/v3/orders/return_actions.rb +116 -0
  35. data/app/controllers/concerns/spree/api/v3/orders/shipping_label_actions.rb +128 -0
  36. data/app/controllers/concerns/spree/api/v3/params_normalizer.rb +7 -4
  37. data/app/controllers/concerns/spree/api/v3/permission_serialization.rb +42 -0
  38. data/app/controllers/concerns/spree/api/v3/rate_limit_headers.rb +40 -6
  39. data/app/controllers/concerns/spree/api/v3/scoped_authorization.rb +80 -26
  40. data/app/controllers/concerns/spree/api/v3/seller/auth_cookies.rb +62 -0
  41. data/app/controllers/concerns/spree/api/v3/seller/seller_context.rb +127 -0
  42. data/app/controllers/concerns/spree/api/v3/seller_authentication.rb +40 -0
  43. data/app/controllers/concerns/spree/api/v3/storefront_access.rb +38 -0
  44. data/app/controllers/concerns/spree/api/v3/streams_shipping_label.rb +37 -0
  45. data/app/controllers/concerns/spree/api/v3/tax_identifier_validation.rb +41 -0
  46. data/app/controllers/spree/api/v3/admin/admin_users_controller.rb +11 -14
  47. data/app/controllers/spree/api/v3/admin/allowed_origins_controller.rb +1 -1
  48. data/app/controllers/spree/api/v3/admin/api_keys_controller.rb +18 -9
  49. data/app/controllers/spree/api/v3/admin/auth_controller.rb +138 -22
  50. data/app/controllers/spree/api/v3/admin/base_controller.rb +2 -0
  51. data/app/controllers/spree/api/v3/admin/catalog_assignments_controller.rb +27 -0
  52. data/app/controllers/spree/api/v3/admin/catalogs/base_controller.rb +29 -0
  53. data/app/controllers/spree/api/v3/admin/catalogs/order_minimums_controller.rb +40 -0
  54. data/app/controllers/spree/api/v3/admin/catalogs/products_controller.rb +107 -0
  55. data/app/controllers/spree/api/v3/admin/catalogs/quantity_rules_controller.rb +75 -0
  56. data/app/controllers/spree/api/v3/admin/catalogs_controller.rb +191 -0
  57. data/app/controllers/spree/api/v3/admin/categories/products_controller.rb +28 -41
  58. data/app/controllers/spree/api/v3/admin/categories_controller.rb +16 -7
  59. data/app/controllers/spree/api/v3/admin/channels_controller.rb +50 -2
  60. data/app/controllers/spree/api/v3/admin/claim_reasons_controller.rb +25 -0
  61. data/app/controllers/spree/api/v3/admin/claims_controller.rb +31 -0
  62. data/app/controllers/spree/api/v3/admin/collection_rules_controller.rb +40 -0
  63. data/app/controllers/spree/api/v3/admin/collections/products_controller.rb +101 -0
  64. data/app/controllers/spree/api/v3/admin/collections_controller.rb +56 -0
  65. data/app/controllers/spree/api/v3/admin/commission_lines_controller.rb +39 -0
  66. data/app/controllers/spree/api/v3/admin/commission_rates_controller.rb +174 -0
  67. data/app/controllers/spree/api/v3/admin/companies/addresses_controller.rb +65 -0
  68. data/app/controllers/spree/api/v3/admin/companies/base_controller.rb +29 -0
  69. data/app/controllers/spree/api/v3/admin/companies/invitations_controller.rb +56 -0
  70. data/app/controllers/spree/api/v3/admin/companies/memberships_controller.rb +66 -0
  71. data/app/controllers/spree/api/v3/admin/companies/tax_exemption_certificates_controller.rb +137 -0
  72. data/app/controllers/spree/api/v3/admin/companies/tax_identifiers_controller.rb +46 -0
  73. data/app/controllers/spree/api/v3/admin/companies_controller.rb +59 -0
  74. data/app/controllers/spree/api/v3/admin/concerns/external_references.rb +166 -0
  75. data/app/controllers/spree/api/v3/admin/consent_records_controller.rb +31 -0
  76. data/app/controllers/spree/api/v3/admin/countries_controller.rb +12 -4
  77. data/app/controllers/spree/api/v3/admin/custom_field_definitions_controller.rb +19 -4
  78. data/app/controllers/spree/api/v3/admin/custom_fields_controller.rb +5 -5
  79. data/app/controllers/spree/api/v3/admin/customer_groups_controller.rb +1 -1
  80. data/app/controllers/spree/api/v3/admin/customers/addresses_controller.rb +4 -4
  81. data/app/controllers/spree/api/v3/admin/customers/base_controller.rb +1 -1
  82. data/app/controllers/spree/api/v3/admin/customers/store_credits_controller.rb +2 -3
  83. data/app/controllers/spree/api/v3/admin/customers/tax_identifiers_controller.rb +43 -0
  84. data/app/controllers/spree/api/v3/admin/customers_controller.rb +190 -11
  85. data/app/controllers/spree/api/v3/admin/dashboard_controller.rb +24 -20
  86. data/app/controllers/spree/api/v3/admin/data_requests_controller.rb +60 -0
  87. data/app/controllers/spree/api/v3/admin/delivery_method_rules_controller.rb +54 -0
  88. data/app/controllers/spree/api/v3/admin/delivery_methods/rules_controller.rb +114 -0
  89. data/app/controllers/spree/api/v3/admin/delivery_methods_controller.rb +243 -0
  90. data/app/controllers/spree/api/v3/admin/delivery_profiles/origin_groups_controller.rb +80 -0
  91. data/app/controllers/spree/api/v3/admin/delivery_profiles_controller.rb +107 -0
  92. data/app/controllers/spree/api/v3/admin/delivery_zones_controller.rb +116 -0
  93. data/app/controllers/spree/api/v3/admin/digital_links_controller.rb +48 -0
  94. data/app/controllers/spree/api/v3/admin/direct_uploads_controller.rb +17 -3
  95. data/app/controllers/spree/api/v3/admin/exchanges_controller.rb +31 -0
  96. data/app/controllers/spree/api/v3/admin/exports_controller.rb +2 -2
  97. data/app/controllers/spree/api/v3/admin/gift_card_batches_controller.rb +1 -1
  98. data/app/controllers/spree/api/v3/admin/gift_cards_controller.rb +3 -2
  99. data/app/controllers/spree/api/v3/admin/imports_controller.rb +71 -8
  100. data/app/controllers/spree/api/v3/admin/integrations_controller.rb +67 -0
  101. data/app/controllers/spree/api/v3/admin/invitation_acceptances_controller.rb +5 -5
  102. data/app/controllers/spree/api/v3/admin/invitations_controller.rb +5 -1
  103. data/app/controllers/spree/api/v3/admin/locales_controller.rb +3 -1
  104. data/app/controllers/spree/api/v3/admin/markets_controller.rb +9 -5
  105. data/app/controllers/spree/api/v3/admin/me_controller.rb +4 -30
  106. data/app/controllers/spree/api/v3/admin/media_controller.rb +88 -38
  107. data/app/controllers/spree/api/v3/admin/media_library_controller.rb +156 -0
  108. data/app/controllers/spree/api/v3/admin/option_types_controller.rb +1 -0
  109. data/app/controllers/spree/api/v3/admin/order_cancellation_reasons_controller.rb +25 -0
  110. data/app/controllers/spree/api/v3/admin/order_groups_controller.rb +43 -0
  111. data/app/controllers/spree/api/v3/admin/order_routing_rules_controller.rb +1 -1
  112. data/app/controllers/spree/api/v3/admin/orders/claims_controller.rb +56 -0
  113. data/app/controllers/spree/api/v3/admin/orders/deliveries_controller.rb +66 -0
  114. data/app/controllers/spree/api/v3/admin/orders/discount_codes_controller.rb +86 -0
  115. data/app/controllers/spree/api/v3/admin/orders/discounts_controller.rb +99 -0
  116. data/app/controllers/spree/api/v3/admin/orders/exchanges_controller.rb +62 -0
  117. data/app/controllers/spree/api/v3/admin/orders/fees_controller.rb +83 -0
  118. data/app/controllers/spree/api/v3/admin/orders/fulfillments_controller.rb +45 -67
  119. data/app/controllers/spree/api/v3/admin/orders/items_controller.rb +40 -22
  120. data/app/controllers/spree/api/v3/admin/orders/labels_controller.rb +75 -0
  121. data/app/controllers/spree/api/v3/admin/orders/payments_controller.rb +36 -18
  122. data/app/controllers/spree/api/v3/admin/orders/refunds_controller.rb +39 -18
  123. data/app/controllers/spree/api/v3/admin/orders/returns_controller.rb +70 -0
  124. data/app/controllers/spree/api/v3/admin/orders/store_credits_controller.rb +2 -2
  125. data/app/controllers/spree/api/v3/admin/orders/tax_identifiers_controller.rb +41 -0
  126. data/app/controllers/spree/api/v3/admin/orders/tax_lines_controller.rb +32 -0
  127. data/app/controllers/spree/api/v3/admin/orders_controller.rb +164 -33
  128. data/app/controllers/spree/api/v3/admin/package_types_controller.rb +39 -0
  129. data/app/controllers/spree/api/v3/admin/password_resets_controller.rb +1 -1
  130. data/app/controllers/spree/api/v3/admin/payment_methods_controller.rb +15 -4
  131. data/app/controllers/spree/api/v3/admin/payout_providers_controller.rb +27 -0
  132. data/app/controllers/spree/api/v3/admin/permissions_controller.rb +30 -0
  133. data/app/controllers/spree/api/v3/admin/policies_controller.rb +42 -0
  134. data/app/controllers/spree/api/v3/admin/price_lists/products_controller.rb +93 -0
  135. data/app/controllers/spree/api/v3/admin/price_lists_controller.rb +43 -29
  136. data/app/controllers/spree/api/v3/admin/prices_controller.rb +41 -4
  137. data/app/controllers/spree/api/v3/admin/product_types_controller.rb +93 -0
  138. data/app/controllers/spree/api/v3/admin/products/digital_assets_controller.rb +148 -0
  139. data/app/controllers/spree/api/v3/admin/products/variants_controller.rb +24 -3
  140. data/app/controllers/spree/api/v3/admin/products_controller.rb +149 -33
  141. data/app/controllers/spree/api/v3/admin/promotion_actions_controller.rb +6 -2
  142. data/app/controllers/spree/api/v3/admin/promotion_rules_controller.rb +1 -1
  143. data/app/controllers/spree/api/v3/admin/promotions_controller.rb +1 -5
  144. data/app/controllers/spree/api/v3/admin/purchase_orders/stock_receipts_controller.rb +32 -0
  145. data/app/controllers/spree/api/v3/admin/purchase_orders_controller.rb +161 -0
  146. data/app/controllers/spree/api/v3/admin/refund_reasons_controller.rb +25 -0
  147. data/app/controllers/spree/api/v3/admin/reporting/saved_reports_controller.rb +45 -0
  148. data/app/controllers/spree/api/v3/admin/reporting_controller.rb +95 -0
  149. data/app/controllers/spree/api/v3/admin/resource_controller.rb +27 -10
  150. data/app/controllers/spree/api/v3/admin/return_reasons_controller.rb +25 -0
  151. data/app/controllers/spree/api/v3/admin/returns_controller.rb +31 -0
  152. data/app/controllers/spree/api/v3/admin/roles_controller.rb +50 -6
  153. data/app/controllers/spree/api/v3/admin/seller_payouts_controller.rb +83 -0
  154. data/app/controllers/spree/api/v3/admin/seller_requirement_submissions_controller.rb +139 -0
  155. data/app/controllers/spree/api/v3/admin/seller_requirements_controller.rb +115 -0
  156. data/app/controllers/spree/api/v3/admin/seller_transfers_controller.rb +36 -0
  157. data/app/controllers/spree/api/v3/admin/sellers/balances_controller.rb +44 -0
  158. data/app/controllers/spree/api/v3/admin/sellers/invitations_controller.rb +77 -0
  159. data/app/controllers/spree/api/v3/admin/sellers/payouts_controller.rb +107 -0
  160. data/app/controllers/spree/api/v3/admin/sellers/team_controller.rb +64 -0
  161. data/app/controllers/spree/api/v3/admin/sellers_controller.rb +197 -0
  162. data/app/controllers/spree/api/v3/admin/setup_controller.rb +239 -0
  163. data/app/controllers/spree/api/v3/admin/stock_levels_controller.rb +172 -0
  164. data/app/controllers/spree/api/v3/admin/stock_locations_controller.rb +3 -2
  165. data/app/controllers/spree/api/v3/admin/stock_movements_controller.rb +37 -0
  166. data/app/controllers/spree/api/v3/admin/stock_reservations_controller.rb +1 -1
  167. data/app/controllers/spree/api/v3/admin/stock_transfers/stock_receipts_controller.rb +31 -0
  168. data/app/controllers/spree/api/v3/admin/stock_transfers_controller.rb +134 -38
  169. data/app/controllers/spree/api/v3/admin/store_controller.rb +66 -0
  170. data/app/controllers/spree/api/v3/admin/store_credits/events_controller.rb +47 -0
  171. data/app/controllers/spree/api/v3/admin/store_credits_controller.rb +87 -0
  172. data/app/controllers/spree/api/v3/admin/suppliers_controller.rb +30 -0
  173. data/app/controllers/spree/api/v3/admin/tags_controller.rb +2 -2
  174. data/app/controllers/spree/api/v3/admin/tax_categories_controller.rb +4 -0
  175. data/app/controllers/spree/api/v3/admin/tax_providers_controller.rb +25 -0
  176. data/app/controllers/spree/api/v3/admin/tax_rates_controller.rb +33 -0
  177. data/app/controllers/spree/api/v3/admin/tracking_carriers_controller.rb +33 -0
  178. data/app/controllers/spree/api/v3/admin/translatable_resources_controller.rb +37 -9
  179. data/app/controllers/spree/api/v3/admin/translations_controller.rb +10 -5
  180. data/app/controllers/spree/api/v3/admin/translations_coverage_controller.rb +150 -0
  181. data/app/controllers/spree/api/v3/admin/variants_controller.rb +11 -4
  182. data/app/controllers/spree/api/v3/admin/webhook_endpoints_controller.rb +1 -1
  183. data/app/controllers/spree/api/v3/base_controller.rb +74 -16
  184. data/app/controllers/spree/api/v3/resource_controller.rb +170 -39
  185. data/app/controllers/spree/api/v3/seller/auth_controller.rb +169 -0
  186. data/app/controllers/spree/api/v3/seller/balances_controller.rb +35 -0
  187. data/app/controllers/spree/api/v3/seller/base_controller.rb +25 -0
  188. data/app/controllers/spree/api/v3/seller/claim_reasons_controller.rb +20 -0
  189. data/app/controllers/spree/api/v3/seller/countries_controller.rb +38 -0
  190. data/app/controllers/spree/api/v3/seller/delivery_methods_controller.rb +265 -0
  191. data/app/controllers/spree/api/v3/seller/delivery_profiles_controller.rb +65 -0
  192. data/app/controllers/spree/api/v3/seller/delivery_zones_controller.rb +41 -0
  193. data/app/controllers/spree/api/v3/seller/direct_uploads_controller.rb +21 -0
  194. data/app/controllers/spree/api/v3/seller/exports_controller.rb +195 -0
  195. data/app/controllers/spree/api/v3/seller/import_rows_controller.rb +49 -0
  196. data/app/controllers/spree/api/v3/seller/imports_controller.rb +317 -0
  197. data/app/controllers/spree/api/v3/seller/invitation_acceptances_controller.rb +152 -0
  198. data/app/controllers/spree/api/v3/seller/invitations_controller.rb +71 -0
  199. data/app/controllers/spree/api/v3/seller/me_controller.rb +72 -0
  200. data/app/controllers/spree/api/v3/seller/onboarding_controller.rb +111 -0
  201. data/app/controllers/spree/api/v3/seller/order_cancellation_reasons_controller.rb +25 -0
  202. data/app/controllers/spree/api/v3/seller/orders/base_controller.rb +44 -0
  203. data/app/controllers/spree/api/v3/seller/orders/claims_controller.rb +45 -0
  204. data/app/controllers/spree/api/v3/seller/orders/deliveries_controller.rb +38 -0
  205. data/app/controllers/spree/api/v3/seller/orders/exchanges_controller.rb +50 -0
  206. data/app/controllers/spree/api/v3/seller/orders/fulfillments_controller.rb +79 -0
  207. data/app/controllers/spree/api/v3/seller/orders/labels_controller.rb +55 -0
  208. data/app/controllers/spree/api/v3/seller/orders/notes_controller.rb +82 -0
  209. data/app/controllers/spree/api/v3/seller/orders/returns_controller.rb +44 -0
  210. data/app/controllers/spree/api/v3/seller/orders_controller.rb +199 -0
  211. data/app/controllers/spree/api/v3/seller/package_types_controller.rb +100 -0
  212. data/app/controllers/spree/api/v3/seller/password_resets_controller.rb +155 -0
  213. data/app/controllers/spree/api/v3/seller/payouts_controller.rb +47 -0
  214. data/app/controllers/spree/api/v3/seller/policies_controller.rb +57 -0
  215. data/app/controllers/spree/api/v3/seller/product_types_controller.rb +35 -0
  216. data/app/controllers/spree/api/v3/seller/products_controller.rb +394 -0
  217. data/app/controllers/spree/api/v3/seller/profile_controller.rb +137 -0
  218. data/app/controllers/spree/api/v3/seller/reasons_controller.rb +45 -0
  219. data/app/controllers/spree/api/v3/seller/requirement_submissions_controller.rb +95 -0
  220. data/app/controllers/spree/api/v3/seller/resource_controller.rb +75 -0
  221. data/app/controllers/spree/api/v3/seller/return_reasons_controller.rb +20 -0
  222. data/app/controllers/spree/api/v3/seller/stock_locations_controller.rb +56 -0
  223. data/app/controllers/spree/api/v3/seller/tax_identifiers_controller.rb +48 -0
  224. data/app/controllers/spree/api/v3/seller/team_controller.rb +103 -0
  225. data/app/controllers/spree/api/v3/seller/tracking_carriers_controller.rb +35 -0
  226. data/app/controllers/spree/api/v3/seller/transfers_controller.rb +43 -0
  227. data/app/controllers/spree/api/v3/store/account/companies_controller.rb +42 -0
  228. data/app/controllers/spree/api/v3/store/auth_controller.rb +21 -34
  229. data/app/controllers/spree/api/v3/store/base_controller.rb +4 -0
  230. data/app/controllers/spree/api/v3/store/carts/discount_codes_controller.rb +24 -2
  231. data/app/controllers/spree/api/v3/store/carts/fulfillments_controller.rb +41 -15
  232. data/app/controllers/spree/api/v3/store/carts/items_controller.rb +53 -20
  233. data/app/controllers/spree/api/v3/store/carts/payment_sessions_controller.rb +36 -20
  234. data/app/controllers/spree/api/v3/store/carts/po_documents_controller.rb +111 -0
  235. data/app/controllers/spree/api/v3/store/carts/store_credits_controller.rb +2 -2
  236. data/app/controllers/spree/api/v3/store/carts/tax_identifiers_controller.rb +96 -0
  237. data/app/controllers/spree/api/v3/store/carts_controller.rb +57 -12
  238. data/app/controllers/spree/api/v3/store/categories_controller.rb +6 -3
  239. data/app/controllers/spree/api/v3/store/collections/products_controller.rb +59 -0
  240. data/app/controllers/spree/api/v3/store/collections_controller.rb +36 -0
  241. data/app/controllers/spree/api/v3/store/companies/addresses_controller.rb +81 -0
  242. data/app/controllers/spree/api/v3/store/companies/base_controller.rb +24 -0
  243. data/app/controllers/spree/api/v3/store/companies/invitations_controller.rb +50 -0
  244. data/app/controllers/spree/api/v3/store/companies/members_controller.rb +66 -0
  245. data/app/controllers/spree/api/v3/store/companies/orders_controller.rb +28 -0
  246. data/app/controllers/spree/api/v3/store/companies_controller.rb +47 -0
  247. data/app/controllers/spree/api/v3/store/company_invitations_controller.rb +90 -0
  248. data/app/controllers/spree/api/v3/store/countries_controller.rb +8 -6
  249. data/app/controllers/spree/api/v3/store/customer/addresses_controller.rb +3 -1
  250. data/app/controllers/spree/api/v3/store/customer/data_requests_controller.rb +78 -0
  251. data/app/controllers/spree/api/v3/store/customer/digital_links_controller.rb +52 -0
  252. data/app/controllers/spree/api/v3/store/customer/orders_controller.rb +6 -0
  253. data/app/controllers/spree/api/v3/store/customer/password_resets_controller.rb +7 -3
  254. data/app/controllers/spree/api/v3/store/customer/payment_setup_sessions_controller.rb +3 -3
  255. data/app/controllers/spree/api/v3/store/customer/store_credits_controller.rb +0 -3
  256. data/app/controllers/spree/api/v3/store/customer/tax_identifiers_controller.rb +91 -0
  257. data/app/controllers/spree/api/v3/store/customers_controller.rb +26 -31
  258. data/app/controllers/spree/api/v3/store/data_feeds_controller.rb +11 -0
  259. data/app/controllers/spree/api/v3/store/data_request_downloads_controller.rb +58 -0
  260. data/app/controllers/spree/api/v3/store/delivery_methods_controller.rb +108 -0
  261. data/app/controllers/spree/api/v3/store/digital_links_controller.rb +105 -0
  262. data/app/controllers/spree/api/v3/store/markets/countries_controller.rb +5 -9
  263. data/app/controllers/spree/api/v3/store/markets_controller.rb +4 -4
  264. data/app/controllers/spree/api/v3/store/newsletter_subscribers_controller.rb +8 -9
  265. data/app/controllers/spree/api/v3/store/orders/claims_controller.rb +94 -0
  266. data/app/controllers/spree/api/v3/store/orders/returns_controller.rb +116 -0
  267. data/app/controllers/spree/api/v3/store/orders/tax_identifiers_controller.rb +46 -0
  268. data/app/controllers/spree/api/v3/store/orders_controller.rb +12 -15
  269. data/app/controllers/spree/api/v3/store/products/filters_controller.rb +10 -3
  270. data/app/controllers/spree/api/v3/store/products_controller.rb +25 -6
  271. data/app/controllers/spree/api/v3/store/resource_controller.rb +2 -0
  272. data/app/controllers/spree/api/v3/store/sellers_controller.rb +43 -0
  273. data/app/controllers/spree/api/v3/store/wishlist_items_controller.rb +9 -6
  274. data/app/controllers/spree/api/v3/store/wishlists_controller.rb +3 -3
  275. data/app/controllers/spree/api/v3/webhooks/fulfillments_controller.rb +88 -0
  276. data/app/controllers/spree/api/v3/webhooks/payments_controller.rb +5 -2
  277. data/app/controllers/spree/api/v3/webhooks/payouts_controller.rb +61 -0
  278. data/app/models/spree/api/data_request_urls.rb +25 -0
  279. data/app/models/spree/api/digital_link_urls.rb +26 -0
  280. data/app/serializers/spree/api/v3/address_serializer.rb +17 -5
  281. data/app/serializers/spree/api/v3/admin/actor_serializer.rb +28 -0
  282. data/app/serializers/spree/api/v3/admin/address_serializer.rb +27 -4
  283. data/app/serializers/spree/api/v3/admin/admin_user_serializer.rb +13 -10
  284. data/app/serializers/spree/api/v3/admin/api_key_serializer.rb +15 -2
  285. data/app/serializers/spree/api/v3/admin/applied_promotion_serializer.rb +15 -0
  286. data/app/serializers/spree/api/v3/admin/cart_serializer.rb +34 -0
  287. data/app/serializers/spree/api/v3/admin/catalog_assignment_serializer.rb +32 -0
  288. data/app/serializers/spree/api/v3/admin/catalog_order_minimum_serializer.rb +23 -0
  289. data/app/serializers/spree/api/v3/admin/catalog_price_serializer.rb +48 -0
  290. data/app/serializers/spree/api/v3/admin/catalog_price_tier_serializer.rb +23 -0
  291. data/app/serializers/spree/api/v3/admin/catalog_product_serializer.rb +57 -0
  292. data/app/serializers/spree/api/v3/admin/catalog_product_term_serializer.rb +38 -0
  293. data/app/serializers/spree/api/v3/admin/catalog_quantity_rule_serializer.rb +37 -0
  294. data/app/serializers/spree/api/v3/admin/catalog_serializer.rb +46 -0
  295. data/app/serializers/spree/api/v3/admin/category_serializer.rb +3 -2
  296. data/app/serializers/spree/api/v3/admin/channel_serializer.rb +15 -1
  297. data/app/serializers/spree/api/v3/admin/claim_line_item_serializer.rb +16 -0
  298. data/app/serializers/spree/api/v3/admin/claim_reason_serializer.rb +21 -0
  299. data/app/serializers/spree/api/v3/admin/claim_serializer.rb +28 -0
  300. data/app/serializers/spree/api/v3/admin/collection_rule_serializer.rb +22 -0
  301. data/app/serializers/spree/api/v3/admin/collection_serializer.rb +29 -0
  302. data/app/serializers/spree/api/v3/admin/commission_line_serializer.rb +67 -0
  303. data/app/serializers/spree/api/v3/admin/commission_rate_serializer.rb +69 -0
  304. data/app/serializers/spree/api/v3/admin/commission_rule_serializer.rb +61 -0
  305. data/app/serializers/spree/api/v3/admin/company_invitation_serializer.rb +15 -0
  306. data/app/serializers/spree/api/v3/admin/company_membership_serializer.rb +11 -0
  307. data/app/serializers/spree/api/v3/admin/company_serializer.rb +37 -0
  308. data/app/serializers/spree/api/v3/admin/concerns/external_references_attribute.rb +33 -0
  309. data/app/serializers/spree/api/v3/admin/consent_record_serializer.rb +28 -0
  310. data/app/serializers/spree/api/v3/admin/country_serializer.rb +2 -2
  311. data/app/serializers/spree/api/v3/admin/credit_card_serializer.rb +1 -1
  312. data/app/serializers/spree/api/v3/admin/custom_field_definition_serializer.rb +2 -2
  313. data/app/serializers/spree/api/v3/admin/custom_field_serializer.rb +2 -2
  314. data/app/serializers/spree/api/v3/admin/customer_serializer.rb +23 -22
  315. data/app/serializers/spree/api/v3/admin/dashboard_counter_serializer.rb +24 -0
  316. data/app/serializers/spree/api/v3/admin/data_request_serializer.rb +36 -0
  317. data/app/serializers/spree/api/v3/admin/delivery_method_rule_serializer.rb +32 -0
  318. data/app/serializers/spree/api/v3/admin/delivery_method_serializer.rb +66 -1
  319. data/app/serializers/spree/api/v3/admin/delivery_method_service_serializer.rb +15 -0
  320. data/app/serializers/spree/api/v3/admin/delivery_origin_group_serializer.rb +34 -0
  321. data/app/serializers/spree/api/v3/admin/delivery_profile_serializer.rb +65 -0
  322. data/app/serializers/spree/api/v3/admin/delivery_rate_serializer.rb +10 -1
  323. data/app/serializers/spree/api/v3/admin/delivery_serializer.rb +20 -0
  324. data/app/serializers/spree/api/v3/admin/delivery_zone_member_serializer.rb +11 -0
  325. data/app/serializers/spree/api/v3/admin/delivery_zone_serializer.rb +29 -0
  326. data/app/serializers/spree/api/v3/admin/digital_asset_serializer.rb +59 -0
  327. data/app/serializers/spree/api/v3/admin/discount_serializer.rb +3 -4
  328. data/app/serializers/spree/api/v3/admin/exchange_line_item_serializer.rb +16 -0
  329. data/app/serializers/spree/api/v3/admin/exchange_serializer.rb +34 -0
  330. data/app/serializers/spree/api/v3/admin/export_serializer.rb +20 -1
  331. data/app/serializers/spree/api/v3/admin/fee_serializer.rb +14 -0
  332. data/app/serializers/spree/api/v3/admin/freight_summary_line_serializer.rb +46 -0
  333. data/app/serializers/spree/api/v3/admin/freight_summary_serializer.rb +16 -0
  334. data/app/serializers/spree/api/v3/admin/fulfillment_item_serializer.rb +39 -0
  335. data/app/serializers/spree/api/v3/admin/fulfillment_serializer.rb +31 -9
  336. data/app/serializers/spree/api/v3/admin/gift_card_serializer.rb +2 -3
  337. data/app/serializers/spree/api/v3/admin/import_serializer.rb +15 -2
  338. data/app/serializers/spree/api/v3/admin/integration_serializer.rb +32 -0
  339. data/app/serializers/spree/api/v3/admin/invitation_serializer.rb +4 -4
  340. data/app/serializers/spree/api/v3/admin/line_item_serializer.rb +46 -5
  341. data/app/serializers/spree/api/v3/admin/market_serializer.rb +5 -1
  342. data/app/serializers/spree/api/v3/admin/media_serializer.rb +50 -2
  343. data/app/serializers/spree/api/v3/admin/membership_product_serializer.rb +29 -0
  344. data/app/serializers/spree/api/v3/admin/order_cancellation_reason_serializer.rb +29 -0
  345. data/app/serializers/spree/api/v3/admin/order_group_serializer.rb +50 -0
  346. data/app/serializers/spree/api/v3/admin/order_routing_rule_serializer.rb +2 -6
  347. data/app/serializers/spree/api/v3/admin/order_serializer.rb +126 -31
  348. data/app/serializers/spree/api/v3/admin/package_type_serializer.rb +53 -0
  349. data/app/serializers/spree/api/v3/admin/payment_method_serializer.rb +8 -2
  350. data/app/serializers/spree/api/v3/admin/payment_serializer.rb +6 -0
  351. data/app/serializers/spree/api/v3/admin/payment_split_serializer.rb +41 -0
  352. data/app/serializers/spree/api/v3/admin/permission_serializer.rb +39 -0
  353. data/app/serializers/spree/api/v3/admin/policy_serializer.rb +11 -0
  354. data/app/serializers/spree/api/v3/admin/price_adjustment_tier_serializer.rb +22 -0
  355. data/app/serializers/spree/api/v3/admin/price_list_product_serializer.rb +32 -0
  356. data/app/serializers/spree/api/v3/admin/price_list_serializer.rb +20 -8
  357. data/app/serializers/spree/api/v3/admin/price_rule_serializer.rb +2 -12
  358. data/app/serializers/spree/api/v3/admin/price_serializer.rb +3 -0
  359. data/app/serializers/spree/api/v3/admin/product_serializer.rb +54 -8
  360. data/app/serializers/spree/api/v3/admin/product_submission_serializer.rb +39 -0
  361. data/app/serializers/spree/api/v3/admin/product_type_custom_field_definition_serializer.rb +44 -0
  362. data/app/serializers/spree/api/v3/admin/product_type_serializer.rb +34 -0
  363. data/app/serializers/spree/api/v3/admin/promotion_action_serializer.rb +6 -12
  364. data/app/serializers/spree/api/v3/admin/promotion_rule_serializer.rb +17 -15
  365. data/app/serializers/spree/api/v3/admin/purchase_order_item_serializer.rb +80 -0
  366. data/app/serializers/spree/api/v3/admin/purchase_order_serializer.rb +94 -0
  367. data/app/serializers/spree/api/v3/admin/refund_reason_serializer.rb +27 -0
  368. data/app/serializers/spree/api/v3/admin/refund_serializer.rb +6 -5
  369. data/app/serializers/spree/api/v3/admin/reporting_result_serializer.rb +72 -0
  370. data/app/serializers/spree/api/v3/admin/return_line_item_serializer.rb +16 -0
  371. data/app/serializers/spree/api/v3/admin/return_reason_serializer.rb +21 -0
  372. data/app/serializers/spree/api/v3/admin/return_serializer.rb +58 -0
  373. data/app/serializers/spree/api/v3/admin/role_serializer.rb +24 -6
  374. data/app/serializers/spree/api/v3/admin/saved_report_serializer.rb +32 -0
  375. data/app/serializers/spree/api/v3/admin/seller_balance_serializer.rb +37 -0
  376. data/app/serializers/spree/api/v3/admin/seller_payout_serializer.rb +46 -0
  377. data/app/serializers/spree/api/v3/admin/seller_requirement_serializer.rb +68 -0
  378. data/app/serializers/spree/api/v3/admin/seller_requirement_status_serializer.rb +48 -0
  379. data/app/serializers/spree/api/v3/admin/seller_requirement_submission_serializer.rb +57 -0
  380. data/app/serializers/spree/api/v3/admin/seller_serializer.rb +92 -0
  381. data/app/serializers/spree/api/v3/admin/seller_team_member_serializer.rb +29 -0
  382. data/app/serializers/spree/api/v3/admin/seller_transfer_serializer.rb +53 -0
  383. data/app/serializers/spree/api/v3/admin/shipping_label_serializer.rb +82 -0
  384. data/app/serializers/spree/api/v3/admin/state_serializer.rb +1 -1
  385. data/app/serializers/spree/api/v3/admin/stock_level_serializer.rb +65 -0
  386. data/app/serializers/spree/api/v3/admin/stock_location_serializer.rb +20 -4
  387. data/app/serializers/spree/api/v3/admin/stock_movement_serializer.rb +116 -0
  388. data/app/serializers/spree/api/v3/admin/stock_receipt_item_serializer.rb +57 -0
  389. data/app/serializers/spree/api/v3/admin/stock_receipt_serializer.rb +48 -0
  390. data/app/serializers/spree/api/v3/admin/stock_reservation_serializer.rb +5 -5
  391. data/app/serializers/spree/api/v3/admin/stock_transfer_item_serializer.rb +57 -0
  392. data/app/serializers/spree/api/v3/admin/stock_transfer_serializer.rb +36 -16
  393. data/app/serializers/spree/api/v3/admin/store_credit_event_serializer.rb +32 -0
  394. data/app/serializers/spree/api/v3/admin/store_credit_serializer.rb +42 -7
  395. data/app/serializers/spree/api/v3/admin/store_serializer.rb +65 -1
  396. data/app/serializers/spree/api/v3/admin/supplier_serializer.rb +39 -0
  397. data/app/serializers/spree/api/v3/admin/tax_exemption_certificate_serializer.rb +67 -0
  398. data/app/serializers/spree/api/v3/admin/tax_identifier_serializer.rb +43 -0
  399. data/app/serializers/spree/api/v3/admin/tax_line_serializer.rb +21 -0
  400. data/app/serializers/spree/api/v3/admin/tax_rate_serializer.rb +49 -0
  401. data/app/serializers/spree/api/v3/admin/variant_serializer.rb +49 -8
  402. data/app/serializers/spree/api/v3/applied_promotion_serializer.rb +23 -0
  403. data/app/serializers/spree/api/v3/base_serializer.rb +61 -2
  404. data/app/serializers/spree/api/v3/cart_serializer.rb +90 -12
  405. data/app/serializers/spree/api/v3/category_serializer.rb +3 -3
  406. data/app/serializers/spree/api/v3/claim_line_item_serializer.rb +50 -0
  407. data/app/serializers/spree/api/v3/claim_reason_serializer.rb +20 -0
  408. data/app/serializers/spree/api/v3/claim_serializer.rb +62 -0
  409. data/app/serializers/spree/api/v3/collection_serializer.rb +41 -0
  410. data/app/serializers/spree/api/v3/company_invitation_serializer.rb +28 -0
  411. data/app/serializers/spree/api/v3/company_membership_serializer.rb +28 -0
  412. data/app/serializers/spree/api/v3/company_serializer.rb +33 -0
  413. data/app/serializers/spree/api/v3/custom_field_serializer.rb +2 -2
  414. data/app/serializers/spree/api/v3/customer_serializer.rb +9 -1
  415. data/app/serializers/spree/api/v3/data_request_event_serializer.rb +30 -0
  416. data/app/serializers/spree/api/v3/data_request_serializer.rb +40 -0
  417. data/app/serializers/spree/api/v3/delivery_method_serializer.rb +12 -2
  418. data/app/serializers/spree/api/v3/delivery_rate_serializer.rb +34 -17
  419. data/app/serializers/spree/api/v3/delivery_serializer.rb +29 -0
  420. data/app/serializers/spree/api/v3/delivery_zone_member_serializer.rb +29 -0
  421. data/app/serializers/spree/api/v3/delivery_zone_serializer.rb +13 -0
  422. data/app/serializers/spree/api/v3/digital_asset_serializer.rb +23 -0
  423. data/app/serializers/spree/api/v3/digital_link_serializer.rb +6 -2
  424. data/app/serializers/spree/api/v3/discount_serializer.rb +21 -7
  425. data/app/serializers/spree/api/v3/exchange_line_item_serializer.rb +53 -0
  426. data/app/serializers/spree/api/v3/exchange_serializer.rb +61 -0
  427. data/app/serializers/spree/api/v3/fee_serializer.rb +27 -0
  428. data/app/serializers/spree/api/v3/freight_summary_serializer.rb +38 -0
  429. data/app/serializers/spree/api/v3/fulfillment_serializer.rb +28 -15
  430. data/app/serializers/spree/api/v3/gift_card_serializer.rb +2 -2
  431. data/app/serializers/spree/api/v3/import_row_serializer.rb +1 -1
  432. data/app/serializers/spree/api/v3/import_serializer.rb +18 -4
  433. data/app/serializers/spree/api/v3/invitation_serializer.rb +1 -1
  434. data/app/serializers/spree/api/v3/line_item_serializer.rb +18 -1
  435. data/app/serializers/spree/api/v3/market_serializer.rb +2 -2
  436. data/app/serializers/spree/api/v3/{asset_serializer.rb → media_event_serializer.rb} +4 -4
  437. data/app/serializers/spree/api/v3/media_serializer.rb +48 -7
  438. data/app/serializers/spree/api/v3/newsletter_subscriber_serializer.rb +1 -1
  439. data/app/serializers/spree/api/v3/option_type_serializer.rb +1 -1
  440. data/app/serializers/spree/api/v3/order_group_serializer.rb +60 -0
  441. data/app/serializers/spree/api/v3/order_serializer.rb +58 -6
  442. data/app/serializers/spree/api/v3/payment_method_serializer.rb +1 -1
  443. data/app/serializers/spree/api/v3/payment_serializer.rb +2 -6
  444. data/app/serializers/spree/api/v3/payment_session_serializer.rb +10 -3
  445. data/app/serializers/spree/api/v3/payment_setup_session_serializer.rb +1 -1
  446. data/app/serializers/spree/api/v3/policy_serializer.rb +7 -2
  447. data/app/serializers/spree/api/v3/product_filter_option_serializer.rb +1 -1
  448. data/app/serializers/spree/api/v3/product_serializer.rb +42 -10
  449. data/app/serializers/spree/api/v3/product_type_serializer.rb +17 -0
  450. data/app/serializers/spree/api/v3/purchase_order_event_serializer.rb +11 -0
  451. data/app/serializers/spree/api/v3/refund_serializer.rb +9 -3
  452. data/app/serializers/spree/api/v3/return_line_item_serializer.rb +42 -0
  453. data/app/serializers/spree/api/v3/return_reason_serializer.rb +20 -0
  454. data/app/serializers/spree/api/v3/return_serializer.rb +62 -0
  455. data/app/serializers/spree/api/v3/seller/balance_serializer.rb +35 -0
  456. data/app/serializers/spree/api/v3/seller/claim_line_item_serializer.rb +21 -0
  457. data/app/serializers/spree/api/v3/seller/claim_serializer.rb +25 -0
  458. data/app/serializers/spree/api/v3/seller/delivery_method_rule_serializer.rb +32 -0
  459. data/app/serializers/spree/api/v3/seller/delivery_method_serializer.rb +59 -0
  460. data/app/serializers/spree/api/v3/seller/delivery_profile_serializer.rb +26 -0
  461. data/app/serializers/spree/api/v3/seller/delivery_rate_serializer.rb +35 -0
  462. data/app/serializers/spree/api/v3/seller/delivery_serializer.rb +17 -0
  463. data/app/serializers/spree/api/v3/seller/delivery_zone_serializer.rb +26 -0
  464. data/app/serializers/spree/api/v3/seller/exchange_line_item_serializer.rb +29 -0
  465. data/app/serializers/spree/api/v3/seller/exchange_serializer.rb +30 -0
  466. data/app/serializers/spree/api/v3/seller/export_serializer.rb +44 -0
  467. data/app/serializers/spree/api/v3/seller/fulfillment_item_serializer.rb +43 -0
  468. data/app/serializers/spree/api/v3/seller/fulfillment_serializer.rb +76 -0
  469. data/app/serializers/spree/api/v3/seller/import_mapping_serializer.rb +20 -0
  470. data/app/serializers/spree/api/v3/seller/import_row_serializer.rb +17 -0
  471. data/app/serializers/spree/api/v3/seller/import_serializer.rb +77 -0
  472. data/app/serializers/spree/api/v3/seller/invitation_serializer.rb +29 -0
  473. data/app/serializers/spree/api/v3/seller/media_serializer.rb +26 -0
  474. data/app/serializers/spree/api/v3/seller/order_line_item_serializer.rb +44 -0
  475. data/app/serializers/spree/api/v3/seller/order_serializer.rb +119 -0
  476. data/app/serializers/spree/api/v3/seller/package_type_serializer.rb +52 -0
  477. data/app/serializers/spree/api/v3/seller/payment_split_serializer.rb +34 -0
  478. data/app/serializers/spree/api/v3/seller/payout_serializer.rb +36 -0
  479. data/app/serializers/spree/api/v3/seller/policy_serializer.rb +11 -0
  480. data/app/serializers/spree/api/v3/seller/product_serializer.rb +60 -0
  481. data/app/serializers/spree/api/v3/seller/product_submission_serializer.rb +30 -0
  482. data/app/serializers/spree/api/v3/seller/product_type_serializer.rb +29 -0
  483. data/app/serializers/spree/api/v3/seller/profile_serializer.rb +77 -0
  484. data/app/serializers/spree/api/v3/seller/reason_serializer.rb +24 -0
  485. data/app/serializers/spree/api/v3/seller/requirement_custom_field_serializer.rb +36 -0
  486. data/app/serializers/spree/api/v3/seller/requirement_status_serializer.rb +62 -0
  487. data/app/serializers/spree/api/v3/seller/requirement_submission_serializer.rb +33 -0
  488. data/app/serializers/spree/api/v3/seller/return_line_item_serializer.rb +24 -0
  489. data/app/serializers/spree/api/v3/seller/return_serializer.rb +51 -0
  490. data/app/serializers/spree/api/v3/seller/shipping_label_serializer.rb +23 -0
  491. data/app/serializers/spree/api/v3/seller/stock_level_serializer.rb +27 -0
  492. data/app/serializers/spree/api/v3/seller/stock_location_serializer.rb +17 -0
  493. data/app/serializers/spree/api/v3/seller/tax_identifier_serializer.rb +15 -0
  494. data/app/serializers/spree/api/v3/seller/team_member_serializer.rb +22 -0
  495. data/app/serializers/spree/api/v3/seller/transfer_serializer.rb +49 -0
  496. data/app/serializers/spree/api/v3/seller/variant_serializer.rb +71 -0
  497. data/app/serializers/spree/api/v3/seller_serializer.rb +50 -0
  498. data/app/serializers/spree/api/v3/shipping_label_event_serializer.rb +11 -0
  499. data/app/serializers/spree/api/v3/{stock_item_serializer.rb → stock_level_serializer.rb} +5 -5
  500. data/app/serializers/spree/api/v3/stock_location_serializer.rb +11 -7
  501. data/app/serializers/spree/api/v3/stock_movement_serializer.rb +8 -15
  502. data/app/serializers/spree/api/v3/stock_receipt_event_serializer.rb +11 -0
  503. data/app/serializers/spree/api/v3/stock_transfer_serializer.rb +6 -6
  504. data/app/serializers/spree/api/v3/store_credit_event_serializer.rb +29 -0
  505. data/app/serializers/spree/api/v3/supplier_event_serializer.rb +11 -0
  506. data/app/serializers/spree/api/v3/tax_identifier_serializer.rb +15 -0
  507. data/app/serializers/spree/api/v3/tax_line_serializer.rb +37 -0
  508. data/app/serializers/spree/api/v3/variant_serializer.rb +52 -2
  509. data/app/serializers/spree/api/v3/wishlist_item_serializer.rb +6 -6
  510. data/app/serializers/spree/api/v3/wishlist_serializer.rb +1 -1
  511. data/app/services/spree/api/v3/filters_aggregator.rb +14 -12
  512. data/app/services/spree/webhooks/deliver_webhook.rb +62 -26
  513. data/app/subscribers/spree/webhook_event_subscriber.rb +9 -5
  514. data/config/brakeman.ignore +1 -1
  515. data/config/initializers/typelizer.rb +51 -4
  516. data/config/locales/en.yml +5 -0
  517. data/config/routes.rb +730 -22
  518. data/lib/spree/api/configuration.rb +19 -19
  519. data/lib/spree/api/dependencies.rb +174 -227
  520. data/lib/spree/api/engine.rb +6 -0
  521. data/lib/spree/api/openapi/schema_helper.rb +179 -13
  522. data/lib/spree/api/testing_support/v3/base.rb +45 -15
  523. data/lib/spree/api.rb +10 -4
  524. data/lib/typelizer/open_enums.rb +35 -0
  525. metadata +342 -27
  526. data/app/controllers/spree/api/v3/admin/orders/adjustments_controller.rb +0 -25
  527. data/app/controllers/spree/api/v3/admin/stock_items_controller.rb +0 -42
  528. data/app/controllers/spree/api/v3/admin/store_credit_categories_controller.rb +0 -21
  529. data/app/controllers/spree/api/v3/store/digitals_controller.rb +0 -38
  530. data/app/serializers/spree/api/v3/admin/adjustment_serializer.rb +0 -24
  531. data/app/serializers/spree/api/v3/admin/dashboard_analytics_serializer.rb +0 -143
  532. data/app/serializers/spree/api/v3/admin/reimbursement_serializer.rb +0 -15
  533. data/app/serializers/spree/api/v3/admin/return_authorization_serializer.rb +0 -19
  534. data/app/serializers/spree/api/v3/admin/stock_item_serializer.rb +0 -34
  535. data/app/serializers/spree/api/v3/admin/store_credit_category_serializer.rb +0 -19
  536. data/app/serializers/spree/api/v3/customer_return_serializer.rb +0 -17
  537. data/app/serializers/spree/api/v3/digital_serializer.rb +0 -17
  538. data/app/serializers/spree/api/v3/reimbursement_serializer.rb +0 -27
  539. data/app/serializers/spree/api/v3/report_serializer.rb +0 -34
  540. data/app/serializers/spree/api/v3/return_authorization_serializer.rb +0 -31
  541. data/app/serializers/spree/api/v3/return_item_serializer.rb +0 -53
  542. data/app/serializers/spree/api/v3/shipping_category_serializer.rb +0 -11
@@ -0,0 +1,191 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ # Catalogs — assortment + optional price list, shown to an audience
6
+ # through assignments. Merchandising data, so it answers to the
7
+ # products scopes.
8
+ class CatalogsController < ResourceController
9
+ scoped_resource :products
10
+
11
+ before_action :set_resource,
12
+ only: [:show, :update, :destroy, :assign, :import_products,
13
+ :activate, :deactivate]
14
+
15
+ # POST /api/v3/admin/catalogs/:id/import_products — copies the
16
+ # attached price list's products into the assortment. Explicit by
17
+ # design: an empty assortment is a pricing-only overlay, so making
18
+ # a catalog restrictive is a deliberate act.
19
+ def import_products
20
+ authorize! :update, @resource
21
+
22
+ if @resource.price_list.nil?
23
+ return render_error(
24
+ code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:validation_error],
25
+ message: Spree.t('catalogs.no_price_list_to_import'),
26
+ status: :unprocessable_content
27
+ )
28
+ end
29
+
30
+ render json: { added_count: @resource.import_products_from_price_list }
31
+ end
32
+
33
+ # POST /api/v3/admin/catalogs/:id/assign — { assignable_type, assignable_id }
34
+ def assign
35
+ authorize! :update, @resource
36
+
37
+ assignment = @resource.catalog_assignments.new(assignable: find_assignable)
38
+
39
+ if assignment.save
40
+ render json: Spree.api.admin_catalog_assignment_serializer.new(
41
+ assignment, params: serializer_params
42
+ ).to_h, status: :created
43
+ else
44
+ render_validation_error(assignment.errors)
45
+ end
46
+ end
47
+
48
+ # PATCH /api/v3/admin/catalogs/:id/activate
49
+ def activate
50
+ run_status_workflow(Spree.catalog_activate_workflow)
51
+ end
52
+
53
+ # PATCH /api/v3/admin/catalogs/:id/deactivate
54
+ def deactivate
55
+ run_status_workflow(Spree.catalog_deactivate_workflow)
56
+ end
57
+
58
+ protected
59
+
60
+ def model_class
61
+ Spree::Catalog
62
+ end
63
+
64
+ def serializer_class
65
+ Spree.api.admin_catalog_serializer
66
+ end
67
+
68
+ def scope
69
+ super.ordered
70
+ end
71
+
72
+ def collection_includes
73
+ # The serializer reads each catalog's pricing strategy, which asks
74
+ # its list whether it carries bands — preloaded so an index does
75
+ # not pay a query per row.
76
+ [:catalog_products, :order_minimums, { price_list: :price_adjustment_tiers }]
77
+ end
78
+
79
+ def create_workflow
80
+ Spree.catalog_create_workflow
81
+ end
82
+
83
+ def update_workflow
84
+ Spree.catalog_update_workflow
85
+ end
86
+
87
+ def run_status_workflow(workflow)
88
+ authorize! :update, @resource
89
+
90
+ result = workflow.call(catalog: @resource)
91
+
92
+ if result.success?
93
+ render json: serialize_resource(@resource.reload)
94
+ else
95
+ render_service_error(result.error)
96
+ end
97
+ end
98
+
99
+ # `price_list` is an inline payload rather than a reference: a
100
+ # catalog and the list it prices through are stood up in one
101
+ # request (docs/plans/6.0-catalog-agreement-rework.md). Sending it
102
+ # as `null` detaches the list the catalog owns; omitting the key
103
+ # leaves it alone.
104
+ def permitted_params
105
+ permitted = params.permit(*model_additional_permitted_attributes,
106
+ :name, :description, :active, :position,
107
+ :minimum_order_quantity, :order_multiple,
108
+ metadata: {},
109
+ # Small bounded sets, saved with the
110
+ # catalog so the whole agreement lands
111
+ # in one transaction. Per-product terms
112
+ # stay their own endpoint — an
113
+ # agreement may name thousands of them.
114
+ assignments: [:assignable_type, :assignable_id],
115
+ order_minimums: [:currency, :amount],
116
+ price_list: [
117
+ :name, :description, :status, :match_policy,
118
+ :starts_at, :ends_at,
119
+ :price_adjustment_percentage, :adjust_compare_at,
120
+ # Contextual rules only in practice — a
121
+ # VolumeRule is what turns a percentage
122
+ # into automatic volume pricing. Audience
123
+ # rules on an owned list are inert, since
124
+ # the catalog assignment already decided
125
+ # the audience.
126
+ { rules: [:id, :type, { preferences: {} }] },
127
+ # An empty array clears the hand-entered
128
+ # amounts — what switching to a
129
+ # percentage sends.
130
+ { prices: [:id, :variant_id, :currency, :min_quantity,
131
+ :amount, :compare_at_amount] },
132
+ # Quantity bands on the percentage. The
133
+ # payload is the whole ladder, so an
134
+ # empty array clears it.
135
+ { price_adjustment_tiers: [:min_quantity, :percentage] }
136
+ ])
137
+ # `permit` drops an explicit null, but detaching has to be
138
+ # distinguishable from saying nothing.
139
+ permitted[:price_list] = nil if params.key?(:price_list) && params[:price_list].nil?
140
+
141
+ # Resolved here rather than in the workflow: each audience goes
142
+ # through the store AND through what this caller may see, so a
143
+ # nested write cannot reach one the dedicated endpoint could not.
144
+ if permitted.key?(:assignments)
145
+ permitted[:assignables] = requested_assignables
146
+ permitted.delete(:assignments)
147
+ end
148
+
149
+ permitted
150
+ end
151
+
152
+ private
153
+
154
+ # The audience vocabulary is closed; each type resolves through the
155
+ # store so another tenant's record is a 404, never an assignment.
156
+ ASSIGNABLE_SCOPES = {
157
+ 'company' => ->(store) { store.companies },
158
+ 'customer_group' => ->(store) { Spree::CustomerGroup.for_store(store) }
159
+ }.freeze
160
+
161
+ # Scoped by the store AND by what this caller may see: a role that
162
+ # reaches only some companies must not be able to assign a catalog
163
+ # to one it cannot read, and an unreadable record is not-found
164
+ # rather than refused so its existence does not leak.
165
+ def find_assignable
166
+ resolve_assignable(params.require(:assignable_type), params.require(:assignable_id))
167
+ end
168
+
169
+ # Each entry resolves the same way a single assign does — through
170
+ # the store AND through what this caller may see — so a set write
171
+ # cannot reach an audience the one-at-a-time path could not.
172
+ def requested_assignables
173
+ Array(params[:assignments]).map do |entry|
174
+ permitted = entry.permit(:assignable_type, :assignable_id)
175
+ resolve_assignable(permitted.require(:assignable_type), permitted.require(:assignable_id))
176
+ end
177
+ end
178
+
179
+ def resolve_assignable(type, id)
180
+ scope_builder = ASSIGNABLE_SCOPES[type.to_s]
181
+ raise ActiveRecord::RecordNotFound if scope_builder.nil?
182
+
183
+ scope_builder.call(current_store).
184
+ accessible_by(current_ability, :show).
185
+ find_by_prefix_id!(id)
186
+ end
187
+ end
188
+ end
189
+ end
190
+ end
191
+ end
@@ -3,33 +3,17 @@ module Spree
3
3
  module V3
4
4
  module Admin
5
5
  module Categories
6
- # Manages the products classified under a category — the manual
7
- # membership half of the old Rails admin's taxon "Products" panel.
8
- # Listing is ordered by the classification position so the merchant's
9
- # manual ordering round-trips; +reposition+ persists a drag-to-reorder.
6
+ # The products classified under a category — the uniform nested
7
+ # membership surface (see Spree::Api::V3::Admin::ProductMembership),
8
+ # plus per-member reposition: listing is ordered by the
9
+ # classification position so the merchant's manual ordering
10
+ # round-trips.
10
11
  class ProductsController < ResourceController
11
- scoped_resource :products
12
-
13
- # Skip the base single-resource load — membership actions resolve
14
- # the product against the category's scope themselves (set_product).
15
- skip_before_action :set_resource
16
- before_action :set_product, only: [:destroy, :reposition]
12
+ include Spree::Api::V3::Admin::ProductMembership
17
13
 
18
- # POST /api/v3/admin/categories/:category_id/products
19
- # Body: { product_id: 'prod_…' }
20
- def create
21
- product = product_scope.find_by_prefix_id!(params[:product_id])
22
- Spree::Taxons::AddProducts.call(taxons: [@category], products: [product])
23
- render json: serialize_resource(product), status: :created
24
- end
14
+ scoped_resource :products
25
15
 
26
- # DELETE /api/v3/admin/categories/:category_id/products/:id
27
- # Bulk removal goes through the existing
28
- # POST /products/bulk_remove_from_categories ({ ids, category_ids }).
29
- def destroy
30
- Spree::Taxons::RemoveProducts.call(taxons: [@category], products: [@product])
31
- head :no_content
32
- end
16
+ before_action :set_product, only: [:reposition]
33
17
 
34
18
  # PATCH /api/v3/admin/categories/:category_id/products/:id/reposition
35
19
  # Body: { new_position: 0 } — 0-based index among the category's products.
@@ -40,25 +24,20 @@ module Spree
40
24
  return render_invalid_position if position.nil?
41
25
 
42
26
  classification_for(@product).insert_at(position + 1)
27
+ # insert_at shifts sibling positions, so refresh every product in the
28
+ # category (manual sort reads position from the search index).
29
+ @category.products.find_each(&:enqueue_search_index)
43
30
  head :no_content
44
31
  end
45
32
 
46
33
  protected
47
34
 
48
- def model_class
49
- Spree::Product
50
- end
51
-
52
- def serializer_class
53
- Spree.api.admin_product_serializer
54
- end
55
-
56
35
  # The category's products, ordered by classification position.
57
36
  def scope
58
37
  product_scope.
59
- joins(:classifications).
60
- where(Spree::Classification.table_name => { taxon_id: @category.id }).
61
- order(Spree::Classification.table_name => { position: :asc })
38
+ joins(:product_categories).
39
+ where(Spree::ProductCategory.table_name => { category_id: @category.id }).
40
+ order(Spree::ProductCategory.table_name => { position: :asc })
62
41
  end
63
42
 
64
43
  # A product is classified at most once per taxon (unique [taxon_id,
@@ -69,9 +48,21 @@ module Spree
69
48
  false
70
49
  end
71
50
 
51
+ def add_member_products(products)
52
+ Spree::Categories::AddProducts.call(categories: [@category], products: products)
53
+ end
54
+
55
+ def remove_member_products(products)
56
+ Spree::Categories::RemoveProducts.call(categories: [@category], products: products)
57
+ end
58
+
72
59
  # Loads the parent category (runs before the base set_resource).
60
+ # Scoped to +manual+ so automatic (rule-based) rows — hidden by the
61
+ # categories CRUD controller and migrating to Spree::Collection — can't
62
+ # have their membership listed or mutated through this endpoint.
73
63
  def set_parent
74
- @category = Spree::Category.accessible_by(current_ability, :update).
64
+ @category = Spree::Category.manual.
65
+ accessible_by(current_ability, parent_ability_action).
75
66
  for_store(current_store).
76
67
  find_by_prefix_id!(params[:category_id])
77
68
  authorize_parent!(@category)
@@ -83,12 +74,8 @@ module Spree
83
74
  @product = scope.find_by_prefix_id!(params[:id])
84
75
  end
85
76
 
86
- def product_scope
87
- current_store.products.accessible_by(current_ability, :show)
88
- end
89
-
90
77
  def classification_for(product)
91
- Spree::Classification.find_by(taxon_id: @category.id, product_id: product.id)
78
+ Spree::ProductCategory.find_by(category_id: @category.id, product_id: product.id)
92
79
  end
93
80
  end
94
81
  end
@@ -52,6 +52,13 @@ module Spree
52
52
  Spree.api.admin_category_serializer
53
53
  end
54
54
 
55
+ # Categories exclude automatic (rule-based) rows, which still live in
56
+ # spree_categories until the Phase 4 migration moves them to Collections.
57
+ # No-op after migration; the .manual scope is removed in 6.1.
58
+ def scope
59
+ super.manual
60
+ end
61
+
55
62
  # Category-half attributes only. Deliberately excludes the
56
63
  # collection-bound fields (automatic, sort_order, rules_match_policy,
57
64
  # taxon_rules) and taxonomy_id — those belong to Spree::Collection
@@ -60,13 +67,14 @@ module Spree
60
67
  # can't be targeted).
61
68
  def permitted_params
62
69
  permitted = params.permit(
70
+ *model_additional_permitted_attributes,
63
71
  :name, :description, :permalink,
64
72
  :meta_title, :meta_description, :meta_keywords,
65
- :hide_from_nav, :image, :square_image,
73
+ :image, :square_image,
66
74
  # Inline custom field values keyed by definition id. The model
67
- # setter (Spree::Metafields#custom_fields=) validates each entry
75
+ # setter (Spree::HasCustomFields#custom_fields=) validates each entry
68
76
  # against its definition. `value` is permitted as a scalar AND as
69
- # `value: []` / `value: {}` so JSON metafields round-trip whether
77
+ # `value: []` / `value: {}` so JSON custom_fields round-trip whether
70
78
  # the parsed payload is an array or an object, while
71
79
  # text/number/boolean ship scalars.
72
80
  custom_fields: [:id, :custom_field_definition_id, :value, { value: [] }, { value: {} }]
@@ -103,10 +111,11 @@ module Spree
103
111
  end
104
112
 
105
113
  # Positions the node at +index+ among the store's root categories.
106
- # awesome_nested_set's move_to_child_with_index(:root, ...) can't be
107
- # used here: its +roots+ are global (every parentless taxon across all
108
- # stores and taxonomies), whereas we order only this store's manual
109
- # roots (the +scope+). So position relative to the target root sibling.
114
+ # Deliberately not move_to_child_with_index(:root, ...): that indexes
115
+ # into awesome_nested_set's class-level +roots+, which stays global
116
+ # across stores even though the set is scoped per store. Positioning
117
+ # relative to the target sibling keeps the index meaning what the
118
+ # caller computed it from — this store's roots.
110
119
  def move_to_root_at_index(node, index)
111
120
  others = scope.where(parent_id: nil).where.not(id: node.id).order(:lft).to_a
112
121
  target = others[index]
@@ -29,6 +29,27 @@ module Spree
29
29
  render json: { product_count: removed }
30
30
  end
31
31
 
32
+ def create
33
+ @resource = model_class.new(assignable_params.merge(store: current_store))
34
+ authorize_resource!(@resource, :create)
35
+
36
+ if @resource.save
37
+ render json: serialize_resource(@resource), status: :created
38
+ else
39
+ render_validation_error(@resource.errors)
40
+ end
41
+ end
42
+
43
+ def update
44
+ @resource.assign_attributes(assignable_params)
45
+
46
+ if @resource.save
47
+ render json: serialize_resource(@resource)
48
+ else
49
+ render_validation_error(@resource.errors)
50
+ end
51
+ end
52
+
32
53
  protected
33
54
 
34
55
  def model_class
@@ -44,8 +65,35 @@ module Spree
44
65
  end
45
66
 
46
67
  def permitted_params
47
- params.permit(:name, :code, :active, :default, :preferred_order_routing_strategy,
48
- :preferred_storefront_access, :preferred_guest_checkout)
68
+ params.permit(*model_additional_permitted_attributes, :name, :code, :active, :default, :preferred_order_routing_strategy,
69
+ :preferred_storefront_access, :preferred_guest_checkout,
70
+ :default_catalog_id,
71
+ stock_location_ids: [])
72
+ end
73
+
74
+ # `stock_location_ids` replaces the channel's fulfillment-origin
75
+ # allowlist; empty clears it (= every location). Store-scoped
76
+ # resolution: a foreign location 404s.
77
+ def assignable_params
78
+ attributes = permitted_params.except(:stock_location_ids)
79
+
80
+ # An incidental lookup like any other: a foreign catalog 404s.
81
+ if attributes.key?(:default_catalog_id)
82
+ attributes[:default_catalog_id] =
83
+ if attributes[:default_catalog_id].present?
84
+ current_store.catalogs.find_by_prefix_id!(attributes[:default_catalog_id]).id
85
+ else
86
+ nil
87
+ end
88
+ end
89
+
90
+ if params.key?(:stock_location_ids)
91
+ attributes[:stock_locations] = Array(params[:stock_location_ids]).map do |id|
92
+ current_store.stock_locations.accessible_by(current_ability, :show).find_by_prefix_id!(id)
93
+ end
94
+ end
95
+
96
+ attributes
49
97
  end
50
98
 
51
99
  private
@@ -0,0 +1,25 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ class ClaimReasonsController < ResourceController
6
+ scoped_resource :settings
7
+
8
+ protected
9
+
10
+ def model_class
11
+ Spree::ClaimReason
12
+ end
13
+
14
+ def serializer_class
15
+ Spree.api.admin_claim_reason_serializer
16
+ end
17
+
18
+ def permitted_params
19
+ params.permit(*model_additional_permitted_attributes, :name, :active)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,31 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ # Cross-order listing of claims — "what is awaiting resolution across
6
+ # the whole store". Read-only by route: opening a claim needs an
7
+ # order, so creation and the status transitions stay on the nested
8
+ # Orders::ClaimsController.
9
+ class ClaimsController < ResourceController
10
+ # Post-sale records are order data: a key that may read orders may
11
+ # read these, and nothing here writes.
12
+ scoped_resource :orders
13
+
14
+ protected
15
+
16
+ def model_class
17
+ Spree::Claim
18
+ end
19
+
20
+ def serializer_class
21
+ Spree.api.admin_claim_serializer
22
+ end
23
+
24
+ def collection_includes
25
+ [:order, :reason, { claim_line_items: :variant }]
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,40 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ # Discovery for `Spree::CollectionRule` STI subclasses, so the dashboard
6
+ # can offer every registered rule kind — including ones a plugin adds to
7
+ # `config.spree.collection_rules` — without hard-coding the list.
8
+ #
9
+ # Read-only by design: rules are written through the owning collection's
10
+ # `rules` sync setter (PATCH /collections/:id), not as a nested resource.
11
+ class CollectionRulesController < ResourceController
12
+ # Rule kinds are part of the collections surface — a key that can read
13
+ # collections can discover the rules it may configure on them.
14
+ scoped_resource :collections
15
+
16
+ def types
17
+ authorize! :read, model_class
18
+
19
+ render json: { data: model_class.subclasses_with_preference_schema }
20
+ end
21
+
22
+ protected
23
+
24
+ def model_class
25
+ Spree::CollectionRule
26
+ end
27
+
28
+ def serializer_class
29
+ Spree.api.admin_collection_rule_serializer
30
+ end
31
+
32
+ # `types` is read-only discovery — maps to the read scope + :show ability.
33
+ def read_actions
34
+ super + %w[types]
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,101 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ module Collections
6
+ # The products curated under a collection — the uniform nested
7
+ # membership surface (see Spree::Api::V3::Admin::ProductMembership),
8
+ # plus per-member reposition: listing is ordered by the
9
+ # ProductCollection position so the merchant's manual ordering
10
+ # round-trips. Automatic (rule-based) membership is materialized by
11
+ # the rules, not managed here.
12
+ class ProductsController < ResourceController
13
+ include Spree::Api::V3::Admin::ProductMembership
14
+
15
+ scoped_resource :products
16
+
17
+ before_action :ensure_manual_collection, only: [:create, :destroy, :reposition]
18
+ before_action :set_product, only: [:reposition]
19
+
20
+ # PATCH /api/v3/admin/collections/:collection_id/products/:id/reposition
21
+ # Body: { new_position: 0 } — 0-based index among the collection's products.
22
+ # @product is already constrained to the collection's scope, so a
23
+ # ProductCollection always exists.
24
+ def reposition
25
+ position = integer_param(:new_position)
26
+ return render_invalid_position if position.nil?
27
+
28
+ product_collection_for(@product).insert_at(position + 1)
29
+ # insert_at shifts sibling positions, so refresh every product in the
30
+ # collection (manual sort reads position from the search index).
31
+ @parent_collection.products.find_each(&:enqueue_search_index)
32
+ head :no_content
33
+ end
34
+
35
+ protected
36
+
37
+ # The collection's products, ordered by membership position.
38
+ def scope
39
+ product_scope.
40
+ joins(:product_collections).
41
+ where(Spree::ProductCollection.table_name => { collection_id: @parent_collection.id }).
42
+ order(Spree::ProductCollection.table_name => { position: :asc })
43
+ end
44
+
45
+ # A product is curated at most once per collection (unique
46
+ # [collection_id, product_id]), so the join can't duplicate rows —
47
+ # DISTINCT is unnecessary and breaks Postgres ordering by position.
48
+ def collection_distinct?
49
+ false
50
+ end
51
+
52
+ def add_member_products(products)
53
+ Spree::Collections::AddProducts.call(collections: [@parent_collection], products: products)
54
+ end
55
+
56
+ def remove_member_products(products)
57
+ Spree::Collections::RemoveProducts.call(collections: [@parent_collection], products: products)
58
+ end
59
+
60
+ # Loads the parent collection (runs before the base set_resource).
61
+ # Any collection resolves — listing (index) an automatic collection's
62
+ # rule-materialized membership is valid. Manual-only curation is enforced
63
+ # separately by +ensure_manual_collection+ on the write actions.
64
+ def set_parent
65
+ @parent_collection = Spree::Collection.
66
+ accessible_by(current_ability, parent_ability_action).
67
+ for_store(current_store).
68
+ find_by_prefix_id!(params[:collection_id])
69
+ authorize_parent!(@parent_collection)
70
+ end
71
+
72
+ private
73
+
74
+ # Manual curation (add/remove/reposition) is invalid on automatic
75
+ # collections: their membership is materialized from rules by
76
+ # RegenerateProducts, so a manual change would be wiped on the next
77
+ # regeneration. Listing (index) the materialized membership is fine.
78
+ def ensure_manual_collection
79
+ return if @parent_collection.manual?
80
+
81
+ render_error(
82
+ code: ERROR_CODES[:validation_error],
83
+ message: Spree.t('api.errors.automatic_collection_curation',
84
+ default: "Products of an automatic collection are managed by its rules and can't be curated manually"),
85
+ status: :unprocessable_content
86
+ )
87
+ end
88
+
89
+ def set_product
90
+ @product = scope.find_by_prefix_id!(params[:id])
91
+ end
92
+
93
+ def product_collection_for(product)
94
+ Spree::ProductCollection.find_by(collection_id: @parent_collection.id, product_id: product.id)
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,56 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ # Admin CRUD for collections — the flat, merchandising half of today's
6
+ # dual-purpose Taxon. Both manual and automatic (rule-based) collections
7
+ # live here. Reordering is a plain +position+ update (acts_as_list
8
+ # reorders siblings on save), matching the SPA ResourceTable reorder
9
+ # convention, so there is no dedicated reposition action.
10
+ class CollectionsController < ResourceController
11
+ scoped_resource :collections
12
+
13
+ protected
14
+
15
+ def model_class
16
+ Spree::Collection
17
+ end
18
+
19
+ def serializer_class
20
+ Spree.api.admin_collection_serializer
21
+ end
22
+
23
+ # The serializer always renders the rule set — eager load it.
24
+ # Eager-loaded unconditionally (as PromotionsController does for its
25
+ # own rules): the write path reads the association through the `rules=`
26
+ # sync setter regardless of what the response expands.
27
+ def scope_includes
28
+ [:rules]
29
+ end
30
+
31
+ def scope
32
+ super.ordered
33
+ end
34
+
35
+ # Flat params. +rules+ is applied by the model's sync setter
36
+ # (Spree::Collection#rules=): the full desired rule set, prefixed
37
+ # +crule_+ ids update, missing ids build, omitted rules are removed —
38
+ # so normalize_params is deliberately NOT called (that would rewrite
39
+ # +rules+ to +rules_attributes+ and route past the setter).
40
+ def permitted_params
41
+ params.permit(
42
+ :name, :description, :permalink, :position,
43
+ :meta_title, :meta_description, :meta_keywords,
44
+ :image, :square_image,
45
+ :automatic, :rules_match_policy, :sort_order,
46
+ rules: [:id, :type, :value, :match_policy],
47
+ # Inline custom field values keyed by definition id (see
48
+ # CategoriesController#permitted_params for the value shapes).
49
+ custom_fields: [:id, :custom_field_definition_id, :value, { value: [] }, { value: {} }]
50
+ )
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end