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,55 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Seller
5
+ module Orders
6
+ # Labels on a parcel the seller ships themselves.
7
+ #
8
+ # Recording, printing and deleting are shared with the operator's
9
+ # branch through the concern. Buying and refunding are not: they
10
+ # need the operator's carrier account, so a seller uploads a label
11
+ # bought elsewhere and prints it back.
12
+ #
13
+ # Rooted at the order fetched through `current_seller_orders`, so a
14
+ # fulfillment on somebody else's order reads as missing.
15
+ class LabelsController < BaseController
16
+ include Spree::Api::V3::Orders::ShippingLabelActions
17
+
18
+ before_action :set_resource, only: [:show, :download, :destroy]
19
+
20
+ # POST .../labels
21
+ #
22
+ # Records an uploaded label; a request without a file is refused,
23
+ # since purchase is the operator's.
24
+ def create
25
+ authorize!(:create, Spree::ShippingLabel)
26
+
27
+ if label_params[:file].blank?
28
+ return render_error(
29
+ code: ERROR_CODES[:validation_error],
30
+ message: Spree.t('shipping_labels.errors.file_required'),
31
+ status: :unprocessable_content
32
+ )
33
+ end
34
+
35
+ record_uploaded_label
36
+ end
37
+
38
+ protected
39
+
40
+ def serializer_class
41
+ Spree.api.seller_shipping_label_serializer
42
+ end
43
+
44
+ # The labels and consignments hang off the fulfillment, not the
45
+ # order, so the parent is narrowed one step past the base's.
46
+ def set_parent
47
+ super
48
+ @parent = @order.fulfillments.find_by_prefix_id!(params[:fulfillment_id])
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,82 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Seller
5
+ module Orders
6
+ # The notes on one of this seller's orders: the instructions the
7
+ # buyer left, and the seller's own working note.
8
+ #
9
+ # A marketplace basket splits into one order per seller, so the
10
+ # internal note on this row is the seller's alone — never the
11
+ # operator's note about the whole sale.
12
+ #
13
+ # Singular, because an order has one set of notes: reading and
14
+ # writing them is a resource rather than a verb on the order.
15
+ class NotesController < BaseController
16
+ # The notes are columns on the order, not a nested collection, so
17
+ # there is no member record to fetch.
18
+ skip_before_action :set_resource, raise: false
19
+
20
+ # GET /api/v3/seller/orders/:order_id/notes
21
+ def show
22
+ render json: serialize_resource(@order)
23
+ end
24
+
25
+ # PATCH /api/v3/seller/orders/:order_id/notes
26
+ #
27
+ # Send only the note that changes: an absent key leaves the other
28
+ # alone, while an empty string clears it.
29
+ def update
30
+ attributes = notes_params
31
+ return render_validation_error(missing_notes_errors) if attributes.empty?
32
+
33
+ if @order.update(attributes)
34
+ render json: serialize_resource(@order.reload)
35
+ else
36
+ render_validation_error(@order.errors)
37
+ end
38
+ end
39
+
40
+ protected
41
+
42
+ def model_class
43
+ Spree::Order
44
+ end
45
+
46
+ # The whole order, so a client refreshing a note gets the same
47
+ # shape it renders the page from.
48
+ def serializer_class
49
+ Spree.api.seller_order_serializer
50
+ end
51
+
52
+ def read_actions
53
+ %w[show]
54
+ end
55
+
56
+ private
57
+
58
+ # The rich-text note is written through `internal_note`, which the
59
+ # model sanitizes — the `_html` reader is its round-trip partner,
60
+ # never a write.
61
+ def notes_params
62
+ permitted = params.permit(:customer_note, :internal_note)
63
+
64
+ {}.tap do |attributes|
65
+ attributes[:customer_note] = permitted[:customer_note] if params.key?(:customer_note)
66
+ attributes[:internal_note] = permitted[:internal_note] if params.key?(:internal_note)
67
+ end
68
+ end
69
+
70
+ # A request naming neither note has asked for nothing; saying so
71
+ # beats a 200 that changed nothing.
72
+ def missing_notes_errors
73
+ ActiveModel::Errors.new(@order).tap do |errors|
74
+ errors.add(:base, :blank, message: 'customer_note or internal_note is required')
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,44 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Seller
5
+ module Orders
6
+ # Goods coming back on one of this seller's orders.
7
+ #
8
+ # Every status move reuses the operator's workflow, shared through
9
+ # the concern, so restocking, the tax credit, the refund and the
10
+ # ledger reversal all happen exactly as they do when the marketplace
11
+ # handles the return itself. What is here is what makes it the
12
+ # seller's: the order comes from `current_seller_orders`, so a
13
+ # return on somebody else's order reads as missing rather than
14
+ # denied, and the goods go back onto the seller's own shelf.
15
+ class ReturnsController < BaseController
16
+ include Spree::Api::V3::Orders::ReturnActions
17
+
18
+ before_action :set_resource, only: [:show, :approve, :receive, :refund, :cancel]
19
+
20
+ protected
21
+
22
+ def serializer_class
23
+ Spree.api.seller_return_serializer
24
+ end
25
+
26
+ def collection_includes
27
+ [:reason, :stock_location, { return_line_items: [:variant, :line_item] }]
28
+ end
29
+
30
+ private
31
+
32
+ # The seller's own shelves: returned goods go back into the stock
33
+ # the seller sells from, never a marketplace warehouse.
34
+ def stock_location_for_create
35
+ return nil if create_params[:stock_location_id].blank?
36
+
37
+ current_seller.stock_locations.find_by_prefix_id!(create_params[:stock_location_id])
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,199 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Seller
5
+ # The orders placed with this seller.
6
+ #
7
+ # On a marketplace a basket spanning several sellers is split into one
8
+ # order each, so a seller's orders are their own rows — not a filtered
9
+ # view of somebody else's. The anchor roots `scope` in
10
+ # `current_seller.orders`, so an id belonging to another seller reads
11
+ # as missing rather than denied. Drafts are not this seller's either —
12
+ # neither an in-flight checkout nor the operator's working document —
13
+ # and are unreachable from every endpoint on this branch.
14
+ #
15
+ # Read, cancel, and correct an address. Fulfilling is the
16
+ # fulfillments endpoint under the order, and everything that settles
17
+ # money with the customer — approving, resuming, refunds, payments —
18
+ # stays with the operator, who owns that relationship.
19
+ class OrdersController < Seller::ResourceController
20
+ include Spree::Api::V3::OrderLock
21
+
22
+ scoped_resource :orders
23
+
24
+ before_action :set_resource, only: [:show, :cancel, :address]
25
+
26
+ # PATCH /api/v3/seller/orders/:id/cancel
27
+ #
28
+ # A seller withdrawing from an order they cannot fulfil, naming a
29
+ # reason from the marketplace's own list.
30
+ #
31
+ # `refund_payments` hands back what the buyer paid for these goods.
32
+ # A seller is merchant of record for their own child order, so the
33
+ # party who owes that money back is the party who took it — and on a
34
+ # split checkout the workflow settles through this order's own
35
+ # payment splits, capped at each share, so a seller can never reach
36
+ # a sibling's money.
37
+ #
38
+ # Deliberately takes no `refund_amount`: withdrawing from the whole
39
+ # order returns what that order was paid, and a seller choosing a
40
+ # partial figure is a return, which has its own endpoint and its own
41
+ # bound.
42
+ def cancel
43
+ with_order_lock do
44
+ result = Spree.order_cancel_workflow.call(
45
+ order: @resource,
46
+ canceler: try_spree_current_user,
47
+ reason: cancel_reason,
48
+ note: params[:cancel_note].presence,
49
+ refund_payments: params[:refund_payments].to_b,
50
+ notify_customer: params[:notify_customer].to_b
51
+ )
52
+
53
+ if result.success?
54
+ render json: serialize_resource(@resource.reload)
55
+ else
56
+ render_service_error(@resource.errors.presence || result.error)
57
+ end
58
+ end
59
+ end
60
+
61
+ # PATCH /api/v3/seller/orders/:id/address
62
+ #
63
+ # Corrects where the goods go or who the invoice names. The seller is
64
+ # merchant of record for their own child order, so a delivery address
65
+ # the buyer got wrong is theirs to fix.
66
+ #
67
+ # Its own action rather than a general PATCH: an order's terms are
68
+ # the marketplace's, and a write that took whatever the serializer
69
+ # permits would quietly grow into one a seller could reprice with.
70
+ def address
71
+ # Checked before the lock: an empty payload needs no serialization,
72
+ # and returning out of a locked block is worth avoiding.
73
+ return render_validation_error(missing_address_errors) if sent_addresses.blank?
74
+
75
+ # The merge reads the address it is about to replace, so it runs
76
+ # under the order's lock: two corrections landing together would
77
+ # each lay their fields over the same snapshot, and the later one
78
+ # would undo the earlier one's lines.
79
+ with_order_lock do
80
+ if @resource.update(address_params)
81
+ render json: serialize_resource(@resource.reload)
82
+ else
83
+ render_validation_error(@resource.errors)
84
+ end
85
+ end
86
+ end
87
+
88
+ protected
89
+
90
+ def model_class
91
+ Spree::Order
92
+ end
93
+
94
+ def serializer_class
95
+ Spree.api.seller_order_serializer
96
+ end
97
+
98
+ def read_actions
99
+ %w[index show]
100
+ end
101
+
102
+ # The same exclusion the nested endpoints get from
103
+ # `current_seller_orders`, applied over the inherited scope so its
104
+ # includes and preloading survive.
105
+ def scope
106
+ super.not_drafts
107
+ end
108
+
109
+ def collection_includes
110
+ [:line_items, :customer, :channel]
111
+ end
112
+
113
+ private
114
+
115
+ # Either address, as a correction rather than a replacement: the
116
+ # sent fields are laid over what the order already holds, so a
117
+ # request naming one line does not blank out the country and
118
+ # postcode beside it. The nested writer builds a fresh address row
119
+ # either way, which is what keeps a shared customer address book
120
+ # entry from being rewritten by an order-level fix.
121
+ def sent_addresses
122
+ @sent_addresses ||= params.permit(
123
+ shipping_address: address_permitted_keys,
124
+ billing_address: address_permitted_keys
125
+ ).slice(:shipping_address, :billing_address).reject { |_key, value| value.blank? }
126
+ end
127
+
128
+ def address_params
129
+ permitted = sent_addresses
130
+
131
+ {}.tap do |attributes|
132
+ if permitted[:shipping_address].present?
133
+ attributes[:ship_address_attributes] =
134
+ merged_address(@resource.ship_address, permitted[:shipping_address])
135
+ end
136
+
137
+ if permitted[:billing_address].present?
138
+ attributes[:bill_address_attributes] =
139
+ merged_address(@resource.bill_address, permitted[:billing_address])
140
+ end
141
+ end
142
+ end
143
+
144
+ def merged_address(address, sent)
145
+ current = address ? address.attributes.slice(*address_attribute_names) : {}
146
+ current.merge(sent.to_h)
147
+ end
148
+
149
+ # The permitted keys that are real columns; the rest are the writer
150
+ # aliases a client may send, which have no value to carry over.
151
+ def address_attribute_names
152
+ @address_attribute_names ||=
153
+ address_permitted_keys.map(&:to_s) & Spree::Address.column_names
154
+ end
155
+
156
+ def address_permitted_keys
157
+ [
158
+ :firstname, :lastname, :first_name, :last_name,
159
+ :address1, :address2, :city,
160
+ :country_code, :state_code,
161
+ :zipcode, :postal_code, :phone, :alternative_phone,
162
+ :state_name, :company, :label
163
+ ]
164
+ end
165
+
166
+ # A request naming neither address has asked for nothing; saying so
167
+ # beats a 200 that changed nothing.
168
+ def missing_address_errors
169
+ ActiveModel::Errors.new(@resource).tap do |errors|
170
+ errors.add(:base, :blank, message: 'shipping_address or billing_address is required')
171
+ end
172
+ end
173
+
174
+ # The reason a seller picked, resolved through the store's own list so
175
+ # a reason belonging to another store reads as missing. Optional —
176
+ # the workflow accepts a cancellation with none.
177
+ def cancel_reason
178
+ id = params[:cancel_reason_id].presence
179
+ return if id.nil?
180
+
181
+ current_store.order_cancellation_reasons.find_by_prefix_id!(id)
182
+ end
183
+
184
+ def set_resource
185
+ @resource = find_resource
186
+ @order = @resource # OrderLock reads this
187
+ authorize_resource!(@resource)
188
+ end
189
+
190
+ # Cancelling and correcting an address are both changes to the
191
+ # order, so they need the write key rather than a key of their own.
192
+ def authorize_resource!(resource = @resource, action = action_name.to_sym)
193
+ authorize!(%i[cancel address].include?(action) ? :update : action, resource)
194
+ end
195
+ end
196
+ end
197
+ end
198
+ end
199
+ end
@@ -0,0 +1,100 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Seller
5
+ # What this seller packs their goods into: the boxes their parcels
6
+ # ship in, the cartons their products are packed into, the pallets a
7
+ # wholesale order leaves on (docs/plans/6.0-seller-package-types.md).
8
+ #
9
+ # The listing also carries the marketplace's own packaging, so a
10
+ # seller can pack into the operator's standard cartons rather than
11
+ # re-measuring them. Those rows are read-only: `find_resource` roots
12
+ # writes in the seller's own packaging, so a marketplace row's id is a
13
+ # 404 on every action but `show`.
14
+ #
15
+ # Marking a row default makes it the box this seller's parcels are
16
+ # quoted with — one default per owner, so it never displaces the
17
+ # marketplace's.
18
+ class PackageTypesController < Seller::ResourceController
19
+ scoped_resource :package_types
20
+
21
+ protected
22
+
23
+ def model_class
24
+ Spree::PackageType
25
+ end
26
+
27
+ def serializer_class
28
+ Spree.api.seller_package_type_serializer
29
+ end
30
+
31
+ # Reading shows the seller's own packaging plus the marketplace's —
32
+ # the same set their variants may reference, so a carton picker can
33
+ # ask "what can I pack into" rather than only "what have I
34
+ # measured".
35
+ #
36
+ # `owner=mine` narrows it to the seller's own rows. The packaging
37
+ # settings page asks for that, because a list mixing both owners
38
+ # reads as "packaging is configured" while the seller has recorded
39
+ # nothing — the shipping-box requirement then looks broken rather
40
+ # than outstanding. Not a Ransack predicate: `available_to_seller`
41
+ # composes with `.or()`, so a filter on `seller_id` widens back out
42
+ # to the whole condition instead of narrowing it.
43
+ def scope
44
+ rows = current_store.package_types
45
+ rows = params[:owner] == 'mine' ? rows.for_seller(current_seller) : rows.available_to_seller(current_seller)
46
+ rows.preload_associations_lazily
47
+ end
48
+
49
+ # Writes root in the seller's own rows, so the marketplace's
50
+ # packaging cannot be edited or deleted through this branch.
51
+ def resource_scope
52
+ current_seller.package_types
53
+ end
54
+
55
+ def find_resource
56
+ action_name == 'show' ? super : resource_scope.find_by_prefix_id!(params[:id])
57
+ end
58
+
59
+ # No DISTINCT, so the owner ordering below is legal on PostgreSQL:
60
+ # it rejects an ORDER BY expression that is not in the select list
61
+ # of a SELECT DISTINCT, and `available_to_seller` makes the query
62
+ # distinct through `.or()`. Nothing here needs it — one table, no
63
+ # joins, so no row can appear twice.
64
+ def collection_distinct?
65
+ false
66
+ end
67
+
68
+ # The seller's own rows before the marketplace's, then by name.
69
+ #
70
+ # This list holds two owners' packaging, so it has roughly twice as
71
+ # much to fit under the 100-row page limit as the operator's does.
72
+ # Ordering here rather than in the client is what makes the limit
73
+ # cut the shared rows instead of the seller's own measurements —
74
+ # the page is taken before anything client-side can reorder it.
75
+ # Ransack cannot express it: it drops the direction on `seller_id`,
76
+ # and NULLs sort first ascending.
77
+ #
78
+ # Skipped when the caller asked for its own order.
79
+ def apply_collection_sort(collection)
80
+ return collection if params[:sort].present?
81
+
82
+ collection.order(
83
+ Arel.sql('CASE WHEN seller_id IS NULL THEN 1 ELSE 0 END'),
84
+ Spree::PackageType.arel_table[:name].asc
85
+ )
86
+ end
87
+
88
+ # The same set the operator's controller permits — a seller measures
89
+ # their own packaging, so every field on the shared form is theirs
90
+ # to set. `seller_id` is deliberately absent: ownership comes from
91
+ # the authenticated seller, never the payload.
92
+ def resource_permitted_attributes
93
+ [:name, :kind, :length, :width, :height, :dimensions_unit,
94
+ :weight, :max_weight, :weight_unit, :default, { metadata: {} }]
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,155 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Api
5
+ module V3
6
+ module Seller
7
+ # Password reset for the marketplace seller panel.
8
+ #
9
+ # Parallel to the admin controller rather than a subclass of it, per
10
+ # Decision 10: what differs is the audience it issues and the panel the
11
+ # emailed link opens, and both are the point. A seller resetting their
12
+ # password must end up with a seller session on the seller panel, never
13
+ # an admin one on the dashboard.
14
+ class PasswordResetsController < Spree::Api::V3::BaseController
15
+ include Spree::Api::V3::Seller::AuthCookies
16
+ include Spree::Api::V3::JwtAuthentication
17
+
18
+ # No `skip_scope_check!`: this extends the plain v3 base, which has
19
+ # no authentication or scope gate to lift. The emailed token is the
20
+ # only credential, exactly as on the admin twin.
21
+ rate_limit to: Spree::Api::Config[:rate_limit_password_reset],
22
+ within: Spree::Api::Config[:rate_limit_window].seconds,
23
+ store: Rails.cache,
24
+ with: RATE_LIMIT_RESPONSE
25
+
26
+ # POST /api/v3/seller/auth/password_resets
27
+ def create
28
+ user = Spree.admin_user_class.find_by(email: params[:email])
29
+
30
+ # Staff share this user class, so a match is not enough: a store
31
+ # admin who runs no seller has no panel to be sent to, and mailing
32
+ # them a seller reset link would be an invitation to a session they
33
+ # cannot hold.
34
+ if user&.seller_member?
35
+ user.publish_event('seller_user.password_reset_requested', event_payload(user))
36
+ end
37
+
38
+ # Always 202, whether or not anything matched — this endpoint must
39
+ # not become a way to discover which addresses exist.
40
+ render json: { message: Spree.t(:password_reset_requested, scope: :api) }, status: :accepted
41
+ end
42
+
43
+ # PATCH /api/v3/seller/auth/password_resets/:id
44
+ def update
45
+ user = Spree.admin_user_class.find_by_password_reset_token(params[:id])
46
+
47
+ # Membership is re-checked here rather than trusted from the token:
48
+ # it can be revoked between the email being sent and the link being
49
+ # opened, and signing in is what the success path does.
50
+ return render_token_invalid unless user&.seller_member?
51
+
52
+ unless user.update(password: params[:password], password_confirmation: params[:password_confirmation])
53
+ return render_errors(user.errors)
54
+ end
55
+
56
+ user.publish_event('seller_user.password_reset')
57
+
58
+ # A reset must kill every existing session — a stolen refresh token
59
+ # must not survive the victim resetting their password. Revoked
60
+ # across every audience, since the password is what they all rest
61
+ # on. Then mint the fresh one for this browser.
62
+ Spree::RefreshToken.revoke_all_for(user)
63
+ set_refresh_cookie(
64
+ Spree::RefreshToken.create_for(
65
+ user,
66
+ audience: Spree::Api::V3::JwtAuthentication::JWT_AUDIENCE_SELLER,
67
+ request_env: request_env_for_token
68
+ )
69
+ )
70
+
71
+ render json: auth_response(user)
72
+ end
73
+
74
+ private
75
+
76
+ # A token that no longer belongs to a seller is reported exactly as an
77
+ # expired or forged one: the caller is unauthenticated either way, and
78
+ # distinguishing them would leak that the address is a real account.
79
+ def render_token_invalid
80
+ render_error(
81
+ code: ErrorHandler::ERROR_CODES[:password_reset_token_invalid],
82
+ message: Spree.t(:password_reset_token_invalid, scope: :api),
83
+ status: :unprocessable_content
84
+ )
85
+ end
86
+
87
+ # The store is carried on the event so the mailer can resolve the
88
+ # right panel origin and locale without a request to read them from.
89
+ def event_payload(user)
90
+ store = seller_store(user)
91
+ payload = {
92
+ reset_token: user.generate_token_for(:password_reset),
93
+ email: user.email,
94
+ store_id: store&.prefixed_id
95
+ }
96
+ redirect_url = validated_redirect_url(store)
97
+ payload[:redirect_url] = redirect_url if redirect_url.present?
98
+ payload
99
+ end
100
+
101
+ # Which store's panel to send them to.
102
+ #
103
+ # Derived from the seller, never from `current_store`: this endpoint
104
+ # is unauthenticated, so the request carries no seller header and
105
+ # `current_store` is simply the default store — which on a
106
+ # multi-store install is the wrong marketplace entirely. The seller
107
+ # branch's rule is that the store follows the seller.
108
+ def seller_store(user)
109
+ user.sellers.first&.store
110
+ end
111
+
112
+ # Honoured only when it points somewhere the seller's own store has
113
+ # vouched for. An unvalidated value would let anyone with the reset
114
+ # form turn this endpoint into a token-exfiltration channel, and
115
+ # judging it against the default store's allowlist would let one
116
+ # marketplace's origins approve a link mailed to another's seller.
117
+ # Dropping it leaves the mailer to resolve the panel origin itself.
118
+ def validated_redirect_url(store)
119
+ url = params[:redirect_url].presence
120
+ return unless url && store
121
+ return unless store.allowed_origins.exists? && store.allowed_origin?(url)
122
+
123
+ url
124
+ end
125
+
126
+ # Same shape as the login response, so the panel can sign them
127
+ # straight in rather than bouncing them to a login form.
128
+ def auth_response(user)
129
+ {
130
+ token: generate_jwt(user, audience: Spree::Api::V3::JwtAuthentication::JWT_AUDIENCE_SELLER),
131
+ user: Spree.api.seller_team_member_serializer.new(
132
+ user, params: { store: seller_store(user) }
133
+ ).to_h,
134
+ sellers: serialized_sellers(user)
135
+ }
136
+ end
137
+
138
+ # The panel needs these to choose an X-Spree-Seller-Id before it can
139
+ # make any other request.
140
+ def serialized_sellers(user)
141
+ user.sellers.map { |seller| { id: seller.prefixed_id, name: seller.name, status: seller.status } }
142
+ end
143
+
144
+ def request_env_for_token
145
+ { ip_address: request.remote_ip, user_agent: request.user_agent&.truncate(255) }
146
+ end
147
+
148
+ def jwt_expiration
149
+ Spree::Api::Config[:admin_jwt_expiration]
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,47 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Seller
5
+ # Settlements to this seller — what has been sent, and what is owed.
6
+ #
7
+ # Read-only: a payout is created by the sweep and confirmed by the
8
+ # provider or the operator, never by the seller.
9
+ class PayoutsController < Seller::ResourceController
10
+ scoped_resource :seller_earnings
11
+
12
+ protected
13
+
14
+ def model_class
15
+ Spree::SellerPayout
16
+ end
17
+
18
+ def serializer_class
19
+ Spree.api.seller_payout_serializer
20
+ end
21
+
22
+ def scope
23
+ super.order(created_at: :desc)
24
+ end
25
+
26
+ # See TransfersController: the model class is the operator's subject.
27
+ def authorize_resource!(_resource = @resource, action = action_name.to_sym)
28
+ authorize!(action, :seller_earnings)
29
+ end
30
+
31
+ # One grouped count for the page rather than a query per settlement
32
+ # (the sweep claims transfers with `update_all`, so no counter column
33
+ # could stay right). A single payout read asks for its own.
34
+ def serializer_params
35
+ return super unless action_name == 'index'
36
+
37
+ super.merge(transfer_counts: transfer_counts)
38
+ end
39
+
40
+ def transfer_counts
41
+ @transfer_counts ||= Spree::SellerTransfer.where(payout_id: collection.map(&:id)).group(:payout_id).count
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end