spree_api 6.0.0.beta4 → 6.0.0.rc2

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 (531) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +4 -48
  3. data/app/controllers/concerns/spree/api/v3/admin/email_template_lookup.rb +139 -0
  4. data/app/controllers/concerns/spree/api/v3/admin/product_membership.rb +10 -0
  5. data/app/controllers/concerns/spree/api/v3/admin/stock_receipt_actions.rb +26 -4
  6. data/app/controllers/concerns/spree/api/v3/admin/store_context.rb +1 -1
  7. data/app/controllers/concerns/spree/api/v3/admin/subclassed_resource.rb +15 -29
  8. data/app/controllers/concerns/spree/api/v3/admin/validation_details.rb +1 -1
  9. data/app/controllers/concerns/spree/api/v3/cart_resolvable.rb +10 -2
  10. data/app/controllers/concerns/spree/api/v3/channel_resolution.rb +3 -3
  11. data/app/controllers/concerns/spree/api/v3/company_address_writes.rb +3 -1
  12. data/app/controllers/concerns/spree/api/v3/current_password_confirmation.rb +1 -1
  13. data/app/controllers/concerns/spree/api/v3/error_handler.rb +55 -4
  14. data/app/controllers/concerns/spree/api/v3/file_uploads.rb +35 -0
  15. data/app/controllers/concerns/spree/api/v3/http_caching.rb +44 -11
  16. data/app/controllers/concerns/spree/api/v3/idempotent.rb +20 -5
  17. data/app/controllers/concerns/spree/api/v3/items_payload.rb +1 -1
  18. data/app/controllers/concerns/spree/api/v3/money_params.rb +52 -0
  19. data/app/controllers/concerns/spree/api/v3/order_lock.rb +2 -2
  20. data/app/controllers/concerns/spree/api/v3/orders/claim_actions.rb +1 -5
  21. data/app/controllers/concerns/spree/api/v3/orders/delivery_actions.rb +7 -11
  22. data/app/controllers/concerns/spree/api/v3/orders/exchange_actions.rb +1 -4
  23. data/app/controllers/concerns/spree/api/v3/orders/fulfillment_actions.rb +3 -15
  24. data/app/controllers/concerns/spree/api/v3/orders/post_sale_actions.rb +2 -10
  25. data/app/controllers/concerns/spree/api/v3/orders/return_actions.rb +1 -4
  26. data/app/controllers/concerns/spree/api/v3/orders/shipping_label_actions.rb +8 -28
  27. data/app/controllers/concerns/spree/api/v3/params_normalizer.rb +5 -0
  28. data/app/controllers/concerns/spree/api/v3/permission_serialization.rb +9 -1
  29. data/app/controllers/concerns/spree/api/v3/purchase_serialization.rb +26 -0
  30. data/app/controllers/concerns/spree/api/v3/request_params.rb +65 -0
  31. data/app/controllers/concerns/spree/api/v3/seller/seller_context.rb +1 -1
  32. data/app/controllers/concerns/spree/api/v3/store/storefront_products.rb +5 -4
  33. data/app/controllers/concerns/spree/api/v3/storefront_gating.rb +11 -5
  34. data/app/controllers/concerns/spree/api/v3/strict_money_params.rb +94 -0
  35. data/app/controllers/spree/api/v3/admin/admin_users_controller.rb +8 -4
  36. data/app/controllers/spree/api/v3/admin/allowed_origins_controller.rb +8 -1
  37. data/app/controllers/spree/api/v3/admin/api_keys_controller.rb +16 -8
  38. data/app/controllers/spree/api/v3/admin/base_controller.rb +1 -0
  39. data/app/controllers/spree/api/v3/admin/catalogs/order_minimums_controller.rb +2 -6
  40. data/app/controllers/spree/api/v3/admin/catalogs/quantity_rules_controller.rb +7 -9
  41. data/app/controllers/spree/api/v3/admin/catalogs_controller.rb +61 -34
  42. data/app/controllers/spree/api/v3/admin/categories/products_controller.rb +4 -1
  43. data/app/controllers/spree/api/v3/admin/categories_controller.rb +40 -20
  44. data/app/controllers/spree/api/v3/admin/channels_controller.rb +39 -10
  45. data/app/controllers/spree/api/v3/admin/claim_reasons_controller.rb +5 -1
  46. data/app/controllers/spree/api/v3/admin/collections/products_controller.rb +5 -3
  47. data/app/controllers/spree/api/v3/admin/collections_controller.rb +44 -15
  48. data/app/controllers/spree/api/v3/admin/commission_rates_controller.rb +62 -14
  49. data/app/controllers/spree/api/v3/admin/companies/addresses_controller.rb +11 -4
  50. data/app/controllers/spree/api/v3/admin/companies/invitations_controller.rb +1 -5
  51. data/app/controllers/spree/api/v3/admin/companies/memberships_controller.rb +9 -5
  52. data/app/controllers/spree/api/v3/admin/companies/tax_exemption_certificates_controller.rb +20 -27
  53. data/app/controllers/spree/api/v3/admin/companies/tax_identifiers_controller.rb +6 -5
  54. data/app/controllers/spree/api/v3/admin/companies_controller.rb +17 -7
  55. data/app/controllers/spree/api/v3/admin/countries_controller.rb +6 -2
  56. data/app/controllers/spree/api/v3/admin/coupon_codes_controller.rb +0 -4
  57. data/app/controllers/spree/api/v3/admin/custom_field_definitions_controller.rb +22 -4
  58. data/app/controllers/spree/api/v3/admin/custom_fields_controller.rb +12 -9
  59. data/app/controllers/spree/api/v3/admin/customer_groups_controller.rb +9 -5
  60. data/app/controllers/spree/api/v3/admin/customers/addresses_controller.rb +12 -11
  61. data/app/controllers/spree/api/v3/admin/customers/credit_cards_controller.rb +0 -4
  62. data/app/controllers/spree/api/v3/admin/customers/store_credits_controller.rb +11 -13
  63. data/app/controllers/spree/api/v3/admin/customers/tax_identifiers_controller.rb +6 -1
  64. data/app/controllers/spree/api/v3/admin/customers_controller.rb +37 -9
  65. data/app/controllers/spree/api/v3/admin/data_requests_controller.rb +8 -0
  66. data/app/controllers/spree/api/v3/admin/delivery_method_rules_controller.rb +1 -1
  67. data/app/controllers/spree/api/v3/admin/delivery_methods/rules_controller.rb +16 -8
  68. data/app/controllers/spree/api/v3/admin/delivery_methods_controller.rb +95 -62
  69. data/app/controllers/spree/api/v3/admin/delivery_profiles/origin_groups_controller.rb +8 -1
  70. data/app/controllers/spree/api/v3/admin/delivery_profiles_controller.rb +14 -7
  71. data/app/controllers/spree/api/v3/admin/delivery_zones_controller.rb +21 -5
  72. data/app/controllers/spree/api/v3/admin/email_templates/drafts_controller.rb +53 -0
  73. data/app/controllers/spree/api/v3/admin/email_templates/previews_controller.rb +34 -0
  74. data/app/controllers/spree/api/v3/admin/email_templates/publications_controller.rb +37 -0
  75. data/app/controllers/spree/api/v3/admin/email_templates/restorations_controller.rb +42 -0
  76. data/app/controllers/spree/api/v3/admin/email_templates/revisions_controller.rb +35 -0
  77. data/app/controllers/spree/api/v3/admin/email_templates/sample_records_controller.rb +33 -0
  78. data/app/controllers/spree/api/v3/admin/email_templates/test_emails_controller.rb +44 -0
  79. data/app/controllers/spree/api/v3/admin/email_templates_controller.rb +46 -0
  80. data/app/controllers/spree/api/v3/admin/exports_controller.rb +23 -6
  81. data/app/controllers/spree/api/v3/admin/files_controller.rb +29 -0
  82. data/app/controllers/spree/api/v3/admin/gift_card_batches_controller.rb +20 -1
  83. data/app/controllers/spree/api/v3/admin/gift_cards_controller.rb +19 -1
  84. data/app/controllers/spree/api/v3/admin/imports_controller.rb +37 -11
  85. data/app/controllers/spree/api/v3/admin/integrations_controller.rb +13 -1
  86. data/app/controllers/spree/api/v3/admin/invitation_acceptances_controller.rb +9 -2
  87. data/app/controllers/spree/api/v3/admin/invitations_controller.rb +8 -8
  88. data/app/controllers/spree/api/v3/admin/locales_controller.rb +1 -1
  89. data/app/controllers/spree/api/v3/admin/markets_controller.rb +30 -9
  90. data/app/controllers/spree/api/v3/admin/me_controller.rb +13 -4
  91. data/app/controllers/spree/api/v3/admin/media_controller.rb +22 -9
  92. data/app/controllers/spree/api/v3/admin/media_library_controller.rb +9 -5
  93. data/app/controllers/spree/api/v3/admin/option_types_controller.rb +24 -7
  94. data/app/controllers/spree/api/v3/admin/order_cancellation_reasons_controller.rb +5 -1
  95. data/app/controllers/spree/api/v3/admin/order_routing_rules_controller.rb +13 -5
  96. data/app/controllers/spree/api/v3/admin/orders/claims_controller.rb +39 -1
  97. data/app/controllers/spree/api/v3/admin/orders/deliveries_controller.rb +20 -6
  98. data/app/controllers/spree/api/v3/admin/orders/discount_codes_controller.rb +6 -2
  99. data/app/controllers/spree/api/v3/admin/orders/discounts_controller.rb +30 -6
  100. data/app/controllers/spree/api/v3/admin/orders/exchanges_controller.rb +36 -1
  101. data/app/controllers/spree/api/v3/admin/orders/fees_controller.rb +22 -1
  102. data/app/controllers/spree/api/v3/admin/orders/fulfillments_controller.rb +83 -22
  103. data/app/controllers/spree/api/v3/admin/orders/gift_cards_controller.rb +9 -5
  104. data/app/controllers/spree/api/v3/admin/orders/items_controller.rb +11 -1
  105. data/app/controllers/spree/api/v3/admin/orders/labels_controller.rb +37 -12
  106. data/app/controllers/spree/api/v3/admin/orders/payments_controller.rb +18 -19
  107. data/app/controllers/spree/api/v3/admin/orders/refunds_controller.rb +7 -5
  108. data/app/controllers/spree/api/v3/admin/orders/returns_controller.rb +37 -1
  109. data/app/controllers/spree/api/v3/admin/orders/store_credits_controller.rb +6 -3
  110. data/app/controllers/spree/api/v3/admin/orders_controller.rb +76 -62
  111. data/app/controllers/spree/api/v3/admin/package_types_controller.rb +30 -5
  112. data/app/controllers/spree/api/v3/admin/password_resets_controller.rb +26 -7
  113. data/app/controllers/spree/api/v3/admin/payment_methods_controller.rb +38 -22
  114. data/app/controllers/spree/api/v3/admin/policies_controller.rb +8 -4
  115. data/app/controllers/spree/api/v3/admin/price_lists_controller.rb +32 -67
  116. data/app/controllers/spree/api/v3/admin/prices_controller.rb +51 -8
  117. data/app/controllers/spree/api/v3/admin/product_types_controller.rb +25 -8
  118. data/app/controllers/spree/api/v3/admin/products/digital_assets_controller.rb +29 -16
  119. data/app/controllers/spree/api/v3/admin/products/variants_controller.rb +9 -18
  120. data/app/controllers/spree/api/v3/admin/products_controller.rb +122 -71
  121. data/app/controllers/spree/api/v3/admin/promotion_actions_controller.rb +11 -6
  122. data/app/controllers/spree/api/v3/admin/promotion_rules_controller.rb +10 -5
  123. data/app/controllers/spree/api/v3/admin/promotions_controller.rb +50 -14
  124. data/app/controllers/spree/api/v3/admin/purchase_orders_controller.rb +55 -8
  125. data/app/controllers/spree/api/v3/admin/refund_reasons_controller.rb +5 -1
  126. data/app/controllers/spree/api/v3/admin/reporting/saved_reports_controller.rb +9 -1
  127. data/app/controllers/spree/api/v3/admin/reporting_controller.rb +34 -0
  128. data/app/controllers/spree/api/v3/admin/resource_controller.rb +2 -1
  129. data/app/controllers/spree/api/v3/admin/return_reasons_controller.rb +5 -1
  130. data/app/controllers/spree/api/v3/admin/roles_controller.rb +13 -1
  131. data/app/controllers/spree/api/v3/admin/seller_payouts_controller.rb +7 -9
  132. data/app/controllers/spree/api/v3/admin/seller_requirement_submissions_controller.rb +17 -10
  133. data/app/controllers/spree/api/v3/admin/seller_requirements_controller.rb +32 -6
  134. data/app/controllers/spree/api/v3/admin/seller_transfers_controller.rb +0 -4
  135. data/app/controllers/spree/api/v3/admin/sellers/invitations_controller.rb +1 -1
  136. data/app/controllers/spree/api/v3/admin/sellers/payouts_controller.rb +1 -1
  137. data/app/controllers/spree/api/v3/admin/sellers_controller.rb +77 -32
  138. data/app/controllers/spree/api/v3/admin/setup_controller.rb +54 -23
  139. data/app/controllers/spree/api/v3/admin/stock_levels_controller.rb +38 -9
  140. data/app/controllers/spree/api/v3/admin/stock_locations_controller.rb +41 -9
  141. data/app/controllers/spree/api/v3/admin/stock_transfers_controller.rb +49 -8
  142. data/app/controllers/spree/api/v3/admin/store_controller.rb +122 -48
  143. data/app/controllers/spree/api/v3/admin/store_credits_controller.rb +1 -7
  144. data/app/controllers/spree/api/v3/admin/suppliers_controller.rb +16 -6
  145. data/app/controllers/spree/api/v3/admin/tags_controller.rb +8 -5
  146. data/app/controllers/spree/api/v3/admin/tax_categories_controller.rb +7 -4
  147. data/app/controllers/spree/api/v3/admin/tax_rates_controller.rb +21 -3
  148. data/app/controllers/spree/api/v3/admin/tracking_carriers_controller.rb +4 -0
  149. data/app/controllers/spree/api/v3/admin/translations/batches_controller.rb +17 -9
  150. data/app/controllers/spree/api/v3/admin/translations_controller.rb +4 -0
  151. data/app/controllers/spree/api/v3/admin/translations_coverage_controller.rb +5 -0
  152. data/app/controllers/spree/api/v3/admin/updates_controller.rb +39 -0
  153. data/app/controllers/spree/api/v3/admin/webhook_endpoints_controller.rb +40 -13
  154. data/app/controllers/spree/api/v3/admin/webhook_events_controller.rb +25 -0
  155. data/app/controllers/spree/api/v3/base_controller.rb +12 -0
  156. data/app/controllers/spree/api/v3/resource_controller.rb +99 -3
  157. data/app/controllers/spree/api/v3/seller/auth_controller.rb +10 -2
  158. data/app/controllers/spree/api/v3/seller/base_controller.rb +1 -0
  159. data/app/controllers/spree/api/v3/seller/countries_controller.rb +3 -3
  160. data/app/controllers/spree/api/v3/seller/delivery_methods_controller.rb +49 -60
  161. data/app/controllers/spree/api/v3/seller/exports_controller.rb +21 -4
  162. data/app/controllers/spree/api/v3/seller/files_controller.rb +27 -0
  163. data/app/controllers/spree/api/v3/seller/imports_controller.rb +25 -9
  164. data/app/controllers/spree/api/v3/seller/invitation_acceptances_controller.rb +12 -4
  165. data/app/controllers/spree/api/v3/seller/invitations_controller.rb +1 -1
  166. data/app/controllers/spree/api/v3/seller/me_controller.rb +15 -4
  167. data/app/controllers/spree/api/v3/seller/onboarding_controller.rb +11 -0
  168. data/app/controllers/spree/api/v3/seller/orders/claims_controller.rb +35 -0
  169. data/app/controllers/spree/api/v3/seller/orders/deliveries_controller.rb +12 -0
  170. data/app/controllers/spree/api/v3/seller/orders/exchanges_controller.rb +33 -0
  171. data/app/controllers/spree/api/v3/seller/orders/fulfillments_controller.rb +28 -2
  172. data/app/controllers/spree/api/v3/seller/orders/labels_controller.rb +23 -2
  173. data/app/controllers/spree/api/v3/seller/orders/notes_controller.rb +8 -1
  174. data/app/controllers/spree/api/v3/seller/orders/returns_controller.rb +32 -0
  175. data/app/controllers/spree/api/v3/seller/orders_controller.rb +35 -14
  176. data/app/controllers/spree/api/v3/seller/package_types_controller.rb +21 -9
  177. data/app/controllers/spree/api/v3/seller/password_resets_controller.rb +20 -11
  178. data/app/controllers/spree/api/v3/seller/policies_controller.rb +12 -4
  179. data/app/controllers/spree/api/v3/seller/products_controller.rb +115 -28
  180. data/app/controllers/spree/api/v3/seller/profile_controller.rb +33 -10
  181. data/app/controllers/spree/api/v3/seller/requirement_submissions_controller.rb +13 -6
  182. data/app/controllers/spree/api/v3/seller/resource_controller.rb +12 -0
  183. data/app/controllers/spree/api/v3/seller/stock_locations_controller.rb +44 -13
  184. data/app/controllers/spree/api/v3/seller/tax_identifiers_controller.rb +10 -1
  185. data/app/controllers/spree/api/v3/seller/team_controller.rb +5 -1
  186. data/app/controllers/spree/api/v3/store/auth_controller.rb +10 -0
  187. data/app/controllers/spree/api/v3/store/carts/discount_codes_controller.rb +9 -2
  188. data/app/controllers/spree/api/v3/store/carts/fulfillments_controller.rb +11 -11
  189. data/app/controllers/spree/api/v3/store/carts/gift_cards_controller.rb +13 -4
  190. data/app/controllers/spree/api/v3/store/carts/items_controller.rb +23 -7
  191. data/app/controllers/spree/api/v3/store/carts/payment_sessions_controller.rb +21 -7
  192. data/app/controllers/spree/api/v3/store/carts/payments_controller.rb +16 -3
  193. data/app/controllers/spree/api/v3/store/carts/po_documents_controller.rb +26 -28
  194. data/app/controllers/spree/api/v3/store/carts/store_credits_controller.rb +9 -1
  195. data/app/controllers/spree/api/v3/store/carts/tax_identifiers_controller.rb +5 -1
  196. data/app/controllers/spree/api/v3/store/carts_controller.rb +64 -52
  197. data/app/controllers/spree/api/v3/store/companies/addresses_controller.rb +12 -8
  198. data/app/controllers/spree/api/v3/store/companies/invitations_controller.rb +1 -5
  199. data/app/controllers/spree/api/v3/store/companies/members_controller.rb +4 -0
  200. data/app/controllers/spree/api/v3/store/companies_controller.rb +5 -1
  201. data/app/controllers/spree/api/v3/store/company_invitations_controller.rb +10 -2
  202. data/app/controllers/spree/api/v3/store/customer/addresses_controller.rb +8 -11
  203. data/app/controllers/spree/api/v3/store/customer/credit_cards_controller.rb +0 -4
  204. data/app/controllers/spree/api/v3/store/customer/data_requests_controller.rb +5 -5
  205. data/app/controllers/spree/api/v3/store/customer/digital_links_controller.rb +0 -4
  206. data/app/controllers/spree/api/v3/store/customer/gift_cards_controller.rb +0 -4
  207. data/app/controllers/spree/api/v3/store/customer/orders_controller.rb +0 -4
  208. data/app/controllers/spree/api/v3/store/customer/password_resets_controller.rb +25 -6
  209. data/app/controllers/spree/api/v3/store/customer/payment_setup_sessions_controller.rb +10 -9
  210. data/app/controllers/spree/api/v3/store/customer/store_credits_controller.rb +0 -5
  211. data/app/controllers/spree/api/v3/store/customer/tax_identifiers_controller.rb +5 -1
  212. data/app/controllers/spree/api/v3/store/customers_controller.rb +28 -2
  213. data/app/controllers/spree/api/v3/store/data_request_downloads_controller.rb +1 -1
  214. data/app/controllers/spree/api/v3/store/delivery_methods_controller.rb +1 -1
  215. data/app/controllers/spree/api/v3/store/newsletter_subscribers_controller.rb +27 -14
  216. data/app/controllers/spree/api/v3/store/orders/claims_controller.rb +12 -7
  217. data/app/controllers/spree/api/v3/store/orders/returns_controller.rb +11 -6
  218. data/app/controllers/spree/api/v3/store/orders_controller.rb +47 -10
  219. data/app/controllers/spree/api/v3/store/products_controller.rb +8 -0
  220. data/app/controllers/spree/api/v3/store/wishlist_items_controller.rb +10 -8
  221. data/app/controllers/spree/api/v3/store/wishlists_controller.rb +12 -4
  222. data/app/request_schemas/spree/api/v3/address_request_schema.rb +27 -0
  223. data/app/request_schemas/spree/api/v3/admin/address_request_schema.rb +13 -0
  224. data/app/request_schemas/spree/api/v3/admin/bulk_tags_request_schema.rb +17 -0
  225. data/app/request_schemas/spree/api/v3/admin/catalog_order_minimum_request_schema.rb +17 -0
  226. data/app/request_schemas/spree/api/v3/admin/email_template_language_request_schema.rb +17 -0
  227. data/app/request_schemas/spree/api/v3/admin/email_template_preview_request_schema.rb +32 -0
  228. data/app/request_schemas/spree/api/v3/admin/price_adjustment_tier_request_schema.rb +21 -0
  229. data/app/request_schemas/spree/api/v3/admin/price_list_price_request_schema.rb +21 -0
  230. data/app/request_schemas/spree/api/v3/admin/price_list_rule_request_schema.rb +19 -0
  231. data/app/request_schemas/spree/api/v3/admin/product_membership_reposition_request_schema.rb +17 -0
  232. data/app/request_schemas/spree/api/v3/admin/promotion_action_calculator_request_schema.rb +18 -0
  233. data/app/request_schemas/spree/api/v3/admin/promotion_action_line_item_request_schema.rb +15 -0
  234. data/app/request_schemas/spree/api/v3/admin/promotion_action_request_schema.rb +19 -0
  235. data/app/request_schemas/spree/api/v3/admin/promotion_rule_request_schema.rb +22 -0
  236. data/app/request_schemas/spree/api/v3/admin/reason_request_schema.rb +14 -0
  237. data/app/request_schemas/spree/api/v3/admin/tax_identifier_request_schema.rb +15 -0
  238. data/app/request_schemas/spree/api/v3/custom_field_value_request_schema.rb +15 -0
  239. data/app/request_schemas/spree/api/v3/file_upload_request_schema.rb +20 -0
  240. data/app/request_schemas/spree/api/v3/media_request_schema.rb +27 -0
  241. data/app/request_schemas/spree/api/v3/price_request_schema.rb +17 -0
  242. data/app/request_schemas/spree/api/v3/stock_level_request_schema.rb +18 -0
  243. data/app/request_schemas/spree/api/v3/store/address_request_schema.rb +29 -0
  244. data/app/request_schemas/spree/api/v3/tax_identifier_request_schema.rb +18 -0
  245. data/app/request_schemas/spree/api/v3/variant_option_request_schema.rb +13 -0
  246. data/app/request_schemas/spree/api/v3/variant_request_schema.rb +52 -0
  247. data/app/serializers/concerns/spree/api/v3/purchase_summary.rb +48 -0
  248. data/app/serializers/spree/api/v3/address_serializer.rb +4 -2
  249. data/app/serializers/spree/api/v3/admin/address_serializer.rb +8 -7
  250. data/app/serializers/spree/api/v3/admin/api_key_serializer.rb +2 -6
  251. data/app/serializers/spree/api/v3/admin/applied_promotion_serializer.rb +3 -1
  252. data/app/serializers/spree/api/v3/admin/cart_serializer.rb +3 -1
  253. data/app/serializers/spree/api/v3/admin/catalog_assignment_serializer.rb +1 -3
  254. data/app/serializers/spree/api/v3/admin/catalog_order_minimum_serializer.rb +3 -8
  255. data/app/serializers/spree/api/v3/admin/catalog_price_serializer.rb +3 -4
  256. data/app/serializers/spree/api/v3/admin/catalog_price_tier_serializer.rb +4 -3
  257. data/app/serializers/spree/api/v3/admin/catalog_product_term_serializer.rb +1 -3
  258. data/app/serializers/spree/api/v3/admin/catalog_quantity_rule_serializer.rb +1 -3
  259. data/app/serializers/spree/api/v3/admin/channel_serializer.rb +7 -10
  260. data/app/serializers/spree/api/v3/admin/claim_line_item_serializer.rb +7 -0
  261. data/app/serializers/spree/api/v3/admin/claim_reason_serializer.rb +1 -3
  262. data/app/serializers/spree/api/v3/admin/claim_serializer.rb +5 -0
  263. data/app/serializers/spree/api/v3/admin/commission_line_serializer.rb +7 -18
  264. data/app/serializers/spree/api/v3/admin/commission_rate_serializer.rb +7 -11
  265. data/app/serializers/spree/api/v3/admin/commission_rule_serializer.rb +1 -5
  266. data/app/serializers/spree/api/v3/admin/country_serializer.rb +4 -0
  267. data/app/serializers/spree/api/v3/admin/coupon_code_serializer.rb +1 -7
  268. data/app/serializers/spree/api/v3/admin/credit_card_serializer.rb +1 -7
  269. data/app/serializers/spree/api/v3/admin/custom_field_definition_serializer.rb +6 -2
  270. data/app/serializers/spree/api/v3/admin/customer_serializer.rb +5 -17
  271. data/app/serializers/spree/api/v3/admin/data_request_serializer.rb +2 -6
  272. data/app/serializers/spree/api/v3/admin/delivery_method_rule_serializer.rb +0 -2
  273. data/app/serializers/spree/api/v3/admin/delivery_method_serializer.rb +20 -30
  274. data/app/serializers/spree/api/v3/admin/delivery_method_service_serializer.rb +9 -1
  275. data/app/serializers/spree/api/v3/admin/delivery_origin_group_serializer.rb +1 -3
  276. data/app/serializers/spree/api/v3/admin/delivery_rate_serializer.rb +8 -0
  277. data/app/serializers/spree/api/v3/admin/delivery_serializer.rb +1 -3
  278. data/app/serializers/spree/api/v3/admin/delivery_zone_serializer.rb +1 -7
  279. data/app/serializers/spree/api/v3/admin/digital_asset_serializer.rb +4 -2
  280. data/app/serializers/spree/api/v3/admin/discount_serializer.rb +3 -1
  281. data/app/serializers/spree/api/v3/admin/email_template_draft_serializer.rb +19 -0
  282. data/app/serializers/spree/api/v3/admin/email_template_preview_serializer.rb +38 -0
  283. data/app/serializers/spree/api/v3/admin/email_template_revision_serializer.rb +18 -0
  284. data/app/serializers/spree/api/v3/admin/email_template_sample_record_serializer.rb +13 -0
  285. data/app/serializers/spree/api/v3/admin/email_template_serializer.rb +61 -0
  286. data/app/serializers/spree/api/v3/admin/exchange_line_item_serializer.rb +5 -0
  287. data/app/serializers/spree/api/v3/admin/exchange_serializer.rb +6 -3
  288. data/app/serializers/spree/api/v3/admin/export_serializer.rb +1 -7
  289. data/app/serializers/spree/api/v3/admin/fee_serializer.rb +3 -1
  290. data/app/serializers/spree/api/v3/admin/file_upload_serializer.rb +11 -0
  291. data/app/serializers/spree/api/v3/admin/file_upload_target_serializer.rb +10 -0
  292. data/app/serializers/spree/api/v3/admin/fulfillment_item_serializer.rb +1 -7
  293. data/app/serializers/spree/api/v3/admin/fulfillment_serializer.rb +13 -17
  294. data/app/serializers/spree/api/v3/admin/gift_card_serializer.rb +4 -10
  295. data/app/serializers/spree/api/v3/admin/import_serializer.rb +2 -2
  296. data/app/serializers/spree/api/v3/admin/integration_serializer.rb +1 -3
  297. data/app/serializers/spree/api/v3/admin/line_item_serializer.rb +14 -18
  298. data/app/serializers/spree/api/v3/admin/locale_serializer.rb +13 -0
  299. data/app/serializers/spree/api/v3/admin/market_serializer.rb +7 -2
  300. data/app/serializers/spree/api/v3/admin/media_serializer.rb +4 -5
  301. data/app/serializers/spree/api/v3/admin/order_cancellation_reason_serializer.rb +1 -3
  302. data/app/serializers/spree/api/v3/admin/order_group_serializer.rb +5 -9
  303. data/app/serializers/spree/api/v3/admin/order_routing_rule_serializer.rb +2 -6
  304. data/app/serializers/spree/api/v3/admin/order_serializer.rb +38 -48
  305. data/app/serializers/spree/api/v3/admin/package_type_serializer.rb +1 -3
  306. data/app/serializers/spree/api/v3/admin/payment_method_serializer.rb +7 -4
  307. data/app/serializers/spree/api/v3/admin/payment_serializer.rb +6 -8
  308. data/app/serializers/spree/api/v3/admin/payment_split_serializer.rb +8 -9
  309. data/app/serializers/spree/api/v3/admin/permission_serializer.rb +4 -4
  310. data/app/serializers/spree/api/v3/admin/price_adjustment_tier_serializer.rb +3 -6
  311. data/app/serializers/spree/api/v3/admin/price_history_serializer.rb +5 -2
  312. data/app/serializers/spree/api/v3/admin/price_list_serializer.rb +1 -5
  313. data/app/serializers/spree/api/v3/admin/price_rule_serializer.rb +2 -6
  314. data/app/serializers/spree/api/v3/admin/price_serializer.rb +2 -0
  315. data/app/serializers/spree/api/v3/admin/product_serializer.rb +4 -10
  316. data/app/serializers/spree/api/v3/admin/product_submission_serializer.rb +2 -10
  317. data/app/serializers/spree/api/v3/admin/product_type_serializer.rb +1 -3
  318. data/app/serializers/spree/api/v3/admin/promotion_action_serializer.rb +5 -9
  319. data/app/serializers/spree/api/v3/admin/promotion_rule_serializer.rb +1 -5
  320. data/app/serializers/spree/api/v3/admin/purchase_order_item_serializer.rb +6 -25
  321. data/app/serializers/spree/api/v3/admin/purchase_order_serializer.rb +4 -17
  322. data/app/serializers/spree/api/v3/admin/refund_reason_serializer.rb +1 -3
  323. data/app/serializers/spree/api/v3/admin/refund_serializer.rb +7 -0
  324. data/app/serializers/spree/api/v3/admin/reporting_result_serializer.rb +9 -2
  325. data/app/serializers/spree/api/v3/admin/return_line_item_serializer.rb +9 -0
  326. data/app/serializers/spree/api/v3/admin/return_reason_serializer.rb +1 -3
  327. data/app/serializers/spree/api/v3/admin/return_serializer.rb +8 -12
  328. data/app/serializers/spree/api/v3/admin/saved_report_serializer.rb +1 -3
  329. data/app/serializers/spree/api/v3/admin/seller_balance_serializer.rb +15 -10
  330. data/app/serializers/spree/api/v3/admin/seller_payout_serializer.rb +7 -7
  331. data/app/serializers/spree/api/v3/admin/seller_requirement_status_serializer.rb +2 -6
  332. data/app/serializers/spree/api/v3/admin/seller_requirement_submission_serializer.rb +1 -7
  333. data/app/serializers/spree/api/v3/admin/seller_serializer.rb +8 -16
  334. data/app/serializers/spree/api/v3/admin/seller_transfer_serializer.rb +11 -10
  335. data/app/serializers/spree/api/v3/admin/shipping_label_serializer.rb +8 -21
  336. data/app/serializers/spree/api/v3/admin/stock_level_serializer.rb +1 -3
  337. data/app/serializers/spree/api/v3/admin/stock_location_serializer.rb +4 -3
  338. data/app/serializers/spree/api/v3/admin/stock_movement_serializer.rb +3 -9
  339. data/app/serializers/spree/api/v3/admin/stock_receipt_item_serializer.rb +1 -7
  340. data/app/serializers/spree/api/v3/admin/stock_receipt_serializer.rb +1 -3
  341. data/app/serializers/spree/api/v3/admin/stock_reservation_serializer.rb +1 -3
  342. data/app/serializers/spree/api/v3/admin/stock_transfer_item_serializer.rb +1 -3
  343. data/app/serializers/spree/api/v3/admin/store_credit_event_serializer.rb +6 -3
  344. data/app/serializers/spree/api/v3/admin/store_credit_serializer.rb +11 -20
  345. data/app/serializers/spree/api/v3/admin/store_serializer.rb +21 -84
  346. data/app/serializers/spree/api/v3/admin/supplier_serializer.rb +2 -4
  347. data/app/serializers/spree/api/v3/admin/tax_exemption_certificate_serializer.rb +6 -10
  348. data/app/serializers/spree/api/v3/admin/tax_identifier_serializer.rb +1 -3
  349. data/app/serializers/spree/api/v3/admin/tax_line_serializer.rb +9 -3
  350. data/app/serializers/spree/api/v3/admin/tax_rate_serializer.rb +3 -19
  351. data/app/serializers/spree/api/v3/admin/update_status_serializer.rb +28 -0
  352. data/app/serializers/spree/api/v3/admin/variant_serializer.rb +13 -10
  353. data/app/serializers/spree/api/v3/admin/webhook_delivery_serializer.rb +1 -3
  354. data/app/serializers/spree/api/v3/admin/webhook_event_serializer.rb +23 -0
  355. data/app/serializers/spree/api/v3/applied_promotion_serializer.rb +2 -4
  356. data/app/serializers/spree/api/v3/base_serializer.rb +132 -7
  357. data/app/serializers/spree/api/v3/cart_serializer.rb +20 -66
  358. data/app/serializers/spree/api/v3/category_serializer.rb +5 -15
  359. data/app/serializers/spree/api/v3/claim_line_item_serializer.rb +6 -29
  360. data/app/serializers/spree/api/v3/claim_serializer.rb +2 -16
  361. data/app/serializers/spree/api/v3/collection_serializer.rb +1 -3
  362. data/app/serializers/spree/api/v3/company_serializer.rb +1 -3
  363. data/app/serializers/spree/api/v3/country_serializer.rb +2 -1
  364. data/app/serializers/spree/api/v3/currency_serializer.rb +9 -1
  365. data/app/serializers/spree/api/v3/custom_field_serializer.rb +1 -2
  366. data/app/serializers/spree/api/v3/customer_serializer.rb +3 -2
  367. data/app/serializers/spree/api/v3/delivery_rate_serializer.rb +8 -32
  368. data/app/serializers/spree/api/v3/delivery_zone_member_serializer.rb +1 -1
  369. data/app/serializers/spree/api/v3/digital_asset_serializer.rb +1 -3
  370. data/app/serializers/spree/api/v3/digital_link_serializer.rb +3 -9
  371. data/app/serializers/spree/api/v3/discount_serializer.rb +4 -12
  372. data/app/serializers/spree/api/v3/exchange_line_item_serializer.rb +6 -30
  373. data/app/serializers/spree/api/v3/exchange_serializer.rb +2 -16
  374. data/app/serializers/spree/api/v3/export_serializer.rb +1 -3
  375. data/app/serializers/spree/api/v3/fee_serializer.rb +2 -10
  376. data/app/serializers/spree/api/v3/file_upload_serializer.rb +28 -0
  377. data/app/serializers/spree/api/v3/file_upload_target_serializer.rb +17 -0
  378. data/app/serializers/spree/api/v3/fulfillment_serializer.rb +4 -11
  379. data/app/serializers/spree/api/v3/gift_card_batch_serializer.rb +3 -7
  380. data/app/serializers/spree/api/v3/gift_card_serializer.rb +7 -17
  381. data/app/serializers/spree/api/v3/import_row_serializer.rb +2 -6
  382. data/app/serializers/spree/api/v3/import_serializer.rb +3 -26
  383. data/app/serializers/spree/api/v3/invitation_serializer.rb +2 -19
  384. data/app/serializers/spree/api/v3/line_item_serializer.rb +19 -23
  385. data/app/serializers/spree/api/v3/locale_serializer.rb +3 -1
  386. data/app/serializers/spree/api/v3/market_serializer.rb +5 -5
  387. data/app/serializers/spree/api/v3/media_event_serializer.rb +1 -3
  388. data/app/serializers/spree/api/v3/media_serializer.rb +8 -5
  389. data/app/serializers/spree/api/v3/newsletter_subscriber_request_event_serializer.rb +35 -0
  390. data/app/serializers/spree/api/v3/newsletter_subscriber_serializer.rb +2 -6
  391. data/app/serializers/spree/api/v3/option_value_serializer.rb +1 -3
  392. data/app/serializers/spree/api/v3/order_group_serializer.rb +12 -25
  393. data/app/serializers/spree/api/v3/order_serializer.rb +14 -58
  394. data/app/serializers/spree/api/v3/password_reset_requested_event_serializer.rb +29 -0
  395. data/app/serializers/spree/api/v3/payment_method_serializer.rb +2 -6
  396. data/app/serializers/spree/api/v3/payment_serializer.rb +5 -10
  397. data/app/serializers/spree/api/v3/payment_session_serializer.rb +5 -13
  398. data/app/serializers/spree/api/v3/payment_setup_session_serializer.rb +3 -11
  399. data/app/serializers/spree/api/v3/policy_serializer.rb +1 -3
  400. data/app/serializers/spree/api/v3/price_history_serializer.rb +6 -8
  401. data/app/serializers/spree/api/v3/price_serializer.rb +7 -12
  402. data/app/serializers/spree/api/v3/product_filter_price_range_serializer.rb +10 -4
  403. data/app/serializers/spree/api/v3/product_publication_serializer.rb +1 -7
  404. data/app/serializers/spree/api/v3/product_serializer.rb +10 -24
  405. data/app/serializers/spree/api/v3/product_submission_serializer.rb +26 -0
  406. data/app/serializers/spree/api/v3/purchase_order_event_serializer.rb +23 -4
  407. data/app/serializers/spree/api/v3/refund_serializer.rb +11 -16
  408. data/app/serializers/spree/api/v3/return_line_item_serializer.rb +6 -21
  409. data/app/serializers/spree/api/v3/return_serializer.rb +4 -16
  410. data/app/serializers/spree/api/v3/saved_report_event_serializer.rb +23 -0
  411. data/app/serializers/spree/api/v3/seller/address_serializer.rb +12 -0
  412. data/app/serializers/spree/api/v3/seller/balance_serializer.rb +15 -10
  413. data/app/serializers/spree/api/v3/seller/claim_line_item_serializer.rb +7 -0
  414. data/app/serializers/spree/api/v3/seller/claim_serializer.rb +5 -0
  415. data/app/serializers/spree/api/v3/seller/country_serializer.rb +19 -0
  416. data/app/serializers/spree/api/v3/seller/delivery_method_rule_serializer.rb +1 -3
  417. data/app/serializers/spree/api/v3/seller/delivery_method_serializer.rb +5 -15
  418. data/app/serializers/spree/api/v3/seller/delivery_rate_serializer.rb +8 -13
  419. data/app/serializers/spree/api/v3/seller/delivery_serializer.rb +1 -3
  420. data/app/serializers/spree/api/v3/seller/delivery_zone_serializer.rb +1 -3
  421. data/app/serializers/spree/api/v3/seller/exchange_line_item_serializer.rb +5 -0
  422. data/app/serializers/spree/api/v3/seller/exchange_serializer.rb +6 -3
  423. data/app/serializers/spree/api/v3/seller/file_upload_serializer.rb +11 -0
  424. data/app/serializers/spree/api/v3/seller/file_upload_target_serializer.rb +10 -0
  425. data/app/serializers/spree/api/v3/seller/fulfillment_item_serializer.rb +1 -7
  426. data/app/serializers/spree/api/v3/seller/fulfillment_serializer.rb +2 -6
  427. data/app/serializers/spree/api/v3/seller/import_serializer.rb +2 -2
  428. data/app/serializers/spree/api/v3/seller/invitation_serializer.rb +1 -3
  429. data/app/serializers/spree/api/v3/seller/media_serializer.rb +2 -5
  430. data/app/serializers/spree/api/v3/seller/order_line_item_serializer.rb +8 -13
  431. data/app/serializers/spree/api/v3/seller/order_serializer.rb +19 -40
  432. data/app/serializers/spree/api/v3/seller/payment_split_serializer.rb +8 -9
  433. data/app/serializers/spree/api/v3/seller/payout_serializer.rb +6 -6
  434. data/app/serializers/spree/api/v3/seller/price_history_serializer.rb +11 -0
  435. data/app/serializers/spree/api/v3/seller/price_serializer.rb +11 -0
  436. data/app/serializers/spree/api/v3/seller/product_serializer.rb +3 -7
  437. data/app/serializers/spree/api/v3/seller/product_submission_serializer.rb +1 -21
  438. data/app/serializers/spree/api/v3/seller/profile_serializer.rb +9 -13
  439. data/app/serializers/spree/api/v3/seller/requirement_status_serializer.rb +3 -9
  440. data/app/serializers/spree/api/v3/seller/return_line_item_serializer.rb +8 -0
  441. data/app/serializers/spree/api/v3/seller/return_serializer.rb +8 -17
  442. data/app/serializers/spree/api/v3/seller/state_serializer.rb +10 -0
  443. data/app/serializers/spree/api/v3/seller/stock_location_serializer.rb +3 -0
  444. data/app/serializers/spree/api/v3/seller/transfer_serializer.rb +10 -9
  445. data/app/serializers/spree/api/v3/seller/variant_serializer.rb +8 -4
  446. data/app/serializers/spree/api/v3/seller_serializer.rb +1 -3
  447. data/app/serializers/spree/api/v3/shipping_label_event_serializer.rb +22 -4
  448. data/app/serializers/spree/api/v3/stock_level_serializer.rb +1 -7
  449. data/app/serializers/spree/api/v3/stock_location_serializer.rb +8 -1
  450. data/app/serializers/spree/api/v3/stock_movement_serializer.rb +1 -3
  451. data/app/serializers/spree/api/v3/stock_receipt_event_serializer.rb +20 -4
  452. data/app/serializers/spree/api/v3/stock_transfer_serializer.rb +1 -7
  453. data/app/serializers/spree/api/v3/store_credit_event_serializer.rb +2 -13
  454. data/app/serializers/spree/api/v3/store_credit_serializer.rb +3 -27
  455. data/app/serializers/spree/api/v3/supplier_event_serializer.rb +6 -4
  456. data/app/serializers/spree/api/v3/tax_line_serializer.rb +11 -23
  457. data/app/serializers/spree/api/v3/variant_serializer.rb +10 -24
  458. data/app/serializers/spree/api/v3/wishlist_item_serializer.rb +1 -11
  459. data/app/serializers/spree/api/v3/wishlist_serializer.rb +2 -6
  460. data/app/services/spree/api/v3/filter_predicates.rb +29 -0
  461. data/app/services/spree/api/v3/filter_table.rb +337 -0
  462. data/app/services/spree/api/v3/filters_aggregator.rb +2 -2
  463. data/app/services/spree/api/v3/request_schema.rb +430 -0
  464. data/app/services/spree/webhooks/deliver_webhook.rb +7 -3
  465. data/app/subscribers/spree/webhook_event_subscriber.rb +3 -10
  466. data/config/initializers/pagy.rb +1 -1
  467. data/config/initializers/typelizer.rb +7 -9
  468. data/config/locales/ar.yml +15 -0
  469. data/config/locales/be.yml +15 -0
  470. data/config/locales/bg.yml +15 -0
  471. data/config/locales/ca.yml +15 -0
  472. data/config/locales/cs.yml +15 -0
  473. data/config/locales/da.yml +15 -0
  474. data/config/locales/de-CH.yml +11 -0
  475. data/config/locales/de.yml +15 -0
  476. data/config/locales/el.yml +15 -0
  477. data/config/locales/en.yml +5 -40
  478. data/config/locales/es-CL.yml +10 -0
  479. data/config/locales/es-EC.yml +11 -0
  480. data/config/locales/es-MX.yml +12 -0
  481. data/config/locales/es.yml +15 -0
  482. data/config/locales/et.yml +15 -0
  483. data/config/locales/fa.yml +15 -0
  484. data/config/locales/fi.yml +15 -0
  485. data/config/locales/fr.yml +15 -0
  486. data/config/locales/hu.yml +15 -0
  487. data/config/locales/id.yml +15 -0
  488. data/config/locales/it.yml +15 -0
  489. data/config/locales/ja.yml +15 -0
  490. data/config/locales/km.yml +15 -0
  491. data/config/locales/ko.yml +15 -0
  492. data/config/locales/ku.yml +15 -0
  493. data/config/locales/lt.yml +15 -0
  494. data/config/locales/lv.yml +15 -0
  495. data/config/locales/nb.yml +15 -0
  496. data/config/locales/ne.yml +15 -0
  497. data/config/locales/nl.yml +15 -0
  498. data/config/locales/pl.yml +15 -0
  499. data/config/locales/pt-BR.yml +13 -0
  500. data/config/locales/pt.yml +15 -0
  501. data/config/locales/ro.yml +15 -0
  502. data/config/locales/ru.yml +15 -0
  503. data/config/locales/sk.yml +15 -0
  504. data/config/locales/sl-SI.yml +15 -0
  505. data/config/locales/sv.yml +15 -0
  506. data/config/locales/th.yml +15 -0
  507. data/config/locales/tr.yml +15 -0
  508. data/config/locales/uk.yml +15 -0
  509. data/config/locales/vi.yml +15 -0
  510. data/config/locales/zh-CN.yml +15 -0
  511. data/config/locales/zh-TW.yml +15 -0
  512. data/config/routes.rb +54 -102
  513. data/lib/spree/api/configuration.rb +5 -0
  514. data/lib/spree/api/dependencies.rb +54 -274
  515. data/lib/spree/api/middleware/request_size_limit.rb +24 -3
  516. data/lib/spree/api/openapi/filter_documentation.rb +136 -0
  517. data/lib/spree/api/openapi/schema_helper.rb +127 -81
  518. data/lib/spree/api/preference_families.rb +46 -0
  519. data/lib/spree/api/preference_types.rb +138 -0
  520. data/lib/spree/api/typelizer_generation.rb +39 -0
  521. data/lib/spree/api/webhook_event_types.rb +140 -0
  522. data/lib/spree/api.rb +0 -2
  523. data/lib/tasks/filters.rake +12 -0
  524. data/lib/typelizer/open_enums.rb +10 -0
  525. metadata +125 -40
  526. data/app/controllers/concerns/spree/api/v3/address_params.rb +0 -17
  527. data/app/controllers/concerns/spree/api/v3/direct_uploads.rb +0 -35
  528. data/app/controllers/spree/api/v3/admin/direct_uploads_controller.rb +0 -54
  529. data/app/controllers/spree/api/v3/seller/direct_uploads_controller.rb +0 -21
  530. data/config/i18n-tasks.yml +0 -40
  531. data/config/initializers/alba.rb +0 -5
@@ -12,6 +12,12 @@ module Spree
12
12
  class SellerPayoutsController < ResourceController
13
13
  scoped_resource :payouts
14
14
 
15
+ request_params 'SellerPayoutCompleteParams', action: :complete do |body|
16
+ body.attribute :reference, :string,
17
+ example: 'TRF-8842',
18
+ description: "The provider's own id for the settlement, when one made it."
19
+ end
20
+
15
21
  # PATCH /api/v3/admin/seller_payouts/:id/complete
16
22
  #
17
23
  # What the built-in provider waits for: the operator saying the bank
@@ -30,11 +36,7 @@ module Spree
30
36
  reference: params[:reference].to_s.presence
31
37
  )
32
38
 
33
- if result.success?
34
- render json: serialize_resource(result.value)
35
- else
36
- render_result_error(result)
37
- end
39
+ render_result(result)
38
40
  end
39
41
 
40
42
  protected
@@ -47,10 +49,6 @@ module Spree
47
49
  Spree.api.admin_seller_payout_serializer
48
50
  end
49
51
 
50
- def scope
51
- super.for_store(current_store)
52
- end
53
-
54
52
  # Deliberately without `transfers`: the serializer wants their number,
55
53
  # not the rows, and a monthly settlement can hold hundreds.
56
54
  def collection_includes
@@ -12,6 +12,21 @@ module Spree
12
12
  class SellerRequirementSubmissionsController < ResourceController
13
13
  scoped_resource :sellers
14
14
 
15
+ request_params 'SellerRequirementWaiveParams', action: :create do |body|
16
+ body.attribute :requirement_id, :id,
17
+ required: true,
18
+ example: 'selreq_UkLWZg9DAJ',
19
+ description: 'The requirement the seller is excused from.'
20
+ body.attribute :review_note, :string, description: 'Why the seller is excused. Kept with the decision.'
21
+ end
22
+
23
+ %i[accept reject].each do |action|
24
+ request_params('SellerRequirementReviewParams', action: action) do |body|
25
+ body.attribute :review_note, :string,
26
+ description: 'Kept with the decision. On a rejection it is the reason sent back to the seller.'
27
+ end
28
+ end
29
+
15
30
  before_action :set_resource, only: [:show, :accept, :reject, :download]
16
31
 
17
32
  # POST /api/v3/admin/sellers/:seller_id/requirement_submissions
@@ -30,11 +45,7 @@ module Spree
30
45
  review_note: params[:review_note]
31
46
  )
32
47
 
33
- if result.success?
34
- render json: serialize_resource(result.value), status: :created
35
- else
36
- render_result_error(result)
37
- end
48
+ render_result(result, status: :created)
38
49
  end
39
50
 
40
51
  # PATCH /api/v3/admin/sellers/:seller_id/requirement_submissions/:id/accept
@@ -126,11 +137,7 @@ module Spree
126
137
  review_note: params[:review_note]
127
138
  )
128
139
 
129
- if result.success?
130
- render json: serialize_resource(result.value)
131
- else
132
- render_result_error(result)
133
- end
140
+ render_result(result)
134
141
  end
135
142
  end
136
143
  end
@@ -16,6 +16,36 @@ module Spree
16
16
  subclassed_via -> { Spree.seller_requirements },
17
17
  unknown_type_error: 'unknown_seller_requirement_type'
18
18
 
19
+ # `type` is stripped before assignment by the subclassed-resource
20
+ # flow, so a saved row's kind can never change — which matters
21
+ # because its submissions answered the old one.
22
+ request_params :seller_requirement do |body|
23
+ body.attribute :type, :string,
24
+ required: true,
25
+ only: :create,
26
+ example: 'document',
27
+ description: 'The kind, from the seller requirement types endpoint.'
28
+ body.attribute :name, :string,
29
+ example: 'Business registration',
30
+ description: 'What the seller sees. Required for kinds that can be added more than once, since the wording is the only thing telling them apart. Left blank on the others, the kind names itself.'
31
+ body.attribute :description, :string,
32
+ example: 'A copy of your certificate of incorporation.',
33
+ description: 'Instructions shown to the seller.'
34
+ body.attribute :position, :integer, example: 1, description: 'Place in the checklist.'
35
+ body.attribute :active, :boolean, example: true
36
+ body.attribute :required, :boolean,
37
+ example: true,
38
+ description: 'Whether this blocks approval. Off means recommended.'
39
+ body.attribute :preferences, :hash,
40
+ example: { accepted_content_types: ['application/pdf'] },
41
+ description: "Configuration for this kind, per its type's `schema`."
42
+ body.attribute :metadata, :hash
43
+ # Permitted per kind, from the kind's own `additional_permitted_attributes`.
44
+ body.attribute :custom_field_definition_ids, :array, of: :id,
45
+ permit: false,
46
+ description: 'Custom field definitions this requirement asks the seller to fill in (`required_custom_fields` kind).'
47
+ end
48
+
19
49
  # GET /api/v3/admin/seller_requirements/types
20
50
  #
21
51
  # The kinds an operator can add, with the shape of each one's
@@ -49,7 +79,7 @@ module Spree
49
79
  # Config a kind takes beyond its preferences — a reference
50
80
  # list gets its own picker, not a text box.
51
81
  association_fields: association_fields_for(klass),
52
- preference_schema: klass.serialized_preference_schema
82
+ schema: klass.preference_json_schema
53
83
  }
54
84
  end
55
85
 
@@ -70,12 +100,8 @@ module Spree
70
100
  super.ordered
71
101
  end
72
102
 
73
- # `type` is stripped before assignment by the subclassed-resource
74
- # flow, so a saved row's kind can never change — which matters
75
- # because its submissions answered the old one.
76
103
  def permitted_params
77
- params.permit(:type, :name, :description, :position, :active, :required,
78
- preferences: {}, metadata: {})
104
+ params.permit(*declared_permitted_attributes)
79
105
  end
80
106
 
81
107
  # `types` is read-only discovery — maps to the read scope.
@@ -20,10 +20,6 @@ module Spree
20
20
  Spree.api.admin_seller_transfer_serializer
21
21
  end
22
22
 
23
- def scope
24
- super.for_store(current_store)
25
- end
26
-
27
23
  # Every association the serializer reads, so a page of rows costs a
28
24
  # fixed number of queries rather than one per row.
29
25
  def collection_includes
@@ -38,7 +38,7 @@ module Spree
38
38
  if @invitation.expired?
39
39
  return render_error(
40
40
  code: ErrorHandler::ERROR_CODES[:processing_error],
41
- message: Spree.t(:invitation_expired),
41
+ message: I18n.t('spree.invitation_expired'),
42
42
  status: :unprocessable_content
43
43
  )
44
44
  end
@@ -47,7 +47,7 @@ module Spree
47
47
  # than a success that produced no payout.
48
48
  render_error(
49
49
  code: ErrorHandler::ERROR_CODES[:validation_error],
50
- message: Spree.t(:seller_payout_nothing_to_settle),
50
+ message: I18n.t('spree.seller_payout_nothing_to_settle'),
51
51
  status: :unprocessable_content
52
52
  )
53
53
  end
@@ -19,6 +19,80 @@ module Spree
19
19
  before_action :set_resource, only: [:show, :update, :destroy, :invite, :approve, :suspend, :reject,
20
20
  :onboarding, :reopen_onboarding]
21
21
 
22
+ # Enumerated rather than borrowing the legacy global list, which
23
+ # permits :id, :user_id and :deleted_at — the first of which would
24
+ # reintroduce the address-by-id hole below.
25
+ # The seller's own profile fields, plus the settlement and tax
26
+ # configuration only the operator sets. `status` is absent by
27
+ # design — see the class comment.
28
+ #
29
+ # Addresses are written as nested attributes, never as ids: an
30
+ # address has no store of its own, so accepting `billing_address_id`
31
+ # would bind an arbitrary row and the serializer would render it
32
+ # back in full — an enumeration oracle over every customer address
33
+ # on the installation.
34
+ request_params :seller do |body|
35
+ body.external_references
36
+ body.attribute :name, :string, required: true, on: :create, example: 'Northwind Books'
37
+ body.attribute :slug, :string,
38
+ example: 'northwind-books',
39
+ description: 'URL-safe slug, derived from the name when omitted.'
40
+ body.attribute :contact_email, :string, nullable: true, example: 'hi@northwind.example'
41
+ body.attribute :billing_email, :string, nullable: true, example: 'billing@northwind.example'
42
+ body.attribute :about, :string,
43
+ nullable: true,
44
+ example: '<p>Independent bookshop.</p>',
45
+ description: "Sanitized HTML: the seller's public description."
46
+ body.attribute :logo_signed_id, :string,
47
+ nullable: true,
48
+ description: 'A `signed_id` from the files upload endpoint to set the image, `null` to remove it, or omit the key to leave it untouched. The same applies to `square_logo_signed_id` and `cover_photo_signed_id`.'
49
+ body.attribute :square_logo_signed_id, :string, nullable: true
50
+ body.attribute :cover_photo_signed_id, :string, nullable: true
51
+ body.attribute :tax_remittance, :string, choices: Spree::Seller::TAX_REMITTANCES, example: 'seller'
52
+ body.attribute :payouts_schedule_interval, :string,
53
+ nullable: true,
54
+ choices: Spree::Seller::PAYOUT_INTERVALS
55
+ body.attribute :minimum_payout_amount, :decimal, nullable: true, example: '25.0'
56
+ body.attribute :holiday_mode_until, :datetime,
57
+ nullable: true,
58
+ description: 'Set while the seller is away: the catalog stays but stops selling.'
59
+ body.attribute :legal_name, :string, nullable: true
60
+ body.attribute :registration_number, :string, nullable: true
61
+ body.attribute :metadata, :hash
62
+ body.attribute :billing_address, :object,
63
+ as: 'SellerAddressParams',
64
+ description: "The seller's own billing address, written inline. There is no `billing_address_id`: an address belongs to whoever it was created for, so it is never referenced by id." do |billing_address|
65
+ billing_address.include_attributes Spree::Api::V3::AddressRequestSchema
66
+ end
67
+ body.attribute :custom_fields, :array, of: Spree::Api::V3::CustomFieldValueRequestSchema,
68
+ description: 'Custom field values, each validated against its definition.'
69
+ end
70
+
71
+ request_params 'SellerInviteParams', action: :invite do |body|
72
+ body.attribute :email, :string, required: true, example: 'seller@example.com'
73
+ body.attribute :role_id, :id,
74
+ nullable: true,
75
+ example: 'role_UkLWZg9DAJ',
76
+ description: "A role this seller owns; defaults to the seller's own admin role."
77
+ end
78
+
79
+ request_params 'SellerApproveParams', action: :approve do |body|
80
+ body.attribute :override_requirements, :boolean,
81
+ description: 'Admits a seller whose onboarding checklist is unfinished: the operator\'s deliberate exception, which the `seller.approved` event records along with what was outstanding.'
82
+ end
83
+
84
+ request_params 'SellerReopenOnboardingParams', action: :reopen_onboarding do |body|
85
+ body.attribute :note, :string, description: 'What the seller has to fix.'
86
+ end
87
+
88
+ request_params 'SellerSuspendParams', action: :suspend do |body|
89
+ body.attribute :reason, :string, example: 'Counterfeit goods'
90
+ end
91
+
92
+ request_params 'SellerRejectParams', action: :reject do |body|
93
+ body.attribute :reason, :string, example: 'Incomplete paperwork'
94
+ end
95
+
22
96
  # POST /api/v3/admin/sellers/:id/invite
23
97
  #
24
98
  # Opens the seller's team to someone. They become a member when they
@@ -31,11 +105,7 @@ module Spree
31
105
  inviter: try_spree_current_user
32
106
  )
33
107
 
34
- if result.success?
35
- render json: serialize_resource(result.value), status: :created
36
- else
37
- render_result_error(result)
38
- end
108
+ render_result(result, status: :created)
39
109
  end
40
110
 
41
111
  # GET /api/v3/admin/sellers/:id/onboarding
@@ -129,29 +199,8 @@ module Spree
129
199
  { store: :seller_requirements, logo_attachment: :blob, cover_photo_attachment: :blob }]
130
200
  end
131
201
 
132
- # Enumerated rather than borrowing the legacy global list, which
133
- # permits :id, :user_id and :deleted_at — the first of which would
134
- # reintroduce the address-by-id hole below.
135
- # The seller's own profile fields, plus the settlement and tax
136
- # configuration only the operator sets. `status` is absent by
137
- # design — see the class comment.
138
- #
139
- # Addresses are written as nested attributes, never as ids: an
140
- # address has no store of its own, so accepting `billing_address_id`
141
- # would bind an arbitrary row and the serializer would render it
142
- # back in full — an enumeration oracle over every customer address
143
- # on the installation.
144
202
  def permitted_params
145
- normalize_params(
146
- params.permit(:name, :slug, :contact_email, :billing_email, :about,
147
- :logo, :square_logo, :cover_photo,
148
- :tax_remittance, :payouts_schedule_interval, :minimum_payout_amount,
149
- :holiday_mode_until,
150
- :legal_name, :registration_number,
151
- metadata: {},
152
- billing_address: Spree::Api::V3::AddressParams::ADDRESS_KEYS,
153
- custom_fields: [:id, :custom_field_definition_id, :value, { value: [] }, { value: {} }])
154
- )
203
+ normalize_params(params.permit(*declared_permitted_attributes))
155
204
  end
156
205
 
157
206
  # Creating a seller provisions their stock location too, so it goes
@@ -176,11 +225,7 @@ module Spree
176
225
  def run_workflow(workflow, **arguments)
177
226
  result = workflow.call(seller: @resource, **arguments)
178
227
 
179
- if result.success?
180
- render json: serialize_resource(result.value)
181
- else
182
- render_result_error(result)
183
- end
228
+ render_result(result)
184
229
  end
185
230
 
186
231
  # Read through the seller's own roles: a role id naming somewhere
@@ -14,6 +14,35 @@ module Spree
14
14
  skip_scope_check!
15
15
  skip_before_action :authenticate_admin!, only: [:show, :countries, :create]
16
16
 
17
+ request_params 'SetupParams', action: :create do |body|
18
+ body.attribute :setup_token, :string,
19
+ required: true,
20
+ permit: false,
21
+ description: 'The one-time token from the install output.'
22
+ body.attribute :email, :string, required: true, format: :email, example: 'owner@example.com'
23
+ body.attribute :password, :string, required: true
24
+ body.attribute :password_confirmation, :string
25
+ body.attribute :first_name, :string, example: 'Olivia'
26
+ body.attribute :last_name, :string, example: 'Owner'
27
+ body.attribute :store_name, :string, permit: false, example: 'My Store'
28
+ body.attribute :country_code, :country,
29
+ required: true,
30
+ permit: false,
31
+ example: 'US',
32
+ description: 'ISO 3166-1 alpha-2 country the store sells from. It determines the default market, the warehouse, the delivery zones and the currency.'
33
+ body.attribute :locale, :locale,
34
+ permit: false,
35
+ example: 'en',
36
+ description: "Storefront locale. Defaults to the country's own language."
37
+ body.attribute :currency, :currency,
38
+ permit: false,
39
+ example: 'USD',
40
+ description: "ISO 4217 currency. Defaults to the country's own currency: pass one only when the store prices in something else."
41
+ body.attribute :sample_data, :boolean,
42
+ permit: false,
43
+ description: 'Load the demo catalog, customers and orders in the background once the admin account exists. The load takes minutes, so the response does not wait for it.'
44
+ end
45
+
17
46
  # Only create checks the setup token, so only create needs the strict
18
47
  # login budget against guessing. The status and countries reads stay
19
48
  # on the general per-caller limit: sharing the login budget with them
@@ -43,15 +72,13 @@ module Spree
43
72
  end
44
73
 
45
74
  # POST /api/v3/admin/auth/setup
46
- # Body: { setup_token, email, password, password_confirmation?,
47
- # first_name?, last_name?, store_name, country_code,
48
- # locale?, currency?, sample_data? }
49
75
  # Currency defaults to the country's own; an unknown code is refused
50
76
  # rather than ignored, since the token is spent in the same request.
51
77
  def create
52
78
  return render_setup_unavailable unless setup_token_usable?
53
79
  return render_missing_country if country.nil?
54
80
  return render_unknown_currency if unknown_currency?
81
+ return render_unknown_locale if unknown_locale?
55
82
 
56
83
  user = nil
57
84
  store = Spree::Store.default
@@ -135,34 +162,38 @@ module Spree
135
162
  )
136
163
  end
137
164
 
165
+ # Blank means "use the country's own language"; another spelling or a
166
+ # region Spree does not list moves to the listed locale, but a code
167
+ # Spree cannot place at all is refused before the token is spent.
168
+ def unknown_locale?
169
+ params[:locale].present? && Spree::Locales.listed(params[:locale]).nil?
170
+ end
171
+
172
+ def render_unknown_locale
173
+ message = "Unknown locale #{params[:locale]}"
174
+
175
+ render_error(
176
+ code: ERROR_CODES[:validation_error],
177
+ message: message,
178
+ status: :unprocessable_content,
179
+ details: { locale: [message] }
180
+ )
181
+ end
182
+
138
183
  def country_payload(country)
139
184
  {
140
185
  code: country.iso,
141
- name: country.name,
142
186
  currency: country.default_currency,
143
187
  locales: offerable_locales(country)
144
188
  }
145
189
  end
146
190
 
147
- # A country's official languages, minus any Spree has no translations
148
- # for — Switzerland speaks Romansh and Spree does not, so offering it
149
- # would point a storefront at a language with nothing behind it.
150
- # English closes the gap for countries whose languages all fall
151
- # through, and is always offered alongside.
152
- #
153
- # Installs without spree_i18n only have English, and filtering
154
- # against that would leave every country English-only. There the
155
- # unfiltered list is the better answer: the merchant's own language
156
- # is still the right default for their storefront, whether or not
157
- # this install carries a translation bundle for it.
191
+ # A country's official languages, as the locales Spree lists for them
192
+ # (Switzerland gives de, fr, it and rm) — content locales, whether
193
+ # or not Spree ships translations, since the storefront and dashboard
194
+ # carry their own. English stands in for a country with none listed.
158
195
  def offerable_locales(country)
159
- return country.official_locales if translated_locales.size <= 1
160
-
161
- (country.official_locales & translated_locales).presence || ['en']
162
- end
163
-
164
- def translated_locales
165
- @translated_locales ||= Spree.available_locales.map { |locale| locale.to_s.split('-').first }.uniq
196
+ country.official_locales.filter_map { |language| Spree::Locales.for_language(language) }.uniq.presence || ['en']
166
197
  end
167
198
 
168
199
  # Token mismatch, spent token, and already-set-up all render the
@@ -180,7 +211,7 @@ module Spree
180
211
  end
181
212
 
182
213
  def admin_user_params
183
- params.permit(:email, :password, :password_confirmation, :first_name, :last_name)
214
+ params.permit(*declared_permitted_attributes)
184
215
  end
185
216
 
186
217
  # The seed already created the default store (every downstream seed
@@ -10,6 +10,43 @@ module Spree
10
10
 
11
11
  before_action :require_stock_levels!, only: [:bulk_upsert]
12
12
 
13
+ # Stock levels are auto-created against a (variant, stock_location)
14
+ # pair and never re-pointed, so update only touches the count and
15
+ # backorder flag, not the variant or location.
16
+ request_params :stock_level do |body|
17
+ body.external_references
18
+ body.attribute :count_on_hand, :integer,
19
+ description: 'The count the shelf should end at: a whole number of zero or more. The API records the difference as an `adjusted` movement, so the correction appears in the stock history.'
20
+ body.attribute :adjustment, :integer,
21
+ description: 'A signed change to the shelf instead of a target count, applied to the count the API holds at that moment and recorded the same way. Cannot be sent together with `count_on_hand`.'
22
+ body.attribute :backorderable, :boolean,
23
+ description: 'Whether this location sells the variant beyond what it holds.'
24
+ # Optional so an audit requirement never turns an existing
25
+ # endpoint into a 422.
26
+ body.attribute :reason, :string,
27
+ description: 'Labels the correction in the stock history. Defaults to "Manual adjustment".'
28
+ body.attribute :metadata, :hash
29
+ end
30
+
31
+ request_params 'StockLevelBulkUpsertParams', action: :bulk_upsert do |body|
32
+ body.attribute :stock_levels, :array,
33
+ required: true,
34
+ as: 'StockLevelBulkUpsertRowParams',
35
+ description: 'Send an empty list to change nothing.' do |stock_level|
36
+ stock_level.attribute :variant_id, :id, required: true, example: 'variant_xY9'
37
+ stock_level.attribute :stock_location_id, :id, required: true, example: 'sloc_aBc'
38
+ stock_level.attribute :count_on_hand, :integer,
39
+ nullable: true,
40
+ example: 42,
41
+ description: 'The absolute level the external system reports.'
42
+ stock_level.attribute :adjustment, :integer,
43
+ nullable: true,
44
+ example: -3,
45
+ description: 'A relative change, for feeds that report movements rather than levels. Each row needs `count_on_hand` or `adjustment`.'
46
+ stock_level.attribute :backorderable, :boolean, nullable: true
47
+ end
48
+ end
49
+
13
50
  def bulk_upsert
14
51
  authorize! :update, Spree::StockLevel
15
52
 
@@ -101,16 +138,8 @@ module Spree
101
138
  collection.order(Spree::StockLevel.arel_table[:id].asc)
102
139
  end
103
140
 
104
- # Stock levels are auto-created against a (variant, stock_location)
105
- # pair and never re-pointed, so update only touches the count and
106
- # backorder flag — not the variant or location FKs.
107
- #
108
- # `reason` labels the correction in the stock history. It stays
109
- # optional so an audit requirement never turns an existing endpoint
110
- # into a 422; omitting it falls back to a translated default.
111
141
  def permitted_params
112
- params.permit(*model_additional_permitted_attributes, :count_on_hand, :adjustment, :backorderable, :reason,
113
- metadata: {})
142
+ params.permit(*permitted_attributes)
114
143
  end
115
144
 
116
145
  private
@@ -5,6 +5,46 @@ module Spree
5
5
  class StockLocationsController < ResourceController
6
6
  scoped_resource :stock
7
7
 
8
+ request_params :stock_location do |body|
9
+ body.external_references
10
+ body.attribute :name, :string, required: true, on: :create, example: 'Brooklyn warehouse'
11
+ body.attribute :admin_name, :string, nullable: true, description: 'Internal name shown only in the admin.'
12
+ body.attribute :active, :boolean
13
+ body.attribute :default, :boolean, description: 'Setting to true demotes the previous default.'
14
+ body.attribute :kind, :string,
15
+ choices: Spree::StockLocation::KINDS,
16
+ open: true,
17
+ example: 'warehouse',
18
+ description: 'Categorizes the location.'
19
+ body.attribute :propagate_all_variants, :boolean
20
+ body.attribute :backorderable_default, :boolean
21
+ body.attribute :address1, :string, nullable: true
22
+ body.attribute :address2, :string, nullable: true
23
+ body.attribute :city, :string, nullable: true
24
+ body.attribute :zipcode, :string, nullable: true
25
+ body.attribute :phone, :string, nullable: true
26
+ body.attribute :company, :string, nullable: true
27
+ body.attribute :country_code, :country,
28
+ nullable: true,
29
+ example: 'US',
30
+ description: 'ISO-3166 alpha-2 country code.'
31
+ body.attribute :state_code, :string,
32
+ nullable: true,
33
+ example: 'NY',
34
+ description: "State or province abbreviation, resolved against the selected country's states."
35
+ body.attribute :state_name, :string,
36
+ nullable: true,
37
+ description: "Free-text state for countries that don't have a states list."
38
+ body.attribute :pickup_enabled, :boolean
39
+ body.attribute :pickup_stock_policy, :string,
40
+ choices: Spree::StockLocation::PICKUP_STOCK_POLICIES,
41
+ description: '`local` collects only items at this location; `any` lets items transfer in from other locations (ship-to-store).'
42
+ body.attribute :pickup_ready_in_minutes, :integer, nullable: true
43
+ body.attribute :returns_enabled, :boolean,
44
+ description: 'Whether customers may send returns to this location.'
45
+ body.attribute :pickup_instructions, :string, nullable: true
46
+ end
47
+
8
48
  protected
9
49
 
10
50
  def model_class
@@ -26,15 +66,7 @@ module Spree
26
66
  end
27
67
 
28
68
  def permitted_params
29
- params.permit(
30
- *model_additional_permitted_attributes,
31
- :name, :admin_name, :active, :default,
32
- :kind, :propagate_all_variants, :backorderable_default,
33
- :address1, :address2, :city, :zipcode, :phone, :company,
34
- :country_code, :state_code, :state_name,
35
- :pickup_enabled, :pickup_stock_policy, :returns_enabled,
36
- :pickup_ready_in_minutes, :pickup_instructions
37
- )
69
+ params.permit(*permitted_attributes)
38
70
  end
39
71
  end
40
72
  end
@@ -18,6 +18,47 @@ module Spree
18
18
 
19
19
  scoped_resource :stock
20
20
 
21
+ # The warehouses and lines are read from the raw params and resolved
22
+ # through the store (see ReceivableActions), so only the document's
23
+ # own fields are permitted.
24
+ request_params :stock_transfer do |body|
25
+ body.attribute :source_location_id, :id,
26
+ required: true, on: :create,
27
+ permit: false,
28
+ example: 'sloc_1234567890'
29
+ body.attribute :destination_location_id, :id,
30
+ required: true, on: :create,
31
+ permit: false,
32
+ example: 'sloc_1234567890'
33
+ body.attribute :reference, :string,
34
+ nullable: true,
35
+ description: "The merchant's own label for the trip. `null` clears it."
36
+ body.attribute :notes, :string, nullable: true
37
+ body.attribute :items, :array,
38
+ permit: false,
39
+ as: 'StockTransferItemParams',
40
+ description: 'A draft may open empty and gain lines as the merchant packs. Sending the list replaces whatever the draft currently holds.' do |item|
41
+ item.attribute :variant_id, :id, required: true, example: 'variant_1234567890'
42
+ item.attribute :quantity_shipped, :integer, required: true, example: 10
43
+ end
44
+ body.attribute :metadata, :hash, nullable: true
45
+ end
46
+
47
+ request_params 'StockTransferMarkInTransitParams', action: :mark_in_transit do |body|
48
+ body.attribute :force, :boolean, description: 'Ship even if it drives the source below zero.'
49
+ end
50
+
51
+ request_params 'ReceivableCloseParams', action: :close do |body|
52
+ body.attribute :reason, :string, nullable: true, description: 'Why the balance is not coming.'
53
+ end
54
+
55
+ request_params 'StockTransferCancelParams', action: :cancel do |body|
56
+ body.attribute :on_in_transit, :string,
57
+ choices: %w[restock write_off],
58
+ description: 'Required once the units have left the source: either they come back (`restock`) or they are written off as lost (`write_off`).'
59
+ body.attribute :reason, :string, nullable: true, description: 'Recorded against the written-off lines.'
60
+ end
61
+
21
62
  # The base registers this for show/update/destroy; a second
22
63
  # `before_action :set_resource` replaces that registration rather than
23
64
  # adding to it, so those three are listed again here.
@@ -38,7 +79,7 @@ module Spree
38
79
  unless @resource.draft?
39
80
  return render_error(
40
81
  code: 'invalid_status',
41
- message: Spree.t('stock_transfer.errors.only_draft_can_be_deleted'),
82
+ message: I18n.t('spree.stock_transfer.errors.only_draft_can_be_deleted'),
42
83
  status: :unprocessable_content
43
84
  )
44
85
  end
@@ -129,10 +170,17 @@ module Spree
129
170
  items: items_from_params(:quantity_shipped) || [],
130
171
  reference: params[:reference],
131
172
  notes: params[:notes],
173
+ metadata: metadata_from_params,
132
174
  created_by: try_spree_current_user
133
175
  }
134
176
  end
135
177
 
178
+ # Merchant data, stored as sent: never through the prefixed-id decoding
179
+ # `permitted_params` applies.
180
+ def metadata_from_params
181
+ params.permit(*declared_permitted_attributes)[:metadata]&.to_h
182
+ end
183
+
136
184
  def update_workflow_arguments
137
185
  {
138
186
  stock_transfer: @resource,
@@ -141,13 +189,6 @@ module Spree
141
189
  }
142
190
  end
143
191
 
144
- # Only what mass assignment may safely carry. The two warehouses are
145
- # resolved through the store instead, since an id the payload names
146
- # has to be proved to belong here.
147
- def resource_permitted_attributes
148
- [:reference, :notes, { metadata: {} }]
149
- end
150
-
151
192
  # A transfer's status transitions are its own actions, so `update`
152
193
  # only ever edits the document — and its two ends are objects the
153
194
  # store handed us, never ids the payload asserted.