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
@@ -6,9 +6,13 @@ module Spree
6
6
  class GiftCardsController < BaseController
7
7
  skip_before_action :set_resource, raise: false
8
8
 
9
+ request_params 'GiftCardApplyParams' do |body|
10
+ body.attribute :code, :string,
11
+ required: true,
12
+ description: 'The gift card code; matched case-insensitively.'
13
+ end
14
+
9
15
  # POST /api/v3/admin/orders/:order_id/gift_cards
10
- #
11
- # Body: { code: String }
12
16
  def create
13
17
  with_order_lock do
14
18
  gift_card = find_gift_card!
@@ -53,17 +57,17 @@ module Spree
53
57
  gift_card = current_store.gift_cards.find_by(code: params[:code]&.downcase)
54
58
 
55
59
  if gift_card.nil?
56
- render_error(code: ERROR_CODES[:gift_card_not_found], message: Spree.t(:gift_card_not_found), status: :not_found)
60
+ render_error(code: ERROR_CODES[:gift_card_not_found], message: I18n.t('spree.gift_card_not_found'), status: :not_found)
57
61
  return
58
62
  end
59
63
 
60
64
  if gift_card.expired?
61
- render_error(code: ERROR_CODES[:gift_card_expired], message: Spree.t(:gift_card_expired), status: :unprocessable_content)
65
+ render_error(code: ERROR_CODES[:gift_card_expired], message: I18n.t('spree.gift_card_expired'), status: :unprocessable_content)
62
66
  return
63
67
  end
64
68
 
65
69
  if gift_card.redeemed?
66
- render_error(code: ERROR_CODES[:gift_card_already_redeemed], message: Spree.t(:gift_card_already_redeemed), status: :unprocessable_content)
70
+ render_error(code: ERROR_CODES[:gift_card_already_redeemed], message: I18n.t('spree.gift_card_already_redeemed'), status: :unprocessable_content)
67
71
  return
68
72
  end
69
73
 
@@ -4,6 +4,16 @@ module Spree
4
4
  module Admin
5
5
  module Orders
6
6
  class ItemsController < BaseController
7
+ request_params :line_item do |body|
8
+ body.attribute :variant_id, :id, required: true, only: :create
9
+ body.attribute :quantity, :integer, example: 1, description: 'Defaults to 1 when adding an item.'
10
+ body.attribute :price, :decimal,
11
+ nullable: true,
12
+ description: "Negotiated unit price. Stamps the line `price_source: 'manual'`, so quantity changes and recalculation never re-price it; an explicit null reverts the line to catalog pricing. Omit to leave pricing alone. Draft (incomplete) orders only."
13
+ body.attribute :options, :hash, only: :create
14
+ body.attribute :metadata, :hash, only: :update
15
+ end
16
+
7
17
  # POST /api/v3/admin/orders/:order_id/items
8
18
  def create
9
19
  with_order_lock do
@@ -69,7 +79,7 @@ module Spree
69
79
  end
70
80
 
71
81
  def permitted_params
72
- params.permit(:variant_id, :quantity, :price, metadata: {}, options: {})
82
+ params.permit(*permitted_attributes)
73
83
  end
74
84
 
75
85
  private
@@ -11,25 +11,44 @@ module Spree
11
11
  class LabelsController < BaseController
12
12
  include Spree::Api::V3::Orders::ShippingLabelActions
13
13
 
14
+ # The permit list itself lives in ShippingLabelActions, shared with
15
+ # the seller branch; this declaration documents it.
16
+ request_params :shipping_label do |body|
17
+ body.attribute :file_signed_id, :string,
18
+ description: 'A `signed_id` from `files.upload()`. Its presence records a label bought elsewhere instead of buying one; without it the body is ignored and the label is bought through the carrier.'
19
+ body.attribute :tracking_number, :string,
20
+ description: 'The number printed on an uploaded label. Required with `file_signed_id`.'
21
+ body.attribute :carrier, :string,
22
+ description: "Free text; a forwarder's name is as valid as a carrier slug. Detected from the number when omitted."
23
+ body.attribute :service, :string, description: 'Carrier service the label was bought at.'
24
+ body.attribute :cost, :decimal,
25
+ description: "What the merchant paid the carrier. Accounting data only; it never touches the order's shipping charge."
26
+ body.attribute :currency, :currency, description: 'Currency of the cost.'
27
+ body.attribute :file_format, :string,
28
+ choices: %w[pdf png zpl],
29
+ description: 'Taken from the file when omitted.'
30
+ body.attribute :tracking_url, :string, description: 'Tracking page for the consignment the label mints.'
31
+ end
32
+
14
33
  before_action :set_resource, only: [:show, :download, :refund, :destroy]
15
34
 
16
35
  # POST .../labels
17
36
  #
18
- # Buys the label through the parcel's provider, or — when a `file`
37
+ # Buys the label through the parcel's provider, or — when a `file_signed_id`
19
38
  # is given — records one the merchant bought elsewhere.
20
39
  def create
21
40
  authorize!(:create, Spree::ShippingLabel)
22
41
 
23
- return record_uploaded_label if label_params[:file].present?
42
+ return record_uploaded_label if label_params[:file_signed_id].present?
43
+ # Buying is the default only when no file is sent at all. A file
44
+ # under its old name would otherwise fall through to buying a
45
+ # label on the carrier account.
46
+ return render_misnamed_label_file if params.key?(:file)
24
47
 
25
48
  with_order_lock do
26
49
  result = Spree.shipping_label_purchase_workflow.call(owner: @parent)
27
50
 
28
- if result.success?
29
- render json: serialize_resource(result.value), status: :created
30
- else
31
- render_result_error(result)
32
- end
51
+ render_result(result, status: :created)
33
52
  end
34
53
  end
35
54
 
@@ -38,11 +57,7 @@ module Spree
38
57
  with_order_lock do
39
58
  result = Spree.shipping_label_refund_workflow.call(shipping_label: @resource)
40
59
 
41
- if result.success?
42
- render json: serialize_resource(result.value)
43
- else
44
- render_result_error(result)
45
- end
60
+ render_result(result)
46
61
  end
47
62
  end
48
63
 
@@ -67,6 +82,16 @@ module Spree
67
82
  @order.fulfillments.find_by_prefix_id!(params[:fulfillment_id])
68
83
  end
69
84
  end
85
+
86
+ private
87
+
88
+ def render_misnamed_label_file
89
+ render_error(
90
+ code: ERROR_CODES[:parameter_invalid],
91
+ message: I18n.t('spree.shipping_labels.errors.file_renamed'),
92
+ status: :unprocessable_content
93
+ )
94
+ end
70
95
  end
71
96
  end
72
97
  end
@@ -6,6 +6,18 @@ module Spree
6
6
  class PaymentsController < BaseController
7
7
  scoped_resource :payments
8
8
 
9
+ request_params :payment do |body|
10
+ body.attribute :payment_method_id, :id, required: true, on: :create
11
+ body.attribute :amount, :decimal, description: "Defaults to the order total left after store credit."
12
+ body.attribute :source_id, :id,
13
+ description: "A saved payment source of the order's customer (a credit card), for an off-session charge. Used only by payment methods that require a source."
14
+ end
15
+
16
+ request_params 'PaymentCaptureParams', action: :capture do |body|
17
+ body.attribute :amount, :decimal,
18
+ description: 'Captures part of the authorized amount. Defaults to all of it.'
19
+ end
20
+
9
21
  before_action :set_resource, only: [:show, :capture, :void]
10
22
 
11
23
  # POST /api/v3/admin/orders/:order_id/payments
@@ -52,26 +64,21 @@ module Spree
52
64
  # to prevent. Both flows are idempotent on replay — an
53
65
  # already-captured or already-void payment returns success.
54
66
  def capture
55
- amount = params[:amount] ? (params[:amount].to_f * 100).round : nil
67
+ amount = money_param(:amount, @resource.currency)
68
+ unless amount.nil? || amount.positive?
69
+ raise Spree::Money::InvalidFormat.new('must be greater than 0', field: :amount)
70
+ end
56
71
 
57
72
  result = Spree.payment_capture_workflow.call(payment: @resource, amount: amount)
58
73
 
59
- if result.success?
60
- render json: serialize_resource(result.value)
61
- else
62
- render_result_error(result)
63
- end
74
+ render_result(result)
64
75
  end
65
76
 
66
77
  # PATCH /api/v3/admin/orders/:order_id/payments/:id/void
67
78
  def void
68
79
  result = Spree.payment_void_workflow.call(payment: @resource)
69
80
 
70
- if result.success?
71
- render json: serialize_resource(result.value)
72
- else
73
- render_result_error(result)
74
- end
81
+ render_result(result)
75
82
  end
76
83
 
77
84
  protected
@@ -84,14 +91,6 @@ module Spree
84
91
  Spree.api.admin_payment_serializer
85
92
  end
86
93
 
87
- def parent_association
88
- :payments
89
- end
90
-
91
- def permitted_params
92
- params.permit(:amount, :payment_method_id, :source_id)
93
- end
94
-
95
94
  # Saved-source charges require an order customer — sources are scoped
96
95
  # to that customer to prevent attaching customer A's card to
97
96
  # customer B's order. Refuse if no customer is assigned.
@@ -6,6 +6,12 @@ module Spree
6
6
  class RefundsController < BaseController
7
7
  scoped_resource :refunds
8
8
 
9
+ request_params :refund do |body|
10
+ body.attribute :payment_id, :id, required: true, on: :create
11
+ body.attribute :amount, :decimal, required: true, on: :create
12
+ body.attribute :refund_reason_id, :id, description: "Defaults to the store's first refund reason."
13
+ end
14
+
9
15
  # POST /api/v3/admin/orders/:order_id/refunds
10
16
  #
11
17
  # Deliberately not wrapped in with_order_lock: the workflow calls
@@ -33,11 +39,7 @@ module Spree
33
39
  order: @parent
34
40
  )
35
41
 
36
- if result.success?
37
- render json: serialize_resource(result.value), status: :created
38
- else
39
- render_result_error(result)
40
- end
42
+ render_result(result, status: :created)
41
43
  end
42
44
 
43
45
  protected
@@ -19,6 +19,42 @@ module Spree
19
19
  # would be wrongly denied.
20
20
  scoped_resource :orders
21
21
 
22
+ request_params :return do |body|
23
+ body.attribute :items, :array,
24
+ required: true, on: :create,
25
+ only: :create,
26
+ description: 'Fulfilled units coming back, and how many of each.' do |item|
27
+ item.attribute :fulfillment_item_id, :id, required: true
28
+ item.attribute :quantity, :integer, required: true
29
+ end
30
+ body.attribute :stock_location_id, :id,
31
+ description: 'Where the goods come back to. Defaults to the location that shipped them.'
32
+ body.attribute :reason_id, :id, description: "One of the store's return reasons."
33
+ body.attribute :memo, :string
34
+ body.attribute :metadata, :hash, only: :update
35
+ end
36
+
37
+ request_params 'ReturnReceiveParams', action: :receive do |body|
38
+ body.attribute :items, :array,
39
+ description: 'What actually arrived. Omit to receive everything as requested and resellable; send rows for a partial or damaged receipt.' do |item|
40
+ item.attribute :return_line_item_id, :id, required: true
41
+ item.attribute :quantity, :integer, required: true
42
+ item.attribute :resellable, :boolean,
43
+ description: 'Goods that cannot be resold are received but never restocked. Defaults to true.'
44
+ end
45
+ end
46
+
47
+ request_params 'ReturnRefundParams', action: :refund do |body|
48
+ body.attribute :amount, :decimal, description: 'Defaults to the value of what was actually received.'
49
+ body.attribute :refund_method, :string,
50
+ choices: Spree::RefundMethods::METHODS,
51
+ description: '`store_credit` issues credit immediately; `original_payment` (the default) refunds through the gateway that took the money.'
52
+ end
53
+
54
+ request_params 'ReturnCancelParams', action: :cancel do |body|
55
+ body.attribute :reason, :string, description: 'A note on why the return was canceled.'
56
+ end
57
+
22
58
  before_action :set_resource, only: [:show, :update, :approve, :receive, :refund, :cancel]
23
59
 
24
60
  # PATCH /api/v3/admin/orders/:order_id/returns/:id
@@ -50,7 +86,7 @@ module Spree
50
86
  end
51
87
 
52
88
  def permitted_params
53
- params.permit(:memo, :reason_id, :stock_location_id, metadata: {})
89
+ params.permit(*permitted_attributes)
54
90
  end
55
91
 
56
92
  private
@@ -6,17 +6,20 @@ module Spree
6
6
  class StoreCreditsController < BaseController
7
7
  skip_before_action :set_resource, raise: false
8
8
 
9
+ request_params 'StoreCreditApplyParams' do |body|
10
+ body.attribute :amount, :decimal,
11
+ description: "Defaults to the customer's available store credit, up to the order total."
12
+ end
13
+
9
14
  # POST /api/v3/admin/orders/:order_id/store_credits
10
15
  #
11
- # Body: { amount: Number (optional) }
12
- #
13
16
  # When `amount` is omitted, applies the customer's available store
14
17
  # credit up to the order total.
15
18
  def create
16
19
  with_order_lock do
17
20
  result = Spree.store_credit_apply_service.call(
18
21
  order: @parent,
19
- amount: params[:amount].try(:to_f)
22
+ amount: money_param(:amount, @parent.currency)
20
23
  )
21
24
 
22
25
  if result.success?
@@ -7,11 +7,78 @@ module Spree
7
7
 
8
8
  scoped_resource :orders
9
9
 
10
- # The order accepts a `po_document` signed blob id and streams it back.
10
+ # The order accepts a `po_document_signed_id` and streams it back.
11
11
  include ActiveStorage::SetCurrent
12
12
 
13
- # A tampered signed id would otherwise surface as a 500.
14
- rescue_from ActiveSupport::MessageVerifier::InvalidSignature, with: :render_invalid_po_document
13
+ ADDRESS = Spree::Api::V3::RequestSchema.shape('AddressInputParams') do |schema|
14
+ schema.include_attributes Spree::Api::V3::Admin::AddressRequestSchema
15
+ end
16
+
17
+ request_params :order do |body|
18
+ body.external_references
19
+ body.attribute :email, :string, example: 'customer@example.com'
20
+ body.attribute :customer_id, :id
21
+ body.attribute :use_customer_default_address, :boolean,
22
+ only: :create,
23
+ description: "With `customer_id`, copies the customer's saved billing and shipping addresses onto the order."
24
+ body.attribute :currency, :currency, example: 'USD'
25
+ body.attribute :market_id, :id
26
+ body.attribute :channel_id, :id, description: 'Defaults to the store primary channel when omitted.'
27
+ body.attribute :locale, :locale, example: 'en-US'
28
+ body.attribute :customer_note, :string, description: 'Public, customer-visible note.'
29
+ body.attribute :internal_note, :string,
30
+ description: 'Staff-only note. Rich text HTML; reads come back as this plus `internal_note_html`.'
31
+ body.attribute :po_number, :string,
32
+ description: "The buyer's own purchase-order reference. Searchable alongside the order number, and rendered on every order-facing document."
33
+ body.attribute :po_document_signed_id, :string,
34
+ nullable: true,
35
+ description: "The `signed_id` of the buyer's purchase order, from `files.upload()` with `visibility: 'private'`. Null removes the document the order carries."
36
+ body.attribute :shipping_address_id, :id,
37
+ only: :create,
38
+ description: 'An existing address of the customer.'
39
+ body.attribute :billing_address_id, :id,
40
+ only: :create,
41
+ description: 'An existing address of the customer.'
42
+ body.attribute :preferred_stock_location_id, :id,
43
+ description: "Stock location to prefer for fulfillment. Order Routing's built-in preferred-location rule ranks it first; routing falls back to the next rule when the location can't cover the cart."
44
+ body.attribute :company_id, :id,
45
+ nullable: true,
46
+ description: "Makes the order a company purchase, with that company's catalog prices and tax treatment. Null makes a draft a plain customer order again."
47
+ body.attribute :coupon_code, :string,
48
+ only: :create,
49
+ description: 'Applied non-fatally: an invalid code does not block creation.'
50
+ body.attribute :metadata, :hash
51
+ body.attribute :tags, :array, of: :string
52
+ body.attribute :shipping_address, :object, shape: ADDRESS
53
+ body.attribute :billing_address, :object, shape: ADDRESS
54
+ body.attribute :items, :array,
55
+ description: 'Line items to upsert, keyed by variant. An entry sets that variant\'s quantity, creating the line item when the order has none; `quantity: 0` removes it. Variants you do not send are left alone.' do |item|
56
+ item.attribute :variant_id, :id, required: true
57
+ item.attribute :quantity, :integer, example: 1
58
+ item.attribute :price, :decimal,
59
+ nullable: true,
60
+ description: "Negotiated unit price; stamps `price_source: 'manual'`. Null reverts the line to catalog pricing. Draft orders only."
61
+ item.attribute :metadata, :hash
62
+ end
63
+ end
64
+
65
+ request_params 'OrderCompleteParams', action: :complete do |body|
66
+ body.attribute :payment_pending, :boolean
67
+ body.attribute :notify_customer, :boolean,
68
+ description: 'Send the order confirmation email after completion.'
69
+ end
70
+
71
+ request_params 'OrderCancelParams', action: :cancel do |body|
72
+ body.attribute :cancel_reason_id, :id,
73
+ description: "Why the order was canceled: the id of one of the store's cancellation reasons."
74
+ body.attribute :cancel_note, :string, description: 'Staff-facing note about the cancellation.'
75
+ body.attribute :refund_payments, :boolean,
76
+ description: "Whether this order's share of a payment shared across a split checkout is handed back."
77
+ body.attribute :refund_amount, :decimal,
78
+ description: 'How much of that share to return. Defaults to all of it; refused on an order whose payment is not shared.'
79
+ body.attribute :notify_customer, :boolean,
80
+ description: 'Send the order cancellation email after canceling.'
81
+ end
15
82
 
16
83
  skip_before_action :set_resource, only: [:index, :create]
17
84
  before_action :set_resource, only: [:show, :update, :destroy, :complete, :cancel, :approve, :resend_confirmation, :resend_digital_links, :po_document]
@@ -58,7 +125,7 @@ module Spree
58
125
  # are nested inside it.
59
126
  def complete
60
127
  with_order_lock do
61
- result = Spree.order_complete_service.call(
128
+ result = Spree.order_complete_workflow.call(
62
129
  order: @resource,
63
130
  payment_pending: params[:payment_pending].to_b,
64
131
  notify_customer: ActiveModel::Type::Boolean.new.cast(params[:notify_customer])
@@ -121,7 +188,7 @@ module Spree
121
188
  unless @resource.po_document.attached?
122
189
  return render_error(
123
190
  code: ERROR_CODES[:validation_error],
124
- message: Spree.t(:po_document_missing),
191
+ message: I18n.t('spree.po_document_missing'),
125
192
  status: :unprocessable_content
126
193
  )
127
194
  end
@@ -244,14 +311,6 @@ module Spree
244
311
 
245
312
  private
246
313
 
247
- def render_invalid_po_document
248
- render_error(
249
- code: ERROR_CODES[:validation_error],
250
- message: Spree.t(:po_document_invalid_signed_id),
251
- status: :unprocessable_content
252
- )
253
- end
254
-
255
314
  def resolve_customer
256
315
  customer_param = params[:customer_id].presence
257
316
  return unless customer_param
@@ -271,44 +330,13 @@ module Spree
271
330
  end
272
331
 
273
332
  def order_create_params
274
- permitted = normalize_params(
275
- params.permit(
276
- :email, :customer_id, :use_customer_default_address,
277
- :currency, :market_id, :channel_id, :locale,
278
- :customer_note, :internal_note,
279
- # The buyer's own purchase-order reference, and the signed blob
280
- # id of the document behind it — a PO arriving by email and
281
- # keyed in is the draft-order flow plus these two fields.
282
- :po_number, :po_document,
283
- :shipping_address_id, :billing_address_id,
284
- :preferred_stock_location_id, :company_id,
285
- :coupon_code,
286
- metadata: {},
287
- tags: [],
288
- shipping_address: address_permitted_keys,
289
- billing_address: address_permitted_keys,
290
- items: item_permitted_keys
291
- )
292
- )
293
- resolve_company_param(permitted)
333
+ resolve_company_param(normalize_params(params.permit(*request_params_schema.permit_list(:create))))
294
334
  end
295
335
 
336
+ # Named rather than read from the action, since an upsert reaches
337
+ # update from the create action.
296
338
  def order_update_params
297
- permitted = normalize_params(
298
- params.permit(
299
- :email, :customer_id,
300
- :customer_note, :internal_note,
301
- :po_number, :po_document,
302
- :currency, :locale, :market_id, :channel_id,
303
- :preferred_stock_location_id, :company_id,
304
- metadata: {},
305
- tags: [],
306
- shipping_address: address_permitted_keys,
307
- billing_address: address_permitted_keys,
308
- items: item_permitted_keys
309
- )
310
- )
311
- resolve_company_param(permitted)
339
+ resolve_company_param(normalize_params(params.permit(*request_params_schema.permit_list(:update))))
312
340
  end
313
341
 
314
342
  # An incidental lookup like any other: resolved through the store so
@@ -326,20 +354,6 @@ module Spree
326
354
  end
327
355
  permitted
328
356
  end
329
-
330
- def address_permitted_keys
331
- [
332
- :firstname, :lastname, :first_name, :last_name,
333
- :address1, :address2, :city,
334
- :country_code, :state_code,
335
- :zipcode, :postal_code, :phone, :alternative_phone,
336
- :state_name, :company, :label
337
- ]
338
- end
339
-
340
- def item_permitted_keys
341
- [:variant_id, :quantity, :price, { metadata: {} }]
342
- end
343
357
  end
344
358
  end
345
359
  end
@@ -14,6 +14,36 @@ module Spree
14
14
  class PackageTypesController < ResourceController
15
15
  scoped_resource :package_types
16
16
 
17
+ request_params :package_type do |body|
18
+ body.attribute :name, :string,
19
+ required: true, on: :create,
20
+ example: 'Euro pallet',
21
+ description: 'Unique within the store.'
22
+ body.attribute :kind, :string,
23
+ required: true, on: :create,
24
+ choices: Spree::PackageType::KINDS,
25
+ example: 'pallet',
26
+ description: 'What this packaging is: the box parcels ship in, or the carton, pallet or container a wholesale order leaves on.'
27
+ body.attribute :length, :number, nullable: true
28
+ body.attribute :width, :number, nullable: true
29
+ body.attribute :height, :number, nullable: true
30
+ body.attribute :dimensions_unit, :string,
31
+ nullable: true,
32
+ choices: Spree::Variant::DIMENSION_UNITS,
33
+ example: 'cm',
34
+ description: "Unit the three dimensions are in; falls back to the store's unit system."
35
+ body.attribute :weight, :number,
36
+ nullable: true,
37
+ description: "The empty package's own weight, added to content weight on every quote."
38
+ body.attribute :max_weight, :number,
39
+ nullable: true,
40
+ description: 'What the package can hold, not the same as its own weight.'
41
+ body.attribute :weight_unit, :string, nullable: true, choices: Spree::Variant::WEIGHT_UNITS, example: 'kg'
42
+ body.attribute :default, :boolean,
43
+ description: 'The box every parcel quote is built on. Setting this demotes whichever row held it.'
44
+ body.attribute :metadata, :hash
45
+ end
46
+
17
47
  protected
18
48
 
19
49
  def model_class
@@ -27,11 +57,6 @@ module Spree
27
57
  def collection_includes
28
58
  [:seller]
29
59
  end
30
-
31
- def resource_permitted_attributes
32
- [:name, :kind, :length, :width, :height, :dimensions_unit,
33
- :weight, :max_weight, :weight_unit, :default, { metadata: {} }]
34
- end
35
60
  end
36
61
  end
37
62
  end
@@ -15,20 +15,39 @@ module Spree
15
15
 
16
16
  skip_before_action :authenticate_admin!
17
17
 
18
+ request_params 'PasswordResetRequestParams', action: :create do |body|
19
+ body.attribute :email, :string,
20
+ required: true,
21
+ permit: false,
22
+ format: :email,
23
+ example: 'admin@example.com'
24
+ body.attribute :redirect_url, :string,
25
+ permit: false,
26
+ example: 'https://admin.your-store.com/reset-password',
27
+ description: 'The page the emailed reset link points at, with the reset token appended. Honored only on the dashboard origin, for an account that is staff of the store; ignored otherwise.'
28
+ end
29
+
30
+ request_params 'PasswordResetParams', action: :update do |body|
31
+ body.attribute :password, :string, required: true, permit: false
32
+ body.attribute :password_confirmation, :string, required: true, permit: false
33
+ end
34
+
18
35
  # POST /api/v3/admin/password_resets
19
36
  def create
20
37
  user = Spree.admin_user_class.find_by(email: params[:email])
21
38
 
22
39
  if user
23
- redirect_url = trusted_redirect_url(user)
24
- token = user.generate_token_for(:password_reset)
25
- event_payload = { reset_token: token, email: user.email, store_id: current_store.prefixed_id }
26
- event_payload[:redirect_url] = redirect_url if redirect_url.present?
27
- user.publish_event('admin_user.password_reset_requested', event_payload)
40
+ event_name = 'admin_user.password_reset_requested'
41
+ payload = user.event_payload_for(
42
+ event_name,
43
+ reset_token: user.generate_token_for(:password_reset), store: current_store,
44
+ redirect_url: trusted_redirect_url(user).presence
45
+ )
46
+ user.publish_event(event_name, payload)
28
47
  end
29
48
 
30
49
  # Always return 202 to prevent email enumeration
31
- render json: { message: Spree.t(:password_reset_requested, scope: :api) }, status: :accepted
50
+ render json: { message: I18n.t('spree.api.password_reset_requested') }, status: :accepted
32
51
  end
33
52
 
34
53
  # PATCH /api/v3/admin/password_resets/:id
@@ -38,7 +57,7 @@ module Spree
38
57
  unless user
39
58
  return render_error(
40
59
  code: ERROR_CODES[:password_reset_token_invalid],
41
- message: Spree.t(:password_reset_token_invalid, scope: :api),
60
+ message: I18n.t('spree.api.password_reset_token_invalid'),
42
61
  status: :unprocessable_content
43
62
  )
44
63
  end