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
@@ -8,23 +8,26 @@ module Spree
8
8
  protected
9
9
 
10
10
  def set_parent
11
- @parent = current_user.wishlists.find_by_prefix_id!(params[:wishlist_id])
11
+ @parent = storefront_access_policy.
12
+ scope(Spree::Wishlist.for_store(current_store)).
13
+ find_by_prefix_id!(params[:wishlist_id])
14
+ authorize_storefront_write!(@parent)
12
15
  end
13
16
 
14
17
  def parent_association
15
- :wished_items
18
+ :wishlist_items
16
19
  end
17
20
 
18
21
  def model_class
19
- Spree::WishedItem
22
+ Spree::WishlistItem
20
23
  end
21
24
 
22
25
  def serializer_class
23
- Spree.api.wished_item_serializer
26
+ Spree.api.wishlist_item_serializer
24
27
  end
25
28
 
26
- def permitted_params
27
- params.permit(Spree::PermittedAttributes.wished_item_attributes)
29
+ def resource_permitted_attributes
30
+ [:variant_id, :quantity]
28
31
  end
29
32
  end
30
33
  end
@@ -20,7 +20,7 @@ module Spree
20
20
  protected
21
21
 
22
22
  def scope
23
- current_user.wishlists.for_store(current_store)
23
+ storefront_access_policy.scope(Spree::Wishlist.for_store(current_store))
24
24
  end
25
25
 
26
26
  def model_class
@@ -31,8 +31,8 @@ module Spree
31
31
  Spree.api.wishlist_serializer
32
32
  end
33
33
 
34
- def permitted_params
35
- params.permit(Spree::PermittedAttributes.wishlist_attributes)
34
+ def resource_permitted_attributes
35
+ [:name, :is_default, :is_private]
36
36
  end
37
37
  end
38
38
  end
@@ -0,0 +1,88 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Webhooks
5
+ # Carrier webhooks, addressed to the integration holding the carrier's
6
+ # credentials: POST /api/v3/webhooks/fulfillments/:integration_id.
7
+ #
8
+ # Mirrors the payments webhook endpoint: the integration verifies the
9
+ # signature synchronously (401 when it fails, so a misconfigured
10
+ # sender notices), translates the payload into core vocabulary, and
11
+ # anything unrecognised is acknowledged with 200 — carriers retry
12
+ # anything else, and there is nothing to retry for a parcel that is
13
+ # not ours. Unlike payments there is no job hand-off: recording a
14
+ # tracking update is a couple of database writes, well inside any
15
+ # sender's timeout.
16
+ class FulfillmentsController < ActionController::API
17
+ include ActionController::RateLimiting
18
+ include Spree::Core::ControllerHelpers::Store
19
+
20
+ # Must render — instance_exec'd in a before_action, where only
21
+ # render/redirect halts the chain.
22
+ RATE_LIMIT_RESPONSE = -> {
23
+ response.headers['Retry-After'] = '60'
24
+ render json: { error: { code: 'rate_limit_exceeded', message: 'Too many requests' } },
25
+ status: :too_many_requests
26
+ }
27
+
28
+ rate_limit to: 120, within: 1.minute,
29
+ store: Rails.cache,
30
+ by: -> { request.remote_ip },
31
+ with: RATE_LIMIT_RESPONSE
32
+
33
+ def create
34
+ integration = current_store.integrations.active.find_by_prefix_id!(params[:integration_id])
35
+
36
+ event = integration.parse_webhook_event(request.raw_post, request.headers)
37
+ return head :ok if event.nil?
38
+
39
+ delivery = find_delivery(event[:tracking_code])
40
+ return head :ok if delivery.nil?
41
+
42
+ Spree.delivery_update_tracking_workflow.call(
43
+ delivery: delivery,
44
+ **event.except(:tracking_code)
45
+ )
46
+
47
+ head :ok
48
+ rescue Spree::Integration::WebhookSignatureError
49
+ head :unauthorized
50
+ rescue ActiveRecord::RecordNotFound
51
+ head :not_found
52
+ rescue StandardError => e
53
+ Rails.error.report(e, source: 'spree.webhooks.fulfillments')
54
+ head :ok
55
+ end
56
+
57
+ private
58
+
59
+ # Scoped to the store the verified integration belongs to — a
60
+ # tracking code can never address another tenant's parcel — and to
61
+ # consignments whose parcel was not canceled, so a recycled code
62
+ # cannot reopen an old one. The newest wins when a code was reused.
63
+ # Carriers reuse tracking numbers across years, so a code can match
64
+ # more than one consignment. The store-scoped index makes that
65
+ # candidate set tiny — almost always one row — and the stood-down
66
+ # ones are dropped from it rather than from every parcel in the
67
+ # database. The newest survivor wins.
68
+ CANDIDATE_LIMIT = 20
69
+
70
+ def find_delivery(tracking_code)
71
+ return if tracking_code.blank?
72
+
73
+ # Paged rather than capped: a tracking number reused across
74
+ # canceled owners would otherwise fill the window and hide the
75
+ # live delivery behind them, and the webhook would be
76
+ # acknowledged without applying the carrier's update.
77
+ current_store.deliveries.
78
+ where(tracking_number: tracking_code).
79
+ order(created_at: :desc, id: :desc).
80
+ includes(:owner).
81
+ find_each(batch_size: CANDIDATE_LIMIT, order: :desc).
82
+ find { |delivery| delivery.owner.present? && !delivery.owner.canceled? }
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -6,9 +6,12 @@ module Spree
6
6
  include ActionController::RateLimiting
7
7
  include Spree::Core::ControllerHelpers::Store
8
8
 
9
+ # Must render — instance_exec'd in a before_action, where only
10
+ # render/redirect halts the chain.
9
11
  RATE_LIMIT_RESPONSE = -> {
10
- [429, { 'Content-Type' => 'application/json', 'Retry-After' => '60' },
11
- [{ error: { code: 'rate_limit_exceeded', message: 'Too many requests' } }.to_json]]
12
+ response.headers['Retry-After'] = '60'
13
+ render json: { error: { code: 'rate_limit_exceeded', message: 'Too many requests' } },
14
+ status: :too_many_requests
12
15
  }
13
16
 
14
17
  rate_limit to: 120, within: 1.minute,
@@ -0,0 +1,61 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Webhooks
5
+ # Marketplace events about sellers: POST /api/v3/webhooks/payouts/:payment_method_id.
6
+ #
7
+ # Separate from the payments endpoint because providers scope the two
8
+ # separately. Events originating in a seller's own account — whether
9
+ # they may be paid, whether a payout reached their bank — arrive on
10
+ # their own subscription with their own signing secret, so verifying
11
+ # them against the payment endpoint's secret would reject every one.
12
+ #
13
+ # Addressed to the payment method because a marketplace pays sellers
14
+ # out of the account it charges their customers from: the same
15
+ # credentials, and so the same record.
16
+ #
17
+ # Handled inline rather than handed to a job, like the carrier
18
+ # endpoint: marking a seller payable or a payout settled is a couple of
19
+ # database writes, well inside any sender's timeout.
20
+ class PayoutsController < ActionController::API
21
+ include ActionController::RateLimiting
22
+ include Spree::Core::ControllerHelpers::Store
23
+
24
+ # Must render — instance_exec'd in a before_action, where only
25
+ # render/redirect halts the chain.
26
+ RATE_LIMIT_RESPONSE = -> {
27
+ response.headers['Retry-After'] = '60'
28
+ render json: { error: { code: 'rate_limit_exceeded', message: 'Too many requests' } },
29
+ status: :too_many_requests
30
+ }
31
+
32
+ rate_limit to: 120, within: 1.minute,
33
+ store: Rails.cache,
34
+ by: -> { request.remote_ip },
35
+ with: RATE_LIMIT_RESPONSE
36
+
37
+ def create
38
+ payment_method = current_store.payment_methods.find_by_prefix_id!(params[:payment_method_id])
39
+ return head :not_found unless payment_method.respond_to?(:handle_payout_webhook)
40
+
41
+ payment_method.handle_payout_webhook(request.raw_post, request.headers)
42
+
43
+ head :ok
44
+ rescue Spree::PaymentMethod::WebhookSignatureError
45
+ head :unauthorized
46
+ rescue ActiveRecord::RecordNotFound
47
+ head :not_found
48
+ rescue StandardError => e
49
+ # 500, unlike the payments endpoint beside this one — that hands
50
+ # its work to a job, so accepting the delivery is honest. This acts
51
+ # inline, so answering 200 for work that failed tells the provider
52
+ # the settlement was recorded when it was not, and nothing will
53
+ # redeliver it. A retry is the only thing that recovers it.
54
+ Rails.error.report(e, source: 'spree.webhooks.payouts')
55
+ head :internal_server_error
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,25 @@
1
+ module Spree
2
+ module Api
3
+ # The one place that knows how a finished export is addressed. Mirrors
4
+ # DigitalLinkUrls: the route only exists in this gem, while the email that
5
+ # needs it absolute lives in another.
6
+ module DataRequestUrls
7
+ module_function
8
+
9
+ # @param data_request [Spree::DataRequest]
10
+ # @return [String] path relative to the API host
11
+ def download_path(data_request)
12
+ Spree::Core::Engine.routes.url_helpers.api_v3_store_data_request_download_path(
13
+ token: data_request.download_token
14
+ )
15
+ end
16
+
17
+ # @param data_request [Spree::DataRequest]
18
+ # @param host [String] the backend's own URL
19
+ # @return [String] absolute URL, for emails and anything else off-request
20
+ def download_url(data_request, host)
21
+ URI.join(host, download_path(data_request)).to_s
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,26 @@
1
+ module Spree
2
+ module Api
3
+ # The one place that knows how a download link is addressed. Both consumers
4
+ # live in different gems — the store serializer emits the path, the email
5
+ # needs it absolute — and the route only exists here, in the gem that draws
6
+ # it, so neither the core model nor the emails gem can own this.
7
+ module DigitalLinkUrls
8
+ module_function
9
+
10
+ # @param digital_link [Spree::DigitalLink]
11
+ # @return [String] path relative to the API host
12
+ def download_path(digital_link)
13
+ Spree::Core::Engine.routes.url_helpers.api_v3_store_digital_link_download_path(
14
+ token: digital_link.token
15
+ )
16
+ end
17
+
18
+ # @param digital_link [Spree::DigitalLink]
19
+ # @param host [String] the backend's own URL
20
+ # @return [String] absolute URL, for emails and anything else off-request
21
+ def download_url(digital_link, host)
22
+ URI.join(host, download_path(digital_link)).to_s
23
+ end
24
+ end
25
+ end
26
+ end
@@ -5,13 +5,25 @@ module Spree
5
5
  typelize first_name: [:string, nullable: true], last_name: [:string, nullable: true], full_name: :string,
6
6
  address1: [:string, nullable: true], address2: [:string, nullable: true],
7
7
  city: [:string, nullable: true], postal_code: [:string, nullable: true], phone: [:string, nullable: true],
8
- company: [:string, nullable: true], state_abbr: [:string, nullable: true], state_name: [:string, nullable: true],
9
- state_text: [:string, nullable: true], country_iso: :string, country_name: :string,
10
- quick_checkout: :boolean, is_default_billing: :boolean, is_default_shipping: :boolean
8
+ company: [:string, nullable: true], state_code: [:string, nullable: true],
9
+ state_abbr: [:string, nullable: true], state_name: [:string, nullable: true],
10
+ state_text: [:string, nullable: true], country_code: :string, country_iso: :string,
11
+ country_name: :string,
12
+ quick_checkout: :boolean, is_default_billing: :boolean, is_default_shipping: :boolean,
13
+ label: [:string, nullable: true]
14
+
15
+ # What the address is filed under in whichever book owns it — a
16
+ # customer's ("Home") or a company node's ("Northern Warehouse").
17
+ attributes :label
11
18
 
12
19
  attributes :first_name, :last_name, :full_name, :address1, :address2, :postal_code,
13
- :city, :phone, :company, :country_name, :country_iso, :state_text,
14
- :state_abbr, :quick_checkout, :is_default_billing, :is_default_shipping
20
+ :city, :phone, :company, :country_name, :country_code, :state_text,
21
+ :state_code, :quick_checkout, :is_default_billing, :is_default_shipping
22
+
23
+ # @deprecated Storefronts shipped against these names; use +state_code+
24
+ # and +country_code+. Removed in 6.1.
25
+ attribute :state_abbr, &:state_code
26
+ attribute :country_iso, &:country_code
15
27
 
16
28
  # State name - used for countries without predefined states
17
29
  attribute :state_name do |address|
@@ -3,16 +3,39 @@ module Spree
3
3
  module V3
4
4
  module Admin
5
5
  class AddressSerializer < V3::AddressSerializer
6
- typelize label: [:string, nullable: true],
7
- customer_id: [:string, nullable: true],
6
+ typelize customer_id: [:string, nullable: true],
7
+ owner_id: [:string, nullable: true],
8
+ owner_type: [:string, nullable: true],
9
+ latitude: [:number, nullable: true],
10
+ longitude: [:number, nullable: true],
8
11
  metadata: 'Record<string, unknown>'
9
12
 
10
- attributes :label, :metadata,
13
+ attributes :metadata,
11
14
  created_at: :iso8601, updated_at: :iso8601
12
15
 
16
+ # Geocoded in the background after the address is saved, so both are
17
+ # null until that job has run — a client showing a map has to cope
18
+ # with an address it cannot place yet.
19
+ attribute :latitude do |address|
20
+ address.latitude&.to_f
21
+ end
22
+
23
+ attribute :longitude do |address|
24
+ address.longitude&.to_f
25
+ end
26
+
13
27
  attribute :customer_id do |address|
14
- address.user&.prefixed_id
28
+ address.customer_owner&.prefixed_id
15
29
  end
30
+
31
+ # Who the row belongs to — a customer's book, a company node's, or a
32
+ # seller's billing address. `customer_id` above stays as the
33
+ # customer-only shorthand the customers surface reads.
34
+ attribute :owner_id do |address|
35
+ address.owner&.prefixed_id
36
+ end
37
+
38
+ attributes :owner_type
16
39
  end
17
40
  end
18
41
  end
@@ -25,21 +25,24 @@ module Spree
25
25
  # the user might have on other stores. Block receives `params`
26
26
  # only when Alba passes it through the `serializer_params` hash —
27
27
  # we fall back to `Spree::Current.store` if not.
28
+ # Filtered in Ruby rather than with `for_resource`, so the staff
29
+ # index's preloaded roles are used instead of a query per user.
28
30
  attribute :roles do |user, params|
29
31
  store = params&.dig(:store) || Spree::Current.store
30
- scope = user.role_users
31
- scope = scope.where(resource: store) if store
32
- scope.includes(:role).map { |ru| { id: ru.role.prefixed_id, name: ru.role.name } }
32
+ roles = user.spree_roles.to_a
33
+ roles = roles.select { |role| role.resource == store } if store
34
+ roles.map { |role| { id: role.prefixed_id, name: role.name } }
33
35
  end
34
36
 
35
- # Every store this user holds a role on (via `Spree::RoleUser`) —
36
- # unlike `roles`, deliberately NOT scoped to the current store, so
37
- # the dashboard store switcher can offer all accessible stores.
38
- # Dedupe/sort happen in Ruby (not `.distinct.order`) so the staff
39
- # index's `collection_includes` preload is used instead of firing
40
- # an extra query per user.
37
+ # Every store this user holds a role on unlike `roles`,
38
+ # deliberately NOT scoped to the current store, so the dashboard
39
+ # store switcher can offer all accessible stores. Read off the same
40
+ # preloaded roles, and deduped/sorted in Ruby, so the staff index
41
+ # spends no extra query per user.
41
42
  attribute :stores do |user|
42
- user.stores.uniq.sort_by(&:name).map do |store|
43
+ stores = user.spree_roles.filter_map { |role| role.resource if role.resource.is_a?(Spree::Store) }
44
+
45
+ stores.uniq.sort_by(&:name).map do |store|
43
46
  { id: store.prefixed_id, name: store.name, code: store.code }
44
47
  end
45
48
  end
@@ -12,7 +12,7 @@ module Spree
12
12
  # via {#plaintext_token} below — it is `nil` everywhere else.
13
13
  class ApiKeySerializer < V3::BaseSerializer
14
14
  typelize name: :string,
15
- key_type: :string,
15
+ key_type: [:string, enum: Spree::ApiKey::KEY_TYPES],
16
16
  token_prefix: [:string, nullable: true],
17
17
  plaintext_token: [:string, nullable: true],
18
18
  scopes: [:string, multi: true],
@@ -0,0 +1,15 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ class AppliedPromotionSerializer < V3::AppliedPromotionSerializer
6
+ # The Admin API has no guest gating — money fields inherited from the
7
+ # store serializer are always present, so override their nullability.
8
+ typelize amount: [:string, nullable: false], display_amount: [:string, nullable: false]
9
+
10
+ attributes created_at: :iso8601, updated_at: :iso8601
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Api
5
+ module V3
6
+ module Admin
7
+ # Admin Cart serializer — the store shape plus operational timestamps,
8
+ # slimmed to what inspecting an originating cart needs. The cart's
9
+ # fulfillment/payment sub-graphs are pre-conversion duplicates of the
10
+ # order's own and are dropped (they also ballooned the generated type
11
+ # graph past the TypeScript instantiation limit). Kept associations
12
+ # are redeclared with admin counterparts — admin serializers never
13
+ # reference store serializers.
14
+ class CartSerializer < V3::CartSerializer
15
+ %i[fulfillments payments payment_methods gift_card discounts fees].each { |key| _attributes.delete(key) }
16
+
17
+ typelize completed_at: [:string, nullable: true]
18
+
19
+ attributes completed_at: :iso8601, created_at: :iso8601, updated_at: :iso8601
20
+
21
+ many :order_promotions, key: :applied_promotions, resource: proc { Spree.api.admin_applied_promotion_serializer }
22
+ many :line_items, key: :items, resource: proc { Spree.api.admin_line_item_serializer }
23
+ one :billing_address, resource: proc { Spree.api.admin_address_serializer }
24
+ one :shipping_address, resource: proc { Spree.api.admin_address_serializer }
25
+ one :market, resource: proc { Spree.api.admin_market_serializer }
26
+
27
+ # An admin twin, so this package carries its own type rather
28
+ # than importing the store one.
29
+ one :freight_summary, resource: proc { Spree.api.admin_freight_summary_serializer }
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,32 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ class CatalogAssignmentSerializer < V3::BaseSerializer
6
+ typelize catalog_id: :string, assignable_type: :string, assignable_id: :string,
7
+ assignable_name: [:string, nullable: true]
8
+
9
+ attributes created_at: :iso8601
10
+
11
+ attribute :catalog_id do |assignment|
12
+ assignment.catalog.prefixed_id
13
+ end
14
+
15
+ # The client-facing type vocabulary: 'company', 'customer_group' —
16
+ # never Ruby class names.
17
+ attribute :assignable_type do |assignment|
18
+ assignment.assignable_type.demodulize.underscore
19
+ end
20
+
21
+ attribute :assignable_id do |assignment|
22
+ assignment.assignable&.prefixed_id
23
+ end
24
+
25
+ attribute :assignable_name do |assignment|
26
+ assignment.assignable.try(:name)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,23 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ # The least a whole order must come to under a catalog's agreement,
6
+ # in one currency.
7
+ class CatalogOrderMinimumSerializer < V3::BaseSerializer
8
+ typelize currency: :string, amount: :string, display_amount: :string
9
+
10
+ attributes :currency, created_at: :iso8601, updated_at: :iso8601
11
+
12
+ attribute :amount do |minimum|
13
+ minimum.amount.to_s
14
+ end
15
+
16
+ attribute :display_amount do |minimum|
17
+ minimum.display_amount.to_s
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,48 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ # What a buyer on one catalog pays for one product, and where that
6
+ # number came from — an explicit amount on the catalog's own list,
7
+ # that list's percentage applied to the base price, or the base price
8
+ # itself, meaning this agreement does not price the product at all
9
+ # (docs/plans/6.0-catalog-agreement-rework.md).
10
+ #
11
+ # Serializes a {Spree::CatalogPrice}, which is resolved rather than
12
+ # stored, so it carries no id.
13
+ class CatalogPriceSerializer < V3::BaseSerializer
14
+ # Resolved rather than stored, so the id is the priced variant's —
15
+ # the thing a client would actually act on. Null on a reading that
16
+ # names no variant.
17
+ _attributes.delete(:id)
18
+
19
+ typelize id: 'string | null', label: 'string | null', sku: 'string | null',
20
+ amount: :string, display_amount: :string,
21
+ currency: :string, source: [:string, enum: Spree::CatalogPrice::SOURCES], break_count: :number
22
+
23
+ # The variant this prices, so a row can name what it is showing —
24
+ # a product's variants can be priced differently, and one figure
25
+ # without a variant beside it names nothing
26
+ # (docs/plans/6.0-volume-pricing.md).
27
+ attribute :id, &:prefixed_id
28
+
29
+ attributes :label, :sku
30
+
31
+ # How many quantity tiers sit above this amount, so the view can say
32
+ # "and three more from a case up" rather than showing one figure as
33
+ # though it were the only one.
34
+ attributes :currency, :source, :break_count
35
+
36
+ attribute :amount, &:display_value
37
+
38
+ attributes :display_amount
39
+
40
+ # The ladder itself, so the agreement page can show what a buyer
41
+ # pays at each threshold without opening the price sheet
42
+ # (docs/plans/6.0-volume-pricing.md).
43
+ many :tiers, resource: proc { Spree.api.admin_catalog_price_tier_serializer }
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,23 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ # One rung of a catalog's quantity ladder: from this quantity up, a
6
+ # buyer on this agreement pays this amount
7
+ # (docs/plans/6.0-volume-pricing.md).
8
+ #
9
+ # Serializes a {Spree::CatalogPriceTier}, which is resolved rather
10
+ # than stored, so it carries no id.
11
+ class CatalogPriceTierSerializer < V3::BaseSerializer
12
+ _attributes.delete(:id)
13
+
14
+ typelize min_quantity: :number, amount: :string, display_amount: :string
15
+
16
+ attributes :min_quantity, :display_amount
17
+
18
+ attribute :amount, &:display_value
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,57 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ # A product as seen from one catalog: what the membership card renders,
6
+ # plus what a buyer on this agreement actually pays for it and where
7
+ # that number comes from.
8
+ #
9
+ # The rows are expanded rather than always sent, because resolving
10
+ # them costs a query per page that the picker and the plain membership
11
+ # listing have no use for (docs/plans/6.0-catalog-agreement-rework.md).
12
+ # There is deliberately no product-level price: the card prices
13
+ # variants, and a figure on the product row would have to pick one
14
+ # variant to speak for the rest (docs/plans/6.0-volume-pricing.md).
15
+ class CatalogProductSerializer < Admin::MembershipProductSerializer
16
+ typelize quantity_rule: ['CatalogProductTerm', nullable: true]
17
+
18
+ # Priced off the same variant the row's own price is read from, so
19
+ # the agreement's amount and the shop's describe the same offer.
20
+ #
21
+ # Null means nothing prices this variant in this currency at all —
22
+ # distinct from a `base` source, which is a real amount the
23
+ # agreement simply does not touch.
24
+ # This product's quantity terms under the agreement, rolled up from
25
+ # the variant rows the page already loaded. Its own request used to
26
+ # fetch every rule in the catalog unpaginated and group them the
27
+ # same way, which is the same object graph this endpoint holds
28
+ # (docs/plans/6.0-volume-pricing.md).
29
+ attribute :quantity_rule, if: proc { expand?('quantity_rule') } do |product|
30
+ rules = params[:catalog_quantity_rules]&.fetch(product.id, nil)
31
+
32
+ if rules.present?
33
+ term = Spree::Catalogs::ProductTerm.new(product: product, rules: rules)
34
+ Spree.api.admin_catalog_product_term_serializer.new(term, params: params).to_h
35
+ end
36
+ end
37
+
38
+ # Every variant with what this agreement charges for it. A product's
39
+ # variants can be priced differently — and carry different quantity
40
+ # ladders — so a single figure on the product row names one variant's
41
+ # deal and hides the rest (docs/plans/6.0-volume-pricing.md).
42
+ # `source:` rather than a plain association: the rows are resolved
43
+ # per request against the catalog's price list, which the serializer
44
+ # receives in params rather than the product carrying it.
45
+ many :catalog_variants,
46
+ resource: proc { Spree.api.admin_catalog_price_serializer },
47
+ if: proc { expand?('catalog_price') },
48
+ source: lambda { |params|
49
+ resolver = params[:catalog_price_resolver]
50
+
51
+ variants.filter_map { |variant| resolver&.call(variant) }
52
+ }
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end