spree_api 6.0.0.rc1 → 6.0.0.rc3

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 (371) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +0 -17
  3. data/app/controllers/concerns/spree/api/v3/admin/product_membership.rb +10 -0
  4. data/app/controllers/concerns/spree/api/v3/admin/stock_receipt_actions.rb +26 -4
  5. data/app/controllers/concerns/spree/api/v3/admin/subclassed_resource.rb +14 -28
  6. data/app/controllers/concerns/spree/api/v3/admin/validation_details.rb +1 -1
  7. data/app/controllers/concerns/spree/api/v3/cart_resolvable.rb +3 -2
  8. data/app/controllers/concerns/spree/api/v3/channel_resolution.rb +1 -1
  9. data/app/controllers/concerns/spree/api/v3/company_address_writes.rb +3 -1
  10. data/app/controllers/concerns/spree/api/v3/error_handler.rb +48 -2
  11. data/app/controllers/concerns/spree/api/v3/file_uploads.rb +35 -0
  12. data/app/controllers/concerns/spree/api/v3/money_params.rb +52 -0
  13. data/app/controllers/concerns/spree/api/v3/orders/claim_actions.rb +1 -5
  14. data/app/controllers/concerns/spree/api/v3/orders/delivery_actions.rb +6 -6
  15. data/app/controllers/concerns/spree/api/v3/orders/exchange_actions.rb +1 -4
  16. data/app/controllers/concerns/spree/api/v3/orders/fulfillment_actions.rb +1 -5
  17. data/app/controllers/concerns/spree/api/v3/orders/return_actions.rb +1 -4
  18. data/app/controllers/concerns/spree/api/v3/orders/shipping_label_actions.rb +5 -21
  19. data/app/controllers/concerns/spree/api/v3/params_normalizer.rb +5 -0
  20. data/app/controllers/concerns/spree/api/v3/purchase_serialization.rb +26 -0
  21. data/app/controllers/concerns/spree/api/v3/request_params.rb +65 -0
  22. data/app/controllers/concerns/spree/api/v3/store/search_provider_support.rb +8 -3
  23. data/app/controllers/concerns/spree/api/v3/strict_money_params.rb +94 -0
  24. data/app/controllers/spree/api/v3/admin/admin_users_controller.rb +10 -1
  25. data/app/controllers/spree/api/v3/admin/allowed_origins_controller.rb +8 -1
  26. data/app/controllers/spree/api/v3/admin/api_keys_controller.rb +15 -7
  27. data/app/controllers/spree/api/v3/admin/base_controller.rb +1 -0
  28. data/app/controllers/spree/api/v3/admin/catalogs/order_minimums_controller.rb +3 -1
  29. data/app/controllers/spree/api/v3/admin/catalogs/quantity_rules_controller.rb +7 -5
  30. data/app/controllers/spree/api/v3/admin/catalogs_controller.rb +60 -33
  31. data/app/controllers/spree/api/v3/admin/categories/products_controller.rb +4 -1
  32. data/app/controllers/spree/api/v3/admin/categories_controller.rb +40 -20
  33. data/app/controllers/spree/api/v3/admin/channels_controller.rb +39 -6
  34. data/app/controllers/spree/api/v3/admin/claim_reasons_controller.rb +5 -1
  35. data/app/controllers/spree/api/v3/admin/collections/products_controller.rb +4 -1
  36. data/app/controllers/spree/api/v3/admin/collections_controller.rb +44 -15
  37. data/app/controllers/spree/api/v3/admin/commission_rates_controller.rb +60 -12
  38. data/app/controllers/spree/api/v3/admin/companies/addresses_controller.rb +11 -0
  39. data/app/controllers/spree/api/v3/admin/companies/memberships_controller.rb +9 -1
  40. data/app/controllers/spree/api/v3/admin/companies/tax_exemption_certificates_controller.rb +19 -18
  41. data/app/controllers/spree/api/v3/admin/companies/tax_identifiers_controller.rb +6 -1
  42. data/app/controllers/spree/api/v3/admin/companies_controller.rb +17 -3
  43. data/app/controllers/spree/api/v3/admin/countries_controller.rb +5 -1
  44. data/app/controllers/spree/api/v3/admin/custom_field_definitions_controller.rb +21 -11
  45. data/app/controllers/spree/api/v3/admin/custom_fields_controller.rb +12 -5
  46. data/app/controllers/spree/api/v3/admin/customer_groups_controller.rb +9 -1
  47. data/app/controllers/spree/api/v3/admin/customers/addresses_controller.rb +12 -7
  48. data/app/controllers/spree/api/v3/admin/customers/store_credits_controller.rb +11 -9
  49. data/app/controllers/spree/api/v3/admin/customers/tax_identifiers_controller.rb +6 -1
  50. data/app/controllers/spree/api/v3/admin/customers_controller.rb +35 -7
  51. data/app/controllers/spree/api/v3/admin/data_requests_controller.rb +8 -0
  52. data/app/controllers/spree/api/v3/admin/delivery_method_rules_controller.rb +1 -1
  53. data/app/controllers/spree/api/v3/admin/delivery_methods/rules_controller.rb +15 -7
  54. data/app/controllers/spree/api/v3/admin/delivery_methods_controller.rb +92 -57
  55. data/app/controllers/spree/api/v3/admin/delivery_profiles/origin_groups_controller.rb +8 -1
  56. data/app/controllers/spree/api/v3/admin/delivery_profiles_controller.rb +13 -1
  57. data/app/controllers/spree/api/v3/admin/delivery_zones_controller.rb +21 -5
  58. data/app/controllers/spree/api/v3/admin/email_templates/drafts_controller.rb +14 -1
  59. data/app/controllers/spree/api/v3/admin/email_templates/previews_controller.rb +4 -0
  60. data/app/controllers/spree/api/v3/admin/email_templates/publications_controller.rb +7 -0
  61. data/app/controllers/spree/api/v3/admin/email_templates/restorations_controller.rb +8 -0
  62. data/app/controllers/spree/api/v3/admin/email_templates/test_emails_controller.rb +4 -0
  63. data/app/controllers/spree/api/v3/admin/exports_controller.rb +23 -6
  64. data/app/controllers/spree/api/v3/admin/files_controller.rb +29 -0
  65. data/app/controllers/spree/api/v3/admin/gift_card_batches_controller.rb +20 -1
  66. data/app/controllers/spree/api/v3/admin/gift_cards_controller.rb +19 -1
  67. data/app/controllers/spree/api/v3/admin/imports_controller.rb +36 -9
  68. data/app/controllers/spree/api/v3/admin/integrations_controller.rb +13 -1
  69. data/app/controllers/spree/api/v3/admin/invitation_acceptances_controller.rb +9 -2
  70. data/app/controllers/spree/api/v3/admin/invitations_controller.rb +8 -1
  71. data/app/controllers/spree/api/v3/admin/locales_controller.rb +1 -1
  72. data/app/controllers/spree/api/v3/admin/markets_controller.rb +30 -9
  73. data/app/controllers/spree/api/v3/admin/me_controller.rb +12 -3
  74. data/app/controllers/spree/api/v3/admin/media_controller.rb +22 -9
  75. data/app/controllers/spree/api/v3/admin/media_library_controller.rb +4 -0
  76. data/app/controllers/spree/api/v3/admin/option_types_controller.rb +24 -7
  77. data/app/controllers/spree/api/v3/admin/order_cancellation_reasons_controller.rb +5 -1
  78. data/app/controllers/spree/api/v3/admin/order_routing_rules_controller.rb +13 -1
  79. data/app/controllers/spree/api/v3/admin/orders/claims_controller.rb +39 -1
  80. data/app/controllers/spree/api/v3/admin/orders/deliveries_controller.rb +19 -1
  81. data/app/controllers/spree/api/v3/admin/orders/discount_codes_controller.rb +5 -1
  82. data/app/controllers/spree/api/v3/admin/orders/discounts_controller.rb +29 -5
  83. data/app/controllers/spree/api/v3/admin/orders/exchanges_controller.rb +36 -1
  84. data/app/controllers/spree/api/v3/admin/orders/fees_controller.rb +22 -1
  85. data/app/controllers/spree/api/v3/admin/orders/fulfillments_controller.rb +66 -7
  86. data/app/controllers/spree/api/v3/admin/orders/gift_cards_controller.rb +6 -2
  87. data/app/controllers/spree/api/v3/admin/orders/items_controller.rb +11 -1
  88. data/app/controllers/spree/api/v3/admin/orders/labels_controller.rb +35 -2
  89. data/app/controllers/spree/api/v3/admin/orders/payments_controller.rb +16 -5
  90. data/app/controllers/spree/api/v3/admin/orders/refunds_controller.rb +6 -0
  91. data/app/controllers/spree/api/v3/admin/orders/returns_controller.rb +37 -1
  92. data/app/controllers/spree/api/v3/admin/orders/store_credits_controller.rb +6 -3
  93. data/app/controllers/spree/api/v3/admin/orders_controller.rb +74 -60
  94. data/app/controllers/spree/api/v3/admin/package_types_controller.rb +30 -5
  95. data/app/controllers/spree/api/v3/admin/password_resets_controller.rb +17 -0
  96. data/app/controllers/spree/api/v3/admin/payment_methods_controller.rb +38 -22
  97. data/app/controllers/spree/api/v3/admin/policies_controller.rb +8 -4
  98. data/app/controllers/spree/api/v3/admin/price_lists_controller.rb +27 -15
  99. data/app/controllers/spree/api/v3/admin/prices_controller.rb +51 -4
  100. data/app/controllers/spree/api/v3/admin/product_types_controller.rb +25 -8
  101. data/app/controllers/spree/api/v3/admin/products/digital_assets_controller.rb +27 -10
  102. data/app/controllers/spree/api/v3/admin/products/variants_controller.rb +9 -14
  103. data/app/controllers/spree/api/v3/admin/products_controller.rb +121 -70
  104. data/app/controllers/spree/api/v3/admin/promotion_actions_controller.rb +11 -2
  105. data/app/controllers/spree/api/v3/admin/promotion_rules_controller.rb +10 -1
  106. data/app/controllers/spree/api/v3/admin/promotions_controller.rb +50 -14
  107. data/app/controllers/spree/api/v3/admin/purchase_orders_controller.rb +54 -7
  108. data/app/controllers/spree/api/v3/admin/refund_reasons_controller.rb +5 -1
  109. data/app/controllers/spree/api/v3/admin/reporting/saved_reports_controller.rb +9 -1
  110. data/app/controllers/spree/api/v3/admin/reporting_controller.rb +34 -0
  111. data/app/controllers/spree/api/v3/admin/resource_controller.rb +1 -0
  112. data/app/controllers/spree/api/v3/admin/return_reasons_controller.rb +5 -1
  113. data/app/controllers/spree/api/v3/admin/roles_controller.rb +13 -1
  114. data/app/controllers/spree/api/v3/admin/seller_payouts_controller.rb +6 -0
  115. data/app/controllers/spree/api/v3/admin/seller_requirement_submissions_controller.rb +15 -0
  116. data/app/controllers/spree/api/v3/admin/seller_requirements_controller.rb +32 -6
  117. data/app/controllers/spree/api/v3/admin/sellers_controller.rb +75 -22
  118. data/app/controllers/spree/api/v3/admin/setup_controller.rb +54 -15
  119. data/app/controllers/spree/api/v3/admin/stock_levels_controller.rb +38 -9
  120. data/app/controllers/spree/api/v3/admin/stock_locations_controller.rb +41 -9
  121. data/app/controllers/spree/api/v3/admin/stock_transfers_controller.rb +48 -7
  122. data/app/controllers/spree/api/v3/admin/store_controller.rb +122 -53
  123. data/app/controllers/spree/api/v3/admin/store_credits_controller.rb +1 -7
  124. data/app/controllers/spree/api/v3/admin/suppliers_controller.rb +16 -6
  125. data/app/controllers/spree/api/v3/admin/tax_categories_controller.rb +7 -4
  126. data/app/controllers/spree/api/v3/admin/tax_rates_controller.rb +21 -3
  127. data/app/controllers/spree/api/v3/admin/tracking_carriers_controller.rb +4 -0
  128. data/app/controllers/spree/api/v3/admin/translations/batches_controller.rb +17 -9
  129. data/app/controllers/spree/api/v3/admin/translations_controller.rb +4 -0
  130. data/app/controllers/spree/api/v3/admin/translations_coverage_controller.rb +5 -0
  131. data/app/controllers/spree/api/v3/admin/updates_controller.rb +39 -0
  132. data/app/controllers/spree/api/v3/admin/webhook_endpoints_controller.rb +23 -1
  133. data/app/controllers/spree/api/v3/base_controller.rb +2 -0
  134. data/app/controllers/spree/api/v3/resource_controller.rb +63 -10
  135. data/app/controllers/spree/api/v3/seller/auth_controller.rb +8 -0
  136. data/app/controllers/spree/api/v3/seller/base_controller.rb +1 -0
  137. data/app/controllers/spree/api/v3/seller/countries_controller.rb +2 -2
  138. data/app/controllers/spree/api/v3/seller/delivery_methods_controller.rb +49 -60
  139. data/app/controllers/spree/api/v3/seller/exports_controller.rb +18 -1
  140. data/app/controllers/spree/api/v3/seller/files_controller.rb +27 -0
  141. data/app/controllers/spree/api/v3/seller/imports_controller.rb +25 -9
  142. data/app/controllers/spree/api/v3/seller/invitation_acceptances_controller.rb +9 -1
  143. data/app/controllers/spree/api/v3/seller/me_controller.rb +14 -3
  144. data/app/controllers/spree/api/v3/seller/onboarding_controller.rb +11 -0
  145. data/app/controllers/spree/api/v3/seller/orders/claims_controller.rb +35 -0
  146. data/app/controllers/spree/api/v3/seller/orders/deliveries_controller.rb +12 -0
  147. data/app/controllers/spree/api/v3/seller/orders/exchanges_controller.rb +33 -0
  148. data/app/controllers/spree/api/v3/seller/orders/fulfillments_controller.rb +28 -2
  149. data/app/controllers/spree/api/v3/seller/orders/labels_controller.rb +22 -1
  150. data/app/controllers/spree/api/v3/seller/orders/notes_controller.rb +8 -1
  151. data/app/controllers/spree/api/v3/seller/orders/returns_controller.rb +32 -0
  152. data/app/controllers/spree/api/v3/seller/orders_controller.rb +35 -14
  153. data/app/controllers/spree/api/v3/seller/package_types_controller.rb +21 -9
  154. data/app/controllers/spree/api/v3/seller/password_resets_controller.rb +10 -0
  155. data/app/controllers/spree/api/v3/seller/policies_controller.rb +12 -4
  156. data/app/controllers/spree/api/v3/seller/products_controller.rb +114 -28
  157. data/app/controllers/spree/api/v3/seller/profile_controller.rb +33 -10
  158. data/app/controllers/spree/api/v3/seller/requirement_submissions_controller.rb +12 -5
  159. data/app/controllers/spree/api/v3/seller/resource_controller.rb +12 -0
  160. data/app/controllers/spree/api/v3/seller/stock_locations_controller.rb +44 -13
  161. data/app/controllers/spree/api/v3/seller/tax_identifiers_controller.rb +10 -1
  162. data/app/controllers/spree/api/v3/seller/team_controller.rb +4 -0
  163. data/app/controllers/spree/api/v3/store/auth_controller.rb +10 -0
  164. data/app/controllers/spree/api/v3/store/carts/discount_codes_controller.rb +8 -1
  165. data/app/controllers/spree/api/v3/store/carts/fulfillments_controller.rb +10 -2
  166. data/app/controllers/spree/api/v3/store/carts/gift_cards_controller.rb +8 -1
  167. data/app/controllers/spree/api/v3/store/carts/items_controller.rb +17 -5
  168. data/app/controllers/spree/api/v3/store/carts/payment_sessions_controller.rb +20 -6
  169. data/app/controllers/spree/api/v3/store/carts/payments_controller.rb +11 -0
  170. data/app/controllers/spree/api/v3/store/carts/po_documents_controller.rb +24 -26
  171. data/app/controllers/spree/api/v3/store/carts/store_credits_controller.rb +19 -1
  172. data/app/controllers/spree/api/v3/store/carts/tax_identifiers_controller.rb +5 -1
  173. data/app/controllers/spree/api/v3/store/carts_controller.rb +54 -47
  174. data/app/controllers/spree/api/v3/store/companies/addresses_controller.rb +12 -4
  175. data/app/controllers/spree/api/v3/store/companies/members_controller.rb +4 -0
  176. data/app/controllers/spree/api/v3/store/companies_controller.rb +5 -1
  177. data/app/controllers/spree/api/v3/store/company_invitations_controller.rb +9 -1
  178. data/app/controllers/spree/api/v3/store/customer/addresses_controller.rb +8 -7
  179. data/app/controllers/spree/api/v3/store/customer/data_requests_controller.rb +5 -0
  180. data/app/controllers/spree/api/v3/store/customer/password_resets_controller.rb +17 -0
  181. data/app/controllers/spree/api/v3/store/customer/payment_setup_sessions_controller.rb +10 -5
  182. data/app/controllers/spree/api/v3/store/customer/tax_identifiers_controller.rb +5 -1
  183. data/app/controllers/spree/api/v3/store/customers_controller.rb +28 -2
  184. data/app/controllers/spree/api/v3/store/newsletter_subscribers_controller.rb +22 -0
  185. data/app/controllers/spree/api/v3/store/orders/claims_controller.rb +11 -2
  186. data/app/controllers/spree/api/v3/store/orders/returns_controller.rb +10 -1
  187. data/app/controllers/spree/api/v3/store/orders_controller.rb +47 -10
  188. data/app/controllers/spree/api/v3/store/products_controller.rb +8 -0
  189. data/app/controllers/spree/api/v3/store/wishlist_items_controller.rb +10 -4
  190. data/app/controllers/spree/api/v3/store/wishlists_controller.rb +12 -4
  191. data/app/request_schemas/spree/api/v3/address_request_schema.rb +27 -0
  192. data/app/request_schemas/spree/api/v3/admin/address_request_schema.rb +13 -0
  193. data/app/request_schemas/spree/api/v3/admin/bulk_tags_request_schema.rb +17 -0
  194. data/app/request_schemas/spree/api/v3/admin/catalog_order_minimum_request_schema.rb +17 -0
  195. data/app/request_schemas/spree/api/v3/admin/email_template_language_request_schema.rb +17 -0
  196. data/app/request_schemas/spree/api/v3/admin/email_template_preview_request_schema.rb +32 -0
  197. data/app/request_schemas/spree/api/v3/admin/price_adjustment_tier_request_schema.rb +21 -0
  198. data/app/request_schemas/spree/api/v3/admin/price_list_price_request_schema.rb +21 -0
  199. data/app/request_schemas/spree/api/v3/admin/price_list_rule_request_schema.rb +19 -0
  200. data/app/request_schemas/spree/api/v3/admin/product_membership_reposition_request_schema.rb +17 -0
  201. data/app/request_schemas/spree/api/v3/admin/promotion_action_calculator_request_schema.rb +18 -0
  202. data/app/request_schemas/spree/api/v3/admin/promotion_action_line_item_request_schema.rb +15 -0
  203. data/app/request_schemas/spree/api/v3/admin/promotion_action_request_schema.rb +19 -0
  204. data/app/request_schemas/spree/api/v3/admin/promotion_rule_request_schema.rb +22 -0
  205. data/app/request_schemas/spree/api/v3/admin/reason_request_schema.rb +14 -0
  206. data/app/request_schemas/spree/api/v3/admin/tax_identifier_request_schema.rb +15 -0
  207. data/app/request_schemas/spree/api/v3/custom_field_value_request_schema.rb +15 -0
  208. data/app/request_schemas/spree/api/v3/file_upload_request_schema.rb +20 -0
  209. data/app/request_schemas/spree/api/v3/media_request_schema.rb +27 -0
  210. data/app/request_schemas/spree/api/v3/price_request_schema.rb +17 -0
  211. data/app/request_schemas/spree/api/v3/stock_level_request_schema.rb +18 -0
  212. data/app/request_schemas/spree/api/v3/store/address_request_schema.rb +31 -0
  213. data/app/request_schemas/spree/api/v3/tax_identifier_request_schema.rb +18 -0
  214. data/app/request_schemas/spree/api/v3/variant_option_request_schema.rb +13 -0
  215. data/app/request_schemas/spree/api/v3/variant_request_schema.rb +52 -0
  216. data/app/serializers/concerns/spree/api/v3/purchase_summary.rb +48 -0
  217. data/app/serializers/spree/api/v3/address_serializer.rb +4 -2
  218. data/app/serializers/spree/api/v3/admin/address_serializer.rb +3 -0
  219. data/app/serializers/spree/api/v3/admin/applied_promotion_serializer.rb +3 -1
  220. data/app/serializers/spree/api/v3/admin/cart_serializer.rb +3 -1
  221. data/app/serializers/spree/api/v3/admin/catalog_order_minimum_serializer.rb +3 -2
  222. data/app/serializers/spree/api/v3/admin/catalog_price_serializer.rb +3 -4
  223. data/app/serializers/spree/api/v3/admin/catalog_price_tier_serializer.rb +4 -3
  224. data/app/serializers/spree/api/v3/admin/channel_serializer.rb +5 -7
  225. data/app/serializers/spree/api/v3/admin/claim_line_item_serializer.rb +7 -0
  226. data/app/serializers/spree/api/v3/admin/claim_serializer.rb +5 -0
  227. data/app/serializers/spree/api/v3/admin/commission_line_serializer.rb +7 -18
  228. data/app/serializers/spree/api/v3/admin/commission_rate_serializer.rb +7 -11
  229. data/app/serializers/spree/api/v3/admin/commission_rule_serializer.rb +0 -2
  230. data/app/serializers/spree/api/v3/admin/country_serializer.rb +4 -0
  231. data/app/serializers/spree/api/v3/admin/customer_serializer.rb +3 -7
  232. data/app/serializers/spree/api/v3/admin/delivery_method_rule_serializer.rb +0 -2
  233. data/app/serializers/spree/api/v3/admin/delivery_method_serializer.rb +14 -10
  234. data/app/serializers/spree/api/v3/admin/delivery_method_service_serializer.rb +9 -1
  235. data/app/serializers/spree/api/v3/admin/delivery_rate_serializer.rb +8 -0
  236. data/app/serializers/spree/api/v3/admin/discount_serializer.rb +3 -1
  237. data/app/serializers/spree/api/v3/admin/exchange_line_item_serializer.rb +5 -0
  238. data/app/serializers/spree/api/v3/admin/exchange_serializer.rb +5 -0
  239. data/app/serializers/spree/api/v3/admin/fee_serializer.rb +3 -1
  240. data/app/serializers/spree/api/v3/admin/file_upload_serializer.rb +11 -0
  241. data/app/serializers/spree/api/v3/admin/file_upload_target_serializer.rb +10 -0
  242. data/app/serializers/spree/api/v3/admin/fulfillment_serializer.rb +13 -11
  243. data/app/serializers/spree/api/v3/admin/gift_card_serializer.rb +3 -3
  244. data/app/serializers/spree/api/v3/admin/import_serializer.rb +2 -2
  245. data/app/serializers/spree/api/v3/admin/integration_serializer.rb +1 -3
  246. data/app/serializers/spree/api/v3/admin/line_item_serializer.rb +12 -12
  247. data/app/serializers/spree/api/v3/admin/locale_serializer.rb +13 -0
  248. data/app/serializers/spree/api/v3/admin/market_serializer.rb +3 -0
  249. data/app/serializers/spree/api/v3/admin/media_serializer.rb +3 -2
  250. data/app/serializers/spree/api/v3/admin/order_group_serializer.rb +2 -0
  251. data/app/serializers/spree/api/v3/admin/order_routing_rule_serializer.rb +1 -3
  252. data/app/serializers/spree/api/v3/admin/order_serializer.rb +33 -33
  253. data/app/serializers/spree/api/v3/admin/payment_method_serializer.rb +1 -4
  254. data/app/serializers/spree/api/v3/admin/payment_serializer.rb +6 -3
  255. data/app/serializers/spree/api/v3/admin/payment_split_serializer.rb +8 -9
  256. data/app/serializers/spree/api/v3/admin/price_adjustment_tier_serializer.rb +3 -6
  257. data/app/serializers/spree/api/v3/admin/price_history_serializer.rb +6 -2
  258. data/app/serializers/spree/api/v3/admin/price_list_serializer.rb +1 -5
  259. data/app/serializers/spree/api/v3/admin/price_rule_serializer.rb +1 -3
  260. data/app/serializers/spree/api/v3/admin/price_serializer.rb +4 -0
  261. data/app/serializers/spree/api/v3/admin/product_serializer.rb +2 -0
  262. data/app/serializers/spree/api/v3/admin/promotion_action_serializer.rb +4 -6
  263. data/app/serializers/spree/api/v3/admin/promotion_rule_serializer.rb +0 -2
  264. data/app/serializers/spree/api/v3/admin/purchase_order_item_serializer.rb +5 -11
  265. data/app/serializers/spree/api/v3/admin/purchase_order_serializer.rb +4 -4
  266. data/app/serializers/spree/api/v3/admin/refund_serializer.rb +7 -3
  267. data/app/serializers/spree/api/v3/admin/reporting_result_serializer.rb +9 -2
  268. data/app/serializers/spree/api/v3/admin/return_line_item_serializer.rb +8 -0
  269. data/app/serializers/spree/api/v3/admin/return_serializer.rb +8 -4
  270. data/app/serializers/spree/api/v3/admin/seller_balance_serializer.rb +15 -10
  271. data/app/serializers/spree/api/v3/admin/seller_payout_serializer.rb +3 -5
  272. data/app/serializers/spree/api/v3/admin/seller_serializer.rb +3 -1
  273. data/app/serializers/spree/api/v3/admin/seller_transfer_serializer.rb +7 -8
  274. data/app/serializers/spree/api/v3/admin/shipping_label_serializer.rb +4 -4
  275. data/app/serializers/spree/api/v3/admin/stock_location_serializer.rb +3 -0
  276. data/app/serializers/spree/api/v3/admin/stock_movement_serializer.rb +2 -6
  277. data/app/serializers/spree/api/v3/admin/store_credit_event_serializer.rb +5 -0
  278. data/app/serializers/spree/api/v3/admin/store_credit_serializer.rb +9 -4
  279. data/app/serializers/spree/api/v3/admin/store_serializer.rb +17 -98
  280. data/app/serializers/spree/api/v3/admin/supplier_serializer.rb +1 -1
  281. data/app/serializers/spree/api/v3/admin/tax_exemption_certificate_serializer.rb +3 -1
  282. data/app/serializers/spree/api/v3/admin/tax_line_serializer.rb +4 -2
  283. data/app/serializers/spree/api/v3/admin/tax_rate_serializer.rb +2 -12
  284. data/app/serializers/spree/api/v3/admin/update_status_serializer.rb +28 -0
  285. data/app/serializers/spree/api/v3/admin/variant_serializer.rb +7 -3
  286. data/app/serializers/spree/api/v3/base_serializer.rb +112 -7
  287. data/app/serializers/spree/api/v3/cart_serializer.rb +16 -30
  288. data/app/serializers/spree/api/v3/claim_line_item_serializer.rb +5 -13
  289. data/app/serializers/spree/api/v3/claim_serializer.rb +2 -3
  290. data/app/serializers/spree/api/v3/country_serializer.rb +2 -1
  291. data/app/serializers/spree/api/v3/currency_serializer.rb +9 -1
  292. data/app/serializers/spree/api/v3/customer_serializer.rb +3 -2
  293. data/app/serializers/spree/api/v3/delivery_rate_serializer.rb +8 -12
  294. data/app/serializers/spree/api/v3/delivery_zone_member_serializer.rb +1 -1
  295. data/app/serializers/spree/api/v3/discount_serializer.rb +4 -1
  296. data/app/serializers/spree/api/v3/exchange_line_item_serializer.rb +2 -8
  297. data/app/serializers/spree/api/v3/exchange_serializer.rb +2 -3
  298. data/app/serializers/spree/api/v3/file_upload_serializer.rb +28 -0
  299. data/app/serializers/spree/api/v3/file_upload_target_serializer.rb +17 -0
  300. data/app/serializers/spree/api/v3/gift_card_batch_serializer.rb +2 -4
  301. data/app/serializers/spree/api/v3/gift_card_serializer.rb +4 -2
  302. data/app/serializers/spree/api/v3/import_serializer.rb +0 -12
  303. data/app/serializers/spree/api/v3/line_item_serializer.rb +15 -5
  304. data/app/serializers/spree/api/v3/locale_serializer.rb +3 -1
  305. data/app/serializers/spree/api/v3/market_serializer.rb +5 -5
  306. data/app/serializers/spree/api/v3/media_serializer.rb +7 -2
  307. data/app/serializers/spree/api/v3/order_group_serializer.rb +12 -4
  308. data/app/serializers/spree/api/v3/order_serializer.rb +5 -23
  309. data/app/serializers/spree/api/v3/payment_session_serializer.rb +2 -4
  310. data/app/serializers/spree/api/v3/price_history_serializer.rb +11 -6
  311. data/app/serializers/spree/api/v3/price_serializer.rb +17 -10
  312. data/app/serializers/spree/api/v3/product_filter_price_range_serializer.rb +10 -4
  313. data/app/serializers/spree/api/v3/product_serializer.rb +3 -3
  314. data/app/serializers/spree/api/v3/refund_serializer.rb +8 -5
  315. data/app/serializers/spree/api/v3/return_line_item_serializer.rb +3 -11
  316. data/app/serializers/spree/api/v3/return_serializer.rb +3 -6
  317. data/app/serializers/spree/api/v3/seller/address_serializer.rb +12 -0
  318. data/app/serializers/spree/api/v3/seller/balance_serializer.rb +15 -10
  319. data/app/serializers/spree/api/v3/seller/claim_line_item_serializer.rb +7 -0
  320. data/app/serializers/spree/api/v3/seller/claim_serializer.rb +5 -0
  321. data/app/serializers/spree/api/v3/seller/country_serializer.rb +19 -0
  322. data/app/serializers/spree/api/v3/seller/delivery_method_rule_serializer.rb +1 -3
  323. data/app/serializers/spree/api/v3/seller/delivery_method_serializer.rb +4 -8
  324. data/app/serializers/spree/api/v3/seller/delivery_rate_serializer.rb +9 -8
  325. data/app/serializers/spree/api/v3/seller/exchange_line_item_serializer.rb +5 -0
  326. data/app/serializers/spree/api/v3/seller/exchange_serializer.rb +5 -0
  327. data/app/serializers/spree/api/v3/seller/file_upload_serializer.rb +11 -0
  328. data/app/serializers/spree/api/v3/seller/file_upload_target_serializer.rb +10 -0
  329. data/app/serializers/spree/api/v3/seller/import_serializer.rb +2 -2
  330. data/app/serializers/spree/api/v3/seller/media_serializer.rb +2 -5
  331. data/app/serializers/spree/api/v3/seller/order_line_item_serializer.rb +4 -3
  332. data/app/serializers/spree/api/v3/seller/order_serializer.rb +16 -16
  333. data/app/serializers/spree/api/v3/seller/payment_split_serializer.rb +8 -9
  334. data/app/serializers/spree/api/v3/seller/payout_serializer.rb +2 -4
  335. data/app/serializers/spree/api/v3/seller/price_history_serializer.rb +12 -0
  336. data/app/serializers/spree/api/v3/seller/price_serializer.rb +13 -0
  337. data/app/serializers/spree/api/v3/seller/product_serializer.rb +2 -0
  338. data/app/serializers/spree/api/v3/seller/profile_serializer.rb +7 -7
  339. data/app/serializers/spree/api/v3/seller/return_line_item_serializer.rb +8 -0
  340. data/app/serializers/spree/api/v3/seller/return_serializer.rb +8 -5
  341. data/app/serializers/spree/api/v3/seller/state_serializer.rb +10 -0
  342. data/app/serializers/spree/api/v3/seller/stock_location_serializer.rb +3 -0
  343. data/app/serializers/spree/api/v3/seller/transfer_serializer.rb +6 -7
  344. data/app/serializers/spree/api/v3/seller/variant_serializer.rb +8 -4
  345. data/app/serializers/spree/api/v3/stock_location_serializer.rb +8 -1
  346. data/app/serializers/spree/api/v3/store_credit_event_serializer.rb +1 -3
  347. data/app/serializers/spree/api/v3/store_credit_serializer.rb +3 -5
  348. data/app/serializers/spree/api/v3/tax_line_serializer.rb +2 -4
  349. data/app/serializers/spree/api/v3/variant_serializer.rb +3 -3
  350. data/app/services/spree/api/v3/filter_predicates.rb +29 -0
  351. data/app/services/spree/api/v3/filter_table.rb +337 -0
  352. data/app/services/spree/api/v3/filters_aggregator.rb +2 -2
  353. data/app/services/spree/api/v3/request_schema.rb +430 -0
  354. data/app/services/spree/webhooks/deliver_webhook.rb +7 -3
  355. data/config/initializers/typelizer.rb +1 -1
  356. data/config/routes.rb +5 -3
  357. data/lib/spree/api/configuration.rb +5 -0
  358. data/lib/spree/api/dependencies.rb +7 -6
  359. data/lib/spree/api/middleware/request_size_limit.rb +24 -3
  360. data/lib/spree/api/openapi/filter_documentation.rb +136 -0
  361. data/lib/spree/api/openapi/schema_helper.rb +126 -80
  362. data/lib/spree/api/preference_families.rb +46 -0
  363. data/lib/spree/api/preference_types.rb +138 -0
  364. data/lib/spree/api/typelizer_generation.rb +4 -0
  365. data/lib/tasks/filters.rake +12 -0
  366. data/lib/typelizer/open_enums.rb +10 -0
  367. metadata +60 -10
  368. data/app/controllers/concerns/spree/api/v3/address_params.rb +0 -17
  369. data/app/controllers/concerns/spree/api/v3/direct_uploads.rb +0 -35
  370. data/app/controllers/spree/api/v3/admin/direct_uploads_controller.rb +0 -54
  371. data/app/controllers/spree/api/v3/seller/direct_uploads_controller.rb +0 -21
@@ -0,0 +1,31 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Store
5
+ # An address as a shopper writes it on the Store API: on a cart and in
6
+ # their own address book. Not published on its own.
7
+ class AddressRequestSchema < Spree::Api::V3::RequestSchema
8
+ attribute :first_name, :string
9
+ attribute :last_name, :string
10
+ attribute :company, :string
11
+ attribute :address1, :string
12
+ attribute :address2, :string
13
+ attribute :city, :string
14
+ attribute :postal_code, :string
15
+ attribute :phone, :string
16
+ attribute :country_code, :country,
17
+ example: 'US',
18
+ description: 'ISO 3166-1 alpha-2 country code, such as `US` or `DE`.'
19
+ attribute :state_code, :string,
20
+ example: 'NY',
21
+ description: 'ISO 3166-2 subdivision code without the country prefix, such as `CA` or `NY`.'
22
+ attribute :state_name, :string, description: 'The state name, for countries without predefined states.'
23
+ attribute :quick_checkout, :boolean,
24
+ description: 'Relaxes validation (name, phone, postal code, street), for express checkouts that share a partial address.'
25
+ attribute :country_iso, :string, deprecated: 'Use `country_code`. Removed in 6.1.'
26
+ attribute :state_abbr, :string, deprecated: 'Use `state_code`. Removed in 6.1.'
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,18 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ # A tax registration. Each endpoint publishes it under its own name
5
+ # (`TaxIdentifierParams`, `SellerTaxIdentifierParams`). `kind` is
6
+ # registry-driven, so a plain string: any kind is stored, and one with a
7
+ # validator in Spree.tax_identifier_validators is checked by it.
8
+ class TaxIdentifierRequestSchema < Spree::Api::V3::RequestSchema
9
+ KIND_DESCRIPTION = 'The registration the number belongs to, such as `eu_vat` or `gb_vat`. ' \
10
+ 'Any kind is accepted; one with a registered validator is checked by it. ' \
11
+ 'Built-in: `eu_vat`. Extensions may register more.'.freeze
12
+
13
+ attribute :kind, :string, required: true, example: 'eu_vat', description: KIND_DESCRIPTION
14
+ attribute :value, :string, required: true, example: 'DE123456789'
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,13 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ # One option pair of a variant, such as size Small. Option types and values are created when missing.
5
+ class VariantOptionRequestSchema < Spree::Api::V3::RequestSchema
6
+ publishes 'VariantOptionParams'
7
+
8
+ attribute :name, :string, required: true, example: 'size'
9
+ attribute :value, :string, required: true, example: 'Small'
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,52 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ # A variant's own attributes, shared by the variant endpoints and the
5
+ # variants nested in a product payload. Not published on its own: each
6
+ # endpoint includes these fields into its own type.
7
+ class VariantRequestSchema < Spree::Api::V3::RequestSchema
8
+ attribute :sku, :string
9
+ attribute :barcode, :string
10
+ attribute :cost_price, :decimal, nullable: true
11
+ attribute :cost_currency, :currency
12
+ attribute :weight, :number, nullable: true
13
+ attribute :height, :number, nullable: true
14
+ attribute :width, :number, nullable: true
15
+ attribute :depth, :number, nullable: true
16
+ attribute :weight_unit, :string, choices: Spree::Variant::WEIGHT_UNITS
17
+ attribute :dimensions_unit, :string, choices: Spree::Variant::DIMENSION_UNITS
18
+ attribute :hs_code, :string
19
+ attribute :customs_description, :string
20
+ attribute :country_of_origin, :country
21
+ attribute :minimum_order_quantity, :integer, nullable: true
22
+ attribute :order_multiple, :integer, nullable: true
23
+ attribute :purchase_unit, :string
24
+ attribute :units_per_carton, :integer, nullable: true, description: 'How many units fill one carton.'
25
+ attribute :carton_package_type_id, :id,
26
+ nullable: true,
27
+ description: 'The carton this variant is packed into: a package type of kind `carton`. Its dimensions are shared by every product packed the same way, so a corrected carton size fixes all of them at once.'
28
+ attribute :carton_weight, :number,
29
+ nullable: true,
30
+ description: "What one packed carton weighs, in the variant's weight unit."
31
+ attribute :cartons_per_pallet, :integer, nullable: true, description: 'How many cartons stack on one pallet.'
32
+ attribute :seller_id, :id
33
+ attribute :delivery_profile_id, :id, nullable: true
34
+ attribute :track_inventory, :boolean
35
+ attribute :preorderable, :boolean,
36
+ description: "Sell this variant before it's in stock. Adds the pre-order label and ships-by promise; the cap comes from `backorder_limit`, an incoming stock count, or backorder."
37
+ attribute :preorder_ships_at, :datetime,
38
+ nullable: true,
39
+ description: 'The "ships by" date shown to customers while the variant is a pre-order. Once it passes, the variant is no longer a pre-order. Null clears it.'
40
+ attribute :backorder_limit, :integer,
41
+ nullable: true,
42
+ description: 'Maximum units sellable beyond available stock, capping backorders and pre-orders. Null is unlimited.'
43
+ attribute :tax_category_id, :id
44
+ attribute :position, :integer
45
+ attribute :prices, :array, of: Spree::Api::V3::PriceRequestSchema,
46
+ description: 'Per-currency prices. Upserted by currency.'
47
+ attribute :stock_levels, :array, of: Spree::Api::V3::StockLevelRequestSchema,
48
+ description: 'Stock per location. Upserted by location; omitted locations are removed.'
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,48 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ # The money summary a cart, an order and a multi-seller purchase all
5
+ # carry, declared once so a storefront renders any of them with one
6
+ # component, and a fix to one is a fix to all three.
7
+ #
8
+ # Every amount is nulled for a guest the storefront hides prices from,
9
+ # the payments' own included.
10
+ module PurchaseSummary
11
+ extend ActiveSupport::Concern
12
+
13
+ included do
14
+ typelize covered_by_store_credit: :boolean
15
+
16
+ money_attributes :item_total, :display_item_total,
17
+ :discount_total, :display_discount_total,
18
+ :tax_total, :display_tax_total,
19
+ :included_tax_total, :display_included_tax_total,
20
+ :additional_tax_total, :display_additional_tax_total,
21
+ :delivery_total, :display_delivery_total,
22
+ :fee_total, :display_fee_total,
23
+ :gift_card_total, :display_gift_card_total,
24
+ :store_credit_total, :display_store_credit_total,
25
+ :total, :display_total,
26
+ :amount_due, :display_amount_due,
27
+ descriptions: {
28
+ item_total: 'The line items: each price times its quantity, before discounts, fees and delivery.',
29
+ discount_total: 'What promotions take off, as a negative amount. Manual discounts are not included.',
30
+ tax_total: 'All tax, both included in prices and added on top.',
31
+ included_tax_total: 'Tax already included in the prices, as in a store whose prices are tax-inclusive.',
32
+ additional_tax_total: 'Tax added on top of the prices.',
33
+ delivery_total: 'What delivery costs, before delivery discounts.',
34
+ fee_total: 'Every fee charged, such as handling or a customs duty.',
35
+ gift_card_total: 'What a gift card pays.',
36
+ store_credit_total: 'What store credit pays, apart from gift cards.',
37
+ total: 'What the customer pays in all: items, delivery, fees and added tax, less discounts.',
38
+ amount_due: 'What is left to pay after payments and store credit.'
39
+ }
40
+
41
+ attribute :covered_by_store_credit, &:covered_by_store_credit?
42
+
43
+ many :payments, resource: proc { Spree.api.payment_serializer }
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -6,8 +6,10 @@ module Spree
6
6
  address1: [:string, nullable: true], address2: [:string, nullable: true],
7
7
  city: [:string, nullable: true], postal_code: [:string, nullable: true], phone: [:string, nullable: true],
8
8
  company: [:string, nullable: true], state_code: [:string, nullable: true],
9
- state_abbr: [:string, nullable: true], state_name: [:string, nullable: true],
10
- state_text: [:string, nullable: true], country_code: :string, country_iso: :string,
9
+ state_abbr: [:string, nullable: true, deprecated: 'Use `state_code`. Removed in 6.1.'],
10
+ state_name: [:string, nullable: true],
11
+ state_text: [:string, nullable: true], country_code: [:string, enum: Spree::IsoData.country_codes, enum_type_name: 'CountryCode'],
12
+ country_iso: [:string, deprecated: 'Use `country_code`. Removed in 6.1.'],
11
13
  country_name: :string,
12
14
  quick_checkout: :boolean, is_default_billing: :boolean, is_default_shipping: :boolean,
13
15
  label: [:string, nullable: true]
@@ -3,6 +3,9 @@ module Spree
3
3
  module V3
4
4
  module Admin
5
5
  class AddressSerializer < V3::AddressSerializer
6
+ # The Store API keeps these deprecated names until 6.1.
7
+ %i[state_abbr country_iso].each { |key| _attributes.delete(key) }
8
+
6
9
  typelize customer_id: [:string, nullable: true],
7
10
  owner_id: [:string, nullable: true],
8
11
  owner_type: [:string, nullable: true],
@@ -3,9 +3,11 @@ module Spree
3
3
  module V3
4
4
  module Admin
5
5
  class AppliedPromotionSerializer < V3::AppliedPromotionSerializer
6
+ without_formatted_money
7
+
6
8
  # The Admin API has no guest gating — money fields inherited from the
7
9
  # store serializer are always present, so override their nullability.
8
- typelize amount: [:string, nullable: false], display_amount: [:string, nullable: false]
10
+ typelize amount: [:string, nullable: false]
9
11
 
10
12
  attributes created_at: :iso8601, updated_at: :iso8601
11
13
  end
@@ -12,7 +12,9 @@ module Spree
12
12
  # are redeclared with admin counterparts — admin serializers never
13
13
  # reference store serializers.
14
14
  class CartSerializer < V3::CartSerializer
15
- %i[fulfillments payments payment_methods gift_card discounts fees].each { |key| _attributes.delete(key) }
15
+ without_formatted_money
16
+
17
+ %i[fulfillments payments payment_methods gift_card discounts fees number].each { |key| _attributes.delete(key) }
16
18
 
17
19
  typelize completed_at: [:string, nullable: true]
18
20
 
@@ -5,11 +5,12 @@ module Spree
5
5
  # The least a whole order must come to under a catalog's agreement,
6
6
  # in one currency.
7
7
  class CatalogOrderMinimumSerializer < V3::BaseSerializer
8
- typelize currency: :string, amount: :string, display_amount: :string
8
+ typelize currency: [:string, enum: Spree::Money::Rounding::CURRENCY_CODES, enum_type_name: 'CurrencyCode']
9
9
 
10
10
  attributes :currency, created_at: :iso8601, updated_at: :iso8601
11
11
 
12
- attributes amount: :string, display_amount: :string
12
+ money_attributes :amount
13
+ typelize amount: [:string, nullable: false]
13
14
  end
14
15
  end
15
16
  end
@@ -17,8 +17,7 @@ module Spree
17
17
  _attributes.delete(:id)
18
18
 
19
19
  typelize id: 'string | null', label: 'string | null', sku: 'string | null',
20
- amount: :string, display_amount: :string,
21
- currency: :string, source: [:string, enum: Spree::CatalogPrice::SOURCES], break_count: :number
20
+ currency: [:string, enum: Spree::Money::Rounding::CURRENCY_CODES, enum_type_name: 'CurrencyCode'], source: [:string, enum: Spree::CatalogPrice::SOURCES], break_count: :number
22
21
 
23
22
  # The variant this prices, so a row can name what it is showing —
24
23
  # a product's variants can be priced differently, and one figure
@@ -33,9 +32,9 @@ module Spree
33
32
  # though it were the only one.
34
33
  attributes :currency, :source, :break_count
35
34
 
36
- attribute :amount, &:display_value
35
+ money_attributes :amount, unit_price: true
36
+ typelize amount: [:string, nullable: false]
37
37
 
38
- attributes :display_amount
39
38
 
40
39
  # The ladder itself, so the agreement page can show what a buyer
41
40
  # pays at each threshold without opening the price sheet
@@ -11,11 +11,12 @@ module Spree
11
11
  class CatalogPriceTierSerializer < V3::BaseSerializer
12
12
  _attributes.delete(:id)
13
13
 
14
- typelize min_quantity: :number, amount: :string, display_amount: :string
14
+ typelize min_quantity: :number
15
15
 
16
- attributes :min_quantity, :display_amount
16
+ attributes :min_quantity
17
17
 
18
- attribute :amount, &:display_value
18
+ money_attributes :amount, unit_price: true
19
+ typelize amount: [:string, nullable: false]
19
20
  end
20
21
  end
21
22
  end
@@ -4,17 +4,15 @@ module Spree
4
4
  module Admin
5
5
  class ChannelSerializer < V3::ChannelSerializer
6
6
  typelize store_id: :string,
7
- preferred_order_routing_strategy: [:string, nullable: true, comment: 'Order routing strategy; null inherits the store setting. Built-in: rules. Extensions may register more.'],
8
- preferred_storefront_access: [:string, nullable: true],
9
- preferred_guest_checkout: [:boolean, nullable: true],
7
+ order_routing_strategy: [:string, nullable: true, comment: 'Order routing strategy; null inherits the store setting. Built-in: rules. Extensions may register more.'],
10
8
  stock_location_ids: [:string, multi: true],
11
9
  default_catalog_id: [:string, nullable: true]
12
10
 
13
- attributes :preferred_storefront_access,
14
- :preferred_guest_checkout,
15
- created_at: :iso8601, updated_at: :iso8601
11
+ attributes created_at: :iso8601, updated_at: :iso8601
16
12
 
17
- api_type_attributes :preferred_order_routing_strategy
13
+ preference_attributes Spree::Channel, except: %i[order_routing_strategy]
14
+
15
+ api_type_attributes :order_routing_strategy
18
16
 
19
17
  # Fulfillment-origin allowlist; empty means every store location
20
18
  # serves this channel.
@@ -5,6 +5,13 @@ module Spree
5
5
  module V3
6
6
  module Admin
7
7
  class ClaimLineItemSerializer < V3::ClaimLineItemSerializer
8
+ without_formatted_money
9
+
10
+ # No guest price gating here, so the inherited money fields are always present.
11
+ typelize refund_amount: [:string, nullable: false], paid_amount: [:string, nullable: false],
12
+ pre_tax_amount: [:string, nullable: false], included_tax_total: [:string, nullable: false],
13
+ additional_tax_total: [:string, nullable: false], tax_total: [:string, nullable: false]
14
+
8
15
  attributes created_at: :iso8601, updated_at: :iso8601
9
16
 
10
17
  one :variant, resource: proc { Spree.api.admin_variant_serializer }, if: proc { expand?('variant') }
@@ -5,6 +5,11 @@ module Spree
5
5
  module V3
6
6
  module Admin
7
7
  class ClaimSerializer < V3::ClaimSerializer
8
+ without_formatted_money
9
+
10
+ # No guest price gating here, so the inherited money fields are always present.
11
+ typelize refund_total: [:string, nullable: false]
12
+
8
13
  typelize memo: [:string, nullable: true],
9
14
  metadata: 'Record<string, unknown>',
10
15
  created_by_id: [:string, nullable: true],
@@ -20,18 +20,10 @@ module Spree
20
20
  fulfillment_id: 'string | null',
21
21
  commission_rate_id: 'string | null',
22
22
  kind: [:string, enum: Spree::CommissionRate::KINDS],
23
- rate: :string,
24
- tax_rate: :string,
25
23
  taxability_reason: 'string | null',
26
- country_code: 'string | null',
24
+ country_code: [:string, nullable: true, enum: Spree::IsoData.country_codes, enum_type_name: 'CountryCode'],
27
25
  state_code: 'string | null',
28
- amount: :string,
29
- tax_amount: :string,
30
- total: :string,
31
- currency: :string,
32
- display_amount: :string,
33
- display_tax_amount: :string,
34
- display_total: :string
26
+ currency: [:string, enum: Spree::Money::Rounding::CURRENCY_CODES, enum_type_name: 'CurrencyCode']
35
27
 
36
28
  # The treatment, in Spree::TaxLine's vocabulary — a seller's invoice
37
29
  # has to explain why its fee was taxed the way it was, and the
@@ -39,14 +31,11 @@ module Spree
39
31
  attributes :kind, :currency, :taxability_reason, :country_code, :state_code,
40
32
  created_at: :iso8601, updated_at: :iso8601
41
33
 
42
- # Strings, so the figures a seller is invoiced round-trip exactly.
43
- %i[rate tax_rate amount tax_amount total].each do |decimal|
44
- attribute(decimal) { |line| line.public_send(decimal)&.to_s }
45
- end
46
-
47
- %i[display_amount display_tax_amount display_total].each do |formatted|
48
- attribute(formatted) { |line| line.public_send(formatted).to_s }
49
- end
34
+ rate_attributes :rate, :tax_rate
35
+ money_attributes :amount, :tax_amount, :total
36
+ typelize rate: [:string, nullable: false], tax_rate: [:string, nullable: false],
37
+ amount: [:string, nullable: false], tax_amount: [:string, nullable: false],
38
+ total: [:string, nullable: false]
50
39
 
51
40
  %i[order seller line_item fulfillment commission_rate].each do |association|
52
41
  attribute(:"#{association}_id") { |line| line.public_send(association)&.prefixed_id }
@@ -10,21 +10,16 @@ module Spree
10
10
  # were actually charged (Spree::CommissionLine) on their own branch,
11
11
  # never the rules that produced it.
12
12
  class CommissionRateSerializer < V3::BaseSerializer
13
- # Decimals serialize as strings, like every other money-ish field on
14
- # the admin API: a rate has to round-trip exactly, and a float does
15
- # not promise that.
16
13
  typelize name: :string,
17
14
  code: 'string | null',
18
15
  enabled: :boolean,
19
16
  position: :number,
20
17
  global: :boolean,
21
18
  kind: [:string, enum: Spree::CommissionRate::KINDS],
22
- value: :string,
23
19
  amounts: 'Record<string, string>',
24
20
  bounds: 'Record<string, { min_amount: string | null; max_amount: string | null }>',
25
21
  tax_inclusive: :boolean,
26
22
  include_shipping: :boolean,
27
- commission_tax_rate: 'string | null',
28
23
  metadata: 'Record<string, unknown> | null',
29
24
  deleted_at: 'string | null'
30
25
 
@@ -32,22 +27,23 @@ module Spree
32
27
  :tax_inclusive, :include_shipping, :metadata,
33
28
  deleted_at: :iso8601, created_at: :iso8601, updated_at: :iso8601
34
29
 
35
- %i[value commission_tax_rate].each do |decimal|
36
- attribute(decimal) { |rate| rate.public_send(decimal)&.to_s }
37
- end
30
+ # +value+ is the percentage a percentage rate charges; a flat fee's
31
+ # money lives in +amounts+, per currency.
32
+ rate_attributes :value, :commission_tax_rate
33
+ typelize value: [:string, nullable: false]
38
34
 
39
35
  # What a flat fee charges, per currency. Empty on a percentage rate,
40
36
  # which needs no amount of its own.
41
37
  attribute :amounts do |rate|
42
- rate.amounts.transform_values(&:to_s)
38
+ rate.amounts.to_h { |currency, amount| [currency, Spree::Money::Rounding.format(amount, currency)] }
43
39
  end
44
40
 
45
41
  # The floor and cap a percentage charges within, per currency. Each
46
42
  # holds only in its own currency, so a rate may bound some and leave
47
43
  # others unbounded.
48
44
  attribute :bounds do |rate|
49
- rate.bounds.transform_values do |bound|
50
- bound.transform_values { |amount| amount&.to_s }
45
+ rate.bounds.to_h do |currency, bound|
46
+ [currency, bound.transform_values { |amount| Spree::Money::Rounding.format(amount, currency) }]
51
47
  end
52
48
  end
53
49
 
@@ -13,7 +13,6 @@ module Spree
13
13
  typelize type: [:string, comment: 'Rule type. Built-in: seller_rule, category_rule, product_rule, item_total_rule. Extensions may register more.'],
14
14
  commission_rate_id: :string,
15
15
  preferences: 'Record<string, unknown>',
16
- preference_schema: 'Array<{ key: string; type: string; default: unknown }>',
17
16
  product_ids: 'Array<string> | null',
18
17
  seller_ids: 'Array<string> | null',
19
18
  category_ids: 'Array<string> | null'
@@ -27,7 +26,6 @@ module Spree
27
26
  prefixed_id_attributes :commission_rate
28
27
 
29
28
  attribute :preferences, &:serialized_preferences
30
- attribute :preference_schema, &:serialized_preference_schema
31
29
 
32
30
  # Reference lists are returned as prefixed IDs to match the rest of
33
31
  # the API. Product ids are read through a join table; seller and
@@ -4,7 +4,11 @@ module Spree
4
4
  module Admin
5
5
  # No timestamps: countries are reference data supplied by the countries
6
6
  # gem rather than records, so they have no created_at/updated_at.
7
+ # The dashboard names countries with Intl.DisplayNames in the admin's
8
+ # own language, so the Admin API sends the ISO code alone.
7
9
  class CountrySerializer < V3::CountrySerializer
10
+ _attributes.delete(:name)
11
+
8
12
  many :states,
9
13
  resource: proc { Spree.api.admin_state_serializer },
10
14
  if: proc { params[:expand]&.include?('states') }
@@ -5,13 +5,14 @@ module Spree
5
5
  # Admin API Customer Serializer
6
6
  # Full customer data including admin-only fields
7
7
  class CustomerSerializer < V3::CustomerSerializer
8
+ without_formatted_money
9
+
8
10
  typelize failed_attempts: :number,
9
11
  tags: [:string, multi: true],
10
12
  internal_note: [:string, nullable: true], internal_note_html: [:string, nullable: true],
11
13
  metadata: 'Record<string, unknown>',
12
14
  orders_count: :number,
13
15
  total_spent: :string,
14
- display_total_spent: :string,
15
16
  last_order_completed_at: [:string, nullable: true],
16
17
  default_billing_address_id: [:string, nullable: true],
17
18
  default_shipping_address_id: [:string, nullable: true],
@@ -53,13 +54,8 @@ module Spree
53
54
  end
54
55
 
55
56
  attribute :total_spent do |user|
56
- (user.attributes['total_spent'] || user.orders.complete.sum(:total)).to_s
57
- end
58
-
59
- attribute :display_total_spent do |user|
60
57
  amount = user.attributes['total_spent'] || user.orders.complete.sum(:total)
61
- currency = Spree::Current.currency || Spree::Current.store&.default_currency
62
- Spree::Money.new(amount, currency: currency).to_s
58
+ Spree::Money::Rounding.format(amount, (current_store || Spree::Current.store)&.default_currency)
63
59
  end
64
60
 
65
61
  attribute :last_order_completed_at do |user|
@@ -6,7 +6,6 @@ module Spree
6
6
  typelize type: [:string, comment: 'Rule type. Built-in: item_total_rule, weight_rule, excluded_products_rule, channel_rule, volume_rule, company_rule. Extensions may register more.'],
7
7
  active: :boolean,
8
8
  preferences: 'Record<string, unknown>',
9
- preference_schema: "Array<{ key: string; type: string; default: unknown; choices?: string[] }>",
10
9
  product_ids: [:string, multi: true]
11
10
 
12
11
  attributes :active, created_at: :iso8601, updated_at: :iso8601
@@ -18,7 +17,6 @@ module Spree
18
17
  end
19
18
 
20
19
  attribute :preferences, &:serialized_preferences
21
- attribute :preference_schema, &:serialized_preference_schema
22
20
 
23
21
  # Association-backed config (ExcludedProductsRule); empty for
24
22
  # preference-only rules. Same name read and written.
@@ -13,18 +13,25 @@ module Spree
13
13
  delivery_origin_group_id: [:string, nullable: true],
14
14
  delivery_zone_id: [:string, nullable: true],
15
15
  stock_location_ids: [:string, multi: true],
16
- calculator_type: [:string, nullable: true],
17
- calculator_preferences: ['Record<string, unknown>', nullable: true],
16
+ calculator: 'TypedDeliveryCalculator | null',
18
17
  markup_flat: [:string, nullable: true],
19
18
  markup_percent: [:string, nullable: true],
20
19
  available_to_sellers: :boolean,
21
20
  seller_id: [:string, nullable: true],
22
21
  seller_name: [:string, nullable: true]
23
22
 
24
- attributes :admin_name, :storefront_visible, :tracking_url,
25
- :markup_flat, :markup_percent, :available_to_sellers,
23
+ attributes :admin_name, :storefront_visible, :tracking_url, :available_to_sellers,
26
24
  created_at: :iso8601, updated_at: :iso8601, deleted_at: :iso8601
27
25
 
26
+ # The flat markup is charged in whatever currency the rate is quoted
27
+ # in, so it is shown as stored rather than rounded to one currency:
28
+ # a rounded figure would be saved back.
29
+ attribute :markup_flat do |record|
30
+ Spree::Money::Rounding.format(record.markup_flat, (current_store || Spree::Current.store)&.default_currency, unit_price: true)
31
+ end
32
+
33
+ rate_attributes :markup_percent
34
+
28
35
  # Which seller runs this method, so the operator's list can say
29
36
  # whose it is. Null is the marketplace's own
30
37
  # (docs/plans/6.0-multi-vendor-marketplace.md, Decision 13).
@@ -48,12 +55,9 @@ module Spree
48
55
 
49
56
  api_type_attributes :fulfillment_provider, :pickup_point_provider, :rate_provider
50
57
 
51
- attribute :calculator_type do |record|
52
- record.calculator&.class&.api_type
53
- end
54
-
55
- attribute :calculator_preferences do |record|
56
- record.calculator.respond_to?(:serialized_preferences) ? record.calculator.serialized_preferences : record.calculator&.preferences
58
+ attribute :calculator do |record|
59
+ calculator = record.calculator
60
+ { type: calculator.class.api_type, preferences: calculator.serialized_preferences } if calculator
57
61
  end
58
62
  end
59
63
  end
@@ -7,7 +7,15 @@ module Spree
7
7
  markup_flat: [:string, nullable: true], markup_percent: [:string, nullable: true],
8
8
  position: :number
9
9
 
10
- attributes :carrier, :service, :label, :markup_flat, :markup_percent, :position
10
+ attributes :carrier, :service, :label
11
+
12
+ attribute :markup_flat do |record|
13
+ Spree::Money::Rounding.format(record.markup_flat, (current_store || Spree::Current.store)&.default_currency, unit_price: true)
14
+ end
15
+
16
+ rate_attributes :markup_percent
17
+
18
+ attributes :position
11
19
  end
12
20
  end
13
21
  end
@@ -3,6 +3,14 @@ module Spree
3
3
  module V3
4
4
  module Admin
5
5
  class DeliveryRateSerializer < V3::DeliveryRateSerializer
6
+ without_formatted_money
7
+
8
+ # No guest price gating here, so the inherited money fields are always present.
9
+ typelize cost: [:string, nullable: false],
10
+ total: [:string, nullable: false],
11
+ additional_tax_total: [:string, nullable: false],
12
+ included_tax_total: [:string, nullable: false], tax_total: [:string, nullable: false]
13
+
6
14
  typelize metadata: ['Record<string, unknown>', nullable: true]
7
15
 
8
16
  # Raw carrier payload (quote ids, service codes) — operational
@@ -3,7 +3,9 @@ module Spree
3
3
  module V3
4
4
  module Admin
5
5
  class DiscountSerializer < V3::DiscountSerializer
6
- typelize amount: [:string, nullable: false], display_amount: [:string, nullable: false],
6
+ without_formatted_money
7
+
8
+ typelize amount: [:string, nullable: false],
7
9
  metadata: ['Record<string, unknown>', nullable: true]
8
10
 
9
11
  attributes :metadata, created_at: :iso8601, updated_at: :iso8601
@@ -5,6 +5,11 @@ module Spree
5
5
  module V3
6
6
  module Admin
7
7
  class ExchangeLineItemSerializer < V3::ExchangeLineItemSerializer
8
+ # No guest price gating here, so the inherited money fields are always present.
9
+ typelize original_price: [:string, nullable: false], new_variant_price: [:string, nullable: false],
10
+ price_difference: [:string, nullable: false], original_tax_total: [:string, nullable: false],
11
+ new_tax_total: [:string, nullable: false]
12
+
8
13
  attributes created_at: :iso8601, updated_at: :iso8601
9
14
 
10
15
  one :original_variant, resource: proc { Spree.api.admin_variant_serializer }, if: proc { expand?('original_variant') }
@@ -5,6 +5,11 @@ module Spree
5
5
  module V3
6
6
  module Admin
7
7
  class ExchangeSerializer < V3::ExchangeSerializer
8
+ without_formatted_money
9
+
10
+ # No guest price gating here, so the inherited money fields are always present.
11
+ typelize price_difference: [:string, nullable: false]
12
+
8
13
  typelize memo: [:string, nullable: true],
9
14
  metadata: 'Record<string, unknown>',
10
15
  stock_location_id: [:string, nullable: true],
@@ -3,7 +3,9 @@ module Spree
3
3
  module V3
4
4
  module Admin
5
5
  class FeeSerializer < V3::FeeSerializer
6
- typelize amount: [:string, nullable: false], display_amount: [:string, nullable: false],
6
+ without_formatted_money
7
+
8
+ typelize amount: [:string, nullable: false],
7
9
  metadata: ['Record<string, unknown>', nullable: true]
8
10
 
9
11
  attributes :metadata, created_at: :iso8601, updated_at: :iso8601