spree_api 6.0.0.rc1 → 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 (370) 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/strict_money_params.rb +94 -0
  23. data/app/controllers/spree/api/v3/admin/admin_users_controller.rb +10 -1
  24. data/app/controllers/spree/api/v3/admin/allowed_origins_controller.rb +8 -1
  25. data/app/controllers/spree/api/v3/admin/api_keys_controller.rb +15 -7
  26. data/app/controllers/spree/api/v3/admin/base_controller.rb +1 -0
  27. data/app/controllers/spree/api/v3/admin/catalogs/order_minimums_controller.rb +3 -1
  28. data/app/controllers/spree/api/v3/admin/catalogs/quantity_rules_controller.rb +7 -5
  29. data/app/controllers/spree/api/v3/admin/catalogs_controller.rb +60 -33
  30. data/app/controllers/spree/api/v3/admin/categories/products_controller.rb +4 -1
  31. data/app/controllers/spree/api/v3/admin/categories_controller.rb +40 -20
  32. data/app/controllers/spree/api/v3/admin/channels_controller.rb +39 -6
  33. data/app/controllers/spree/api/v3/admin/claim_reasons_controller.rb +5 -1
  34. data/app/controllers/spree/api/v3/admin/collections/products_controller.rb +4 -1
  35. data/app/controllers/spree/api/v3/admin/collections_controller.rb +44 -15
  36. data/app/controllers/spree/api/v3/admin/commission_rates_controller.rb +60 -12
  37. data/app/controllers/spree/api/v3/admin/companies/addresses_controller.rb +11 -0
  38. data/app/controllers/spree/api/v3/admin/companies/memberships_controller.rb +9 -1
  39. data/app/controllers/spree/api/v3/admin/companies/tax_exemption_certificates_controller.rb +19 -18
  40. data/app/controllers/spree/api/v3/admin/companies/tax_identifiers_controller.rb +6 -1
  41. data/app/controllers/spree/api/v3/admin/companies_controller.rb +17 -3
  42. data/app/controllers/spree/api/v3/admin/countries_controller.rb +5 -1
  43. data/app/controllers/spree/api/v3/admin/custom_field_definitions_controller.rb +21 -11
  44. data/app/controllers/spree/api/v3/admin/custom_fields_controller.rb +12 -5
  45. data/app/controllers/spree/api/v3/admin/customer_groups_controller.rb +9 -1
  46. data/app/controllers/spree/api/v3/admin/customers/addresses_controller.rb +12 -7
  47. data/app/controllers/spree/api/v3/admin/customers/store_credits_controller.rb +11 -9
  48. data/app/controllers/spree/api/v3/admin/customers/tax_identifiers_controller.rb +6 -1
  49. data/app/controllers/spree/api/v3/admin/customers_controller.rb +35 -7
  50. data/app/controllers/spree/api/v3/admin/data_requests_controller.rb +8 -0
  51. data/app/controllers/spree/api/v3/admin/delivery_method_rules_controller.rb +1 -1
  52. data/app/controllers/spree/api/v3/admin/delivery_methods/rules_controller.rb +15 -7
  53. data/app/controllers/spree/api/v3/admin/delivery_methods_controller.rb +92 -57
  54. data/app/controllers/spree/api/v3/admin/delivery_profiles/origin_groups_controller.rb +8 -1
  55. data/app/controllers/spree/api/v3/admin/delivery_profiles_controller.rb +13 -1
  56. data/app/controllers/spree/api/v3/admin/delivery_zones_controller.rb +21 -5
  57. data/app/controllers/spree/api/v3/admin/email_templates/drafts_controller.rb +14 -1
  58. data/app/controllers/spree/api/v3/admin/email_templates/previews_controller.rb +4 -0
  59. data/app/controllers/spree/api/v3/admin/email_templates/publications_controller.rb +7 -0
  60. data/app/controllers/spree/api/v3/admin/email_templates/restorations_controller.rb +8 -0
  61. data/app/controllers/spree/api/v3/admin/email_templates/test_emails_controller.rb +4 -0
  62. data/app/controllers/spree/api/v3/admin/exports_controller.rb +23 -6
  63. data/app/controllers/spree/api/v3/admin/files_controller.rb +29 -0
  64. data/app/controllers/spree/api/v3/admin/gift_card_batches_controller.rb +20 -1
  65. data/app/controllers/spree/api/v3/admin/gift_cards_controller.rb +19 -1
  66. data/app/controllers/spree/api/v3/admin/imports_controller.rb +36 -9
  67. data/app/controllers/spree/api/v3/admin/integrations_controller.rb +13 -1
  68. data/app/controllers/spree/api/v3/admin/invitation_acceptances_controller.rb +9 -2
  69. data/app/controllers/spree/api/v3/admin/invitations_controller.rb +8 -1
  70. data/app/controllers/spree/api/v3/admin/locales_controller.rb +1 -1
  71. data/app/controllers/spree/api/v3/admin/markets_controller.rb +30 -9
  72. data/app/controllers/spree/api/v3/admin/me_controller.rb +12 -3
  73. data/app/controllers/spree/api/v3/admin/media_controller.rb +22 -9
  74. data/app/controllers/spree/api/v3/admin/media_library_controller.rb +4 -0
  75. data/app/controllers/spree/api/v3/admin/option_types_controller.rb +24 -7
  76. data/app/controllers/spree/api/v3/admin/order_cancellation_reasons_controller.rb +5 -1
  77. data/app/controllers/spree/api/v3/admin/order_routing_rules_controller.rb +13 -1
  78. data/app/controllers/spree/api/v3/admin/orders/claims_controller.rb +39 -1
  79. data/app/controllers/spree/api/v3/admin/orders/deliveries_controller.rb +19 -1
  80. data/app/controllers/spree/api/v3/admin/orders/discount_codes_controller.rb +5 -1
  81. data/app/controllers/spree/api/v3/admin/orders/discounts_controller.rb +29 -5
  82. data/app/controllers/spree/api/v3/admin/orders/exchanges_controller.rb +36 -1
  83. data/app/controllers/spree/api/v3/admin/orders/fees_controller.rb +22 -1
  84. data/app/controllers/spree/api/v3/admin/orders/fulfillments_controller.rb +66 -7
  85. data/app/controllers/spree/api/v3/admin/orders/gift_cards_controller.rb +6 -2
  86. data/app/controllers/spree/api/v3/admin/orders/items_controller.rb +11 -1
  87. data/app/controllers/spree/api/v3/admin/orders/labels_controller.rb +35 -2
  88. data/app/controllers/spree/api/v3/admin/orders/payments_controller.rb +16 -5
  89. data/app/controllers/spree/api/v3/admin/orders/refunds_controller.rb +6 -0
  90. data/app/controllers/spree/api/v3/admin/orders/returns_controller.rb +37 -1
  91. data/app/controllers/spree/api/v3/admin/orders/store_credits_controller.rb +6 -3
  92. data/app/controllers/spree/api/v3/admin/orders_controller.rb +74 -60
  93. data/app/controllers/spree/api/v3/admin/package_types_controller.rb +30 -5
  94. data/app/controllers/spree/api/v3/admin/password_resets_controller.rb +17 -0
  95. data/app/controllers/spree/api/v3/admin/payment_methods_controller.rb +38 -22
  96. data/app/controllers/spree/api/v3/admin/policies_controller.rb +8 -4
  97. data/app/controllers/spree/api/v3/admin/price_lists_controller.rb +27 -15
  98. data/app/controllers/spree/api/v3/admin/prices_controller.rb +51 -4
  99. data/app/controllers/spree/api/v3/admin/product_types_controller.rb +25 -8
  100. data/app/controllers/spree/api/v3/admin/products/digital_assets_controller.rb +27 -10
  101. data/app/controllers/spree/api/v3/admin/products/variants_controller.rb +9 -14
  102. data/app/controllers/spree/api/v3/admin/products_controller.rb +121 -70
  103. data/app/controllers/spree/api/v3/admin/promotion_actions_controller.rb +11 -2
  104. data/app/controllers/spree/api/v3/admin/promotion_rules_controller.rb +10 -1
  105. data/app/controllers/spree/api/v3/admin/promotions_controller.rb +50 -14
  106. data/app/controllers/spree/api/v3/admin/purchase_orders_controller.rb +54 -7
  107. data/app/controllers/spree/api/v3/admin/refund_reasons_controller.rb +5 -1
  108. data/app/controllers/spree/api/v3/admin/reporting/saved_reports_controller.rb +9 -1
  109. data/app/controllers/spree/api/v3/admin/reporting_controller.rb +34 -0
  110. data/app/controllers/spree/api/v3/admin/resource_controller.rb +1 -0
  111. data/app/controllers/spree/api/v3/admin/return_reasons_controller.rb +5 -1
  112. data/app/controllers/spree/api/v3/admin/roles_controller.rb +13 -1
  113. data/app/controllers/spree/api/v3/admin/seller_payouts_controller.rb +6 -0
  114. data/app/controllers/spree/api/v3/admin/seller_requirement_submissions_controller.rb +15 -0
  115. data/app/controllers/spree/api/v3/admin/seller_requirements_controller.rb +32 -6
  116. data/app/controllers/spree/api/v3/admin/sellers_controller.rb +75 -22
  117. data/app/controllers/spree/api/v3/admin/setup_controller.rb +54 -15
  118. data/app/controllers/spree/api/v3/admin/stock_levels_controller.rb +38 -9
  119. data/app/controllers/spree/api/v3/admin/stock_locations_controller.rb +41 -9
  120. data/app/controllers/spree/api/v3/admin/stock_transfers_controller.rb +48 -7
  121. data/app/controllers/spree/api/v3/admin/store_controller.rb +122 -53
  122. data/app/controllers/spree/api/v3/admin/store_credits_controller.rb +1 -7
  123. data/app/controllers/spree/api/v3/admin/suppliers_controller.rb +16 -6
  124. data/app/controllers/spree/api/v3/admin/tax_categories_controller.rb +7 -4
  125. data/app/controllers/spree/api/v3/admin/tax_rates_controller.rb +21 -3
  126. data/app/controllers/spree/api/v3/admin/tracking_carriers_controller.rb +4 -0
  127. data/app/controllers/spree/api/v3/admin/translations/batches_controller.rb +17 -9
  128. data/app/controllers/spree/api/v3/admin/translations_controller.rb +4 -0
  129. data/app/controllers/spree/api/v3/admin/translations_coverage_controller.rb +5 -0
  130. data/app/controllers/spree/api/v3/admin/updates_controller.rb +39 -0
  131. data/app/controllers/spree/api/v3/admin/webhook_endpoints_controller.rb +23 -1
  132. data/app/controllers/spree/api/v3/base_controller.rb +2 -0
  133. data/app/controllers/spree/api/v3/resource_controller.rb +63 -10
  134. data/app/controllers/spree/api/v3/seller/auth_controller.rb +8 -0
  135. data/app/controllers/spree/api/v3/seller/base_controller.rb +1 -0
  136. data/app/controllers/spree/api/v3/seller/countries_controller.rb +2 -2
  137. data/app/controllers/spree/api/v3/seller/delivery_methods_controller.rb +49 -60
  138. data/app/controllers/spree/api/v3/seller/exports_controller.rb +18 -1
  139. data/app/controllers/spree/api/v3/seller/files_controller.rb +27 -0
  140. data/app/controllers/spree/api/v3/seller/imports_controller.rb +25 -9
  141. data/app/controllers/spree/api/v3/seller/invitation_acceptances_controller.rb +9 -1
  142. data/app/controllers/spree/api/v3/seller/me_controller.rb +14 -3
  143. data/app/controllers/spree/api/v3/seller/onboarding_controller.rb +11 -0
  144. data/app/controllers/spree/api/v3/seller/orders/claims_controller.rb +35 -0
  145. data/app/controllers/spree/api/v3/seller/orders/deliveries_controller.rb +12 -0
  146. data/app/controllers/spree/api/v3/seller/orders/exchanges_controller.rb +33 -0
  147. data/app/controllers/spree/api/v3/seller/orders/fulfillments_controller.rb +28 -2
  148. data/app/controllers/spree/api/v3/seller/orders/labels_controller.rb +22 -1
  149. data/app/controllers/spree/api/v3/seller/orders/notes_controller.rb +8 -1
  150. data/app/controllers/spree/api/v3/seller/orders/returns_controller.rb +32 -0
  151. data/app/controllers/spree/api/v3/seller/orders_controller.rb +35 -14
  152. data/app/controllers/spree/api/v3/seller/package_types_controller.rb +21 -9
  153. data/app/controllers/spree/api/v3/seller/password_resets_controller.rb +10 -0
  154. data/app/controllers/spree/api/v3/seller/policies_controller.rb +12 -4
  155. data/app/controllers/spree/api/v3/seller/products_controller.rb +114 -28
  156. data/app/controllers/spree/api/v3/seller/profile_controller.rb +33 -10
  157. data/app/controllers/spree/api/v3/seller/requirement_submissions_controller.rb +12 -5
  158. data/app/controllers/spree/api/v3/seller/resource_controller.rb +12 -0
  159. data/app/controllers/spree/api/v3/seller/stock_locations_controller.rb +44 -13
  160. data/app/controllers/spree/api/v3/seller/tax_identifiers_controller.rb +10 -1
  161. data/app/controllers/spree/api/v3/seller/team_controller.rb +4 -0
  162. data/app/controllers/spree/api/v3/store/auth_controller.rb +10 -0
  163. data/app/controllers/spree/api/v3/store/carts/discount_codes_controller.rb +8 -1
  164. data/app/controllers/spree/api/v3/store/carts/fulfillments_controller.rb +10 -2
  165. data/app/controllers/spree/api/v3/store/carts/gift_cards_controller.rb +8 -1
  166. data/app/controllers/spree/api/v3/store/carts/items_controller.rb +17 -5
  167. data/app/controllers/spree/api/v3/store/carts/payment_sessions_controller.rb +20 -6
  168. data/app/controllers/spree/api/v3/store/carts/payments_controller.rb +11 -0
  169. data/app/controllers/spree/api/v3/store/carts/po_documents_controller.rb +24 -26
  170. data/app/controllers/spree/api/v3/store/carts/store_credits_controller.rb +7 -1
  171. data/app/controllers/spree/api/v3/store/carts/tax_identifiers_controller.rb +5 -1
  172. data/app/controllers/spree/api/v3/store/carts_controller.rb +56 -47
  173. data/app/controllers/spree/api/v3/store/companies/addresses_controller.rb +12 -4
  174. data/app/controllers/spree/api/v3/store/companies/members_controller.rb +4 -0
  175. data/app/controllers/spree/api/v3/store/companies_controller.rb +5 -1
  176. data/app/controllers/spree/api/v3/store/company_invitations_controller.rb +9 -1
  177. data/app/controllers/spree/api/v3/store/customer/addresses_controller.rb +8 -7
  178. data/app/controllers/spree/api/v3/store/customer/data_requests_controller.rb +5 -0
  179. data/app/controllers/spree/api/v3/store/customer/password_resets_controller.rb +17 -0
  180. data/app/controllers/spree/api/v3/store/customer/payment_setup_sessions_controller.rb +10 -5
  181. data/app/controllers/spree/api/v3/store/customer/tax_identifiers_controller.rb +5 -1
  182. data/app/controllers/spree/api/v3/store/customers_controller.rb +28 -2
  183. data/app/controllers/spree/api/v3/store/newsletter_subscribers_controller.rb +22 -0
  184. data/app/controllers/spree/api/v3/store/orders/claims_controller.rb +11 -2
  185. data/app/controllers/spree/api/v3/store/orders/returns_controller.rb +10 -1
  186. data/app/controllers/spree/api/v3/store/orders_controller.rb +47 -10
  187. data/app/controllers/spree/api/v3/store/products_controller.rb +8 -0
  188. data/app/controllers/spree/api/v3/store/wishlist_items_controller.rb +10 -4
  189. data/app/controllers/spree/api/v3/store/wishlists_controller.rb +12 -4
  190. data/app/request_schemas/spree/api/v3/address_request_schema.rb +27 -0
  191. data/app/request_schemas/spree/api/v3/admin/address_request_schema.rb +13 -0
  192. data/app/request_schemas/spree/api/v3/admin/bulk_tags_request_schema.rb +17 -0
  193. data/app/request_schemas/spree/api/v3/admin/catalog_order_minimum_request_schema.rb +17 -0
  194. data/app/request_schemas/spree/api/v3/admin/email_template_language_request_schema.rb +17 -0
  195. data/app/request_schemas/spree/api/v3/admin/email_template_preview_request_schema.rb +32 -0
  196. data/app/request_schemas/spree/api/v3/admin/price_adjustment_tier_request_schema.rb +21 -0
  197. data/app/request_schemas/spree/api/v3/admin/price_list_price_request_schema.rb +21 -0
  198. data/app/request_schemas/spree/api/v3/admin/price_list_rule_request_schema.rb +19 -0
  199. data/app/request_schemas/spree/api/v3/admin/product_membership_reposition_request_schema.rb +17 -0
  200. data/app/request_schemas/spree/api/v3/admin/promotion_action_calculator_request_schema.rb +18 -0
  201. data/app/request_schemas/spree/api/v3/admin/promotion_action_line_item_request_schema.rb +15 -0
  202. data/app/request_schemas/spree/api/v3/admin/promotion_action_request_schema.rb +19 -0
  203. data/app/request_schemas/spree/api/v3/admin/promotion_rule_request_schema.rb +22 -0
  204. data/app/request_schemas/spree/api/v3/admin/reason_request_schema.rb +14 -0
  205. data/app/request_schemas/spree/api/v3/admin/tax_identifier_request_schema.rb +15 -0
  206. data/app/request_schemas/spree/api/v3/custom_field_value_request_schema.rb +15 -0
  207. data/app/request_schemas/spree/api/v3/file_upload_request_schema.rb +20 -0
  208. data/app/request_schemas/spree/api/v3/media_request_schema.rb +27 -0
  209. data/app/request_schemas/spree/api/v3/price_request_schema.rb +17 -0
  210. data/app/request_schemas/spree/api/v3/stock_level_request_schema.rb +18 -0
  211. data/app/request_schemas/spree/api/v3/store/address_request_schema.rb +29 -0
  212. data/app/request_schemas/spree/api/v3/tax_identifier_request_schema.rb +18 -0
  213. data/app/request_schemas/spree/api/v3/variant_option_request_schema.rb +13 -0
  214. data/app/request_schemas/spree/api/v3/variant_request_schema.rb +52 -0
  215. data/app/serializers/concerns/spree/api/v3/purchase_summary.rb +48 -0
  216. data/app/serializers/spree/api/v3/address_serializer.rb +4 -2
  217. data/app/serializers/spree/api/v3/admin/address_serializer.rb +3 -0
  218. data/app/serializers/spree/api/v3/admin/applied_promotion_serializer.rb +3 -1
  219. data/app/serializers/spree/api/v3/admin/cart_serializer.rb +3 -1
  220. data/app/serializers/spree/api/v3/admin/catalog_order_minimum_serializer.rb +3 -2
  221. data/app/serializers/spree/api/v3/admin/catalog_price_serializer.rb +3 -4
  222. data/app/serializers/spree/api/v3/admin/catalog_price_tier_serializer.rb +4 -3
  223. data/app/serializers/spree/api/v3/admin/channel_serializer.rb +5 -7
  224. data/app/serializers/spree/api/v3/admin/claim_line_item_serializer.rb +7 -0
  225. data/app/serializers/spree/api/v3/admin/claim_serializer.rb +5 -0
  226. data/app/serializers/spree/api/v3/admin/commission_line_serializer.rb +7 -18
  227. data/app/serializers/spree/api/v3/admin/commission_rate_serializer.rb +7 -11
  228. data/app/serializers/spree/api/v3/admin/commission_rule_serializer.rb +0 -2
  229. data/app/serializers/spree/api/v3/admin/country_serializer.rb +4 -0
  230. data/app/serializers/spree/api/v3/admin/customer_serializer.rb +3 -7
  231. data/app/serializers/spree/api/v3/admin/delivery_method_rule_serializer.rb +0 -2
  232. data/app/serializers/spree/api/v3/admin/delivery_method_serializer.rb +14 -10
  233. data/app/serializers/spree/api/v3/admin/delivery_method_service_serializer.rb +9 -1
  234. data/app/serializers/spree/api/v3/admin/delivery_rate_serializer.rb +8 -0
  235. data/app/serializers/spree/api/v3/admin/discount_serializer.rb +3 -1
  236. data/app/serializers/spree/api/v3/admin/exchange_line_item_serializer.rb +5 -0
  237. data/app/serializers/spree/api/v3/admin/exchange_serializer.rb +5 -0
  238. data/app/serializers/spree/api/v3/admin/fee_serializer.rb +3 -1
  239. data/app/serializers/spree/api/v3/admin/file_upload_serializer.rb +11 -0
  240. data/app/serializers/spree/api/v3/admin/file_upload_target_serializer.rb +10 -0
  241. data/app/serializers/spree/api/v3/admin/fulfillment_serializer.rb +13 -11
  242. data/app/serializers/spree/api/v3/admin/gift_card_serializer.rb +3 -3
  243. data/app/serializers/spree/api/v3/admin/import_serializer.rb +2 -2
  244. data/app/serializers/spree/api/v3/admin/integration_serializer.rb +1 -3
  245. data/app/serializers/spree/api/v3/admin/line_item_serializer.rb +12 -12
  246. data/app/serializers/spree/api/v3/admin/locale_serializer.rb +13 -0
  247. data/app/serializers/spree/api/v3/admin/market_serializer.rb +3 -0
  248. data/app/serializers/spree/api/v3/admin/media_serializer.rb +3 -2
  249. data/app/serializers/spree/api/v3/admin/order_group_serializer.rb +2 -0
  250. data/app/serializers/spree/api/v3/admin/order_routing_rule_serializer.rb +1 -3
  251. data/app/serializers/spree/api/v3/admin/order_serializer.rb +33 -33
  252. data/app/serializers/spree/api/v3/admin/payment_method_serializer.rb +1 -4
  253. data/app/serializers/spree/api/v3/admin/payment_serializer.rb +6 -3
  254. data/app/serializers/spree/api/v3/admin/payment_split_serializer.rb +8 -9
  255. data/app/serializers/spree/api/v3/admin/price_adjustment_tier_serializer.rb +3 -6
  256. data/app/serializers/spree/api/v3/admin/price_history_serializer.rb +5 -2
  257. data/app/serializers/spree/api/v3/admin/price_list_serializer.rb +1 -5
  258. data/app/serializers/spree/api/v3/admin/price_rule_serializer.rb +1 -3
  259. data/app/serializers/spree/api/v3/admin/price_serializer.rb +2 -0
  260. data/app/serializers/spree/api/v3/admin/product_serializer.rb +2 -0
  261. data/app/serializers/spree/api/v3/admin/promotion_action_serializer.rb +4 -6
  262. data/app/serializers/spree/api/v3/admin/promotion_rule_serializer.rb +0 -2
  263. data/app/serializers/spree/api/v3/admin/purchase_order_item_serializer.rb +5 -11
  264. data/app/serializers/spree/api/v3/admin/purchase_order_serializer.rb +4 -4
  265. data/app/serializers/spree/api/v3/admin/refund_serializer.rb +7 -3
  266. data/app/serializers/spree/api/v3/admin/reporting_result_serializer.rb +9 -2
  267. data/app/serializers/spree/api/v3/admin/return_line_item_serializer.rb +8 -0
  268. data/app/serializers/spree/api/v3/admin/return_serializer.rb +8 -4
  269. data/app/serializers/spree/api/v3/admin/seller_balance_serializer.rb +15 -10
  270. data/app/serializers/spree/api/v3/admin/seller_payout_serializer.rb +3 -5
  271. data/app/serializers/spree/api/v3/admin/seller_serializer.rb +3 -1
  272. data/app/serializers/spree/api/v3/admin/seller_transfer_serializer.rb +7 -8
  273. data/app/serializers/spree/api/v3/admin/shipping_label_serializer.rb +4 -4
  274. data/app/serializers/spree/api/v3/admin/stock_location_serializer.rb +3 -0
  275. data/app/serializers/spree/api/v3/admin/stock_movement_serializer.rb +2 -6
  276. data/app/serializers/spree/api/v3/admin/store_credit_event_serializer.rb +5 -0
  277. data/app/serializers/spree/api/v3/admin/store_credit_serializer.rb +9 -4
  278. data/app/serializers/spree/api/v3/admin/store_serializer.rb +17 -98
  279. data/app/serializers/spree/api/v3/admin/supplier_serializer.rb +1 -1
  280. data/app/serializers/spree/api/v3/admin/tax_exemption_certificate_serializer.rb +3 -1
  281. data/app/serializers/spree/api/v3/admin/tax_line_serializer.rb +4 -2
  282. data/app/serializers/spree/api/v3/admin/tax_rate_serializer.rb +2 -12
  283. data/app/serializers/spree/api/v3/admin/update_status_serializer.rb +28 -0
  284. data/app/serializers/spree/api/v3/admin/variant_serializer.rb +7 -3
  285. data/app/serializers/spree/api/v3/base_serializer.rb +112 -7
  286. data/app/serializers/spree/api/v3/cart_serializer.rb +11 -29
  287. data/app/serializers/spree/api/v3/claim_line_item_serializer.rb +5 -13
  288. data/app/serializers/spree/api/v3/claim_serializer.rb +2 -3
  289. data/app/serializers/spree/api/v3/country_serializer.rb +2 -1
  290. data/app/serializers/spree/api/v3/currency_serializer.rb +9 -1
  291. data/app/serializers/spree/api/v3/customer_serializer.rb +3 -2
  292. data/app/serializers/spree/api/v3/delivery_rate_serializer.rb +8 -12
  293. data/app/serializers/spree/api/v3/delivery_zone_member_serializer.rb +1 -1
  294. data/app/serializers/spree/api/v3/discount_serializer.rb +4 -1
  295. data/app/serializers/spree/api/v3/exchange_line_item_serializer.rb +2 -8
  296. data/app/serializers/spree/api/v3/exchange_serializer.rb +2 -3
  297. data/app/serializers/spree/api/v3/file_upload_serializer.rb +28 -0
  298. data/app/serializers/spree/api/v3/file_upload_target_serializer.rb +17 -0
  299. data/app/serializers/spree/api/v3/gift_card_batch_serializer.rb +2 -4
  300. data/app/serializers/spree/api/v3/gift_card_serializer.rb +4 -2
  301. data/app/serializers/spree/api/v3/import_serializer.rb +0 -12
  302. data/app/serializers/spree/api/v3/line_item_serializer.rb +15 -5
  303. data/app/serializers/spree/api/v3/locale_serializer.rb +3 -1
  304. data/app/serializers/spree/api/v3/market_serializer.rb +5 -5
  305. data/app/serializers/spree/api/v3/media_serializer.rb +7 -2
  306. data/app/serializers/spree/api/v3/order_group_serializer.rb +12 -4
  307. data/app/serializers/spree/api/v3/order_serializer.rb +5 -23
  308. data/app/serializers/spree/api/v3/payment_session_serializer.rb +2 -4
  309. data/app/serializers/spree/api/v3/price_history_serializer.rb +5 -5
  310. data/app/serializers/spree/api/v3/price_serializer.rb +6 -9
  311. data/app/serializers/spree/api/v3/product_filter_price_range_serializer.rb +10 -4
  312. data/app/serializers/spree/api/v3/product_serializer.rb +3 -3
  313. data/app/serializers/spree/api/v3/refund_serializer.rb +8 -5
  314. data/app/serializers/spree/api/v3/return_line_item_serializer.rb +3 -11
  315. data/app/serializers/spree/api/v3/return_serializer.rb +3 -6
  316. data/app/serializers/spree/api/v3/seller/address_serializer.rb +12 -0
  317. data/app/serializers/spree/api/v3/seller/balance_serializer.rb +15 -10
  318. data/app/serializers/spree/api/v3/seller/claim_line_item_serializer.rb +7 -0
  319. data/app/serializers/spree/api/v3/seller/claim_serializer.rb +5 -0
  320. data/app/serializers/spree/api/v3/seller/country_serializer.rb +19 -0
  321. data/app/serializers/spree/api/v3/seller/delivery_method_rule_serializer.rb +1 -3
  322. data/app/serializers/spree/api/v3/seller/delivery_method_serializer.rb +4 -8
  323. data/app/serializers/spree/api/v3/seller/delivery_rate_serializer.rb +9 -8
  324. data/app/serializers/spree/api/v3/seller/exchange_line_item_serializer.rb +5 -0
  325. data/app/serializers/spree/api/v3/seller/exchange_serializer.rb +5 -0
  326. data/app/serializers/spree/api/v3/seller/file_upload_serializer.rb +11 -0
  327. data/app/serializers/spree/api/v3/seller/file_upload_target_serializer.rb +10 -0
  328. data/app/serializers/spree/api/v3/seller/import_serializer.rb +2 -2
  329. data/app/serializers/spree/api/v3/seller/media_serializer.rb +2 -5
  330. data/app/serializers/spree/api/v3/seller/order_line_item_serializer.rb +4 -3
  331. data/app/serializers/spree/api/v3/seller/order_serializer.rb +16 -16
  332. data/app/serializers/spree/api/v3/seller/payment_split_serializer.rb +8 -9
  333. data/app/serializers/spree/api/v3/seller/payout_serializer.rb +2 -4
  334. data/app/serializers/spree/api/v3/seller/price_history_serializer.rb +11 -0
  335. data/app/serializers/spree/api/v3/seller/price_serializer.rb +11 -0
  336. data/app/serializers/spree/api/v3/seller/product_serializer.rb +2 -0
  337. data/app/serializers/spree/api/v3/seller/profile_serializer.rb +7 -7
  338. data/app/serializers/spree/api/v3/seller/return_line_item_serializer.rb +8 -0
  339. data/app/serializers/spree/api/v3/seller/return_serializer.rb +8 -5
  340. data/app/serializers/spree/api/v3/seller/state_serializer.rb +10 -0
  341. data/app/serializers/spree/api/v3/seller/stock_location_serializer.rb +3 -0
  342. data/app/serializers/spree/api/v3/seller/transfer_serializer.rb +6 -7
  343. data/app/serializers/spree/api/v3/seller/variant_serializer.rb +8 -4
  344. data/app/serializers/spree/api/v3/stock_location_serializer.rb +8 -1
  345. data/app/serializers/spree/api/v3/store_credit_event_serializer.rb +1 -3
  346. data/app/serializers/spree/api/v3/store_credit_serializer.rb +3 -5
  347. data/app/serializers/spree/api/v3/tax_line_serializer.rb +2 -4
  348. data/app/serializers/spree/api/v3/variant_serializer.rb +3 -3
  349. data/app/services/spree/api/v3/filter_predicates.rb +29 -0
  350. data/app/services/spree/api/v3/filter_table.rb +337 -0
  351. data/app/services/spree/api/v3/filters_aggregator.rb +2 -2
  352. data/app/services/spree/api/v3/request_schema.rb +430 -0
  353. data/app/services/spree/webhooks/deliver_webhook.rb +7 -3
  354. data/config/initializers/typelizer.rb +1 -1
  355. data/config/routes.rb +5 -3
  356. data/lib/spree/api/configuration.rb +5 -0
  357. data/lib/spree/api/dependencies.rb +7 -6
  358. data/lib/spree/api/middleware/request_size_limit.rb +24 -3
  359. data/lib/spree/api/openapi/filter_documentation.rb +136 -0
  360. data/lib/spree/api/openapi/schema_helper.rb +126 -80
  361. data/lib/spree/api/preference_families.rb +46 -0
  362. data/lib/spree/api/preference_types.rb +138 -0
  363. data/lib/spree/api/typelizer_generation.rb +4 -0
  364. data/lib/tasks/filters.rake +12 -0
  365. data/lib/typelizer/open_enums.rb +10 -0
  366. metadata +60 -10
  367. data/app/controllers/concerns/spree/api/v3/address_params.rb +0 -17
  368. data/app/controllers/concerns/spree/api/v3/direct_uploads.rb +0 -35
  369. data/app/controllers/spree/api/v3/admin/direct_uploads_controller.rb +0 -54
  370. data/app/controllers/spree/api/v3/seller/direct_uploads_controller.rb +0 -21
@@ -16,16 +16,84 @@ module Spree
16
16
  object.prefixed_id
17
17
  end
18
18
 
19
- # Declares money/display attributes that render +null+ for gated
20
- # (prices_hidden) guests, keyed off the same +hide_prices+ flag the
21
- # +price_for+/+price_in+ helpers use — so the whole price surface
22
- # (product prices AND cart/order/line-item totals) is gated from one
23
- # place instead of per-attribute opt-in.
24
- def self.money_attributes(*names)
19
+ # Display strings that are labels, not formatted money.
20
+ FORMATTED_LABELS = %i[display_name display_description display_code display_action].freeze
21
+
22
+ # Back-office serializers leave formatting money to the client, which
23
+ # shows it in the admin's own language (docs/plans/6.0-money-correctness.md,
24
+ # PR E): inherited display_* attributes are dropped, and nested prices
25
+ # are written with the admin price serializers, which carry none.
26
+ #
27
+ # @param surface [Symbol] :admin or :seller, whose price serializers to use
28
+ def self.without_formatted_money(surface = :admin)
29
+ without_display_money
30
+ define_method(:price_serializer) { Spree.api.public_send(:"#{surface}_price_serializer") }
31
+ define_method(:price_history_serializer) { Spree.api.public_send(:"#{surface}_price_history_serializer") }
32
+ end
33
+
34
+ # Drops the inherited display_* money attributes, keeping labels.
35
+ # Emails use it alone: their templates format amounts with the `money`
36
+ # Liquid filter.
37
+ def self.without_display_money
38
+ _attributes.delete_if { |key, _| display_money?(key) }
39
+ end
40
+
41
+ # Declares money attributes, written as decimal strings with exactly
42
+ # the currency's decimal places ("10.00", "1.500", "100"), or up to
43
+ # four for unit prices ("0.0125"). +display_*+ names pass through as
44
+ # formatted. All render +null+ for gated (prices_hidden) guests, keyed
45
+ # off the same +hide_prices+ flag the +price_for+/+price_in+ helpers
46
+ # use, so the whole price surface is gated from one place.
47
+ #
48
+ # @param currency [Symbol, Proc] the record's reader for its currency,
49
+ # or a block taking the record
50
+ # @param unit_price [Boolean]
51
+ # @param descriptions [Hash{Symbol => String}] what each amount is, for
52
+ # the API reference and the SDK types
53
+ def self.money_attributes(*names, currency: :currency, unit_price: false, descriptions: {})
54
+ typelize(**names.index_with do |name|
55
+ next display_money_type(name) if display_money?(name)
56
+
57
+ descriptions[name] ? [:string, nullable: true, comment: descriptions[name]] : [:string, nullable: true]
58
+ end)
59
+
60
+ names.each do |name|
61
+ formatted = display_money?(name)
62
+ attribute(name) do |object|
63
+ next if params[:hide_prices]
64
+
65
+ value = object.public_send(name)
66
+ next value if formatted || value.nil?
67
+
68
+ code = currency.is_a?(Proc) ? currency.call(object) : object.public_send(currency)
69
+ Spree::Money::Rounding.format(value, code, unit_price: unit_price)
70
+ end
71
+ end
72
+ end
73
+
74
+ # A formatted money copy, as opposed to a label such as +display_name+.
75
+ def self.display_money?(name)
76
+ name.to_s.start_with?('display_') && !FORMATTED_LABELS.include?(name.to_sym)
77
+ end
78
+
79
+ # The type of a formatted money copy: deprecated in favour of the
80
+ # amount it formats, which clients format in the reader's language.
81
+ def self.display_money_type(name, nullable: true)
82
+ amount = name.to_s.delete_prefix('display_')
83
+ [:string, nullable: nullable,
84
+ comment: "`#{amount}` formatted with its currency symbol in the request's language.",
85
+ deprecated: "Format `#{amount}` with its currency instead. Removed in 6.1."]
86
+ end
87
+
88
+ # Declares rates and percentages, written as decimal strings without
89
+ # trailing zeros ("0.23", "7.25", "10"). A name ending +_percent+ or
90
+ # +_percentage+ holds 0-100; +rate+ or a name ending +_rate+ holds a
91
+ # fraction.
92
+ def self.rate_attributes(*names)
25
93
  typelize(**names.index_with { [:string, nullable: true] })
26
94
 
27
95
  names.each do |name|
28
- attribute(name) { |object| object.public_send(name) unless params[:hide_prices] }
96
+ attribute(name) { |object| Spree::Money::Rounding.format_decimal(object.public_send(name)) }
29
97
  end
30
98
  end
31
99
 
@@ -47,6 +115,39 @@ module Spree
47
115
  end
48
116
  end
49
117
 
118
+ # Declares a model's settings under their plain names (see
119
+ # `exposes_preferences`) — every exposed one unless named — typed from
120
+ # their declarations so the generated SDK types never drift from the
121
+ # model. Each reads the stored setting, never a reader the model
122
+ # overrides with a fallback.
123
+ #
124
+ # preference_attributes Spree::Store, except: %i[payout_provider]
125
+ def self.preference_attributes(model, *names, except: [])
126
+ names = model.exposed_preference_names.to_a - except if names.empty?
127
+ definitions = model.preference_definitions
128
+ names.each do |name|
129
+ typelize name => preference_type_hint(Spree::PreferenceSchema::JsonSchema.property_schema(definitions.fetch(name)))
130
+ reader = :"preferred_#{name}"
131
+ attribute(name) do |object|
132
+ value = object.public_send(reader)
133
+ value.is_a?(BigDecimal) ? value.to_s('F') : value
134
+ end
135
+ end
136
+ end
137
+
138
+ TYPELIZER_TYPES = { 'string' => :string, 'integer' => :number, 'number' => :number, 'boolean' => :boolean }.freeze
139
+ private_constant :TYPELIZER_TYPES
140
+
141
+ def self.preference_type_hint(schema)
142
+ types = Array(schema['type'])
143
+ hint = TYPELIZER_TYPES.fetch((types - ['null']).first, :unknown)
144
+ options = {}
145
+ options[:nullable] = true if types.include?('null')
146
+ options[:enum] = schema['enum'].compact if schema['enum']
147
+ options.empty? ? hint : [hint, options]
148
+ end
149
+ private_class_method :preference_type_hint
150
+
50
151
  # Declares the wire form of an `acted_by` association: the actor's
51
152
  # prefixed id, the kind of actor it is, and the expansion. Both
52
153
  # halves read off the columns, so naming an actor costs no query and
@@ -143,6 +244,10 @@ module Spree
143
244
  product.featured_variant(currency: current_currency)
144
245
  end
145
246
 
247
+ def price_serializer = Spree.api.price_serializer
248
+
249
+ def price_history_serializer = Spree.api.price_history_serializer
250
+
146
251
  # Returns price for a variant using full Price List resolution
147
252
  # This may return a price from a price list if applicable
148
253
  # Memoized per variant to avoid duplicate queries
@@ -4,19 +4,18 @@ module Spree
4
4
  # Store API Cart Serializer
5
5
  # Pre-purchase cart data with checkout progression info
6
6
  class CartSerializer < BaseSerializer
7
- typelize number: :string, current_step: :string, completed_steps: 'string[]', token: :string,
7
+ typelize number: [:string, deprecated: 'Use `id`; a cart has no order number. Removed in 6.1.'], current_step: :string, completed_steps: 'string[]', token: :string,
8
8
  email: [:string, nullable: true], customer_note: [:string, nullable: true],
9
- market_id: [:string, nullable: true], channel_id: [:string, nullable: true], currency: :string,
10
- locale: [:string, nullable: true], total_quantity: :number, coupon_code: [:string, nullable: true],
9
+ market_id: [:string, nullable: true], channel_id: [:string, nullable: true], currency: [:string, enum: Spree::Money::Rounding::CURRENCY_CODES, enum_type_name: 'CurrencyCode'],
10
+ locale: [:string, nullable: true, enum: Spree::Locales::ALL, enum_type_name: 'LocaleCode'], total_quantity: :number, coupon_code: [:string, nullable: true],
11
11
  preferred_stock_location_id: [:string, nullable: true], company_id: [:string, nullable: true],
12
12
  company_name: [:string, nullable: true], po_number: [:string, nullable: true],
13
13
  po_number_required: :boolean, po_document_filename: [:string, nullable: true],
14
- po_document_byte_size: ['number | null'], order_minimum: ['number | null'],
15
- order_minimum_shortfall: ['number | null'], below_order_minimum: ['boolean | null'],
14
+ po_document_byte_size: ['number | null'], order_minimum: [:string, nullable: true],
15
+ order_minimum_shortfall: [:string, nullable: true], below_order_minimum: ['boolean | null'],
16
16
  freight_summary: [:FreightSummary, nullable: true],
17
17
  requirements: 'Array<{step: string, field: string, code: string, message: string}>',
18
- store_credit_total: [:string, nullable: true], display_store_credit_total: [:string, nullable: true],
19
- covered_by_store_credit: :boolean, shipping_eq_billing_address: :boolean,
18
+ shipping_eq_billing_address: :boolean,
20
19
  warnings: 'Array<{code: string, message: string, line_item_id?: string, variant_id?: string, item_index?: number}>',
21
20
  billing_address: { nullable: true }, shipping_address: { nullable: true },
22
21
  gift_card: { nullable: true }, market: { nullable: true }
@@ -59,25 +58,9 @@ module Spree
59
58
 
60
59
  # Nulled for gated (prices_hidden) guests so the cart can't leak the
61
60
  # prices that product/variant serializers already withhold.
62
- money_attributes :item_total, :display_item_total,
63
- :adjustment_total, :display_adjustment_total,
64
- :discount_total, :display_discount_total,
65
- :tax_total, :display_tax_total, :included_tax_total, :display_included_tax_total,
66
- :additional_tax_total, :display_additional_tax_total, :total, :display_total,
67
- :gift_card_total, :display_gift_card_total,
68
- :amount_due, :display_amount_due,
69
- :delivery_total, :display_delivery_total,
70
- :fee_total, :display_fee_total
71
-
72
- attribute :store_credit_total do |order|
73
- order.total_applied_store_credit.to_s unless params[:hide_prices]
74
- end
75
-
76
- attribute :display_store_credit_total do |order|
77
- order.display_total_applied_store_credit.to_s unless params[:hide_prices]
78
- end
79
-
80
- attribute :covered_by_store_credit, &:covered_by_store_credit?
61
+ include Spree::Api::V3::PurchaseSummary
62
+ money_attributes :adjustment_total, :display_adjustment_total,
63
+ descriptions: { adjustment_total: 'Every discount, fee and added tax together, as one amount.' }
81
64
 
82
65
  attribute :current_step do |order|
83
66
  order.current_checkout_step
@@ -106,11 +89,11 @@ module Spree
106
89
  # shortfall are amounts, and a storefront that hides prices from
107
90
  # guests must not hand them "$180 short of $500" instead.
108
91
  attribute :order_minimum do |order|
109
- order.order_minimum_amount&.to_f unless params[:hide_prices]
92
+ Spree::Money::Rounding.format(order.order_minimum_amount, order.currency) unless params[:hide_prices]
110
93
  end
111
94
 
112
95
  attribute :order_minimum_shortfall do |order|
113
- order.order_minimum_shortfall&.to_f unless params[:hide_prices]
96
+ Spree::Money::Rounding.format(order.order_minimum_shortfall, order.currency) unless params[:hide_prices]
114
97
  end
115
98
 
116
99
  attribute :below_order_minimum do |order|
@@ -136,7 +119,6 @@ module Spree
136
119
  many :fees, resource: proc { Spree.api.fee_serializer }
137
120
  many :line_items, key: :items, resource: proc { Spree.api.line_item_serializer }
138
121
  many :fulfillments, resource: proc { Spree.api.fulfillment_serializer }
139
- many :payments, resource: proc { Spree.api.payment_serializer }
140
122
  one :billing_address, resource: proc { Spree.api.address_serializer }
141
123
  one :shipping_address, resource: proc { Spree.api.address_serializer }
142
124
 
@@ -6,13 +6,6 @@ module Spree
6
6
  class ClaimLineItemSerializer < BaseSerializer
7
7
  typelize quantity: :number,
8
8
  send_replacement: :boolean,
9
- refund_amount: :string,
10
- display_refund_amount: :string,
11
- paid_amount: :string,
12
- pre_tax_amount: :string,
13
- included_tax_total: :string,
14
- additional_tax_total: :string,
15
- tax_total: :string,
16
9
  description: [:string, nullable: true],
17
10
  variant_id: [:string, nullable: true],
18
11
  replacement_variant_id: [:string, nullable: true],
@@ -20,12 +13,11 @@ module Spree
20
13
 
21
14
  attributes :quantity, :send_replacement, :description
22
15
 
23
- attributes refund_amount: :string
24
- # What the customer actually paid for these units, tax included — the
25
- # ceiling the resolve workflow enforces, and what the dashboard offers
26
- # when the claim carries no explicit amount.
27
- attributes paid_amount: :string, pre_tax_amount: :string, included_tax_total: :string,
28
- additional_tax_total: :string, tax_total: :string, display_refund_amount: :string
16
+ # paid_amount is what the customer actually paid for these units, tax
17
+ # included — the ceiling the resolve workflow enforces, and what the
18
+ # dashboard offers when the claim carries no explicit amount.
19
+ money_attributes :refund_amount, :paid_amount, :pre_tax_amount, :included_tax_total,
20
+ :additional_tax_total, :tax_total, :display_refund_amount
29
21
  prefixed_id_attributes :variant, :replacement_variant, :line_item
30
22
 
31
23
  one :variant, resource: proc { Spree.api.variant_serializer }, if: proc { expand?('variant') }
@@ -10,8 +10,6 @@ module Spree
10
10
  resolution: [:string, nullable: true],
11
11
  order_id: [:string, nullable: true],
12
12
  reason_id: [:string, nullable: true],
13
- refund_total: :string,
14
- display_refund_total: :string,
15
13
  approved_at: [:string, nullable: true],
16
14
  resolved_at: [:string, nullable: true],
17
15
  denied_at: [:string, nullable: true],
@@ -21,7 +19,8 @@ module Spree
21
19
 
22
20
  prefixed_id_attributes :order, :reason
23
21
 
24
- attributes refund_total: :string, display_refund_total: :string
22
+ money_attributes :refund_total, :display_refund_total
23
+
25
24
  attribute :approved_at do |claim|
26
25
  claim.approved_at&.iso8601
27
26
  end
@@ -5,7 +5,8 @@ module Spree
5
5
  include Alba::Resource
6
6
  include Typelizer::DSL
7
7
 
8
- typelize iso: :string, iso3: :string, name: :string,
8
+ typelize iso: [:string, enum: Spree::IsoData.country_codes, enum_type_name: 'CountryCode'], iso3: :string,
9
+ name: [:string, deprecated: 'Name the country from `iso` with `Intl.DisplayNames` (type `region`). Removed in 6.1.'],
9
10
  states_required: :boolean, zipcode_required: :boolean,
10
11
  market: [:Market, nullable: true]
11
12
 
@@ -5,9 +5,17 @@ module Spree
5
5
  include Alba::Resource
6
6
  include Typelizer::DSL
7
7
 
8
- typelize iso_code: :string, name: :string, symbol: :string
8
+ typelize iso_code: [:string, enum: Spree::Money::Rounding::CURRENCY_CODES, enum_type_name: 'CurrencyCode'], name: [:string, deprecated: 'Name the currency from `iso_code` with `Intl.DisplayNames` (type `currency`). Removed in 6.1.'],
9
+ symbol: [:string, deprecated: 'Format amounts with `formatMoney` or `Intl.NumberFormat`, which place the symbol. Removed in 6.1.'],
10
+ decimal_places: :number
9
11
 
10
12
  attributes :iso_code, :name, :symbol
13
+
14
+ # ISO 4217 minor units: the decimals every amount in this currency is
15
+ # written with (2 for USD, 0 for JPY, 3 for KWD).
16
+ attribute :decimal_places do |currency|
17
+ Spree::Money::Rounding.precision(currency)
18
+ end
11
19
  end
12
20
  end
13
21
  end
@@ -7,7 +7,8 @@ module Spree
7
7
  typelize email: :string, first_name: [:string, nullable: true], last_name: [:string, nullable: true],
8
8
  full_name: :string,
9
9
  phone: [:string, nullable: true], accepts_email_marketing: :boolean,
10
- available_store_credit_total: :string, display_available_store_credit_total: :string,
10
+ available_store_credit_total: :string,
11
+ display_available_store_credit_total: display_money_type(:display_available_store_credit_total, nullable: false),
11
12
  default_billing_address: { nullable: true }, default_shipping_address: { nullable: true },
12
13
  newsletter_subscriber: { nullable: true },
13
14
  email_marketing_consent_updated_at: [:string, nullable: true]
@@ -28,7 +29,7 @@ module Spree
28
29
  attribute :available_store_credit_total do |user, params|
29
30
  store = params&.dig(:store) || Spree::Current.store
30
31
  currency = params&.dig(:currency) || Spree::Current.currency || store&.default_currency
31
- user.total_available_store_credit(currency, store).to_s
32
+ Spree::Money::Rounding.format(user.total_available_store_credit(currency, store), currency)
32
33
  end
33
34
 
34
35
  attribute :display_available_store_credit_total do |user, params|
@@ -3,11 +3,6 @@ module Spree
3
3
  module V3
4
4
  class DeliveryRateSerializer < BaseSerializer
5
5
  typelize name: :string, selected: :boolean, delivery_method_id: :string,
6
- cost: :string, display_cost: :string,
7
- total: :string, display_total: :string,
8
- additional_tax_total: :string, display_additional_tax_total: :string,
9
- included_tax_total: :string, display_included_tax_total: :string,
10
- tax_total: :string, display_tax_total: :string,
11
6
  carrier: [:string, nullable: true],
12
7
  service_level: [:string, nullable: true],
13
8
  estimated_delivery_date: [:string, nullable: true],
@@ -19,11 +14,11 @@ module Spree
19
14
  # Carrier, service level and delivery date come from the rate provider
20
15
  # and are what the customer chooses between; nil on calculator-priced
21
16
  # methods. Provider metadata stays admin-only.
22
- attributes :name, :selected,
23
- :cost, :total,
24
- :additional_tax_total, :included_tax_total,
25
- :tax_total,
26
- :carrier, :service_level, :estimated_delivery_date,
17
+ attributes :name, :selected
18
+
19
+ money_attributes :cost, :total, :additional_tax_total, :included_tax_total, :tax_total
20
+
21
+ attributes :carrier, :service_level, :estimated_delivery_date,
27
22
  :unpriced
28
23
 
29
24
  # What the shipment looks like to a freight forwarder — cartons,
@@ -33,8 +28,9 @@ module Spree
33
28
  # froze it here when it quoted.
34
29
  one :freight_summary, resource: proc { Spree.api.freight_summary_serializer }
35
30
 
36
- attributes display_cost: :string, display_total: :string, display_additional_tax_total: :string,
37
- display_included_tax_total: :string, display_tax_total: :string
31
+ money_attributes :display_cost, :display_total, :display_additional_tax_total,
32
+ :display_included_tax_total, :display_tax_total
33
+
38
34
  one :delivery_method, resource: proc { Spree.api.delivery_method_serializer }
39
35
  end
40
36
  end
@@ -2,7 +2,7 @@ module Spree
2
2
  module Api
3
3
  module V3
4
4
  class DeliveryZoneMemberSerializer < BaseSerializer
5
- typelize member_type: [:string, enum: Spree::DeliveryZoneMember::MEMBER_TYPES], country_code: [:string, nullable: true],
5
+ typelize member_type: [:string, enum: Spree::DeliveryZoneMember::MEMBER_TYPES], country_code: [:string, nullable: true, enum: Spree::IsoData.country_codes, enum_type_name: 'CountryCode'],
6
6
  country_name: [:string, nullable: true],
7
7
  state_code: [:string, nullable: true], state_name: [:string, nullable: true],
8
8
  postal_code_prefix: [:string, nullable: true],
@@ -12,8 +12,11 @@ module Spree
12
12
 
13
13
  attributes :label, :kind, :code, :value_type
14
14
 
15
+ # A percent discount carries a rate; a flat one an amount.
15
16
  attribute :value do |record|
16
- record.value&.to_s
17
+ next Spree::Money::Rounding.format_decimal(record.value) if record.value_type == 'percent'
18
+
19
+ Spree::Money::Rounding.format(record.value, record.currency) unless params[:hide_prices]
17
20
  end
18
21
 
19
22
  prefixed_id_attributes :promotion, :line_item, :fulfillment
@@ -7,11 +7,6 @@ module Spree
7
7
  typelize quantity: :number,
8
8
  received_quantity: :number,
9
9
  resellable: :boolean,
10
- original_price: :string,
11
- new_variant_price: :string,
12
- price_difference: :string,
13
- original_tax_total: :string,
14
- new_tax_total: :string,
15
10
  original_variant_id: [:string, nullable: true],
16
11
  new_variant_id: [:string, nullable: true],
17
12
  line_item_id: [:string, nullable: true],
@@ -21,10 +16,9 @@ module Spree
21
16
 
22
17
  # What the customer paid for the units coming back, after discounts
23
18
  # and with their tax.
24
- attributes original_price: :string
19
+ money_attributes :original_price
25
20
  # The replacement at the same discount, with its own tax.
26
- attributes new_variant_price: :string, price_difference: :string, original_tax_total: :string,
27
- new_tax_total: :string
21
+ money_attributes :new_variant_price, :price_difference, :original_tax_total, :new_tax_total
28
22
  prefixed_id_attributes :original_variant, :new_variant, :line_item, :fulfillment_item
29
23
 
30
24
  one :original_variant, resource: proc { Spree.api.variant_serializer }, if: proc { expand?('original_variant') }
@@ -9,8 +9,6 @@ module Spree
9
9
  status: [:string, enum: Spree::Exchange.statuses, enum_type_name: 'ExchangeStatus'],
10
10
  order_id: [:string, nullable: true],
11
11
  reason_id: [:string, nullable: true],
12
- price_difference: :string,
13
- display_price_difference: :string,
14
12
  approved_at: [:string, nullable: true],
15
13
  received_at: [:string, nullable: true],
16
14
  fulfilled_at: [:string, nullable: true],
@@ -20,7 +18,8 @@ module Spree
20
18
 
21
19
  prefixed_id_attributes :order, :reason
22
20
 
23
- attributes price_difference: :string, display_price_difference: :string
21
+ money_attributes :price_difference, :display_price_difference
22
+
24
23
  attribute :approved_at do |exchange|
25
24
  exchange.approved_at&.iso8601
26
25
  end
@@ -0,0 +1,28 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ # A file accepted by an upload endpoint ({Spree::FileUpload}).
5
+ #
6
+ # `signed_id` is opaque: clients pass it back unchanged to the endpoint
7
+ # that uses the file and never parse it. It stops being attachable at
8
+ # `expires_at`. `upload` is where a presigned upload sends its bytes, and
9
+ # null once the file is already stored.
10
+ class FileUploadSerializer < BaseSerializer
11
+ # A value object, not a record — it has no id of its own.
12
+ _attributes.delete(:id)
13
+
14
+ typelize signed_id: :string,
15
+ filename: :string,
16
+ content_type: :string,
17
+ byte_size: :number,
18
+ visibility: [:string, enum: Spree::FileUpload::VISIBILITIES],
19
+ expires_at: :string,
20
+ upload: [:FileUploadTarget, nullable: true]
21
+
22
+ attributes :signed_id, :filename, :content_type, :byte_size, :visibility, expires_at: :iso8601
23
+
24
+ one :upload_target, key: :upload, resource: proc { Spree.api.file_upload_target_serializer }
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,17 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ # Where a presigned upload sends its bytes. Clients send them with
5
+ # `method` to `url` carrying exactly `headers`, and treat all three as
6
+ # opaque: the storage service decides them.
7
+ class FileUploadTargetSerializer < BaseSerializer
8
+ _attributes.delete(:id)
9
+
10
+ typelize method: :string, url: :string, headers: 'Record<string, string>'
11
+
12
+ attribute :method, &:http_method
13
+ attributes :url, :headers
14
+ end
15
+ end
16
+ end
17
+ end
@@ -4,16 +4,14 @@ module Spree
4
4
  module Api
5
5
  module V3
6
6
  class GiftCardBatchSerializer < BaseSerializer
7
- typelize codes_count: :number, amount: [:string, nullable: true], currency: [:string, nullable: true],
7
+ typelize codes_count: :number, currency: [:string, nullable: true, enum: Spree::Money::Rounding::CURRENCY_CODES, enum_type_name: 'CurrencyCode'],
8
8
  prefix: [:string, nullable: true], expires_at: [:string, nullable: true],
9
9
  created_by_id: [:string, nullable: true]
10
10
 
11
11
  attributes :codes_count, :currency, :prefix,
12
12
  created_at: :iso8601, updated_at: :iso8601
13
13
 
14
- attribute :amount do |batch|
15
- batch.amount&.to_s
16
- end
14
+ money_attributes :amount
17
15
 
18
16
  attribute :expires_at do |batch|
19
17
  batch.expires_at&.iso8601
@@ -4,8 +4,10 @@ module Spree
4
4
  class GiftCardSerializer < BaseSerializer
5
5
  typelize code: :string,
6
6
  status: [:string, enum: Spree::GiftCard::DISPLAY_STATUSES, enum_type_name: 'GiftCardStatus'],
7
- display_amount: [:string, nullable: true], display_amount_used: [:string, nullable: true],
8
- display_amount_remaining: [:string, nullable: true], currency: :string,
7
+ display_amount: display_money_type(:display_amount),
8
+ display_amount_used: display_money_type(:display_amount_used),
9
+ display_amount_remaining: display_money_type(:display_amount_remaining),
10
+ currency: [:string, enum: Spree::Money::Rounding::CURRENCY_CODES, enum_type_name: 'CurrencyCode'],
9
11
  expires_at: [:string, nullable: true], redeemed_at: [:string, nullable: true], expired: :boolean,
10
12
  active: :boolean
11
13
 
@@ -6,7 +6,6 @@ module Spree
6
6
  class ImportSerializer < BaseSerializer
7
7
  typelize number: :string,
8
8
  type: [:string, nullable: true, comment: 'Import type. Built-in: products, product_translations, customers, price_list_prices. Extensions may register more.'], status: [:string, enum: Spree::Import.statuses, enum_type_name: 'ImportStatus'],
9
- owner_type: [:string, nullable: true], owner_id: [:string, nullable: true],
10
9
  store_id: [:string, nullable: true], seller_id: [:string, nullable: true],
11
10
  user_id: [:string, nullable: true], rows_count: :number
12
11
 
@@ -26,17 +25,6 @@ module Spree
26
25
  # whose it is. A null `seller_id` means the operator's own.
27
26
  prefixed_id_attributes :store, :seller
28
27
 
29
- # @deprecated Read `store_id` / `seller_id` — removed in 6.1. Emitted
30
- # from the pair above rather than the dropped columns, so a client
31
- # still reading them sees the same answer.
32
- attribute :owner_type do |import|
33
- Spree::Base.polymorphic_api_type(import.seller_id.present? ? 'Spree::Seller' : 'Spree::Store')
34
- end
35
-
36
- attribute :owner_id do |import|
37
- (import.seller || import.store)&.prefixed_id
38
- end
39
-
40
28
  prefixed_id_attributes :user
41
29
  end
42
30
  end
@@ -2,8 +2,8 @@ module Spree
2
2
  module Api
3
3
  module V3
4
4
  class LineItemSerializer < BaseSerializer
5
- typelize variant_id: :string, quantity: :number, currency: :string, name: :string, slug: :string,
6
- options_text: :string, compare_at_amount: [:string, nullable: true],
5
+ typelize variant_id: :string, quantity: :number, currency: [:string, enum: Spree::Money::Rounding::CURRENCY_CODES, enum_type_name: 'CurrencyCode'], name: :string, slug: :string,
6
+ options_text: :string, compare_at_amount: [:string, nullable: true, comment: 'The compare-at price times quantity, or null when the variant has none.'],
7
7
  thumbnail_url: [:string, nullable: true], preorder: :boolean,
8
8
  preorder_ships_at: [:string, nullable: true], seller_id: [:string, nullable: true]
9
9
 
@@ -30,21 +30,31 @@ module Spree
30
30
 
31
31
  # Nulled for gated (prices_hidden) guests so the cart's line items can't
32
32
  # leak the prices that product/variant serializers already withhold.
33
- money_attributes :price, :display_price, :total, :display_total,
33
+ money_attributes :price, :display_price, unit_price: true, descriptions: { price: 'The price of one unit.' }
34
+ money_attributes :total, :display_total,
34
35
  :adjustment_total, :display_adjustment_total,
35
36
  :additional_tax_total, :display_additional_tax_total,
36
37
  :included_tax_total, :display_included_tax_total,
37
38
  :discount_total, :display_discount_total,
38
39
  :pre_tax_amount, :display_pre_tax_amount,
39
40
  :discounted_amount, :display_discounted_amount,
40
- :display_compare_at_amount
41
+ :display_compare_at_amount,
42
+ descriptions: {
43
+ total: 'What this line costs: price times quantity, with its discounts, fees and added tax.',
44
+ adjustment_total: "This line's discounts, fees and added tax together.",
45
+ additional_tax_total: 'Tax added on top of the price.',
46
+ included_tax_total: 'Tax already included in the price.',
47
+ discount_total: 'What promotions take off this line, as a negative amount.',
48
+ pre_tax_amount: 'This line after discounts, without tax.',
49
+ discounted_amount: 'Price times quantity, after discounts.'
50
+ }
41
51
 
42
52
  # Return compare_at_amount as string, nil if zero
43
53
  attribute :compare_at_amount do |line_item|
44
54
  next nil if params[:hide_prices]
45
55
 
46
56
  amount = line_item.compare_at_amount
47
- amount.present? && amount.positive? ? amount.to_s : nil
57
+ amount.present? && amount.positive? ? Spree::Money::Rounding.format(amount, line_item.currency, unit_price: true) : nil
48
58
  end
49
59
 
50
60
  # Thumbnail URL for line item (variant thumbnail or product thumbnail)
@@ -7,7 +7,9 @@ module Spree
7
7
  include Alba::Resource
8
8
  include Typelizer::DSL
9
9
 
10
- typelize code: :string, name: :string, default: :boolean, rtl: :boolean
10
+ typelize code: [:string, enum: Spree::Locales::ALL, enum_type_name: 'LocaleCode'],
11
+ name: [:string, deprecated: 'Name the locale from `code` with `Intl.DisplayNames`. Removed in 6.1.'],
12
+ default: :boolean, rtl: :boolean
11
13
 
12
14
  attributes :code, :name
13
15
 
@@ -2,11 +2,11 @@ module Spree
2
2
  module Api
3
3
  module V3
4
4
  class MarketSerializer < BaseSerializer
5
- typelize name: :string, currency: :string,
6
- default_locale: :string,
7
- supported_locales: [:string, multi: true],
8
- country_codes: [:string, multi: true],
9
- country_isos: [:string, multi: true],
5
+ typelize name: :string, currency: [:string, enum: Spree::Money::Rounding::CURRENCY_CODES, enum_type_name: 'CurrencyCode'],
6
+ default_locale: [:string, enum: Spree::Locales::ALL, enum_type_name: 'LocaleCode'],
7
+ supported_locales: [:string, multi: true, enum: Spree::Locales::ALL, enum_type_name: 'LocaleCode'],
8
+ country_codes: [:string, multi: true, enum: Spree::IsoData.country_codes, enum_type_name: 'CountryCode'],
9
+ country_isos: [:string, multi: true, deprecated: 'Use `country_codes`. Removed in 6.1.'],
10
10
  tax_inclusive: :boolean,
11
11
  default: :boolean
12
12
 
@@ -32,8 +32,13 @@ module Spree
32
32
  ids.compact.uniq
33
33
  end
34
34
 
35
- attributes :position, :alt, :media_type,
36
- :focal_point_x, :focal_point_y, :external_video_url
35
+ attributes :position, :alt, :media_type, :external_video_url
36
+
37
+ # Decimal columns serialize as strings; a focal point is a 0–1
38
+ # position on the image, which clients read as a number.
39
+ %i[focal_point_x focal_point_y].each do |name|
40
+ attribute(name) { |asset| asset.public_send(name)&.to_f }
41
+ end
37
42
 
38
43
  # Spree parses the YouTube/Vimeo link once, here, so no storefront has
39
44
  # to reimplement it. Nil on anything that isn't an external video.