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
@@ -22,7 +22,7 @@ module Spree
22
22
  end
23
23
 
24
24
  def permitted_params
25
- params.permit(:prefix, :codes_count, :amount, :expires_at, :currency)
25
+ params.permit(*model_additional_permitted_attributes, :prefix, :codes_count, :amount, :expires_at, :currency)
26
26
  end
27
27
  end
28
28
  end
@@ -9,7 +9,7 @@ module Spree
9
9
  # `store` and `created_by` are auto-stamped by `build_resource` in
10
10
  # `Spree::Api::V3::ResourceController`, so create requests only need
11
11
  # to include user-facing attributes (amount, currency, expires_at,
12
- # optional code, optional user_id).
12
+ # optional code, optional customer_id).
13
13
  class GiftCardsController < ResourceController
14
14
  scoped_resource :gift_cards
15
15
 
@@ -24,7 +24,8 @@ module Spree
24
24
  end
25
25
 
26
26
  def permitted_params
27
- params.permit(:code, :amount, :expires_at, :user_id, :currency)
27
+ params.permit(*model_additional_permitted_attributes, :code, :amount, :expires_at,
28
+ :customer_id, :currency)
28
29
  end
29
30
  end
30
31
  end
@@ -26,10 +26,15 @@ module Spree
26
26
  def create
27
27
  @resource = build_resource
28
28
  authorize_resource!(@resource, :create)
29
+ # After authorization: a 404 for an unknown list must not tell a
30
+ # caller without import rights whether the id exists.
31
+ assign_price_list(@resource)
29
32
 
30
33
  if @resource.save
31
34
  begin
32
- @resource.start_mapping!
35
+ result = Spree.import_start_mapping_workflow.call(import: @resource)
36
+
37
+ return render_service_error(result.error) unless result.success?
33
38
  rescue ::CSV::MalformedCSVError, EncodingError => e
34
39
  @resource.update_columns(status: 'failed', processing_errors: e.message, updated_at: Time.current)
35
40
  return render_error(
@@ -72,7 +77,10 @@ module Spree
72
77
  apply_mappings!(@resource)
73
78
 
74
79
  if @resource.mapping_done?
75
- @resource.complete_mapping!
80
+ result = Spree.import_complete_mapping_workflow.call(import: @resource)
81
+
82
+ return render_service_error(result.error) unless result.success?
83
+
76
84
  render json: serialize_resource(@resource)
77
85
  else
78
86
  missing = @resource.required_fields - @resource.mappings.mapped.pluck(:schema_field)
@@ -96,7 +104,11 @@ module Spree
96
104
  @resource = find_resource
97
105
  authorize_resource!(@resource, :update)
98
106
 
99
- if @resource.retry_failed_rows
107
+ return if refuse_seller_owned!
108
+
109
+ result = Spree.import_retry_failed_rows_workflow.call(import: @resource)
110
+
111
+ if result.success?
100
112
  render json: serialize_resource(@resource)
101
113
  else
102
114
  render_error(
@@ -136,7 +148,7 @@ module Spree
136
148
 
137
149
  # GET /api/v3/admin/imports/template?type=Spree::Imports::Products
138
150
  #
139
- # CSV header row for the type's schema (including the metafield
151
+ # CSV header row for the type's schema (including the custom_field
140
152
  # columns available for the model) — the "Download template" link
141
153
  # in the admin dashboard.
142
154
  def template
@@ -181,6 +193,19 @@ module Spree
181
193
  redirect_to url, allow_other_host: true, status: :found
182
194
  end
183
195
 
196
+ # DELETE /api/v3/admin/imports/:id
197
+ #
198
+ # An operator deletes their own imports. A seller's is theirs to
199
+ # remove — see `refuse_seller_owned!`.
200
+ def destroy
201
+ @resource = find_resource
202
+ authorize_resource!(@resource, :destroy)
203
+
204
+ return if refuse_seller_owned!
205
+
206
+ super
207
+ end
208
+
184
209
  protected
185
210
 
186
211
  def model_class
@@ -224,8 +249,8 @@ module Spree
224
249
 
225
250
  def build_resource
226
251
  klass = resolve_import_type(permitted_params[:type]) || Spree::Import
227
- attrs = permitted_params.except(:type).merge(
228
- owner: current_store,
252
+ attrs = permitted_params.except(:type, :price_list_id).merge(
253
+ store: current_store,
229
254
  user: acting_admin_user
230
255
  )
231
256
  # The done email links back to results_url — allowed origins only.
@@ -234,7 +259,21 @@ module Spree
234
259
  end
235
260
 
236
261
  def permitted_params
237
- params.permit(:type, :attachment, :preferred_delimiter, :results_url)
262
+ params.permit(*model_additional_permitted_attributes, :type, :attachment, :preferred_delimiter, :results_url, :price_list_id)
263
+ end
264
+
265
+ # A price-list import writes into one list, named by its prefixed id.
266
+ # Resolved through the current store, so another store's list is a
267
+ # 404 rather than a write into it; a type without a list ignores the
268
+ # parameter. `permitted_params` does not normalize, so the raw
269
+ # prefixed id is what arrives here.
270
+ def assign_price_list(import)
271
+ return unless import.respond_to?(:price_list=)
272
+
273
+ prefixed_id = permitted_params[:price_list_id]
274
+ return if prefixed_id.blank?
275
+
276
+ import.price_list = current_store.price_lists.find_by_prefix_id!(prefixed_id)
238
277
  end
239
278
 
240
279
  # Returns the registered Import subclass matching `name`, or nil.
@@ -251,11 +290,35 @@ module Spree
251
290
  return nil if name.blank?
252
291
 
253
292
  name = name.to_s
254
- Spree::Import.available_types.find { |type| type.api_type == name || type.to_s == name }
293
+ Spree::Import.available_types.find { |type| type.api_type == name }
255
294
  end
256
295
 
257
296
  private
258
297
 
298
+ # Refuses a write against an import one of this store's sellers ran,
299
+ # rendering 422 and answering true so the caller returns.
300
+ #
301
+ # An operator can see every import in their marketplace — that is the
302
+ # point of the store-scoped list, and it is what makes a seller's
303
+ # failed rows debuggable. Acting on one is different: a retry re-runs
304
+ # writes into the seller's own catalog, and nothing on the import
305
+ # would record that the operator, rather than the seller, caused
306
+ # them. So reads span the store and writes stay with whoever owns the
307
+ # row.
308
+ #
309
+ # @return [Boolean]
310
+ def refuse_seller_owned!
311
+ return false if @resource.seller_id.blank?
312
+
313
+ render_error(
314
+ code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:validation_error],
315
+ message: Spree.t(:cannot_modify_seller_import, scope: 'api',
316
+ default: "This import belongs to a seller. It can be viewed here, but only the seller can retry or delete it."),
317
+ status: :unprocessable_content
318
+ )
319
+ true
320
+ end
321
+
259
322
  # Imports require a user: row processors resolve records through
260
323
  # `import.current_ability`. JWT requests use the signed-in admin;
261
324
  # API-key requests attribute to the key's creator when that is an
@@ -0,0 +1,67 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ # Credential records for provider gems (delivery rates, tax, ...) —
6
+ # one per (store, type). The types endpoint is the dashboard's
7
+ # gallery source; activation is verified by the model
8
+ # (verify-before-activate), so a failed connection surfaces as a
9
+ # plain 422 on `active`.
10
+ class IntegrationsController < ResourceController
11
+ include Spree::Api::V3::Admin::SubclassedResource
12
+
13
+ scoped_resource :integrations
14
+
15
+ subclassed_via -> { Spree::Integration.registered_classes },
16
+ unknown_type_error: 'unknown_integration_type'
17
+
18
+ # GET /api/v3/admin/integrations/types
19
+ # Pure registry discovery — which integrations are installed and how
20
+ # they're configured. Deliberately carries no per-store connected
21
+ # state: clients cache this long-lived and read live connection
22
+ # state from the integrations list instead.
23
+ def types
24
+ authorize! :create, model_class
25
+
26
+ render json: { data: Spree::Integration.discovery_entries }
27
+ end
28
+
29
+ # POST /api/v3/admin/integrations/:id/test
30
+ # Live connection check; nothing is persisted.
31
+ def test
32
+ @resource = find_resource
33
+ authorize_resource!(@resource, :update)
34
+
35
+ connected = @resource.can_connect?
36
+ render json: { connected: connected, error_message: connected ? nil : @resource.connection_error_message }
37
+ end
38
+
39
+ protected
40
+
41
+ def model_class
42
+ Spree::Integration
43
+ end
44
+
45
+ def serializer_class
46
+ Spree.api.admin_integration_serializer
47
+ end
48
+
49
+ def permitted_params
50
+ params.permit(*model_additional_permitted_attributes, :type, :active, preferences: {})
51
+ end
52
+
53
+ # `types` is read-only discovery — maps to the read scope.
54
+ def read_actions
55
+ super + %w[types]
56
+ end
57
+
58
+ private
59
+
60
+ def build_subclassed_resource(klass, attrs)
61
+ current_store.integrations.build(attrs.merge(type: klass.sti_name))
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -14,7 +14,7 @@ module Spree
14
14
  within: Spree::Api::Config[:rate_limit_window].seconds,
15
15
  store: Rails.cache,
16
16
  only: [:lookup, :accept],
17
- with: RATE_LIMIT_RESPONSE
17
+ with: -> { render_rate_limited(limit: Spree::Api::Config[:rate_limit_login]) }
18
18
 
19
19
  # GET /api/v3/admin/auth/invitations/:id/lookup?token=:token
20
20
  def lookup
@@ -32,13 +32,13 @@ module Spree
32
32
  return if performed?
33
33
 
34
34
  @invitation.invitee = user
35
- @invitation.accept!
35
+ result = Spree.invitation_accept_workflow.call(invitation: @invitation)
36
36
 
37
- refresh_token = Spree::RefreshToken.create_for(user, request_env: request_env_for_token)
37
+ return render_service_error(result.error) unless result.success?
38
+
39
+ refresh_token = Spree::RefreshToken.create_for(user, audience: JWT_AUDIENCE_ADMIN, request_env: request_env_for_token)
38
40
  set_refresh_cookie(refresh_token)
39
41
  render json: auth_response(user)
40
- rescue ActiveRecord::RecordInvalid => e
41
- render_validation_error(e.record.errors)
42
42
  end
43
43
 
44
44
  private
@@ -9,7 +9,9 @@ module Spree
9
9
  class InvitationsController < ResourceController
10
10
  include Spree::Api::V3::Admin::RoleGrantGuard
11
11
 
12
- scoped_resource :settings
12
+ # Staff management is the escalation path — its own scope pair,
13
+ # grantable separately from store configuration (6.0-admin-rbac.md).
14
+ scoped_resource :staff
13
15
 
14
16
  # POST /api/v3/admin/invitations
15
17
  # Guards against inviting a new staff member straight into the admin
@@ -67,6 +69,8 @@ module Spree
67
69
  end
68
70
 
69
71
  # `email` and `role_id` are flat — `role_id` accepts a prefixed ID.
72
+ # No extension union: an invitation carries only the role grant, which is
73
+ # the authorization surface itself, not extensible resource data.
70
74
  def permitted_params
71
75
  attrs = params.permit(:email, :role_id)
72
76
  if attrs[:role_id].present? && Spree::PrefixedId.prefixed_id?(attrs[:role_id])
@@ -6,7 +6,9 @@ module Spree
6
6
  # current store (its supported_locales_list), so the dashboard's locale
7
7
  # switcher enumerates locales instead of hardcoding them.
8
8
  class LocalesController < Admin::BaseController
9
- scoped_resource :settings
9
+ # Reference data the dashboard shell needs regardless of the caller's
10
+ # grant — exempt from the key gate like `/tags` and `/countries`.
11
+ skip_scope_check!
10
12
 
11
13
  # GET /api/v3/admin/locales
12
14
  def index
@@ -7,8 +7,8 @@ module Spree
7
7
  # `scope` chain narrows appropriately when we restrict to
8
8
  # `current_store.markets`.
9
9
  #
10
- # `country_isos` and `supported_locales` are accepted as arrays on the
11
- # wire and translated by model setters (`Spree::Market#country_isos=`,
10
+ # `country_codes` and `supported_locales` are accepted as arrays on the
11
+ # wire and translated by model setters (`Spree::Market#country_codes=`,
12
12
  # `#supported_locales=`).
13
13
  class MarketsController < ResourceController
14
14
  scoped_resource :settings
@@ -24,14 +24,18 @@ module Spree
24
24
  end
25
25
 
26
26
  def collection_includes
27
- [:countries]
27
+ [:market_countries]
28
+ end
29
+
30
+ def scope
31
+ super.ordered
28
32
  end
29
33
 
30
34
  def permitted_params
31
35
  normalize_params(
32
36
  params.permit(
33
- :name, :currency, :default_locale, :tax_inclusive,
34
- :default, :position, supported_locales: [], country_isos: []
37
+ :name, :currency, :default_locale, :tax_inclusive, :tax_provider,
38
+ :default, :position, supported_locales: [], country_codes: []
35
39
  )
36
40
  )
37
41
  end
@@ -3,6 +3,8 @@ module Spree
3
3
  module V3
4
4
  module Admin
5
5
  class MeController < Admin::BaseController
6
+ include Spree::Api::V3::PermissionSerialization
7
+
6
8
  skip_scope_check!
7
9
 
8
10
  before_action :require_current_user!
@@ -63,39 +65,11 @@ module Spree
63
65
  def me_response
64
66
  {
65
67
  user: admin_user_serializer.new(current_user, params: serializer_params).to_h,
66
- permissions: serialize_permissions(current_ability)
68
+ permissions: serialize_permissions(current_ability),
69
+ permission_keys: serialize_permission_keys(current_ability)
67
70
  }
68
71
  end
69
72
 
70
- # Serializes CanCanCan's rules into a flat, JSON-safe list of permission rules.
71
- #
72
- # - Rule order is preserved so the frontend matcher can apply
73
- # CanCanCan's "last matching rule wins" semantics.
74
- # - Per-record conditions are NOT serialized (they often reference
75
- # scopes or blocks that don't translate to JSON). The frontend
76
- # receives `has_conditions: true` as a hint that the action might
77
- # be denied at the per-record level — in practice the SPA shows
78
- # the action optimistically and handles 403 from the API.
79
- def serialize_permissions(ability)
80
- ability.send(:rules).map do |rule|
81
- {
82
- allow: rule.base_behavior,
83
- actions: Array(rule.actions).map(&:to_s),
84
- subjects: Array(rule.subjects).map { |s| s.is_a?(Class) ? s.name : s.to_s },
85
- has_conditions: rule_has_conditions?(rule)
86
- }
87
- end
88
- end
89
-
90
- def rule_has_conditions?(rule)
91
- return true if rule.block.present?
92
- conditions = rule.conditions
93
- return false if conditions.nil?
94
- return !conditions.empty? if conditions.respond_to?(:empty?)
95
-
96
- true
97
- end
98
-
99
73
  def admin_user_serializer
100
74
  Spree.api.admin_admin_user_serializer
101
75
  end
@@ -6,111 +6,161 @@ module Spree
6
6
  scoped_resource :products
7
7
 
8
8
  def create
9
- if permitted_params[:url].present?
9
+ # An external video has no file, so it takes the plain create path
10
+ # even though a URL is present — `url` means "fetch this image from
11
+ # here" and only applies to image rows.
12
+ if permitted_params[:source_media_id].present?
13
+ create_from_library
14
+ elsif permitted_params[:url].present? && !external_video_request?
10
15
  create_from_url
11
16
  elsif permitted_params[:signed_id].present?
12
17
  create_from_signed_id
13
18
  else
14
- @resource = build_resource
15
- authorize_resource!(@resource, :create)
16
-
17
- if @resource.save
18
- render json: serialize_resource(@resource), status: :created
19
- else
20
- render_validation_error(@resource.errors)
21
- end
19
+ authorize_and_create(build_resource)
22
20
  end
23
21
  end
24
22
 
25
23
  protected
26
24
 
25
+ # `url` and `signed_id` say how to *fetch* the bytes; neither is an
26
+ # attribute on the row. A re-synced asset already has its file, so
27
+ # the replay only carries them as leftovers from the create shape.
28
+ def normalize_upsert_params!
29
+ params.delete(:url)
30
+ params.delete(:signed_id)
31
+ end
32
+
27
33
  def model_class
28
- Spree::Asset
34
+ Spree::Media
29
35
  end
30
36
 
31
37
  def serializer_class
32
38
  Spree.api.admin_media_serializer
33
39
  end
34
40
 
41
+ # A product's gallery is part of the product: authorizing the product
42
+ # here is the whole check, and the per-record hook stays a no-op so a
43
+ # media key is never required to manage a product's own pictures.
44
+ # The media keys govern the library.
45
+ def authorize_resource!(resource = @resource, action = action_name.to_sym); end
46
+
35
47
  def set_parent
36
48
  @product = current_store.products.find_by_prefix_id!(params[:product_id])
37
49
  authorize!(:update, @product)
38
50
 
39
51
  @parent = if params[:variant_id].present?
40
- @product.variants_including_master.find_by_prefix_id!(params[:variant_id])
52
+ @product.variants.find_by_prefix_id!(params[:variant_id])
41
53
  else
42
54
  @product
43
55
  end
44
56
  end
45
57
 
46
58
  # Variants store assets via the polymorphic `images` association; products own
47
- # their gallery via `media`. Both resolve to `Spree::Asset` rows with different
59
+ # their gallery via `media`. Both resolve to `Spree::Media` rows with different
48
60
  # `viewable_type` values.
49
61
  def parent_association
50
62
  params[:variant_id].present? ? :images : :media
51
63
  end
52
64
 
53
65
  # For product-scoped listings we surface BOTH product-level assets and any
54
- # legacy master-pinned assets, so existing data keeps showing up while
55
- # merchants migrate. New uploads land on `Spree::Product` (see #set_parent).
66
+ # legacy assets still pinned to the default variant, so existing data keeps
67
+ # showing up while merchants migrate. New uploads land on `Spree::Product`
68
+ # (see #set_parent).
56
69
  def scope
57
70
  return super if params[:variant_id].present?
58
71
 
59
- Spree::Asset.where(
72
+ Spree::Media.where(
60
73
  viewable_type: 'Spree::Product', viewable_id: @product.id
61
74
  ).or(
62
- Spree::Asset.where(
63
- viewable_type: 'Spree::Variant', viewable_id: @product.master&.id
75
+ Spree::Media.where(
76
+ viewable_type: 'Spree::Variant', viewable_id: @product.default_variant&.id
64
77
  )
65
78
  ).order(:position)
66
79
  end
67
80
 
68
- ALLOWED_MEDIA_TYPES = -> { [Spree::Asset, *Spree::Asset.descendants].map(&:name).to_set.freeze }
69
-
70
81
  def build_resource
71
- media_type = permitted_params[:type] || 'Spree::Image'
72
-
73
- unless ALLOWED_MEDIA_TYPES.call.include?(media_type)
74
- raise ArgumentError, "Invalid media type: #{media_type}"
75
- end
76
-
77
- media = @parent.send(parent_association).build(permitted_params.except(:type, :url, :signed_id))
78
- media.type = media_type
82
+ @parent.send(parent_association).build(media_attributes)
83
+ end
79
84
 
80
- media
85
+ # Everything the client sent minus the transport keys — a direct file,
86
+ # the URL to fetch one from, and the library row to copy are ways of
87
+ # getting at a file, not attributes of the row. Leaving `attachment`
88
+ # in let a request carrying it alongside `source_media_id` overwrite
89
+ # the shared blob with an upload, defeating the reuse.
90
+ def media_attributes
91
+ permitted_params.except(:attachment, :url, :signed_id, :source_media_id)
81
92
  end
82
93
 
94
+ # The media file, a URL to fetch one from, and the library row to copy
95
+ # are transport, not attributes — everything a client can set lives on
96
+ # the model.
83
97
  def permitted_params
84
- params.permit(:type, :alt, :position, :attachment, :url, :signed_id, variant_ids: [])
98
+ params.permit(
99
+ *model_additional_permitted_attributes,
100
+ *Spree::Media::WRITABLE_ATTRIBUTES,
101
+ :attachment, :url, :signed_id, :source_media_id,
102
+ variant_ids: []
103
+ )
85
104
  end
86
105
 
87
- def create_from_url
88
- authorize!(:create, Spree::Asset)
106
+ def external_video_request?
107
+ permitted_params[:media_type] == 'external_video'
108
+ end
89
109
 
110
+ def create_from_url
90
111
  url = permitted_params[:url]
91
112
  position = permitted_params[:position]
92
113
 
114
+ # The job runs later, so the identities the connector sent ride
115
+ # along and are written on the media once it exists. All of them:
116
+ # a DAM and a PIM may both name the same asset.
117
+ references = external_reference_params.map { |entry| entry.transform_keys(&:to_s) }
118
+ references = references.presence
119
+
93
120
  Spree::Images::SaveFromUrlJob.perform_later(
94
121
  @parent.id,
95
122
  @parent.class.name,
96
123
  url,
97
- nil,
124
+ references,
98
125
  position
99
126
  )
100
127
 
101
128
  head :accepted
102
129
  end
103
130
 
131
+ # Places a file already in the library onto this product or variant.
132
+ # The copy shares the source's blob, so nothing is uploaded and no
133
+ # rendition is regenerated; it gets its own alt, position and variant
134
+ # links from there on.
135
+ #
136
+ # The source is fetched through the store's own library, so a media id
137
+ # belonging to another store reads as a 404 rather than copying a
138
+ # file across the tenancy boundary.
139
+ def create_from_library
140
+ source = current_store.media.find_by_prefix_id!(permitted_params[:source_media_id])
141
+
142
+ @resource = source.duplicate_for(@parent)
143
+ # Anything the client sent alongside the source wins over what was
144
+ # copied, so a merchant can place a file and correct its alt text
145
+ # for the new context in one request.
146
+ @resource.assign_attributes(media_attributes)
147
+
148
+ authorize_and_create(@resource)
149
+ end
150
+
104
151
  def create_from_signed_id
105
152
  @resource = build_resource
106
153
  @resource.attachment.attach(permitted_params[:signed_id])
107
- authorize_resource!(@resource, :create)
108
154
 
109
- if @resource.save
110
- render json: serialize_resource(@resource), status: :created
111
- else
112
- render_validation_error(@resource.errors)
113
- end
155
+ authorize_and_create(@resource)
156
+ end
157
+
158
+ # The common tail of every create branch. Wraps the base class's
159
+ # save_and_render with the per-record authorization the branches
160
+ # share, since each builds its record a different way.
161
+ def authorize_and_create(media)
162
+ authorize_resource!(media, :create)
163
+ save_and_render(media, status: :created)
114
164
  end
115
165
  end
116
166
  end