spree_api 5.6.1 → 6.0.0.beta1

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 (540) 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 +9 -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 +16 -7
  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 +157 -32
  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 +231 -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 +65 -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 +59 -16
  184. data/app/controllers/spree/api/v3/resource_controller.rb +154 -38
  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/address_serializer.rb +27 -4
  282. data/app/serializers/spree/api/v3/admin/admin_user_serializer.rb +13 -10
  283. data/app/serializers/spree/api/v3/admin/api_key_serializer.rb +1 -1
  284. data/app/serializers/spree/api/v3/admin/applied_promotion_serializer.rb +15 -0
  285. data/app/serializers/spree/api/v3/admin/cart_serializer.rb +34 -0
  286. data/app/serializers/spree/api/v3/admin/catalog_assignment_serializer.rb +32 -0
  287. data/app/serializers/spree/api/v3/admin/catalog_order_minimum_serializer.rb +23 -0
  288. data/app/serializers/spree/api/v3/admin/catalog_price_serializer.rb +48 -0
  289. data/app/serializers/spree/api/v3/admin/catalog_price_tier_serializer.rb +23 -0
  290. data/app/serializers/spree/api/v3/admin/catalog_product_serializer.rb +57 -0
  291. data/app/serializers/spree/api/v3/admin/catalog_product_term_serializer.rb +38 -0
  292. data/app/serializers/spree/api/v3/admin/catalog_quantity_rule_serializer.rb +37 -0
  293. data/app/serializers/spree/api/v3/admin/catalog_serializer.rb +46 -0
  294. data/app/serializers/spree/api/v3/admin/category_serializer.rb +3 -2
  295. data/app/serializers/spree/api/v3/admin/channel_serializer.rb +15 -1
  296. data/app/serializers/spree/api/v3/admin/claim_line_item_serializer.rb +16 -0
  297. data/app/serializers/spree/api/v3/admin/claim_reason_serializer.rb +21 -0
  298. data/app/serializers/spree/api/v3/admin/claim_serializer.rb +29 -0
  299. data/app/serializers/spree/api/v3/admin/collection_rule_serializer.rb +22 -0
  300. data/app/serializers/spree/api/v3/admin/collection_serializer.rb +29 -0
  301. data/app/serializers/spree/api/v3/admin/commission_line_serializer.rb +67 -0
  302. data/app/serializers/spree/api/v3/admin/commission_rate_serializer.rb +69 -0
  303. data/app/serializers/spree/api/v3/admin/commission_rule_serializer.rb +61 -0
  304. data/app/serializers/spree/api/v3/admin/company_invitation_serializer.rb +15 -0
  305. data/app/serializers/spree/api/v3/admin/company_membership_serializer.rb +11 -0
  306. data/app/serializers/spree/api/v3/admin/company_serializer.rb +37 -0
  307. data/app/serializers/spree/api/v3/admin/concerns/external_references_attribute.rb +33 -0
  308. data/app/serializers/spree/api/v3/admin/consent_record_serializer.rb +28 -0
  309. data/app/serializers/spree/api/v3/admin/country_serializer.rb +2 -2
  310. data/app/serializers/spree/api/v3/admin/credit_card_serializer.rb +1 -1
  311. data/app/serializers/spree/api/v3/admin/custom_field_definition_serializer.rb +2 -2
  312. data/app/serializers/spree/api/v3/admin/custom_field_serializer.rb +2 -2
  313. data/app/serializers/spree/api/v3/admin/customer_serializer.rb +23 -22
  314. data/app/serializers/spree/api/v3/admin/dashboard_counter_serializer.rb +24 -0
  315. data/app/serializers/spree/api/v3/admin/data_request_serializer.rb +36 -0
  316. data/app/serializers/spree/api/v3/admin/delivery_method_rule_serializer.rb +32 -0
  317. data/app/serializers/spree/api/v3/admin/delivery_method_serializer.rb +66 -1
  318. data/app/serializers/spree/api/v3/admin/delivery_method_service_serializer.rb +15 -0
  319. data/app/serializers/spree/api/v3/admin/delivery_origin_group_serializer.rb +34 -0
  320. data/app/serializers/spree/api/v3/admin/delivery_profile_serializer.rb +65 -0
  321. data/app/serializers/spree/api/v3/admin/delivery_rate_serializer.rb +10 -1
  322. data/app/serializers/spree/api/v3/admin/delivery_serializer.rb +20 -0
  323. data/app/serializers/spree/api/v3/admin/delivery_zone_member_serializer.rb +11 -0
  324. data/app/serializers/spree/api/v3/admin/delivery_zone_serializer.rb +29 -0
  325. data/app/serializers/spree/api/v3/admin/digital_asset_serializer.rb +59 -0
  326. data/app/serializers/spree/api/v3/admin/discount_serializer.rb +3 -4
  327. data/app/serializers/spree/api/v3/admin/exchange_line_item_serializer.rb +16 -0
  328. data/app/serializers/spree/api/v3/admin/exchange_serializer.rb +35 -0
  329. data/app/serializers/spree/api/v3/admin/export_serializer.rb +20 -1
  330. data/app/serializers/spree/api/v3/admin/fee_serializer.rb +14 -0
  331. data/app/serializers/spree/api/v3/admin/freight_summary_line_serializer.rb +46 -0
  332. data/app/serializers/spree/api/v3/admin/freight_summary_serializer.rb +16 -0
  333. data/app/serializers/spree/api/v3/admin/fulfillment_item_serializer.rb +39 -0
  334. data/app/serializers/spree/api/v3/admin/fulfillment_serializer.rb +31 -9
  335. data/app/serializers/spree/api/v3/admin/gift_card_serializer.rb +2 -3
  336. data/app/serializers/spree/api/v3/admin/import_serializer.rb +15 -2
  337. data/app/serializers/spree/api/v3/admin/integration_serializer.rb +32 -0
  338. data/app/serializers/spree/api/v3/admin/invitation_serializer.rb +4 -4
  339. data/app/serializers/spree/api/v3/admin/line_item_serializer.rb +19 -5
  340. data/app/serializers/spree/api/v3/admin/market_serializer.rb +5 -1
  341. data/app/serializers/spree/api/v3/admin/media_serializer.rb +50 -2
  342. data/app/serializers/spree/api/v3/admin/membership_product_serializer.rb +29 -0
  343. data/app/serializers/spree/api/v3/admin/order_cancellation_reason_serializer.rb +29 -0
  344. data/app/serializers/spree/api/v3/admin/order_group_serializer.rb +50 -0
  345. data/app/serializers/spree/api/v3/admin/order_routing_rule_serializer.rb +2 -6
  346. data/app/serializers/spree/api/v3/admin/order_serializer.rb +131 -19
  347. data/app/serializers/spree/api/v3/admin/package_type_serializer.rb +53 -0
  348. data/app/serializers/spree/api/v3/admin/payment_method_serializer.rb +8 -2
  349. data/app/serializers/spree/api/v3/admin/payment_serializer.rb +6 -0
  350. data/app/serializers/spree/api/v3/admin/payment_split_serializer.rb +41 -0
  351. data/app/serializers/spree/api/v3/admin/permission_serializer.rb +39 -0
  352. data/app/serializers/spree/api/v3/admin/policy_serializer.rb +11 -0
  353. data/app/serializers/spree/api/v3/admin/price_adjustment_tier_serializer.rb +22 -0
  354. data/app/serializers/spree/api/v3/admin/price_list_product_serializer.rb +32 -0
  355. data/app/serializers/spree/api/v3/admin/price_list_serializer.rb +20 -8
  356. data/app/serializers/spree/api/v3/admin/price_rule_serializer.rb +2 -12
  357. data/app/serializers/spree/api/v3/admin/price_serializer.rb +3 -0
  358. data/app/serializers/spree/api/v3/admin/product_serializer.rb +54 -8
  359. data/app/serializers/spree/api/v3/admin/product_submission_serializer.rb +39 -0
  360. data/app/serializers/spree/api/v3/admin/product_type_custom_field_definition_serializer.rb +44 -0
  361. data/app/serializers/spree/api/v3/admin/product_type_serializer.rb +34 -0
  362. data/app/serializers/spree/api/v3/admin/promotion_action_serializer.rb +6 -12
  363. data/app/serializers/spree/api/v3/admin/promotion_rule_serializer.rb +17 -15
  364. data/app/serializers/spree/api/v3/admin/purchase_order_item_serializer.rb +80 -0
  365. data/app/serializers/spree/api/v3/admin/purchase_order_serializer.rb +94 -0
  366. data/app/serializers/spree/api/v3/admin/refund_reason_serializer.rb +27 -0
  367. data/app/serializers/spree/api/v3/admin/refund_serializer.rb +0 -5
  368. data/app/serializers/spree/api/v3/admin/reporting_result_serializer.rb +72 -0
  369. data/app/serializers/spree/api/v3/admin/return_line_item_serializer.rb +16 -0
  370. data/app/serializers/spree/api/v3/admin/return_reason_serializer.rb +21 -0
  371. data/app/serializers/spree/api/v3/admin/return_serializer.rb +59 -0
  372. data/app/serializers/spree/api/v3/admin/role_serializer.rb +24 -6
  373. data/app/serializers/spree/api/v3/admin/saved_report_serializer.rb +33 -0
  374. data/app/serializers/spree/api/v3/admin/seller_balance_serializer.rb +37 -0
  375. data/app/serializers/spree/api/v3/admin/seller_payout_serializer.rb +46 -0
  376. data/app/serializers/spree/api/v3/admin/seller_requirement_serializer.rb +68 -0
  377. data/app/serializers/spree/api/v3/admin/seller_requirement_status_serializer.rb +48 -0
  378. data/app/serializers/spree/api/v3/admin/seller_requirement_submission_serializer.rb +57 -0
  379. data/app/serializers/spree/api/v3/admin/seller_serializer.rb +92 -0
  380. data/app/serializers/spree/api/v3/admin/seller_team_member_serializer.rb +29 -0
  381. data/app/serializers/spree/api/v3/admin/seller_transfer_serializer.rb +53 -0
  382. data/app/serializers/spree/api/v3/admin/shipping_label_serializer.rb +82 -0
  383. data/app/serializers/spree/api/v3/admin/state_serializer.rb +1 -1
  384. data/app/serializers/spree/api/v3/admin/stock_level_serializer.rb +65 -0
  385. data/app/serializers/spree/api/v3/admin/stock_location_serializer.rb +20 -4
  386. data/app/serializers/spree/api/v3/admin/stock_movement_serializer.rb +116 -0
  387. data/app/serializers/spree/api/v3/admin/stock_receipt_item_serializer.rb +57 -0
  388. data/app/serializers/spree/api/v3/admin/stock_receipt_serializer.rb +49 -0
  389. data/app/serializers/spree/api/v3/admin/stock_reservation_serializer.rb +5 -5
  390. data/app/serializers/spree/api/v3/admin/stock_transfer_item_serializer.rb +57 -0
  391. data/app/serializers/spree/api/v3/admin/stock_transfer_serializer.rb +36 -16
  392. data/app/serializers/spree/api/v3/admin/store_credit_event_serializer.rb +32 -0
  393. data/app/serializers/spree/api/v3/admin/store_credit_serializer.rb +42 -7
  394. data/app/serializers/spree/api/v3/admin/store_serializer.rb +63 -1
  395. data/app/serializers/spree/api/v3/admin/supplier_serializer.rb +39 -0
  396. data/app/serializers/spree/api/v3/admin/tax_exemption_certificate_serializer.rb +67 -0
  397. data/app/serializers/spree/api/v3/admin/tax_identifier_serializer.rb +43 -0
  398. data/app/serializers/spree/api/v3/admin/tax_line_serializer.rb +21 -0
  399. data/app/serializers/spree/api/v3/admin/tax_rate_serializer.rb +49 -0
  400. data/app/serializers/spree/api/v3/admin/variant_serializer.rb +49 -8
  401. data/app/serializers/spree/api/v3/applied_promotion_serializer.rb +23 -0
  402. data/app/serializers/spree/api/v3/base_serializer.rb +39 -2
  403. data/app/serializers/spree/api/v3/cart_serializer.rb +90 -12
  404. data/app/serializers/spree/api/v3/category_serializer.rb +3 -3
  405. data/app/serializers/spree/api/v3/claim_line_item_serializer.rb +50 -0
  406. data/app/serializers/spree/api/v3/claim_reason_serializer.rb +20 -0
  407. data/app/serializers/spree/api/v3/claim_serializer.rb +62 -0
  408. data/app/serializers/spree/api/v3/collection_serializer.rb +41 -0
  409. data/app/serializers/spree/api/v3/company_invitation_serializer.rb +28 -0
  410. data/app/serializers/spree/api/v3/company_membership_serializer.rb +28 -0
  411. data/app/serializers/spree/api/v3/company_serializer.rb +33 -0
  412. data/app/serializers/spree/api/v3/custom_field_serializer.rb +2 -2
  413. data/app/serializers/spree/api/v3/customer_serializer.rb +9 -1
  414. data/app/serializers/spree/api/v3/data_request_event_serializer.rb +30 -0
  415. data/app/serializers/spree/api/v3/data_request_serializer.rb +40 -0
  416. data/app/serializers/spree/api/v3/delivery_method_serializer.rb +12 -2
  417. data/app/serializers/spree/api/v3/delivery_rate_serializer.rb +34 -17
  418. data/app/serializers/spree/api/v3/delivery_serializer.rb +29 -0
  419. data/app/serializers/spree/api/v3/delivery_zone_member_serializer.rb +29 -0
  420. data/app/serializers/spree/api/v3/delivery_zone_serializer.rb +13 -0
  421. data/app/serializers/spree/api/v3/digital_asset_serializer.rb +23 -0
  422. data/app/serializers/spree/api/v3/digital_link_serializer.rb +6 -2
  423. data/app/serializers/spree/api/v3/discount_serializer.rb +21 -7
  424. data/app/serializers/spree/api/v3/exchange_line_item_serializer.rb +53 -0
  425. data/app/serializers/spree/api/v3/exchange_serializer.rb +61 -0
  426. data/app/serializers/spree/api/v3/fee_serializer.rb +27 -0
  427. data/app/serializers/spree/api/v3/freight_summary_serializer.rb +38 -0
  428. data/app/serializers/spree/api/v3/fulfillment_serializer.rb +28 -15
  429. data/app/serializers/spree/api/v3/gift_card_serializer.rb +2 -2
  430. data/app/serializers/spree/api/v3/import_row_serializer.rb +1 -1
  431. data/app/serializers/spree/api/v3/import_serializer.rb +18 -4
  432. data/app/serializers/spree/api/v3/invitation_serializer.rb +1 -1
  433. data/app/serializers/spree/api/v3/line_item_serializer.rb +18 -1
  434. data/app/serializers/spree/api/v3/market_serializer.rb +2 -2
  435. data/app/serializers/spree/api/v3/{asset_serializer.rb → media_event_serializer.rb} +4 -4
  436. data/app/serializers/spree/api/v3/media_serializer.rb +48 -7
  437. data/app/serializers/spree/api/v3/newsletter_subscriber_serializer.rb +1 -1
  438. data/app/serializers/spree/api/v3/option_type_serializer.rb +1 -1
  439. data/app/serializers/spree/api/v3/order_group_serializer.rb +60 -0
  440. data/app/serializers/spree/api/v3/order_serializer.rb +58 -6
  441. data/app/serializers/spree/api/v3/payment_method_serializer.rb +1 -1
  442. data/app/serializers/spree/api/v3/payment_serializer.rb +2 -6
  443. data/app/serializers/spree/api/v3/payment_session_serializer.rb +10 -3
  444. data/app/serializers/spree/api/v3/payment_setup_session_serializer.rb +1 -1
  445. data/app/serializers/spree/api/v3/policy_serializer.rb +7 -2
  446. data/app/serializers/spree/api/v3/product_filter_option_serializer.rb +1 -1
  447. data/app/serializers/spree/api/v3/product_serializer.rb +42 -10
  448. data/app/serializers/spree/api/v3/product_type_serializer.rb +17 -0
  449. data/app/serializers/spree/api/v3/purchase_order_event_serializer.rb +11 -0
  450. data/app/serializers/spree/api/v3/refund_serializer.rb +9 -3
  451. data/app/serializers/spree/api/v3/return_line_item_serializer.rb +42 -0
  452. data/app/serializers/spree/api/v3/return_reason_serializer.rb +20 -0
  453. data/app/serializers/spree/api/v3/return_serializer.rb +62 -0
  454. data/app/serializers/spree/api/v3/seller/balance_serializer.rb +35 -0
  455. data/app/serializers/spree/api/v3/seller/claim_line_item_serializer.rb +21 -0
  456. data/app/serializers/spree/api/v3/seller/claim_serializer.rb +25 -0
  457. data/app/serializers/spree/api/v3/seller/delivery_method_rule_serializer.rb +32 -0
  458. data/app/serializers/spree/api/v3/seller/delivery_method_serializer.rb +59 -0
  459. data/app/serializers/spree/api/v3/seller/delivery_profile_serializer.rb +26 -0
  460. data/app/serializers/spree/api/v3/seller/delivery_rate_serializer.rb +35 -0
  461. data/app/serializers/spree/api/v3/seller/delivery_serializer.rb +17 -0
  462. data/app/serializers/spree/api/v3/seller/delivery_zone_serializer.rb +26 -0
  463. data/app/serializers/spree/api/v3/seller/exchange_line_item_serializer.rb +29 -0
  464. data/app/serializers/spree/api/v3/seller/exchange_serializer.rb +30 -0
  465. data/app/serializers/spree/api/v3/seller/export_serializer.rb +44 -0
  466. data/app/serializers/spree/api/v3/seller/fulfillment_item_serializer.rb +43 -0
  467. data/app/serializers/spree/api/v3/seller/fulfillment_serializer.rb +76 -0
  468. data/app/serializers/spree/api/v3/seller/import_mapping_serializer.rb +20 -0
  469. data/app/serializers/spree/api/v3/seller/import_row_serializer.rb +17 -0
  470. data/app/serializers/spree/api/v3/seller/import_serializer.rb +77 -0
  471. data/app/serializers/spree/api/v3/seller/invitation_serializer.rb +29 -0
  472. data/app/serializers/spree/api/v3/seller/media_serializer.rb +26 -0
  473. data/app/serializers/spree/api/v3/seller/order_line_item_serializer.rb +44 -0
  474. data/app/serializers/spree/api/v3/seller/order_serializer.rb +119 -0
  475. data/app/serializers/spree/api/v3/seller/package_type_serializer.rb +52 -0
  476. data/app/serializers/spree/api/v3/seller/payment_split_serializer.rb +34 -0
  477. data/app/serializers/spree/api/v3/seller/payout_serializer.rb +36 -0
  478. data/app/serializers/spree/api/v3/seller/policy_serializer.rb +11 -0
  479. data/app/serializers/spree/api/v3/seller/product_serializer.rb +60 -0
  480. data/app/serializers/spree/api/v3/seller/product_submission_serializer.rb +30 -0
  481. data/app/serializers/spree/api/v3/seller/product_type_serializer.rb +29 -0
  482. data/app/serializers/spree/api/v3/seller/profile_serializer.rb +77 -0
  483. data/app/serializers/spree/api/v3/seller/reason_serializer.rb +24 -0
  484. data/app/serializers/spree/api/v3/seller/requirement_custom_field_serializer.rb +36 -0
  485. data/app/serializers/spree/api/v3/seller/requirement_status_serializer.rb +62 -0
  486. data/app/serializers/spree/api/v3/seller/requirement_submission_serializer.rb +33 -0
  487. data/app/serializers/spree/api/v3/seller/return_line_item_serializer.rb +24 -0
  488. data/app/serializers/spree/api/v3/seller/return_serializer.rb +51 -0
  489. data/app/serializers/spree/api/v3/seller/shipping_label_serializer.rb +23 -0
  490. data/app/serializers/spree/api/v3/seller/stock_level_serializer.rb +27 -0
  491. data/app/serializers/spree/api/v3/seller/stock_location_serializer.rb +17 -0
  492. data/app/serializers/spree/api/v3/seller/tax_identifier_serializer.rb +15 -0
  493. data/app/serializers/spree/api/v3/seller/team_member_serializer.rb +22 -0
  494. data/app/serializers/spree/api/v3/seller/transfer_serializer.rb +49 -0
  495. data/app/serializers/spree/api/v3/seller/variant_serializer.rb +71 -0
  496. data/app/serializers/spree/api/v3/seller_serializer.rb +50 -0
  497. data/app/serializers/spree/api/v3/shipping_label_event_serializer.rb +11 -0
  498. data/app/serializers/spree/api/v3/{stock_item_serializer.rb → stock_level_serializer.rb} +5 -5
  499. data/app/serializers/spree/api/v3/stock_location_serializer.rb +11 -7
  500. data/app/serializers/spree/api/v3/stock_movement_serializer.rb +8 -15
  501. data/app/serializers/spree/api/v3/stock_receipt_event_serializer.rb +11 -0
  502. data/app/serializers/spree/api/v3/stock_transfer_serializer.rb +6 -6
  503. data/app/serializers/spree/api/v3/store_credit_event_serializer.rb +29 -0
  504. data/app/serializers/spree/api/v3/supplier_event_serializer.rb +11 -0
  505. data/app/serializers/spree/api/v3/tax_identifier_serializer.rb +15 -0
  506. data/app/serializers/spree/api/v3/tax_line_serializer.rb +37 -0
  507. data/app/serializers/spree/api/v3/variant_serializer.rb +52 -2
  508. data/app/serializers/spree/api/v3/wishlist_item_serializer.rb +6 -6
  509. data/app/serializers/spree/api/v3/wishlist_serializer.rb +1 -1
  510. data/app/services/spree/api/v3/filters_aggregator.rb +14 -12
  511. data/app/services/spree/webhooks/deliver_webhook.rb +62 -26
  512. data/app/subscribers/spree/webhook_event_subscriber.rb +9 -5
  513. data/config/brakeman.ignore +1 -1
  514. data/config/initializers/typelizer.rb +51 -4
  515. data/config/locales/en.yml +5 -0
  516. data/config/routes.rb +730 -22
  517. data/lib/spree/api/configuration.rb +2 -7
  518. data/lib/spree/api/dependencies.rb +173 -227
  519. data/lib/spree/api/openapi/schema_helper.rb +179 -13
  520. data/lib/spree/api/testing_support/v3/base.rb +45 -15
  521. data/lib/spree/api.rb +10 -4
  522. data/lib/typelizer/open_enums.rb +35 -0
  523. metadata +341 -27
  524. data/app/controllers/spree/api/v3/admin/orders/adjustments_controller.rb +0 -25
  525. data/app/controllers/spree/api/v3/admin/stock_items_controller.rb +0 -42
  526. data/app/controllers/spree/api/v3/admin/store_credit_categories_controller.rb +0 -21
  527. data/app/controllers/spree/api/v3/store/digitals_controller.rb +0 -38
  528. data/app/serializers/spree/api/v3/admin/adjustment_serializer.rb +0 -24
  529. data/app/serializers/spree/api/v3/admin/dashboard_analytics_serializer.rb +0 -143
  530. data/app/serializers/spree/api/v3/admin/reimbursement_serializer.rb +0 -15
  531. data/app/serializers/spree/api/v3/admin/return_authorization_serializer.rb +0 -19
  532. data/app/serializers/spree/api/v3/admin/stock_item_serializer.rb +0 -34
  533. data/app/serializers/spree/api/v3/admin/store_credit_category_serializer.rb +0 -19
  534. data/app/serializers/spree/api/v3/customer_return_serializer.rb +0 -17
  535. data/app/serializers/spree/api/v3/digital_serializer.rb +0 -17
  536. data/app/serializers/spree/api/v3/reimbursement_serializer.rb +0 -27
  537. data/app/serializers/spree/api/v3/report_serializer.rb +0 -34
  538. data/app/serializers/spree/api/v3/return_authorization_serializer.rb +0 -31
  539. data/app/serializers/spree/api/v3/return_item_serializer.rb +0 -53
  540. data/app/serializers/spree/api/v3/shipping_category_serializer.rb +0 -11
@@ -0,0 +1,29 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ module Catalogs
6
+ # Anything nested under a catalog. The parent resolves through the
7
+ # store, so a catalog belonging to another tenant is a 404 rather
8
+ # than a readable record.
9
+ class BaseController < ResourceController
10
+ scoped_resource :products
11
+
12
+ protected
13
+
14
+ def set_parent
15
+ @parent = current_store.catalogs.
16
+ accessible_by(current_ability, parent_ability_action).
17
+ find_by_prefix_id!(params[:catalog_id])
18
+ @catalog = @parent
19
+ end
20
+
21
+ def authorize_parent_access!
22
+ authorize_parent!(@parent)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,40 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ module Catalogs
6
+ # The least a whole order must come to under a catalog's agreement.
7
+ # One row per currency — never one amount with a currency beside
8
+ # it, because Spree holds no exchange rates.
9
+ class OrderMinimumsController < BaseController
10
+ before_action :authorize_parent_access!
11
+
12
+
13
+ protected
14
+
15
+ def model_class
16
+ Spree::CatalogOrderMinimum
17
+ end
18
+
19
+ def serializer_class
20
+ Spree.api.admin_catalog_order_minimum_serializer
21
+ end
22
+
23
+ def scope
24
+ @parent.order_minimums
25
+ end
26
+
27
+ def parent_association
28
+ :order_minimums
29
+ end
30
+
31
+ def permitted_params
32
+ params.permit(:currency, :amount)
33
+ end
34
+
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,107 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ module Catalogs
6
+ # The products curated into a catalog's assortment — the uniform
7
+ # nested membership surface (see
8
+ # Spree::Api::V3::Admin::ProductMembership). A catalog decides what
9
+ # a buyer sees, never the order they see it in, so membership
10
+ # carries no position and listing is ordered by name.
11
+ class ProductsController < BaseController
12
+ include Spree::Api::V3::Admin::ProductMembership
13
+
14
+ before_action :authorize_parent_access!
15
+
16
+ protected
17
+
18
+ def serializer_class
19
+ Spree.api.admin_catalog_product_serializer
20
+ end
21
+
22
+ # The resolver rides along in the serializer params, preloaded
23
+ # with this page's variants: resolving row by row would be a query
24
+ # per product, and the answer is the same for every row on the
25
+ # page.
26
+ # `expanded_keys` is the same dot-notation matching the serializer's
27
+ # own `expand?` does, so the attribute never renders without the
28
+ # resolver that fills it.
29
+ def serializer_params
30
+ params = super
31
+ params = params.merge(catalog_price_resolver: catalog_price_resolver) if expanded_keys.include?('catalog_price')
32
+ params = params.merge(catalog_quantity_rules: quantity_rules_by_product) if expanded_keys.include?('quantity_rule')
33
+ params
34
+ end
35
+
36
+ # The page's quantity rules in one query, keyed by product. The
37
+ # rows are stored per variant and read per product, which is the
38
+ # roll-up the serializer does — on variants this page has already
39
+ # loaded (docs/plans/6.0-volume-pricing.md).
40
+ def quantity_rules_by_product
41
+ @quantity_rules_by_product ||= begin
42
+ variant_ids = priced_variants.map(&:id)
43
+ rules = variant_ids.any? ? @catalog.quantity_rules.where(variant_id: variant_ids).to_a : []
44
+ product_by_variant = priced_variants.to_h { |variant| [variant.id, variant.product_id] }
45
+
46
+ rules.group_by { |rule| product_by_variant[rule.variant_id] }
47
+ end
48
+ end
49
+
50
+ # Preloaded with every variant the page renders — each row now
51
+ # prices its variants individually, so preloading only the buy-box
52
+ # winner would leave the rest falling through to a query apiece
53
+ # (docs/plans/6.0-volume-pricing.md).
54
+ def catalog_price_resolver
55
+ @catalog_price_resolver ||=
56
+ Spree::Catalogs::ResolvePrices.new(catalog: @catalog, currency: current_currency).
57
+ tap { |resolver| resolver.preload(priced_variants) }
58
+ end
59
+
60
+ def priced_variants
61
+ Array(@collection).flat_map { |product| product.variants.to_a }
62
+ end
63
+
64
+ # Only what this page reads: the card's thumbnail, and every
65
+ # variant with the rows and option values the resolver and the
66
+ # variant rows need. `default_variant` is deliberately absent —
67
+ # it is a separate `belongs_to` with a cache of its own, so
68
+ # reading it here would re-query option values per row. Publications, stock levels and the default
69
+ # variant's own prices are deliberately absent — this endpoint
70
+ # serializes the membership shape, not a full admin product
71
+ # (docs/plans/6.0-volume-pricing.md).
72
+ def collection_includes
73
+ [
74
+ :primary_media,
75
+ { variants: [:prices, { option_values: :option_type }] }
76
+ ]
77
+ end
78
+
79
+ def scope
80
+ product_scope.
81
+ joins(:catalog_products).
82
+ where(Spree::CatalogProduct.table_name => { catalog_id: @catalog.id }).
83
+ order(:name)
84
+ end
85
+
86
+ # A product is curated at most once per catalog (unique
87
+ # [catalog_id, product_id]), so the join can't duplicate rows and
88
+ # DISTINCT is unnecessary.
89
+ def collection_distinct?
90
+ false
91
+ end
92
+
93
+ def add_member_products(products)
94
+ @catalog.add_products(products.map(&:id))
95
+ end
96
+
97
+ # Through the model, so an owned price list drops the rows it
98
+ # held for these products along with them.
99
+ def remove_member_products(products)
100
+ @catalog.remove_products(products.map(&:id))
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,75 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ module Catalogs
6
+ # A catalog's quantity terms — the narrowest of the three levels a
7
+ # buyer's rules resolve through. The catalog-wide default is a pair
8
+ # of fields on the catalog itself, so this surface is strictly the
9
+ # overrides.
10
+ #
11
+ # Rows are stored per variant and written as a whole set, because
12
+ # that is the grain a merchant states them at ("minimum 48 of this
13
+ # product") and the dashboard stages every edit behind the catalog's
14
+ # Save — a partial application would leave an agreement half-changed.
15
+ #
16
+ # There is no read action: the rules are read back on the assortment
17
+ # rows (`expand=quantity_rule` on this catalog's products), which
18
+ # already hold the variants they roll up
19
+ # (docs/plans/6.0-volume-pricing.md).
20
+ class QuantityRulesController < BaseController
21
+ before_action :authorize_parent_access!
22
+
23
+ # PUT /api/v3/admin/catalogs/:catalog_id/quantity_rules
24
+ #
25
+ # { terms: { "prod_abc": { minimum_order_quantity: 48,
26
+ # order_multiple: 24 } } }
27
+ #
28
+ # A product whose pair is both null has its terms cleared.
29
+ def upsert
30
+ authorize! :update, @catalog
31
+
32
+ result = Spree::Catalogs::SetProductTerms.call(catalog: @catalog, terms: resolved_terms)
33
+
34
+ if result.success?
35
+ head :no_content
36
+ else
37
+ render_service_error(result)
38
+ end
39
+ end
40
+
41
+ protected
42
+
43
+ def model_class
44
+ Spree::CatalogQuantityRule
45
+ end
46
+
47
+ def serializer_class
48
+ Spree.api.admin_catalog_quantity_rule_serializer
49
+ end
50
+
51
+ def scope
52
+ @catalog.quantity_rules
53
+ end
54
+
55
+ def parent_association
56
+ :quantity_rules
57
+ end
58
+
59
+ private
60
+
61
+ # Products resolve through this store, so an id belonging to
62
+ # another tenant is a 404 rather than a term written against a
63
+ # product the merchant does not sell.
64
+ def resolved_terms
65
+ params.require(:terms).to_unsafe_h.to_h do |product_id, values|
66
+ product = current_store.products.find_by_prefix_id!(product_id)
67
+ [product, values.to_h.symbolize_keys.slice(:minimum_order_quantity, :order_multiple)]
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -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