spree_api 5.6.1 → 6.0.0.beta2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (542) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +28 -0
  3. data/Rakefile +1 -1
  4. data/app/controllers/concerns/spree/api/v3/address_params.rb +17 -0
  5. data/app/controllers/concerns/spree/api/v3/admin/product_listing.rb +46 -0
  6. data/app/controllers/concerns/spree/api/v3/admin/product_membership.rb +110 -0
  7. data/app/controllers/concerns/spree/api/v3/admin/receivable_actions.rb +68 -0
  8. data/app/controllers/concerns/spree/api/v3/admin/reporting_authorization.rb +27 -0
  9. data/app/controllers/concerns/spree/api/v3/admin/role_grant_guard.rb +69 -33
  10. data/app/controllers/concerns/spree/api/v3/admin/stock_receipt_actions.rb +86 -0
  11. data/app/controllers/concerns/spree/api/v3/admin/store_context.rb +97 -0
  12. data/app/controllers/concerns/spree/api/v3/admin/subclassed_resource.rb +12 -6
  13. data/app/controllers/concerns/spree/api/v3/admin/validation_details.rb +91 -0
  14. data/app/controllers/concerns/spree/api/v3/admin_authentication.rb +20 -5
  15. data/app/controllers/concerns/spree/api/v3/api_key_authentication.rb +41 -5
  16. data/app/controllers/concerns/spree/api/v3/authentication_strategies.rb +48 -0
  17. data/app/controllers/concerns/spree/api/v3/bulk_operations.rb +4 -6
  18. data/app/controllers/concerns/spree/api/v3/cart_resolvable.rb +52 -16
  19. data/app/controllers/concerns/spree/api/v3/company_address_writes.rb +37 -0
  20. data/app/controllers/concerns/spree/api/v3/current_password_confirmation.rb +41 -0
  21. data/app/controllers/concerns/spree/api/v3/direct_uploads.rb +35 -0
  22. data/app/controllers/concerns/spree/api/v3/error_handler.rb +53 -11
  23. data/app/controllers/concerns/spree/api/v3/idempotent.rb +10 -4
  24. data/app/controllers/concerns/spree/api/v3/items_payload.rb +54 -0
  25. data/app/controllers/concerns/spree/api/v3/jwt_authentication.rb +23 -3
  26. data/app/controllers/concerns/spree/api/v3/key_store_context.rb +31 -0
  27. data/app/controllers/concerns/spree/api/v3/locale_and_currency.rb +3 -3
  28. data/app/controllers/concerns/spree/api/v3/order_lock.rb +22 -3
  29. data/app/controllers/concerns/spree/api/v3/orders/claim_actions.rb +112 -0
  30. data/app/controllers/concerns/spree/api/v3/orders/delivery_actions.rb +105 -0
  31. data/app/controllers/concerns/spree/api/v3/orders/exchange_actions.rb +117 -0
  32. data/app/controllers/concerns/spree/api/v3/orders/fulfillment_actions.rb +157 -0
  33. data/app/controllers/concerns/spree/api/v3/orders/post_sale_actions.rb +76 -0
  34. data/app/controllers/concerns/spree/api/v3/orders/return_actions.rb +116 -0
  35. data/app/controllers/concerns/spree/api/v3/orders/shipping_label_actions.rb +128 -0
  36. data/app/controllers/concerns/spree/api/v3/params_normalizer.rb +7 -4
  37. data/app/controllers/concerns/spree/api/v3/permission_serialization.rb +42 -0
  38. data/app/controllers/concerns/spree/api/v3/rate_limit_headers.rb +40 -6
  39. data/app/controllers/concerns/spree/api/v3/scoped_authorization.rb +80 -26
  40. data/app/controllers/concerns/spree/api/v3/seller/auth_cookies.rb +62 -0
  41. data/app/controllers/concerns/spree/api/v3/seller/seller_context.rb +127 -0
  42. data/app/controllers/concerns/spree/api/v3/seller_authentication.rb +40 -0
  43. data/app/controllers/concerns/spree/api/v3/storefront_access.rb +38 -0
  44. data/app/controllers/concerns/spree/api/v3/streams_shipping_label.rb +37 -0
  45. data/app/controllers/concerns/spree/api/v3/tax_identifier_validation.rb +41 -0
  46. data/app/controllers/spree/api/v3/admin/admin_users_controller.rb +11 -14
  47. data/app/controllers/spree/api/v3/admin/allowed_origins_controller.rb +1 -1
  48. data/app/controllers/spree/api/v3/admin/api_keys_controller.rb +18 -9
  49. data/app/controllers/spree/api/v3/admin/auth_controller.rb +138 -22
  50. data/app/controllers/spree/api/v3/admin/base_controller.rb +2 -0
  51. data/app/controllers/spree/api/v3/admin/catalog_assignments_controller.rb +27 -0
  52. data/app/controllers/spree/api/v3/admin/catalogs/base_controller.rb +29 -0
  53. data/app/controllers/spree/api/v3/admin/catalogs/order_minimums_controller.rb +40 -0
  54. data/app/controllers/spree/api/v3/admin/catalogs/products_controller.rb +107 -0
  55. data/app/controllers/spree/api/v3/admin/catalogs/quantity_rules_controller.rb +75 -0
  56. data/app/controllers/spree/api/v3/admin/catalogs_controller.rb +191 -0
  57. data/app/controllers/spree/api/v3/admin/categories/products_controller.rb +28 -41
  58. data/app/controllers/spree/api/v3/admin/categories_controller.rb +16 -7
  59. data/app/controllers/spree/api/v3/admin/channels_controller.rb +50 -2
  60. data/app/controllers/spree/api/v3/admin/claim_reasons_controller.rb +25 -0
  61. data/app/controllers/spree/api/v3/admin/claims_controller.rb +31 -0
  62. data/app/controllers/spree/api/v3/admin/collection_rules_controller.rb +40 -0
  63. data/app/controllers/spree/api/v3/admin/collections/products_controller.rb +101 -0
  64. data/app/controllers/spree/api/v3/admin/collections_controller.rb +56 -0
  65. data/app/controllers/spree/api/v3/admin/commission_lines_controller.rb +39 -0
  66. data/app/controllers/spree/api/v3/admin/commission_rates_controller.rb +174 -0
  67. data/app/controllers/spree/api/v3/admin/companies/addresses_controller.rb +65 -0
  68. data/app/controllers/spree/api/v3/admin/companies/base_controller.rb +29 -0
  69. data/app/controllers/spree/api/v3/admin/companies/invitations_controller.rb +56 -0
  70. data/app/controllers/spree/api/v3/admin/companies/memberships_controller.rb +66 -0
  71. data/app/controllers/spree/api/v3/admin/companies/tax_exemption_certificates_controller.rb +137 -0
  72. data/app/controllers/spree/api/v3/admin/companies/tax_identifiers_controller.rb +46 -0
  73. data/app/controllers/spree/api/v3/admin/companies_controller.rb +59 -0
  74. data/app/controllers/spree/api/v3/admin/concerns/external_references.rb +166 -0
  75. data/app/controllers/spree/api/v3/admin/consent_records_controller.rb +31 -0
  76. data/app/controllers/spree/api/v3/admin/countries_controller.rb +12 -4
  77. data/app/controllers/spree/api/v3/admin/custom_field_definitions_controller.rb +19 -4
  78. data/app/controllers/spree/api/v3/admin/custom_fields_controller.rb +5 -5
  79. data/app/controllers/spree/api/v3/admin/customer_groups_controller.rb +1 -1
  80. data/app/controllers/spree/api/v3/admin/customers/addresses_controller.rb +4 -4
  81. data/app/controllers/spree/api/v3/admin/customers/base_controller.rb +1 -1
  82. data/app/controllers/spree/api/v3/admin/customers/store_credits_controller.rb +2 -3
  83. data/app/controllers/spree/api/v3/admin/customers/tax_identifiers_controller.rb +43 -0
  84. data/app/controllers/spree/api/v3/admin/customers_controller.rb +190 -11
  85. data/app/controllers/spree/api/v3/admin/dashboard_controller.rb +24 -20
  86. data/app/controllers/spree/api/v3/admin/data_requests_controller.rb +60 -0
  87. data/app/controllers/spree/api/v3/admin/delivery_method_rules_controller.rb +54 -0
  88. data/app/controllers/spree/api/v3/admin/delivery_methods/rules_controller.rb +114 -0
  89. data/app/controllers/spree/api/v3/admin/delivery_methods_controller.rb +243 -0
  90. data/app/controllers/spree/api/v3/admin/delivery_profiles/origin_groups_controller.rb +80 -0
  91. data/app/controllers/spree/api/v3/admin/delivery_profiles_controller.rb +107 -0
  92. data/app/controllers/spree/api/v3/admin/delivery_zones_controller.rb +116 -0
  93. data/app/controllers/spree/api/v3/admin/digital_links_controller.rb +48 -0
  94. data/app/controllers/spree/api/v3/admin/direct_uploads_controller.rb +17 -3
  95. data/app/controllers/spree/api/v3/admin/exchanges_controller.rb +31 -0
  96. data/app/controllers/spree/api/v3/admin/exports_controller.rb +2 -2
  97. data/app/controllers/spree/api/v3/admin/gift_card_batches_controller.rb +1 -1
  98. data/app/controllers/spree/api/v3/admin/gift_cards_controller.rb +3 -2
  99. data/app/controllers/spree/api/v3/admin/imports_controller.rb +71 -8
  100. data/app/controllers/spree/api/v3/admin/integrations_controller.rb +67 -0
  101. data/app/controllers/spree/api/v3/admin/invitation_acceptances_controller.rb +5 -5
  102. data/app/controllers/spree/api/v3/admin/invitations_controller.rb +5 -1
  103. data/app/controllers/spree/api/v3/admin/locales_controller.rb +3 -1
  104. data/app/controllers/spree/api/v3/admin/markets_controller.rb +9 -5
  105. data/app/controllers/spree/api/v3/admin/me_controller.rb +4 -30
  106. data/app/controllers/spree/api/v3/admin/media_controller.rb +88 -38
  107. data/app/controllers/spree/api/v3/admin/media_library_controller.rb +156 -0
  108. data/app/controllers/spree/api/v3/admin/option_types_controller.rb +1 -0
  109. data/app/controllers/spree/api/v3/admin/order_cancellation_reasons_controller.rb +25 -0
  110. data/app/controllers/spree/api/v3/admin/order_groups_controller.rb +43 -0
  111. data/app/controllers/spree/api/v3/admin/order_routing_rules_controller.rb +1 -1
  112. data/app/controllers/spree/api/v3/admin/orders/claims_controller.rb +56 -0
  113. data/app/controllers/spree/api/v3/admin/orders/deliveries_controller.rb +66 -0
  114. data/app/controllers/spree/api/v3/admin/orders/discount_codes_controller.rb +86 -0
  115. data/app/controllers/spree/api/v3/admin/orders/discounts_controller.rb +99 -0
  116. data/app/controllers/spree/api/v3/admin/orders/exchanges_controller.rb +62 -0
  117. data/app/controllers/spree/api/v3/admin/orders/fees_controller.rb +83 -0
  118. data/app/controllers/spree/api/v3/admin/orders/fulfillments_controller.rb +45 -67
  119. data/app/controllers/spree/api/v3/admin/orders/items_controller.rb +40 -22
  120. data/app/controllers/spree/api/v3/admin/orders/labels_controller.rb +75 -0
  121. data/app/controllers/spree/api/v3/admin/orders/payments_controller.rb +36 -18
  122. data/app/controllers/spree/api/v3/admin/orders/refunds_controller.rb +39 -18
  123. data/app/controllers/spree/api/v3/admin/orders/returns_controller.rb +70 -0
  124. data/app/controllers/spree/api/v3/admin/orders/store_credits_controller.rb +2 -2
  125. data/app/controllers/spree/api/v3/admin/orders/tax_identifiers_controller.rb +41 -0
  126. data/app/controllers/spree/api/v3/admin/orders/tax_lines_controller.rb +32 -0
  127. data/app/controllers/spree/api/v3/admin/orders_controller.rb +164 -33
  128. data/app/controllers/spree/api/v3/admin/package_types_controller.rb +39 -0
  129. data/app/controllers/spree/api/v3/admin/password_resets_controller.rb +1 -1
  130. data/app/controllers/spree/api/v3/admin/payment_methods_controller.rb +15 -4
  131. data/app/controllers/spree/api/v3/admin/payout_providers_controller.rb +27 -0
  132. data/app/controllers/spree/api/v3/admin/permissions_controller.rb +30 -0
  133. data/app/controllers/spree/api/v3/admin/policies_controller.rb +42 -0
  134. data/app/controllers/spree/api/v3/admin/price_lists/products_controller.rb +93 -0
  135. data/app/controllers/spree/api/v3/admin/price_lists_controller.rb +43 -29
  136. data/app/controllers/spree/api/v3/admin/prices_controller.rb +41 -4
  137. data/app/controllers/spree/api/v3/admin/product_types_controller.rb +93 -0
  138. data/app/controllers/spree/api/v3/admin/products/digital_assets_controller.rb +148 -0
  139. data/app/controllers/spree/api/v3/admin/products/variants_controller.rb +24 -3
  140. data/app/controllers/spree/api/v3/admin/products_controller.rb +149 -33
  141. data/app/controllers/spree/api/v3/admin/promotion_actions_controller.rb +6 -2
  142. data/app/controllers/spree/api/v3/admin/promotion_rules_controller.rb +1 -1
  143. data/app/controllers/spree/api/v3/admin/promotions_controller.rb +1 -5
  144. data/app/controllers/spree/api/v3/admin/purchase_orders/stock_receipts_controller.rb +32 -0
  145. data/app/controllers/spree/api/v3/admin/purchase_orders_controller.rb +161 -0
  146. data/app/controllers/spree/api/v3/admin/refund_reasons_controller.rb +25 -0
  147. data/app/controllers/spree/api/v3/admin/reporting/saved_reports_controller.rb +45 -0
  148. data/app/controllers/spree/api/v3/admin/reporting_controller.rb +95 -0
  149. data/app/controllers/spree/api/v3/admin/resource_controller.rb +27 -10
  150. data/app/controllers/spree/api/v3/admin/return_reasons_controller.rb +25 -0
  151. data/app/controllers/spree/api/v3/admin/returns_controller.rb +31 -0
  152. data/app/controllers/spree/api/v3/admin/roles_controller.rb +50 -6
  153. data/app/controllers/spree/api/v3/admin/seller_payouts_controller.rb +83 -0
  154. data/app/controllers/spree/api/v3/admin/seller_requirement_submissions_controller.rb +139 -0
  155. data/app/controllers/spree/api/v3/admin/seller_requirements_controller.rb +115 -0
  156. data/app/controllers/spree/api/v3/admin/seller_transfers_controller.rb +36 -0
  157. data/app/controllers/spree/api/v3/admin/sellers/balances_controller.rb +44 -0
  158. data/app/controllers/spree/api/v3/admin/sellers/invitations_controller.rb +77 -0
  159. data/app/controllers/spree/api/v3/admin/sellers/payouts_controller.rb +107 -0
  160. data/app/controllers/spree/api/v3/admin/sellers/team_controller.rb +64 -0
  161. data/app/controllers/spree/api/v3/admin/sellers_controller.rb +197 -0
  162. data/app/controllers/spree/api/v3/admin/setup_controller.rb +239 -0
  163. data/app/controllers/spree/api/v3/admin/stock_levels_controller.rb +172 -0
  164. data/app/controllers/spree/api/v3/admin/stock_locations_controller.rb +3 -2
  165. data/app/controllers/spree/api/v3/admin/stock_movements_controller.rb +37 -0
  166. data/app/controllers/spree/api/v3/admin/stock_reservations_controller.rb +1 -1
  167. data/app/controllers/spree/api/v3/admin/stock_transfers/stock_receipts_controller.rb +31 -0
  168. data/app/controllers/spree/api/v3/admin/stock_transfers_controller.rb +134 -38
  169. data/app/controllers/spree/api/v3/admin/store_controller.rb +66 -0
  170. data/app/controllers/spree/api/v3/admin/store_credits/events_controller.rb +47 -0
  171. data/app/controllers/spree/api/v3/admin/store_credits_controller.rb +87 -0
  172. data/app/controllers/spree/api/v3/admin/suppliers_controller.rb +30 -0
  173. data/app/controllers/spree/api/v3/admin/tags_controller.rb +2 -2
  174. data/app/controllers/spree/api/v3/admin/tax_categories_controller.rb +4 -0
  175. data/app/controllers/spree/api/v3/admin/tax_providers_controller.rb +25 -0
  176. data/app/controllers/spree/api/v3/admin/tax_rates_controller.rb +33 -0
  177. data/app/controllers/spree/api/v3/admin/tracking_carriers_controller.rb +33 -0
  178. data/app/controllers/spree/api/v3/admin/translatable_resources_controller.rb +37 -9
  179. data/app/controllers/spree/api/v3/admin/translations_controller.rb +10 -5
  180. data/app/controllers/spree/api/v3/admin/translations_coverage_controller.rb +150 -0
  181. data/app/controllers/spree/api/v3/admin/variants_controller.rb +11 -4
  182. data/app/controllers/spree/api/v3/admin/webhook_endpoints_controller.rb +1 -1
  183. data/app/controllers/spree/api/v3/base_controller.rb +74 -16
  184. data/app/controllers/spree/api/v3/resource_controller.rb +170 -39
  185. data/app/controllers/spree/api/v3/seller/auth_controller.rb +169 -0
  186. data/app/controllers/spree/api/v3/seller/balances_controller.rb +35 -0
  187. data/app/controllers/spree/api/v3/seller/base_controller.rb +25 -0
  188. data/app/controllers/spree/api/v3/seller/claim_reasons_controller.rb +20 -0
  189. data/app/controllers/spree/api/v3/seller/countries_controller.rb +38 -0
  190. data/app/controllers/spree/api/v3/seller/delivery_methods_controller.rb +265 -0
  191. data/app/controllers/spree/api/v3/seller/delivery_profiles_controller.rb +65 -0
  192. data/app/controllers/spree/api/v3/seller/delivery_zones_controller.rb +41 -0
  193. data/app/controllers/spree/api/v3/seller/direct_uploads_controller.rb +21 -0
  194. data/app/controllers/spree/api/v3/seller/exports_controller.rb +195 -0
  195. data/app/controllers/spree/api/v3/seller/import_rows_controller.rb +49 -0
  196. data/app/controllers/spree/api/v3/seller/imports_controller.rb +317 -0
  197. data/app/controllers/spree/api/v3/seller/invitation_acceptances_controller.rb +152 -0
  198. data/app/controllers/spree/api/v3/seller/invitations_controller.rb +71 -0
  199. data/app/controllers/spree/api/v3/seller/me_controller.rb +72 -0
  200. data/app/controllers/spree/api/v3/seller/onboarding_controller.rb +111 -0
  201. data/app/controllers/spree/api/v3/seller/order_cancellation_reasons_controller.rb +25 -0
  202. data/app/controllers/spree/api/v3/seller/orders/base_controller.rb +44 -0
  203. data/app/controllers/spree/api/v3/seller/orders/claims_controller.rb +45 -0
  204. data/app/controllers/spree/api/v3/seller/orders/deliveries_controller.rb +38 -0
  205. data/app/controllers/spree/api/v3/seller/orders/exchanges_controller.rb +50 -0
  206. data/app/controllers/spree/api/v3/seller/orders/fulfillments_controller.rb +79 -0
  207. data/app/controllers/spree/api/v3/seller/orders/labels_controller.rb +55 -0
  208. data/app/controllers/spree/api/v3/seller/orders/notes_controller.rb +82 -0
  209. data/app/controllers/spree/api/v3/seller/orders/returns_controller.rb +44 -0
  210. data/app/controllers/spree/api/v3/seller/orders_controller.rb +199 -0
  211. data/app/controllers/spree/api/v3/seller/package_types_controller.rb +100 -0
  212. data/app/controllers/spree/api/v3/seller/password_resets_controller.rb +155 -0
  213. data/app/controllers/spree/api/v3/seller/payouts_controller.rb +47 -0
  214. data/app/controllers/spree/api/v3/seller/policies_controller.rb +57 -0
  215. data/app/controllers/spree/api/v3/seller/product_types_controller.rb +35 -0
  216. data/app/controllers/spree/api/v3/seller/products_controller.rb +394 -0
  217. data/app/controllers/spree/api/v3/seller/profile_controller.rb +137 -0
  218. data/app/controllers/spree/api/v3/seller/reasons_controller.rb +45 -0
  219. data/app/controllers/spree/api/v3/seller/requirement_submissions_controller.rb +95 -0
  220. data/app/controllers/spree/api/v3/seller/resource_controller.rb +75 -0
  221. data/app/controllers/spree/api/v3/seller/return_reasons_controller.rb +20 -0
  222. data/app/controllers/spree/api/v3/seller/stock_locations_controller.rb +56 -0
  223. data/app/controllers/spree/api/v3/seller/tax_identifiers_controller.rb +48 -0
  224. data/app/controllers/spree/api/v3/seller/team_controller.rb +103 -0
  225. data/app/controllers/spree/api/v3/seller/tracking_carriers_controller.rb +35 -0
  226. data/app/controllers/spree/api/v3/seller/transfers_controller.rb +43 -0
  227. data/app/controllers/spree/api/v3/store/account/companies_controller.rb +42 -0
  228. data/app/controllers/spree/api/v3/store/auth_controller.rb +21 -34
  229. data/app/controllers/spree/api/v3/store/base_controller.rb +4 -0
  230. data/app/controllers/spree/api/v3/store/carts/discount_codes_controller.rb +24 -2
  231. data/app/controllers/spree/api/v3/store/carts/fulfillments_controller.rb +41 -15
  232. data/app/controllers/spree/api/v3/store/carts/items_controller.rb +53 -20
  233. data/app/controllers/spree/api/v3/store/carts/payment_sessions_controller.rb +36 -20
  234. data/app/controllers/spree/api/v3/store/carts/po_documents_controller.rb +111 -0
  235. data/app/controllers/spree/api/v3/store/carts/store_credits_controller.rb +2 -2
  236. data/app/controllers/spree/api/v3/store/carts/tax_identifiers_controller.rb +96 -0
  237. data/app/controllers/spree/api/v3/store/carts_controller.rb +57 -12
  238. data/app/controllers/spree/api/v3/store/categories_controller.rb +6 -3
  239. data/app/controllers/spree/api/v3/store/collections/products_controller.rb +59 -0
  240. data/app/controllers/spree/api/v3/store/collections_controller.rb +36 -0
  241. data/app/controllers/spree/api/v3/store/companies/addresses_controller.rb +81 -0
  242. data/app/controllers/spree/api/v3/store/companies/base_controller.rb +24 -0
  243. data/app/controllers/spree/api/v3/store/companies/invitations_controller.rb +50 -0
  244. data/app/controllers/spree/api/v3/store/companies/members_controller.rb +66 -0
  245. data/app/controllers/spree/api/v3/store/companies/orders_controller.rb +28 -0
  246. data/app/controllers/spree/api/v3/store/companies_controller.rb +47 -0
  247. data/app/controllers/spree/api/v3/store/company_invitations_controller.rb +90 -0
  248. data/app/controllers/spree/api/v3/store/countries_controller.rb +8 -6
  249. data/app/controllers/spree/api/v3/store/customer/addresses_controller.rb +3 -1
  250. data/app/controllers/spree/api/v3/store/customer/data_requests_controller.rb +78 -0
  251. data/app/controllers/spree/api/v3/store/customer/digital_links_controller.rb +52 -0
  252. data/app/controllers/spree/api/v3/store/customer/orders_controller.rb +6 -0
  253. data/app/controllers/spree/api/v3/store/customer/password_resets_controller.rb +7 -3
  254. data/app/controllers/spree/api/v3/store/customer/payment_setup_sessions_controller.rb +3 -3
  255. data/app/controllers/spree/api/v3/store/customer/store_credits_controller.rb +0 -3
  256. data/app/controllers/spree/api/v3/store/customer/tax_identifiers_controller.rb +91 -0
  257. data/app/controllers/spree/api/v3/store/customers_controller.rb +26 -31
  258. data/app/controllers/spree/api/v3/store/data_feeds_controller.rb +11 -0
  259. data/app/controllers/spree/api/v3/store/data_request_downloads_controller.rb +58 -0
  260. data/app/controllers/spree/api/v3/store/delivery_methods_controller.rb +108 -0
  261. data/app/controllers/spree/api/v3/store/digital_links_controller.rb +105 -0
  262. data/app/controllers/spree/api/v3/store/markets/countries_controller.rb +5 -9
  263. data/app/controllers/spree/api/v3/store/markets_controller.rb +4 -4
  264. data/app/controllers/spree/api/v3/store/newsletter_subscribers_controller.rb +8 -9
  265. data/app/controllers/spree/api/v3/store/orders/claims_controller.rb +94 -0
  266. data/app/controllers/spree/api/v3/store/orders/returns_controller.rb +116 -0
  267. data/app/controllers/spree/api/v3/store/orders/tax_identifiers_controller.rb +46 -0
  268. data/app/controllers/spree/api/v3/store/orders_controller.rb +12 -15
  269. data/app/controllers/spree/api/v3/store/products/filters_controller.rb +10 -3
  270. data/app/controllers/spree/api/v3/store/products_controller.rb +25 -6
  271. data/app/controllers/spree/api/v3/store/resource_controller.rb +2 -0
  272. data/app/controllers/spree/api/v3/store/sellers_controller.rb +43 -0
  273. data/app/controllers/spree/api/v3/store/wishlist_items_controller.rb +9 -6
  274. data/app/controllers/spree/api/v3/store/wishlists_controller.rb +3 -3
  275. data/app/controllers/spree/api/v3/webhooks/fulfillments_controller.rb +88 -0
  276. data/app/controllers/spree/api/v3/webhooks/payments_controller.rb +5 -2
  277. data/app/controllers/spree/api/v3/webhooks/payouts_controller.rb +61 -0
  278. data/app/models/spree/api/data_request_urls.rb +25 -0
  279. data/app/models/spree/api/digital_link_urls.rb +26 -0
  280. data/app/serializers/spree/api/v3/address_serializer.rb +17 -5
  281. data/app/serializers/spree/api/v3/admin/actor_serializer.rb +28 -0
  282. data/app/serializers/spree/api/v3/admin/address_serializer.rb +27 -4
  283. data/app/serializers/spree/api/v3/admin/admin_user_serializer.rb +13 -10
  284. data/app/serializers/spree/api/v3/admin/api_key_serializer.rb +15 -2
  285. data/app/serializers/spree/api/v3/admin/applied_promotion_serializer.rb +15 -0
  286. data/app/serializers/spree/api/v3/admin/cart_serializer.rb +34 -0
  287. data/app/serializers/spree/api/v3/admin/catalog_assignment_serializer.rb +32 -0
  288. data/app/serializers/spree/api/v3/admin/catalog_order_minimum_serializer.rb +23 -0
  289. data/app/serializers/spree/api/v3/admin/catalog_price_serializer.rb +48 -0
  290. data/app/serializers/spree/api/v3/admin/catalog_price_tier_serializer.rb +23 -0
  291. data/app/serializers/spree/api/v3/admin/catalog_product_serializer.rb +57 -0
  292. data/app/serializers/spree/api/v3/admin/catalog_product_term_serializer.rb +38 -0
  293. data/app/serializers/spree/api/v3/admin/catalog_quantity_rule_serializer.rb +37 -0
  294. data/app/serializers/spree/api/v3/admin/catalog_serializer.rb +46 -0
  295. data/app/serializers/spree/api/v3/admin/category_serializer.rb +3 -2
  296. data/app/serializers/spree/api/v3/admin/channel_serializer.rb +15 -1
  297. data/app/serializers/spree/api/v3/admin/claim_line_item_serializer.rb +16 -0
  298. data/app/serializers/spree/api/v3/admin/claim_reason_serializer.rb +21 -0
  299. data/app/serializers/spree/api/v3/admin/claim_serializer.rb +28 -0
  300. data/app/serializers/spree/api/v3/admin/collection_rule_serializer.rb +22 -0
  301. data/app/serializers/spree/api/v3/admin/collection_serializer.rb +29 -0
  302. data/app/serializers/spree/api/v3/admin/commission_line_serializer.rb +67 -0
  303. data/app/serializers/spree/api/v3/admin/commission_rate_serializer.rb +69 -0
  304. data/app/serializers/spree/api/v3/admin/commission_rule_serializer.rb +61 -0
  305. data/app/serializers/spree/api/v3/admin/company_invitation_serializer.rb +15 -0
  306. data/app/serializers/spree/api/v3/admin/company_membership_serializer.rb +11 -0
  307. data/app/serializers/spree/api/v3/admin/company_serializer.rb +37 -0
  308. data/app/serializers/spree/api/v3/admin/concerns/external_references_attribute.rb +33 -0
  309. data/app/serializers/spree/api/v3/admin/consent_record_serializer.rb +28 -0
  310. data/app/serializers/spree/api/v3/admin/country_serializer.rb +2 -2
  311. data/app/serializers/spree/api/v3/admin/credit_card_serializer.rb +1 -1
  312. data/app/serializers/spree/api/v3/admin/custom_field_definition_serializer.rb +2 -2
  313. data/app/serializers/spree/api/v3/admin/custom_field_serializer.rb +2 -2
  314. data/app/serializers/spree/api/v3/admin/customer_serializer.rb +23 -22
  315. data/app/serializers/spree/api/v3/admin/dashboard_counter_serializer.rb +24 -0
  316. data/app/serializers/spree/api/v3/admin/data_request_serializer.rb +36 -0
  317. data/app/serializers/spree/api/v3/admin/delivery_method_rule_serializer.rb +32 -0
  318. data/app/serializers/spree/api/v3/admin/delivery_method_serializer.rb +66 -1
  319. data/app/serializers/spree/api/v3/admin/delivery_method_service_serializer.rb +15 -0
  320. data/app/serializers/spree/api/v3/admin/delivery_origin_group_serializer.rb +34 -0
  321. data/app/serializers/spree/api/v3/admin/delivery_profile_serializer.rb +65 -0
  322. data/app/serializers/spree/api/v3/admin/delivery_rate_serializer.rb +10 -1
  323. data/app/serializers/spree/api/v3/admin/delivery_serializer.rb +20 -0
  324. data/app/serializers/spree/api/v3/admin/delivery_zone_member_serializer.rb +11 -0
  325. data/app/serializers/spree/api/v3/admin/delivery_zone_serializer.rb +29 -0
  326. data/app/serializers/spree/api/v3/admin/digital_asset_serializer.rb +59 -0
  327. data/app/serializers/spree/api/v3/admin/discount_serializer.rb +3 -4
  328. data/app/serializers/spree/api/v3/admin/exchange_line_item_serializer.rb +16 -0
  329. data/app/serializers/spree/api/v3/admin/exchange_serializer.rb +34 -0
  330. data/app/serializers/spree/api/v3/admin/export_serializer.rb +20 -1
  331. data/app/serializers/spree/api/v3/admin/fee_serializer.rb +14 -0
  332. data/app/serializers/spree/api/v3/admin/freight_summary_line_serializer.rb +46 -0
  333. data/app/serializers/spree/api/v3/admin/freight_summary_serializer.rb +16 -0
  334. data/app/serializers/spree/api/v3/admin/fulfillment_item_serializer.rb +39 -0
  335. data/app/serializers/spree/api/v3/admin/fulfillment_serializer.rb +31 -9
  336. data/app/serializers/spree/api/v3/admin/gift_card_serializer.rb +2 -3
  337. data/app/serializers/spree/api/v3/admin/import_serializer.rb +15 -2
  338. data/app/serializers/spree/api/v3/admin/integration_serializer.rb +32 -0
  339. data/app/serializers/spree/api/v3/admin/invitation_serializer.rb +4 -4
  340. data/app/serializers/spree/api/v3/admin/line_item_serializer.rb +46 -5
  341. data/app/serializers/spree/api/v3/admin/market_serializer.rb +5 -1
  342. data/app/serializers/spree/api/v3/admin/media_serializer.rb +50 -2
  343. data/app/serializers/spree/api/v3/admin/membership_product_serializer.rb +29 -0
  344. data/app/serializers/spree/api/v3/admin/order_cancellation_reason_serializer.rb +29 -0
  345. data/app/serializers/spree/api/v3/admin/order_group_serializer.rb +50 -0
  346. data/app/serializers/spree/api/v3/admin/order_routing_rule_serializer.rb +2 -6
  347. data/app/serializers/spree/api/v3/admin/order_serializer.rb +126 -31
  348. data/app/serializers/spree/api/v3/admin/package_type_serializer.rb +53 -0
  349. data/app/serializers/spree/api/v3/admin/payment_method_serializer.rb +8 -2
  350. data/app/serializers/spree/api/v3/admin/payment_serializer.rb +6 -0
  351. data/app/serializers/spree/api/v3/admin/payment_split_serializer.rb +41 -0
  352. data/app/serializers/spree/api/v3/admin/permission_serializer.rb +39 -0
  353. data/app/serializers/spree/api/v3/admin/policy_serializer.rb +11 -0
  354. data/app/serializers/spree/api/v3/admin/price_adjustment_tier_serializer.rb +22 -0
  355. data/app/serializers/spree/api/v3/admin/price_list_product_serializer.rb +32 -0
  356. data/app/serializers/spree/api/v3/admin/price_list_serializer.rb +20 -8
  357. data/app/serializers/spree/api/v3/admin/price_rule_serializer.rb +2 -12
  358. data/app/serializers/spree/api/v3/admin/price_serializer.rb +3 -0
  359. data/app/serializers/spree/api/v3/admin/product_serializer.rb +54 -8
  360. data/app/serializers/spree/api/v3/admin/product_submission_serializer.rb +39 -0
  361. data/app/serializers/spree/api/v3/admin/product_type_custom_field_definition_serializer.rb +44 -0
  362. data/app/serializers/spree/api/v3/admin/product_type_serializer.rb +34 -0
  363. data/app/serializers/spree/api/v3/admin/promotion_action_serializer.rb +6 -12
  364. data/app/serializers/spree/api/v3/admin/promotion_rule_serializer.rb +17 -15
  365. data/app/serializers/spree/api/v3/admin/purchase_order_item_serializer.rb +80 -0
  366. data/app/serializers/spree/api/v3/admin/purchase_order_serializer.rb +94 -0
  367. data/app/serializers/spree/api/v3/admin/refund_reason_serializer.rb +27 -0
  368. data/app/serializers/spree/api/v3/admin/refund_serializer.rb +6 -5
  369. data/app/serializers/spree/api/v3/admin/reporting_result_serializer.rb +72 -0
  370. data/app/serializers/spree/api/v3/admin/return_line_item_serializer.rb +16 -0
  371. data/app/serializers/spree/api/v3/admin/return_reason_serializer.rb +21 -0
  372. data/app/serializers/spree/api/v3/admin/return_serializer.rb +58 -0
  373. data/app/serializers/spree/api/v3/admin/role_serializer.rb +24 -6
  374. data/app/serializers/spree/api/v3/admin/saved_report_serializer.rb +32 -0
  375. data/app/serializers/spree/api/v3/admin/seller_balance_serializer.rb +37 -0
  376. data/app/serializers/spree/api/v3/admin/seller_payout_serializer.rb +46 -0
  377. data/app/serializers/spree/api/v3/admin/seller_requirement_serializer.rb +68 -0
  378. data/app/serializers/spree/api/v3/admin/seller_requirement_status_serializer.rb +48 -0
  379. data/app/serializers/spree/api/v3/admin/seller_requirement_submission_serializer.rb +57 -0
  380. data/app/serializers/spree/api/v3/admin/seller_serializer.rb +92 -0
  381. data/app/serializers/spree/api/v3/admin/seller_team_member_serializer.rb +29 -0
  382. data/app/serializers/spree/api/v3/admin/seller_transfer_serializer.rb +53 -0
  383. data/app/serializers/spree/api/v3/admin/shipping_label_serializer.rb +82 -0
  384. data/app/serializers/spree/api/v3/admin/state_serializer.rb +1 -1
  385. data/app/serializers/spree/api/v3/admin/stock_level_serializer.rb +65 -0
  386. data/app/serializers/spree/api/v3/admin/stock_location_serializer.rb +20 -4
  387. data/app/serializers/spree/api/v3/admin/stock_movement_serializer.rb +116 -0
  388. data/app/serializers/spree/api/v3/admin/stock_receipt_item_serializer.rb +57 -0
  389. data/app/serializers/spree/api/v3/admin/stock_receipt_serializer.rb +48 -0
  390. data/app/serializers/spree/api/v3/admin/stock_reservation_serializer.rb +5 -5
  391. data/app/serializers/spree/api/v3/admin/stock_transfer_item_serializer.rb +57 -0
  392. data/app/serializers/spree/api/v3/admin/stock_transfer_serializer.rb +36 -16
  393. data/app/serializers/spree/api/v3/admin/store_credit_event_serializer.rb +32 -0
  394. data/app/serializers/spree/api/v3/admin/store_credit_serializer.rb +42 -7
  395. data/app/serializers/spree/api/v3/admin/store_serializer.rb +65 -1
  396. data/app/serializers/spree/api/v3/admin/supplier_serializer.rb +39 -0
  397. data/app/serializers/spree/api/v3/admin/tax_exemption_certificate_serializer.rb +67 -0
  398. data/app/serializers/spree/api/v3/admin/tax_identifier_serializer.rb +43 -0
  399. data/app/serializers/spree/api/v3/admin/tax_line_serializer.rb +21 -0
  400. data/app/serializers/spree/api/v3/admin/tax_rate_serializer.rb +49 -0
  401. data/app/serializers/spree/api/v3/admin/variant_serializer.rb +49 -8
  402. data/app/serializers/spree/api/v3/applied_promotion_serializer.rb +23 -0
  403. data/app/serializers/spree/api/v3/base_serializer.rb +61 -2
  404. data/app/serializers/spree/api/v3/cart_serializer.rb +90 -12
  405. data/app/serializers/spree/api/v3/category_serializer.rb +3 -3
  406. data/app/serializers/spree/api/v3/claim_line_item_serializer.rb +50 -0
  407. data/app/serializers/spree/api/v3/claim_reason_serializer.rb +20 -0
  408. data/app/serializers/spree/api/v3/claim_serializer.rb +62 -0
  409. data/app/serializers/spree/api/v3/collection_serializer.rb +41 -0
  410. data/app/serializers/spree/api/v3/company_invitation_serializer.rb +28 -0
  411. data/app/serializers/spree/api/v3/company_membership_serializer.rb +28 -0
  412. data/app/serializers/spree/api/v3/company_serializer.rb +33 -0
  413. data/app/serializers/spree/api/v3/custom_field_serializer.rb +2 -2
  414. data/app/serializers/spree/api/v3/customer_serializer.rb +9 -1
  415. data/app/serializers/spree/api/v3/data_request_event_serializer.rb +30 -0
  416. data/app/serializers/spree/api/v3/data_request_serializer.rb +40 -0
  417. data/app/serializers/spree/api/v3/delivery_method_serializer.rb +12 -2
  418. data/app/serializers/spree/api/v3/delivery_rate_serializer.rb +34 -17
  419. data/app/serializers/spree/api/v3/delivery_serializer.rb +29 -0
  420. data/app/serializers/spree/api/v3/delivery_zone_member_serializer.rb +29 -0
  421. data/app/serializers/spree/api/v3/delivery_zone_serializer.rb +13 -0
  422. data/app/serializers/spree/api/v3/digital_asset_serializer.rb +23 -0
  423. data/app/serializers/spree/api/v3/digital_link_serializer.rb +6 -2
  424. data/app/serializers/spree/api/v3/discount_serializer.rb +21 -7
  425. data/app/serializers/spree/api/v3/exchange_line_item_serializer.rb +53 -0
  426. data/app/serializers/spree/api/v3/exchange_serializer.rb +61 -0
  427. data/app/serializers/spree/api/v3/fee_serializer.rb +27 -0
  428. data/app/serializers/spree/api/v3/freight_summary_serializer.rb +38 -0
  429. data/app/serializers/spree/api/v3/fulfillment_serializer.rb +28 -15
  430. data/app/serializers/spree/api/v3/gift_card_serializer.rb +2 -2
  431. data/app/serializers/spree/api/v3/import_row_serializer.rb +1 -1
  432. data/app/serializers/spree/api/v3/import_serializer.rb +18 -4
  433. data/app/serializers/spree/api/v3/invitation_serializer.rb +1 -1
  434. data/app/serializers/spree/api/v3/line_item_serializer.rb +18 -1
  435. data/app/serializers/spree/api/v3/market_serializer.rb +2 -2
  436. data/app/serializers/spree/api/v3/{asset_serializer.rb → media_event_serializer.rb} +4 -4
  437. data/app/serializers/spree/api/v3/media_serializer.rb +48 -7
  438. data/app/serializers/spree/api/v3/newsletter_subscriber_serializer.rb +1 -1
  439. data/app/serializers/spree/api/v3/option_type_serializer.rb +1 -1
  440. data/app/serializers/spree/api/v3/order_group_serializer.rb +60 -0
  441. data/app/serializers/spree/api/v3/order_serializer.rb +58 -6
  442. data/app/serializers/spree/api/v3/payment_method_serializer.rb +1 -1
  443. data/app/serializers/spree/api/v3/payment_serializer.rb +2 -6
  444. data/app/serializers/spree/api/v3/payment_session_serializer.rb +10 -3
  445. data/app/serializers/spree/api/v3/payment_setup_session_serializer.rb +1 -1
  446. data/app/serializers/spree/api/v3/policy_serializer.rb +7 -2
  447. data/app/serializers/spree/api/v3/product_filter_option_serializer.rb +1 -1
  448. data/app/serializers/spree/api/v3/product_serializer.rb +42 -10
  449. data/app/serializers/spree/api/v3/product_type_serializer.rb +17 -0
  450. data/app/serializers/spree/api/v3/purchase_order_event_serializer.rb +11 -0
  451. data/app/serializers/spree/api/v3/refund_serializer.rb +9 -3
  452. data/app/serializers/spree/api/v3/return_line_item_serializer.rb +42 -0
  453. data/app/serializers/spree/api/v3/return_reason_serializer.rb +20 -0
  454. data/app/serializers/spree/api/v3/return_serializer.rb +62 -0
  455. data/app/serializers/spree/api/v3/seller/balance_serializer.rb +35 -0
  456. data/app/serializers/spree/api/v3/seller/claim_line_item_serializer.rb +21 -0
  457. data/app/serializers/spree/api/v3/seller/claim_serializer.rb +25 -0
  458. data/app/serializers/spree/api/v3/seller/delivery_method_rule_serializer.rb +32 -0
  459. data/app/serializers/spree/api/v3/seller/delivery_method_serializer.rb +59 -0
  460. data/app/serializers/spree/api/v3/seller/delivery_profile_serializer.rb +26 -0
  461. data/app/serializers/spree/api/v3/seller/delivery_rate_serializer.rb +35 -0
  462. data/app/serializers/spree/api/v3/seller/delivery_serializer.rb +17 -0
  463. data/app/serializers/spree/api/v3/seller/delivery_zone_serializer.rb +26 -0
  464. data/app/serializers/spree/api/v3/seller/exchange_line_item_serializer.rb +29 -0
  465. data/app/serializers/spree/api/v3/seller/exchange_serializer.rb +30 -0
  466. data/app/serializers/spree/api/v3/seller/export_serializer.rb +44 -0
  467. data/app/serializers/spree/api/v3/seller/fulfillment_item_serializer.rb +43 -0
  468. data/app/serializers/spree/api/v3/seller/fulfillment_serializer.rb +76 -0
  469. data/app/serializers/spree/api/v3/seller/import_mapping_serializer.rb +20 -0
  470. data/app/serializers/spree/api/v3/seller/import_row_serializer.rb +17 -0
  471. data/app/serializers/spree/api/v3/seller/import_serializer.rb +77 -0
  472. data/app/serializers/spree/api/v3/seller/invitation_serializer.rb +29 -0
  473. data/app/serializers/spree/api/v3/seller/media_serializer.rb +26 -0
  474. data/app/serializers/spree/api/v3/seller/order_line_item_serializer.rb +44 -0
  475. data/app/serializers/spree/api/v3/seller/order_serializer.rb +119 -0
  476. data/app/serializers/spree/api/v3/seller/package_type_serializer.rb +52 -0
  477. data/app/serializers/spree/api/v3/seller/payment_split_serializer.rb +34 -0
  478. data/app/serializers/spree/api/v3/seller/payout_serializer.rb +36 -0
  479. data/app/serializers/spree/api/v3/seller/policy_serializer.rb +11 -0
  480. data/app/serializers/spree/api/v3/seller/product_serializer.rb +60 -0
  481. data/app/serializers/spree/api/v3/seller/product_submission_serializer.rb +30 -0
  482. data/app/serializers/spree/api/v3/seller/product_type_serializer.rb +29 -0
  483. data/app/serializers/spree/api/v3/seller/profile_serializer.rb +77 -0
  484. data/app/serializers/spree/api/v3/seller/reason_serializer.rb +24 -0
  485. data/app/serializers/spree/api/v3/seller/requirement_custom_field_serializer.rb +36 -0
  486. data/app/serializers/spree/api/v3/seller/requirement_status_serializer.rb +62 -0
  487. data/app/serializers/spree/api/v3/seller/requirement_submission_serializer.rb +33 -0
  488. data/app/serializers/spree/api/v3/seller/return_line_item_serializer.rb +24 -0
  489. data/app/serializers/spree/api/v3/seller/return_serializer.rb +51 -0
  490. data/app/serializers/spree/api/v3/seller/shipping_label_serializer.rb +23 -0
  491. data/app/serializers/spree/api/v3/seller/stock_level_serializer.rb +27 -0
  492. data/app/serializers/spree/api/v3/seller/stock_location_serializer.rb +17 -0
  493. data/app/serializers/spree/api/v3/seller/tax_identifier_serializer.rb +15 -0
  494. data/app/serializers/spree/api/v3/seller/team_member_serializer.rb +22 -0
  495. data/app/serializers/spree/api/v3/seller/transfer_serializer.rb +49 -0
  496. data/app/serializers/spree/api/v3/seller/variant_serializer.rb +71 -0
  497. data/app/serializers/spree/api/v3/seller_serializer.rb +50 -0
  498. data/app/serializers/spree/api/v3/shipping_label_event_serializer.rb +11 -0
  499. data/app/serializers/spree/api/v3/{stock_item_serializer.rb → stock_level_serializer.rb} +5 -5
  500. data/app/serializers/spree/api/v3/stock_location_serializer.rb +11 -7
  501. data/app/serializers/spree/api/v3/stock_movement_serializer.rb +8 -15
  502. data/app/serializers/spree/api/v3/stock_receipt_event_serializer.rb +11 -0
  503. data/app/serializers/spree/api/v3/stock_transfer_serializer.rb +6 -6
  504. data/app/serializers/spree/api/v3/store_credit_event_serializer.rb +29 -0
  505. data/app/serializers/spree/api/v3/supplier_event_serializer.rb +11 -0
  506. data/app/serializers/spree/api/v3/tax_identifier_serializer.rb +15 -0
  507. data/app/serializers/spree/api/v3/tax_line_serializer.rb +37 -0
  508. data/app/serializers/spree/api/v3/variant_serializer.rb +52 -2
  509. data/app/serializers/spree/api/v3/wishlist_item_serializer.rb +6 -6
  510. data/app/serializers/spree/api/v3/wishlist_serializer.rb +1 -1
  511. data/app/services/spree/api/v3/filters_aggregator.rb +14 -12
  512. data/app/services/spree/webhooks/deliver_webhook.rb +62 -26
  513. data/app/subscribers/spree/webhook_event_subscriber.rb +9 -5
  514. data/config/brakeman.ignore +1 -1
  515. data/config/initializers/typelizer.rb +51 -4
  516. data/config/locales/en.yml +5 -0
  517. data/config/routes.rb +730 -22
  518. data/lib/spree/api/configuration.rb +19 -19
  519. data/lib/spree/api/dependencies.rb +174 -227
  520. data/lib/spree/api/engine.rb +6 -0
  521. data/lib/spree/api/openapi/schema_helper.rb +179 -13
  522. data/lib/spree/api/testing_support/v3/base.rb +45 -15
  523. data/lib/spree/api.rb +10 -4
  524. data/lib/typelizer/open_enums.rb +35 -0
  525. metadata +342 -27
  526. data/app/controllers/spree/api/v3/admin/orders/adjustments_controller.rb +0 -25
  527. data/app/controllers/spree/api/v3/admin/stock_items_controller.rb +0 -42
  528. data/app/controllers/spree/api/v3/admin/store_credit_categories_controller.rb +0 -21
  529. data/app/controllers/spree/api/v3/store/digitals_controller.rb +0 -38
  530. data/app/serializers/spree/api/v3/admin/adjustment_serializer.rb +0 -24
  531. data/app/serializers/spree/api/v3/admin/dashboard_analytics_serializer.rb +0 -143
  532. data/app/serializers/spree/api/v3/admin/reimbursement_serializer.rb +0 -15
  533. data/app/serializers/spree/api/v3/admin/return_authorization_serializer.rb +0 -19
  534. data/app/serializers/spree/api/v3/admin/stock_item_serializer.rb +0 -34
  535. data/app/serializers/spree/api/v3/admin/store_credit_category_serializer.rb +0 -19
  536. data/app/serializers/spree/api/v3/customer_return_serializer.rb +0 -17
  537. data/app/serializers/spree/api/v3/digital_serializer.rb +0 -17
  538. data/app/serializers/spree/api/v3/reimbursement_serializer.rb +0 -27
  539. data/app/serializers/spree/api/v3/report_serializer.rb +0 -34
  540. data/app/serializers/spree/api/v3/return_authorization_serializer.rb +0 -31
  541. data/app/serializers/spree/api/v3/return_item_serializer.rb +0 -53
  542. data/app/serializers/spree/api/v3/shipping_category_serializer.rb +0 -11
@@ -0,0 +1,107 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ # Fulfillment profiles — the grouping that decides how a set of
6
+ # products ships (origins, zones, methods). Stock-location membership
7
+ # is managed atomically through the profile: `stock_location_ids`
8
+ # replaces the full set; an empty array means every store location.
9
+ class DeliveryProfilesController < ResourceController
10
+ scoped_resource :settings
11
+
12
+ # GET /api/v3/admin/delivery_profiles/kinds
13
+ # Registered profile kinds, so admin UIs offer extension-added
14
+ # kinds without hardcoding the built-ins.
15
+ def kinds
16
+ authorize! :create, model_class
17
+
18
+ data = Spree.delivery_profile_types.map do |profile_class|
19
+ {
20
+ type: profile_class.to_s,
21
+ kind: profile_class.api_type
22
+ }
23
+ end
24
+
25
+ render json: { data: data }
26
+ end
27
+
28
+ def create
29
+ @resource = model_class.new(assignable_params)
30
+ authorize_resource!(@resource, :create)
31
+
32
+ if @resource.save
33
+ apply_default_group_locations(@resource)
34
+ render json: serialize_resource(@resource), status: :created
35
+ else
36
+ render_validation_error(@resource.errors)
37
+ end
38
+ end
39
+
40
+ def update
41
+ @resource.assign_attributes(assignable_params)
42
+
43
+ if @resource.save
44
+ apply_default_group_locations(@resource)
45
+ render json: serialize_resource(@resource)
46
+ else
47
+ render_validation_error(@resource.errors)
48
+ end
49
+ end
50
+
51
+ protected
52
+
53
+ def model_class
54
+ Spree::DeliveryProfile
55
+ end
56
+
57
+ def serializer_class
58
+ Spree.api.admin_delivery_profile_serializer
59
+ end
60
+
61
+ def scope
62
+ super.order_default
63
+ end
64
+
65
+ def permitted_params
66
+ params.permit(*model_additional_permitted_attributes, :name, :default, :position, :kind, stock_location_ids: [])
67
+ end
68
+
69
+ def collection_includes
70
+ [delivery_origin_groups: :stock_locations]
71
+ end
72
+
73
+ private
74
+
75
+ def assignable_params
76
+ attributes = permitted_params.except(:kind, :stock_location_ids)
77
+
78
+ if @resource.nil?
79
+ attributes[:type] = params.key?(:kind) ? resolve_kind(params[:kind]).to_s : Spree::DeliveryProfiles::Shipping.to_s
80
+ end
81
+
82
+ attributes
83
+ end
84
+
85
+ # The profile-level shorthand writes the default origin group's
86
+ # membership — one call keeps working for single-group stores;
87
+ # multi-group stores manage members through the nested endpoint.
88
+ def apply_default_group_locations(profile)
89
+ return unless params.key?(:stock_location_ids)
90
+
91
+ locations = Array(params[:stock_location_ids]).map do |id|
92
+ current_store.stock_locations.accessible_by(current_ability, :show).find_by_prefix_id!(id)
93
+ end
94
+ profile.default_origin_group&.stock_locations = locations
95
+ end
96
+
97
+ # The wire kind (`shipping`, `digital`) resolves against the
98
+ # registry; an unknown kind is a client error, not a constantize.
99
+ def resolve_kind(kind)
100
+ Spree.delivery_profile_types.find { |klass| klass.api_type == kind.to_s } ||
101
+ raise(ActiveRecord::RecordNotFound)
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,116 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ # Delivery zones with typed members (country / state / postal_code).
6
+ # Members are managed atomically through the zone: `members` in the
7
+ # payload replaces the full member set.
8
+ class DeliveryZonesController < ResourceController
9
+ scoped_resource :settings
10
+
11
+ def create
12
+ @resource = model_class.new(zone_params)
13
+ authorize_resource!(@resource, :create)
14
+
15
+ build_members(@resource) if params.key?(:members)
16
+
17
+ if @resource.save
18
+ render json: serialize_resource(@resource), status: :created
19
+ else
20
+ render_validation_error(@resource.errors)
21
+ end
22
+ end
23
+
24
+ def update
25
+ @resource.assign_attributes(zone_params)
26
+
27
+ model_class.transaction do
28
+ if params.key?(:members)
29
+ @resource.members.destroy_all
30
+ build_members(@resource)
31
+ end
32
+
33
+ if @resource.save
34
+ render json: serialize_resource(@resource)
35
+ else
36
+ render_validation_error(@resource.errors)
37
+ raise ActiveRecord::Rollback
38
+ end
39
+ end
40
+ end
41
+
42
+ protected
43
+
44
+ def model_class
45
+ Spree::DeliveryZone
46
+ end
47
+
48
+ def serializer_class
49
+ Spree.api.admin_delivery_zone_serializer
50
+ end
51
+
52
+ def permitted_params
53
+ params.permit(
54
+ *model_additional_permitted_attributes,
55
+ :name, :description, :delivery_profile_id, :delivery_origin_group_id,
56
+ members: [:member_type, :country_code, :state_code, :postal_code_prefix, :postal_code_from, :postal_code_to]
57
+ )
58
+ end
59
+
60
+ def collection_includes
61
+ [:members]
62
+ end
63
+
64
+ private
65
+
66
+ # A zone always lives inside a profile; absent an explicit one it
67
+ # joins the store default.
68
+ def zone_params
69
+ attributes = permitted_params.except(:members, :delivery_profile_id, :delivery_origin_group_id)
70
+ if params.key?(:delivery_profile_id) && params[:delivery_profile_id].present?
71
+ attributes[:delivery_profile] = current_store.delivery_profiles.accessible_by(current_ability, :show).find_by_prefix_id!(params[:delivery_profile_id])
72
+ end
73
+ if params.key?(:delivery_origin_group_id) && params[:delivery_origin_group_id].present?
74
+ attributes[:delivery_origin_group] = current_store.delivery_origin_groups.accessible_by(current_ability, :show).find_by_prefix_id!(params[:delivery_origin_group_id])
75
+ end
76
+ attributes
77
+ end
78
+
79
+ # Members are stored as codes. A subdivision may be given by code or
80
+ # by name, and a state member without a country has its country
81
+ # inferred — a code alone is ambiguous ("CA" is California and
82
+ # several other places), so an inference matching more than one
83
+ # country is rejected rather than guessed at.
84
+ def build_members(zone)
85
+ Array(permitted_params[:members]).each do |member|
86
+ attributes = member.to_h.symbolize_keys
87
+ country_code = attributes[:country_code].presence&.to_s&.upcase
88
+ state_value = attributes[:state_code].presence
89
+
90
+ if state_value.present?
91
+ country_code ||= infer_country_code_for_state(state_value)
92
+ attributes[:state_code] = Spree::IsoData.subdivision_code(country_code, state_value) if country_code
93
+ end
94
+
95
+ attributes[:country_code] = country_code
96
+ zone.members.build(attributes)
97
+ end
98
+ end
99
+
100
+ # Returns nil when the code is ambiguous, which leaves the member
101
+ # without a country for its presence validation to reject — better
102
+ # than silently picking one of several matching countries.
103
+ #
104
+ # @return [String, nil] the only country whose subdivisions match, if exactly one does
105
+ def infer_country_code_for_state(state_value)
106
+ matches = Spree::IsoData.countries.map(&:alpha2).select do |iso|
107
+ Spree::IsoData.subdivision_code(iso, state_value).present?
108
+ end
109
+
110
+ matches.one? ? matches.first : nil
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,48 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ class DigitalLinksController < ResourceController
6
+ scoped_resource :orders
7
+
8
+ before_action :set_resource, only: [:reset]
9
+
10
+ # PATCH /api/v3/admin/digital_links/:id/reset
11
+ #
12
+ # Gives the customer their download allowance back and restarts the
13
+ # expiry clock — the remedy when a download failed or a file was
14
+ # replaced after they had used up their attempts.
15
+ def reset
16
+ @resource.reset!
17
+
18
+ render json: serialize_resource(@resource)
19
+ end
20
+
21
+ protected
22
+
23
+ def model_class
24
+ Spree::DigitalLink
25
+ end
26
+
27
+ def serializer_class
28
+ Spree.api.admin_digital_link_serializer
29
+ end
30
+
31
+ # `digital_links` reaches links through line items, so the query
32
+ # carries a DISTINCT and inherits an ORDER BY on the line items'
33
+ # table. PostgreSQL rejects DISTINCT combined with an ORDER BY column
34
+ # outside the select list, so reorder by the links' own table —
35
+ # SQLite tolerates the inherited order, so this only surfaces on a
36
+ # real deployment.
37
+ def scope
38
+ current_store.digital_links.reorder("#{Spree::DigitalLink.table_name}.created_at": :desc)
39
+ end
40
+
41
+ def scope_includes
42
+ [:line_item, digital_asset: { attachment_attachment: :blob }]
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -3,6 +3,8 @@ module Spree
3
3
  module V3
4
4
  module Admin
5
5
  class DirectUploadsController < Admin::BaseController
6
+ include Spree::Api::V3::DirectUploads
7
+
6
8
  # Direct uploads is a write-adjacent presigning helper: callers exchange
7
9
  # blob metadata for an upload URL, then reference the resulting
8
10
  # signed_id when creating/updating a resource (product media, customer
@@ -16,8 +18,12 @@ module Spree
16
18
  skip_before_action :authenticate_user
17
19
 
18
20
  # POST /api/v3/admin/direct_uploads
21
+ #
22
+ # Overrides the shared concern's create to select the storage service:
23
+ # digital assets must land on private storage up front, since attaching
24
+ # a signed id never moves a blob between services.
19
25
  def create
20
- blob = ActiveStorage::Blob.create_before_direct_upload!(**blob_params)
26
+ blob = ActiveStorage::Blob.create_before_direct_upload!(service_name: storage_service_name, **blob_params)
21
27
 
22
28
  render json: {
23
29
  direct_upload: {
@@ -30,8 +36,16 @@ module Spree
30
36
 
31
37
  private
32
38
 
33
- def blob_params
34
- params.require(:blob).permit(:filename, :byte_size, :checksum, :content_type).to_h.symbolize_keys
39
+ # Attaching a signed id never moves the blob between services, so a
40
+ # file destined for a private attachment has to be uploaded to the
41
+ # private service up front. `private: true` asks for that; everything
42
+ # else keeps landing on the public service as before.
43
+ def storage_service_name
44
+ if params[:private].to_b
45
+ Spree.private_storage_service_name
46
+ else
47
+ Spree.public_storage_service_name
48
+ end
35
49
  end
36
50
  end
37
51
  end
@@ -0,0 +1,31 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ # Cross-order listing of exchanges — "what is awaiting fulfillment
6
+ # across the whole store". Read-only by route: opening an exchange
7
+ # needs an order, so creation and the status transitions stay on the
8
+ # nested Orders::ExchangesController.
9
+ class ExchangesController < ResourceController
10
+ # Post-sale records are order data: a key that may read orders may
11
+ # read these, and nothing here writes.
12
+ scoped_resource :orders
13
+
14
+ protected
15
+
16
+ def model_class
17
+ Spree::Exchange
18
+ end
19
+
20
+ def serializer_class
21
+ Spree.api.admin_exchange_serializer
22
+ end
23
+
24
+ def collection_includes
25
+ [:order, :reason, :stock_location, { exchange_line_items: [:original_variant, :new_variant] }]
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -98,7 +98,7 @@ module Spree
98
98
  # is intentionally dropped — only CSV is supported and Rails' request
99
99
  # format would otherwise overwrite the model's enum.
100
100
  def permitted_params
101
- attrs = params.permit(:type, :record_selection, :results_url)
101
+ attrs = params.permit(*model_additional_permitted_attributes, :type, :record_selection, :results_url)
102
102
  raw = params[:search_params]
103
103
  attrs[:search_params] = raw.respond_to?(:to_unsafe_h) ? raw.to_unsafe_h : raw if raw.present?
104
104
  attrs
@@ -118,7 +118,7 @@ module Spree
118
118
  return nil if name.blank?
119
119
 
120
120
  name = name.to_s
121
- Spree::Export.available_types.find { |type| type.api_type == name || type.to_s == name }
121
+ Spree::Export.available_types.find { |type| type.api_type == name }
122
122
  end
123
123
 
124
124
  private
@@ -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