spree_api 6.0.0.beta4 → 6.0.0.rc2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (531) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +4 -48
  3. data/app/controllers/concerns/spree/api/v3/admin/email_template_lookup.rb +139 -0
  4. data/app/controllers/concerns/spree/api/v3/admin/product_membership.rb +10 -0
  5. data/app/controllers/concerns/spree/api/v3/admin/stock_receipt_actions.rb +26 -4
  6. data/app/controllers/concerns/spree/api/v3/admin/store_context.rb +1 -1
  7. data/app/controllers/concerns/spree/api/v3/admin/subclassed_resource.rb +15 -29
  8. data/app/controllers/concerns/spree/api/v3/admin/validation_details.rb +1 -1
  9. data/app/controllers/concerns/spree/api/v3/cart_resolvable.rb +10 -2
  10. data/app/controllers/concerns/spree/api/v3/channel_resolution.rb +3 -3
  11. data/app/controllers/concerns/spree/api/v3/company_address_writes.rb +3 -1
  12. data/app/controllers/concerns/spree/api/v3/current_password_confirmation.rb +1 -1
  13. data/app/controllers/concerns/spree/api/v3/error_handler.rb +55 -4
  14. data/app/controllers/concerns/spree/api/v3/file_uploads.rb +35 -0
  15. data/app/controllers/concerns/spree/api/v3/http_caching.rb +44 -11
  16. data/app/controllers/concerns/spree/api/v3/idempotent.rb +20 -5
  17. data/app/controllers/concerns/spree/api/v3/items_payload.rb +1 -1
  18. data/app/controllers/concerns/spree/api/v3/money_params.rb +52 -0
  19. data/app/controllers/concerns/spree/api/v3/order_lock.rb +2 -2
  20. data/app/controllers/concerns/spree/api/v3/orders/claim_actions.rb +1 -5
  21. data/app/controllers/concerns/spree/api/v3/orders/delivery_actions.rb +7 -11
  22. data/app/controllers/concerns/spree/api/v3/orders/exchange_actions.rb +1 -4
  23. data/app/controllers/concerns/spree/api/v3/orders/fulfillment_actions.rb +3 -15
  24. data/app/controllers/concerns/spree/api/v3/orders/post_sale_actions.rb +2 -10
  25. data/app/controllers/concerns/spree/api/v3/orders/return_actions.rb +1 -4
  26. data/app/controllers/concerns/spree/api/v3/orders/shipping_label_actions.rb +8 -28
  27. data/app/controllers/concerns/spree/api/v3/params_normalizer.rb +5 -0
  28. data/app/controllers/concerns/spree/api/v3/permission_serialization.rb +9 -1
  29. data/app/controllers/concerns/spree/api/v3/purchase_serialization.rb +26 -0
  30. data/app/controllers/concerns/spree/api/v3/request_params.rb +65 -0
  31. data/app/controllers/concerns/spree/api/v3/seller/seller_context.rb +1 -1
  32. data/app/controllers/concerns/spree/api/v3/store/storefront_products.rb +5 -4
  33. data/app/controllers/concerns/spree/api/v3/storefront_gating.rb +11 -5
  34. data/app/controllers/concerns/spree/api/v3/strict_money_params.rb +94 -0
  35. data/app/controllers/spree/api/v3/admin/admin_users_controller.rb +8 -4
  36. data/app/controllers/spree/api/v3/admin/allowed_origins_controller.rb +8 -1
  37. data/app/controllers/spree/api/v3/admin/api_keys_controller.rb +16 -8
  38. data/app/controllers/spree/api/v3/admin/base_controller.rb +1 -0
  39. data/app/controllers/spree/api/v3/admin/catalogs/order_minimums_controller.rb +2 -6
  40. data/app/controllers/spree/api/v3/admin/catalogs/quantity_rules_controller.rb +7 -9
  41. data/app/controllers/spree/api/v3/admin/catalogs_controller.rb +61 -34
  42. data/app/controllers/spree/api/v3/admin/categories/products_controller.rb +4 -1
  43. data/app/controllers/spree/api/v3/admin/categories_controller.rb +40 -20
  44. data/app/controllers/spree/api/v3/admin/channels_controller.rb +39 -10
  45. data/app/controllers/spree/api/v3/admin/claim_reasons_controller.rb +5 -1
  46. data/app/controllers/spree/api/v3/admin/collections/products_controller.rb +5 -3
  47. data/app/controllers/spree/api/v3/admin/collections_controller.rb +44 -15
  48. data/app/controllers/spree/api/v3/admin/commission_rates_controller.rb +62 -14
  49. data/app/controllers/spree/api/v3/admin/companies/addresses_controller.rb +11 -4
  50. data/app/controllers/spree/api/v3/admin/companies/invitations_controller.rb +1 -5
  51. data/app/controllers/spree/api/v3/admin/companies/memberships_controller.rb +9 -5
  52. data/app/controllers/spree/api/v3/admin/companies/tax_exemption_certificates_controller.rb +20 -27
  53. data/app/controllers/spree/api/v3/admin/companies/tax_identifiers_controller.rb +6 -5
  54. data/app/controllers/spree/api/v3/admin/companies_controller.rb +17 -7
  55. data/app/controllers/spree/api/v3/admin/countries_controller.rb +6 -2
  56. data/app/controllers/spree/api/v3/admin/coupon_codes_controller.rb +0 -4
  57. data/app/controllers/spree/api/v3/admin/custom_field_definitions_controller.rb +22 -4
  58. data/app/controllers/spree/api/v3/admin/custom_fields_controller.rb +12 -9
  59. data/app/controllers/spree/api/v3/admin/customer_groups_controller.rb +9 -5
  60. data/app/controllers/spree/api/v3/admin/customers/addresses_controller.rb +12 -11
  61. data/app/controllers/spree/api/v3/admin/customers/credit_cards_controller.rb +0 -4
  62. data/app/controllers/spree/api/v3/admin/customers/store_credits_controller.rb +11 -13
  63. data/app/controllers/spree/api/v3/admin/customers/tax_identifiers_controller.rb +6 -1
  64. data/app/controllers/spree/api/v3/admin/customers_controller.rb +37 -9
  65. data/app/controllers/spree/api/v3/admin/data_requests_controller.rb +8 -0
  66. data/app/controllers/spree/api/v3/admin/delivery_method_rules_controller.rb +1 -1
  67. data/app/controllers/spree/api/v3/admin/delivery_methods/rules_controller.rb +16 -8
  68. data/app/controllers/spree/api/v3/admin/delivery_methods_controller.rb +95 -62
  69. data/app/controllers/spree/api/v3/admin/delivery_profiles/origin_groups_controller.rb +8 -1
  70. data/app/controllers/spree/api/v3/admin/delivery_profiles_controller.rb +14 -7
  71. data/app/controllers/spree/api/v3/admin/delivery_zones_controller.rb +21 -5
  72. data/app/controllers/spree/api/v3/admin/email_templates/drafts_controller.rb +53 -0
  73. data/app/controllers/spree/api/v3/admin/email_templates/previews_controller.rb +34 -0
  74. data/app/controllers/spree/api/v3/admin/email_templates/publications_controller.rb +37 -0
  75. data/app/controllers/spree/api/v3/admin/email_templates/restorations_controller.rb +42 -0
  76. data/app/controllers/spree/api/v3/admin/email_templates/revisions_controller.rb +35 -0
  77. data/app/controllers/spree/api/v3/admin/email_templates/sample_records_controller.rb +33 -0
  78. data/app/controllers/spree/api/v3/admin/email_templates/test_emails_controller.rb +44 -0
  79. data/app/controllers/spree/api/v3/admin/email_templates_controller.rb +46 -0
  80. data/app/controllers/spree/api/v3/admin/exports_controller.rb +23 -6
  81. data/app/controllers/spree/api/v3/admin/files_controller.rb +29 -0
  82. data/app/controllers/spree/api/v3/admin/gift_card_batches_controller.rb +20 -1
  83. data/app/controllers/spree/api/v3/admin/gift_cards_controller.rb +19 -1
  84. data/app/controllers/spree/api/v3/admin/imports_controller.rb +37 -11
  85. data/app/controllers/spree/api/v3/admin/integrations_controller.rb +13 -1
  86. data/app/controllers/spree/api/v3/admin/invitation_acceptances_controller.rb +9 -2
  87. data/app/controllers/spree/api/v3/admin/invitations_controller.rb +8 -8
  88. data/app/controllers/spree/api/v3/admin/locales_controller.rb +1 -1
  89. data/app/controllers/spree/api/v3/admin/markets_controller.rb +30 -9
  90. data/app/controllers/spree/api/v3/admin/me_controller.rb +13 -4
  91. data/app/controllers/spree/api/v3/admin/media_controller.rb +22 -9
  92. data/app/controllers/spree/api/v3/admin/media_library_controller.rb +9 -5
  93. data/app/controllers/spree/api/v3/admin/option_types_controller.rb +24 -7
  94. data/app/controllers/spree/api/v3/admin/order_cancellation_reasons_controller.rb +5 -1
  95. data/app/controllers/spree/api/v3/admin/order_routing_rules_controller.rb +13 -5
  96. data/app/controllers/spree/api/v3/admin/orders/claims_controller.rb +39 -1
  97. data/app/controllers/spree/api/v3/admin/orders/deliveries_controller.rb +20 -6
  98. data/app/controllers/spree/api/v3/admin/orders/discount_codes_controller.rb +6 -2
  99. data/app/controllers/spree/api/v3/admin/orders/discounts_controller.rb +30 -6
  100. data/app/controllers/spree/api/v3/admin/orders/exchanges_controller.rb +36 -1
  101. data/app/controllers/spree/api/v3/admin/orders/fees_controller.rb +22 -1
  102. data/app/controllers/spree/api/v3/admin/orders/fulfillments_controller.rb +83 -22
  103. data/app/controllers/spree/api/v3/admin/orders/gift_cards_controller.rb +9 -5
  104. data/app/controllers/spree/api/v3/admin/orders/items_controller.rb +11 -1
  105. data/app/controllers/spree/api/v3/admin/orders/labels_controller.rb +37 -12
  106. data/app/controllers/spree/api/v3/admin/orders/payments_controller.rb +18 -19
  107. data/app/controllers/spree/api/v3/admin/orders/refunds_controller.rb +7 -5
  108. data/app/controllers/spree/api/v3/admin/orders/returns_controller.rb +37 -1
  109. data/app/controllers/spree/api/v3/admin/orders/store_credits_controller.rb +6 -3
  110. data/app/controllers/spree/api/v3/admin/orders_controller.rb +76 -62
  111. data/app/controllers/spree/api/v3/admin/package_types_controller.rb +30 -5
  112. data/app/controllers/spree/api/v3/admin/password_resets_controller.rb +26 -7
  113. data/app/controllers/spree/api/v3/admin/payment_methods_controller.rb +38 -22
  114. data/app/controllers/spree/api/v3/admin/policies_controller.rb +8 -4
  115. data/app/controllers/spree/api/v3/admin/price_lists_controller.rb +32 -67
  116. data/app/controllers/spree/api/v3/admin/prices_controller.rb +51 -8
  117. data/app/controllers/spree/api/v3/admin/product_types_controller.rb +25 -8
  118. data/app/controllers/spree/api/v3/admin/products/digital_assets_controller.rb +29 -16
  119. data/app/controllers/spree/api/v3/admin/products/variants_controller.rb +9 -18
  120. data/app/controllers/spree/api/v3/admin/products_controller.rb +122 -71
  121. data/app/controllers/spree/api/v3/admin/promotion_actions_controller.rb +11 -6
  122. data/app/controllers/spree/api/v3/admin/promotion_rules_controller.rb +10 -5
  123. data/app/controllers/spree/api/v3/admin/promotions_controller.rb +50 -14
  124. data/app/controllers/spree/api/v3/admin/purchase_orders_controller.rb +55 -8
  125. data/app/controllers/spree/api/v3/admin/refund_reasons_controller.rb +5 -1
  126. data/app/controllers/spree/api/v3/admin/reporting/saved_reports_controller.rb +9 -1
  127. data/app/controllers/spree/api/v3/admin/reporting_controller.rb +34 -0
  128. data/app/controllers/spree/api/v3/admin/resource_controller.rb +2 -1
  129. data/app/controllers/spree/api/v3/admin/return_reasons_controller.rb +5 -1
  130. data/app/controllers/spree/api/v3/admin/roles_controller.rb +13 -1
  131. data/app/controllers/spree/api/v3/admin/seller_payouts_controller.rb +7 -9
  132. data/app/controllers/spree/api/v3/admin/seller_requirement_submissions_controller.rb +17 -10
  133. data/app/controllers/spree/api/v3/admin/seller_requirements_controller.rb +32 -6
  134. data/app/controllers/spree/api/v3/admin/seller_transfers_controller.rb +0 -4
  135. data/app/controllers/spree/api/v3/admin/sellers/invitations_controller.rb +1 -1
  136. data/app/controllers/spree/api/v3/admin/sellers/payouts_controller.rb +1 -1
  137. data/app/controllers/spree/api/v3/admin/sellers_controller.rb +77 -32
  138. data/app/controllers/spree/api/v3/admin/setup_controller.rb +54 -23
  139. data/app/controllers/spree/api/v3/admin/stock_levels_controller.rb +38 -9
  140. data/app/controllers/spree/api/v3/admin/stock_locations_controller.rb +41 -9
  141. data/app/controllers/spree/api/v3/admin/stock_transfers_controller.rb +49 -8
  142. data/app/controllers/spree/api/v3/admin/store_controller.rb +122 -48
  143. data/app/controllers/spree/api/v3/admin/store_credits_controller.rb +1 -7
  144. data/app/controllers/spree/api/v3/admin/suppliers_controller.rb +16 -6
  145. data/app/controllers/spree/api/v3/admin/tags_controller.rb +8 -5
  146. data/app/controllers/spree/api/v3/admin/tax_categories_controller.rb +7 -4
  147. data/app/controllers/spree/api/v3/admin/tax_rates_controller.rb +21 -3
  148. data/app/controllers/spree/api/v3/admin/tracking_carriers_controller.rb +4 -0
  149. data/app/controllers/spree/api/v3/admin/translations/batches_controller.rb +17 -9
  150. data/app/controllers/spree/api/v3/admin/translations_controller.rb +4 -0
  151. data/app/controllers/spree/api/v3/admin/translations_coverage_controller.rb +5 -0
  152. data/app/controllers/spree/api/v3/admin/updates_controller.rb +39 -0
  153. data/app/controllers/spree/api/v3/admin/webhook_endpoints_controller.rb +40 -13
  154. data/app/controllers/spree/api/v3/admin/webhook_events_controller.rb +25 -0
  155. data/app/controllers/spree/api/v3/base_controller.rb +12 -0
  156. data/app/controllers/spree/api/v3/resource_controller.rb +99 -3
  157. data/app/controllers/spree/api/v3/seller/auth_controller.rb +10 -2
  158. data/app/controllers/spree/api/v3/seller/base_controller.rb +1 -0
  159. data/app/controllers/spree/api/v3/seller/countries_controller.rb +3 -3
  160. data/app/controllers/spree/api/v3/seller/delivery_methods_controller.rb +49 -60
  161. data/app/controllers/spree/api/v3/seller/exports_controller.rb +21 -4
  162. data/app/controllers/spree/api/v3/seller/files_controller.rb +27 -0
  163. data/app/controllers/spree/api/v3/seller/imports_controller.rb +25 -9
  164. data/app/controllers/spree/api/v3/seller/invitation_acceptances_controller.rb +12 -4
  165. data/app/controllers/spree/api/v3/seller/invitations_controller.rb +1 -1
  166. data/app/controllers/spree/api/v3/seller/me_controller.rb +15 -4
  167. data/app/controllers/spree/api/v3/seller/onboarding_controller.rb +11 -0
  168. data/app/controllers/spree/api/v3/seller/orders/claims_controller.rb +35 -0
  169. data/app/controllers/spree/api/v3/seller/orders/deliveries_controller.rb +12 -0
  170. data/app/controllers/spree/api/v3/seller/orders/exchanges_controller.rb +33 -0
  171. data/app/controllers/spree/api/v3/seller/orders/fulfillments_controller.rb +28 -2
  172. data/app/controllers/spree/api/v3/seller/orders/labels_controller.rb +23 -2
  173. data/app/controllers/spree/api/v3/seller/orders/notes_controller.rb +8 -1
  174. data/app/controllers/spree/api/v3/seller/orders/returns_controller.rb +32 -0
  175. data/app/controllers/spree/api/v3/seller/orders_controller.rb +35 -14
  176. data/app/controllers/spree/api/v3/seller/package_types_controller.rb +21 -9
  177. data/app/controllers/spree/api/v3/seller/password_resets_controller.rb +20 -11
  178. data/app/controllers/spree/api/v3/seller/policies_controller.rb +12 -4
  179. data/app/controllers/spree/api/v3/seller/products_controller.rb +115 -28
  180. data/app/controllers/spree/api/v3/seller/profile_controller.rb +33 -10
  181. data/app/controllers/spree/api/v3/seller/requirement_submissions_controller.rb +13 -6
  182. data/app/controllers/spree/api/v3/seller/resource_controller.rb +12 -0
  183. data/app/controllers/spree/api/v3/seller/stock_locations_controller.rb +44 -13
  184. data/app/controllers/spree/api/v3/seller/tax_identifiers_controller.rb +10 -1
  185. data/app/controllers/spree/api/v3/seller/team_controller.rb +5 -1
  186. data/app/controllers/spree/api/v3/store/auth_controller.rb +10 -0
  187. data/app/controllers/spree/api/v3/store/carts/discount_codes_controller.rb +9 -2
  188. data/app/controllers/spree/api/v3/store/carts/fulfillments_controller.rb +11 -11
  189. data/app/controllers/spree/api/v3/store/carts/gift_cards_controller.rb +13 -4
  190. data/app/controllers/spree/api/v3/store/carts/items_controller.rb +23 -7
  191. data/app/controllers/spree/api/v3/store/carts/payment_sessions_controller.rb +21 -7
  192. data/app/controllers/spree/api/v3/store/carts/payments_controller.rb +16 -3
  193. data/app/controllers/spree/api/v3/store/carts/po_documents_controller.rb +26 -28
  194. data/app/controllers/spree/api/v3/store/carts/store_credits_controller.rb +9 -1
  195. data/app/controllers/spree/api/v3/store/carts/tax_identifiers_controller.rb +5 -1
  196. data/app/controllers/spree/api/v3/store/carts_controller.rb +64 -52
  197. data/app/controllers/spree/api/v3/store/companies/addresses_controller.rb +12 -8
  198. data/app/controllers/spree/api/v3/store/companies/invitations_controller.rb +1 -5
  199. data/app/controllers/spree/api/v3/store/companies/members_controller.rb +4 -0
  200. data/app/controllers/spree/api/v3/store/companies_controller.rb +5 -1
  201. data/app/controllers/spree/api/v3/store/company_invitations_controller.rb +10 -2
  202. data/app/controllers/spree/api/v3/store/customer/addresses_controller.rb +8 -11
  203. data/app/controllers/spree/api/v3/store/customer/credit_cards_controller.rb +0 -4
  204. data/app/controllers/spree/api/v3/store/customer/data_requests_controller.rb +5 -5
  205. data/app/controllers/spree/api/v3/store/customer/digital_links_controller.rb +0 -4
  206. data/app/controllers/spree/api/v3/store/customer/gift_cards_controller.rb +0 -4
  207. data/app/controllers/spree/api/v3/store/customer/orders_controller.rb +0 -4
  208. data/app/controllers/spree/api/v3/store/customer/password_resets_controller.rb +25 -6
  209. data/app/controllers/spree/api/v3/store/customer/payment_setup_sessions_controller.rb +10 -9
  210. data/app/controllers/spree/api/v3/store/customer/store_credits_controller.rb +0 -5
  211. data/app/controllers/spree/api/v3/store/customer/tax_identifiers_controller.rb +5 -1
  212. data/app/controllers/spree/api/v3/store/customers_controller.rb +28 -2
  213. data/app/controllers/spree/api/v3/store/data_request_downloads_controller.rb +1 -1
  214. data/app/controllers/spree/api/v3/store/delivery_methods_controller.rb +1 -1
  215. data/app/controllers/spree/api/v3/store/newsletter_subscribers_controller.rb +27 -14
  216. data/app/controllers/spree/api/v3/store/orders/claims_controller.rb +12 -7
  217. data/app/controllers/spree/api/v3/store/orders/returns_controller.rb +11 -6
  218. data/app/controllers/spree/api/v3/store/orders_controller.rb +47 -10
  219. data/app/controllers/spree/api/v3/store/products_controller.rb +8 -0
  220. data/app/controllers/spree/api/v3/store/wishlist_items_controller.rb +10 -8
  221. data/app/controllers/spree/api/v3/store/wishlists_controller.rb +12 -4
  222. data/app/request_schemas/spree/api/v3/address_request_schema.rb +27 -0
  223. data/app/request_schemas/spree/api/v3/admin/address_request_schema.rb +13 -0
  224. data/app/request_schemas/spree/api/v3/admin/bulk_tags_request_schema.rb +17 -0
  225. data/app/request_schemas/spree/api/v3/admin/catalog_order_minimum_request_schema.rb +17 -0
  226. data/app/request_schemas/spree/api/v3/admin/email_template_language_request_schema.rb +17 -0
  227. data/app/request_schemas/spree/api/v3/admin/email_template_preview_request_schema.rb +32 -0
  228. data/app/request_schemas/spree/api/v3/admin/price_adjustment_tier_request_schema.rb +21 -0
  229. data/app/request_schemas/spree/api/v3/admin/price_list_price_request_schema.rb +21 -0
  230. data/app/request_schemas/spree/api/v3/admin/price_list_rule_request_schema.rb +19 -0
  231. data/app/request_schemas/spree/api/v3/admin/product_membership_reposition_request_schema.rb +17 -0
  232. data/app/request_schemas/spree/api/v3/admin/promotion_action_calculator_request_schema.rb +18 -0
  233. data/app/request_schemas/spree/api/v3/admin/promotion_action_line_item_request_schema.rb +15 -0
  234. data/app/request_schemas/spree/api/v3/admin/promotion_action_request_schema.rb +19 -0
  235. data/app/request_schemas/spree/api/v3/admin/promotion_rule_request_schema.rb +22 -0
  236. data/app/request_schemas/spree/api/v3/admin/reason_request_schema.rb +14 -0
  237. data/app/request_schemas/spree/api/v3/admin/tax_identifier_request_schema.rb +15 -0
  238. data/app/request_schemas/spree/api/v3/custom_field_value_request_schema.rb +15 -0
  239. data/app/request_schemas/spree/api/v3/file_upload_request_schema.rb +20 -0
  240. data/app/request_schemas/spree/api/v3/media_request_schema.rb +27 -0
  241. data/app/request_schemas/spree/api/v3/price_request_schema.rb +17 -0
  242. data/app/request_schemas/spree/api/v3/stock_level_request_schema.rb +18 -0
  243. data/app/request_schemas/spree/api/v3/store/address_request_schema.rb +29 -0
  244. data/app/request_schemas/spree/api/v3/tax_identifier_request_schema.rb +18 -0
  245. data/app/request_schemas/spree/api/v3/variant_option_request_schema.rb +13 -0
  246. data/app/request_schemas/spree/api/v3/variant_request_schema.rb +52 -0
  247. data/app/serializers/concerns/spree/api/v3/purchase_summary.rb +48 -0
  248. data/app/serializers/spree/api/v3/address_serializer.rb +4 -2
  249. data/app/serializers/spree/api/v3/admin/address_serializer.rb +8 -7
  250. data/app/serializers/spree/api/v3/admin/api_key_serializer.rb +2 -6
  251. data/app/serializers/spree/api/v3/admin/applied_promotion_serializer.rb +3 -1
  252. data/app/serializers/spree/api/v3/admin/cart_serializer.rb +3 -1
  253. data/app/serializers/spree/api/v3/admin/catalog_assignment_serializer.rb +1 -3
  254. data/app/serializers/spree/api/v3/admin/catalog_order_minimum_serializer.rb +3 -8
  255. data/app/serializers/spree/api/v3/admin/catalog_price_serializer.rb +3 -4
  256. data/app/serializers/spree/api/v3/admin/catalog_price_tier_serializer.rb +4 -3
  257. data/app/serializers/spree/api/v3/admin/catalog_product_term_serializer.rb +1 -3
  258. data/app/serializers/spree/api/v3/admin/catalog_quantity_rule_serializer.rb +1 -3
  259. data/app/serializers/spree/api/v3/admin/channel_serializer.rb +7 -10
  260. data/app/serializers/spree/api/v3/admin/claim_line_item_serializer.rb +7 -0
  261. data/app/serializers/spree/api/v3/admin/claim_reason_serializer.rb +1 -3
  262. data/app/serializers/spree/api/v3/admin/claim_serializer.rb +5 -0
  263. data/app/serializers/spree/api/v3/admin/commission_line_serializer.rb +7 -18
  264. data/app/serializers/spree/api/v3/admin/commission_rate_serializer.rb +7 -11
  265. data/app/serializers/spree/api/v3/admin/commission_rule_serializer.rb +1 -5
  266. data/app/serializers/spree/api/v3/admin/country_serializer.rb +4 -0
  267. data/app/serializers/spree/api/v3/admin/coupon_code_serializer.rb +1 -7
  268. data/app/serializers/spree/api/v3/admin/credit_card_serializer.rb +1 -7
  269. data/app/serializers/spree/api/v3/admin/custom_field_definition_serializer.rb +6 -2
  270. data/app/serializers/spree/api/v3/admin/customer_serializer.rb +5 -17
  271. data/app/serializers/spree/api/v3/admin/data_request_serializer.rb +2 -6
  272. data/app/serializers/spree/api/v3/admin/delivery_method_rule_serializer.rb +0 -2
  273. data/app/serializers/spree/api/v3/admin/delivery_method_serializer.rb +20 -30
  274. data/app/serializers/spree/api/v3/admin/delivery_method_service_serializer.rb +9 -1
  275. data/app/serializers/spree/api/v3/admin/delivery_origin_group_serializer.rb +1 -3
  276. data/app/serializers/spree/api/v3/admin/delivery_rate_serializer.rb +8 -0
  277. data/app/serializers/spree/api/v3/admin/delivery_serializer.rb +1 -3
  278. data/app/serializers/spree/api/v3/admin/delivery_zone_serializer.rb +1 -7
  279. data/app/serializers/spree/api/v3/admin/digital_asset_serializer.rb +4 -2
  280. data/app/serializers/spree/api/v3/admin/discount_serializer.rb +3 -1
  281. data/app/serializers/spree/api/v3/admin/email_template_draft_serializer.rb +19 -0
  282. data/app/serializers/spree/api/v3/admin/email_template_preview_serializer.rb +38 -0
  283. data/app/serializers/spree/api/v3/admin/email_template_revision_serializer.rb +18 -0
  284. data/app/serializers/spree/api/v3/admin/email_template_sample_record_serializer.rb +13 -0
  285. data/app/serializers/spree/api/v3/admin/email_template_serializer.rb +61 -0
  286. data/app/serializers/spree/api/v3/admin/exchange_line_item_serializer.rb +5 -0
  287. data/app/serializers/spree/api/v3/admin/exchange_serializer.rb +6 -3
  288. data/app/serializers/spree/api/v3/admin/export_serializer.rb +1 -7
  289. data/app/serializers/spree/api/v3/admin/fee_serializer.rb +3 -1
  290. data/app/serializers/spree/api/v3/admin/file_upload_serializer.rb +11 -0
  291. data/app/serializers/spree/api/v3/admin/file_upload_target_serializer.rb +10 -0
  292. data/app/serializers/spree/api/v3/admin/fulfillment_item_serializer.rb +1 -7
  293. data/app/serializers/spree/api/v3/admin/fulfillment_serializer.rb +13 -17
  294. data/app/serializers/spree/api/v3/admin/gift_card_serializer.rb +4 -10
  295. data/app/serializers/spree/api/v3/admin/import_serializer.rb +2 -2
  296. data/app/serializers/spree/api/v3/admin/integration_serializer.rb +1 -3
  297. data/app/serializers/spree/api/v3/admin/line_item_serializer.rb +14 -18
  298. data/app/serializers/spree/api/v3/admin/locale_serializer.rb +13 -0
  299. data/app/serializers/spree/api/v3/admin/market_serializer.rb +7 -2
  300. data/app/serializers/spree/api/v3/admin/media_serializer.rb +4 -5
  301. data/app/serializers/spree/api/v3/admin/order_cancellation_reason_serializer.rb +1 -3
  302. data/app/serializers/spree/api/v3/admin/order_group_serializer.rb +5 -9
  303. data/app/serializers/spree/api/v3/admin/order_routing_rule_serializer.rb +2 -6
  304. data/app/serializers/spree/api/v3/admin/order_serializer.rb +38 -48
  305. data/app/serializers/spree/api/v3/admin/package_type_serializer.rb +1 -3
  306. data/app/serializers/spree/api/v3/admin/payment_method_serializer.rb +7 -4
  307. data/app/serializers/spree/api/v3/admin/payment_serializer.rb +6 -8
  308. data/app/serializers/spree/api/v3/admin/payment_split_serializer.rb +8 -9
  309. data/app/serializers/spree/api/v3/admin/permission_serializer.rb +4 -4
  310. data/app/serializers/spree/api/v3/admin/price_adjustment_tier_serializer.rb +3 -6
  311. data/app/serializers/spree/api/v3/admin/price_history_serializer.rb +5 -2
  312. data/app/serializers/spree/api/v3/admin/price_list_serializer.rb +1 -5
  313. data/app/serializers/spree/api/v3/admin/price_rule_serializer.rb +2 -6
  314. data/app/serializers/spree/api/v3/admin/price_serializer.rb +2 -0
  315. data/app/serializers/spree/api/v3/admin/product_serializer.rb +4 -10
  316. data/app/serializers/spree/api/v3/admin/product_submission_serializer.rb +2 -10
  317. data/app/serializers/spree/api/v3/admin/product_type_serializer.rb +1 -3
  318. data/app/serializers/spree/api/v3/admin/promotion_action_serializer.rb +5 -9
  319. data/app/serializers/spree/api/v3/admin/promotion_rule_serializer.rb +1 -5
  320. data/app/serializers/spree/api/v3/admin/purchase_order_item_serializer.rb +6 -25
  321. data/app/serializers/spree/api/v3/admin/purchase_order_serializer.rb +4 -17
  322. data/app/serializers/spree/api/v3/admin/refund_reason_serializer.rb +1 -3
  323. data/app/serializers/spree/api/v3/admin/refund_serializer.rb +7 -0
  324. data/app/serializers/spree/api/v3/admin/reporting_result_serializer.rb +9 -2
  325. data/app/serializers/spree/api/v3/admin/return_line_item_serializer.rb +9 -0
  326. data/app/serializers/spree/api/v3/admin/return_reason_serializer.rb +1 -3
  327. data/app/serializers/spree/api/v3/admin/return_serializer.rb +8 -12
  328. data/app/serializers/spree/api/v3/admin/saved_report_serializer.rb +1 -3
  329. data/app/serializers/spree/api/v3/admin/seller_balance_serializer.rb +15 -10
  330. data/app/serializers/spree/api/v3/admin/seller_payout_serializer.rb +7 -7
  331. data/app/serializers/spree/api/v3/admin/seller_requirement_status_serializer.rb +2 -6
  332. data/app/serializers/spree/api/v3/admin/seller_requirement_submission_serializer.rb +1 -7
  333. data/app/serializers/spree/api/v3/admin/seller_serializer.rb +8 -16
  334. data/app/serializers/spree/api/v3/admin/seller_transfer_serializer.rb +11 -10
  335. data/app/serializers/spree/api/v3/admin/shipping_label_serializer.rb +8 -21
  336. data/app/serializers/spree/api/v3/admin/stock_level_serializer.rb +1 -3
  337. data/app/serializers/spree/api/v3/admin/stock_location_serializer.rb +4 -3
  338. data/app/serializers/spree/api/v3/admin/stock_movement_serializer.rb +3 -9
  339. data/app/serializers/spree/api/v3/admin/stock_receipt_item_serializer.rb +1 -7
  340. data/app/serializers/spree/api/v3/admin/stock_receipt_serializer.rb +1 -3
  341. data/app/serializers/spree/api/v3/admin/stock_reservation_serializer.rb +1 -3
  342. data/app/serializers/spree/api/v3/admin/stock_transfer_item_serializer.rb +1 -3
  343. data/app/serializers/spree/api/v3/admin/store_credit_event_serializer.rb +6 -3
  344. data/app/serializers/spree/api/v3/admin/store_credit_serializer.rb +11 -20
  345. data/app/serializers/spree/api/v3/admin/store_serializer.rb +21 -84
  346. data/app/serializers/spree/api/v3/admin/supplier_serializer.rb +2 -4
  347. data/app/serializers/spree/api/v3/admin/tax_exemption_certificate_serializer.rb +6 -10
  348. data/app/serializers/spree/api/v3/admin/tax_identifier_serializer.rb +1 -3
  349. data/app/serializers/spree/api/v3/admin/tax_line_serializer.rb +9 -3
  350. data/app/serializers/spree/api/v3/admin/tax_rate_serializer.rb +3 -19
  351. data/app/serializers/spree/api/v3/admin/update_status_serializer.rb +28 -0
  352. data/app/serializers/spree/api/v3/admin/variant_serializer.rb +13 -10
  353. data/app/serializers/spree/api/v3/admin/webhook_delivery_serializer.rb +1 -3
  354. data/app/serializers/spree/api/v3/admin/webhook_event_serializer.rb +23 -0
  355. data/app/serializers/spree/api/v3/applied_promotion_serializer.rb +2 -4
  356. data/app/serializers/spree/api/v3/base_serializer.rb +132 -7
  357. data/app/serializers/spree/api/v3/cart_serializer.rb +20 -66
  358. data/app/serializers/spree/api/v3/category_serializer.rb +5 -15
  359. data/app/serializers/spree/api/v3/claim_line_item_serializer.rb +6 -29
  360. data/app/serializers/spree/api/v3/claim_serializer.rb +2 -16
  361. data/app/serializers/spree/api/v3/collection_serializer.rb +1 -3
  362. data/app/serializers/spree/api/v3/company_serializer.rb +1 -3
  363. data/app/serializers/spree/api/v3/country_serializer.rb +2 -1
  364. data/app/serializers/spree/api/v3/currency_serializer.rb +9 -1
  365. data/app/serializers/spree/api/v3/custom_field_serializer.rb +1 -2
  366. data/app/serializers/spree/api/v3/customer_serializer.rb +3 -2
  367. data/app/serializers/spree/api/v3/delivery_rate_serializer.rb +8 -32
  368. data/app/serializers/spree/api/v3/delivery_zone_member_serializer.rb +1 -1
  369. data/app/serializers/spree/api/v3/digital_asset_serializer.rb +1 -3
  370. data/app/serializers/spree/api/v3/digital_link_serializer.rb +3 -9
  371. data/app/serializers/spree/api/v3/discount_serializer.rb +4 -12
  372. data/app/serializers/spree/api/v3/exchange_line_item_serializer.rb +6 -30
  373. data/app/serializers/spree/api/v3/exchange_serializer.rb +2 -16
  374. data/app/serializers/spree/api/v3/export_serializer.rb +1 -3
  375. data/app/serializers/spree/api/v3/fee_serializer.rb +2 -10
  376. data/app/serializers/spree/api/v3/file_upload_serializer.rb +28 -0
  377. data/app/serializers/spree/api/v3/file_upload_target_serializer.rb +17 -0
  378. data/app/serializers/spree/api/v3/fulfillment_serializer.rb +4 -11
  379. data/app/serializers/spree/api/v3/gift_card_batch_serializer.rb +3 -7
  380. data/app/serializers/spree/api/v3/gift_card_serializer.rb +7 -17
  381. data/app/serializers/spree/api/v3/import_row_serializer.rb +2 -6
  382. data/app/serializers/spree/api/v3/import_serializer.rb +3 -26
  383. data/app/serializers/spree/api/v3/invitation_serializer.rb +2 -19
  384. data/app/serializers/spree/api/v3/line_item_serializer.rb +19 -23
  385. data/app/serializers/spree/api/v3/locale_serializer.rb +3 -1
  386. data/app/serializers/spree/api/v3/market_serializer.rb +5 -5
  387. data/app/serializers/spree/api/v3/media_event_serializer.rb +1 -3
  388. data/app/serializers/spree/api/v3/media_serializer.rb +8 -5
  389. data/app/serializers/spree/api/v3/newsletter_subscriber_request_event_serializer.rb +35 -0
  390. data/app/serializers/spree/api/v3/newsletter_subscriber_serializer.rb +2 -6
  391. data/app/serializers/spree/api/v3/option_value_serializer.rb +1 -3
  392. data/app/serializers/spree/api/v3/order_group_serializer.rb +12 -25
  393. data/app/serializers/spree/api/v3/order_serializer.rb +14 -58
  394. data/app/serializers/spree/api/v3/password_reset_requested_event_serializer.rb +29 -0
  395. data/app/serializers/spree/api/v3/payment_method_serializer.rb +2 -6
  396. data/app/serializers/spree/api/v3/payment_serializer.rb +5 -10
  397. data/app/serializers/spree/api/v3/payment_session_serializer.rb +5 -13
  398. data/app/serializers/spree/api/v3/payment_setup_session_serializer.rb +3 -11
  399. data/app/serializers/spree/api/v3/policy_serializer.rb +1 -3
  400. data/app/serializers/spree/api/v3/price_history_serializer.rb +6 -8
  401. data/app/serializers/spree/api/v3/price_serializer.rb +7 -12
  402. data/app/serializers/spree/api/v3/product_filter_price_range_serializer.rb +10 -4
  403. data/app/serializers/spree/api/v3/product_publication_serializer.rb +1 -7
  404. data/app/serializers/spree/api/v3/product_serializer.rb +10 -24
  405. data/app/serializers/spree/api/v3/product_submission_serializer.rb +26 -0
  406. data/app/serializers/spree/api/v3/purchase_order_event_serializer.rb +23 -4
  407. data/app/serializers/spree/api/v3/refund_serializer.rb +11 -16
  408. data/app/serializers/spree/api/v3/return_line_item_serializer.rb +6 -21
  409. data/app/serializers/spree/api/v3/return_serializer.rb +4 -16
  410. data/app/serializers/spree/api/v3/saved_report_event_serializer.rb +23 -0
  411. data/app/serializers/spree/api/v3/seller/address_serializer.rb +12 -0
  412. data/app/serializers/spree/api/v3/seller/balance_serializer.rb +15 -10
  413. data/app/serializers/spree/api/v3/seller/claim_line_item_serializer.rb +7 -0
  414. data/app/serializers/spree/api/v3/seller/claim_serializer.rb +5 -0
  415. data/app/serializers/spree/api/v3/seller/country_serializer.rb +19 -0
  416. data/app/serializers/spree/api/v3/seller/delivery_method_rule_serializer.rb +1 -3
  417. data/app/serializers/spree/api/v3/seller/delivery_method_serializer.rb +5 -15
  418. data/app/serializers/spree/api/v3/seller/delivery_rate_serializer.rb +8 -13
  419. data/app/serializers/spree/api/v3/seller/delivery_serializer.rb +1 -3
  420. data/app/serializers/spree/api/v3/seller/delivery_zone_serializer.rb +1 -3
  421. data/app/serializers/spree/api/v3/seller/exchange_line_item_serializer.rb +5 -0
  422. data/app/serializers/spree/api/v3/seller/exchange_serializer.rb +6 -3
  423. data/app/serializers/spree/api/v3/seller/file_upload_serializer.rb +11 -0
  424. data/app/serializers/spree/api/v3/seller/file_upload_target_serializer.rb +10 -0
  425. data/app/serializers/spree/api/v3/seller/fulfillment_item_serializer.rb +1 -7
  426. data/app/serializers/spree/api/v3/seller/fulfillment_serializer.rb +2 -6
  427. data/app/serializers/spree/api/v3/seller/import_serializer.rb +2 -2
  428. data/app/serializers/spree/api/v3/seller/invitation_serializer.rb +1 -3
  429. data/app/serializers/spree/api/v3/seller/media_serializer.rb +2 -5
  430. data/app/serializers/spree/api/v3/seller/order_line_item_serializer.rb +8 -13
  431. data/app/serializers/spree/api/v3/seller/order_serializer.rb +19 -40
  432. data/app/serializers/spree/api/v3/seller/payment_split_serializer.rb +8 -9
  433. data/app/serializers/spree/api/v3/seller/payout_serializer.rb +6 -6
  434. data/app/serializers/spree/api/v3/seller/price_history_serializer.rb +11 -0
  435. data/app/serializers/spree/api/v3/seller/price_serializer.rb +11 -0
  436. data/app/serializers/spree/api/v3/seller/product_serializer.rb +3 -7
  437. data/app/serializers/spree/api/v3/seller/product_submission_serializer.rb +1 -21
  438. data/app/serializers/spree/api/v3/seller/profile_serializer.rb +9 -13
  439. data/app/serializers/spree/api/v3/seller/requirement_status_serializer.rb +3 -9
  440. data/app/serializers/spree/api/v3/seller/return_line_item_serializer.rb +8 -0
  441. data/app/serializers/spree/api/v3/seller/return_serializer.rb +8 -17
  442. data/app/serializers/spree/api/v3/seller/state_serializer.rb +10 -0
  443. data/app/serializers/spree/api/v3/seller/stock_location_serializer.rb +3 -0
  444. data/app/serializers/spree/api/v3/seller/transfer_serializer.rb +10 -9
  445. data/app/serializers/spree/api/v3/seller/variant_serializer.rb +8 -4
  446. data/app/serializers/spree/api/v3/seller_serializer.rb +1 -3
  447. data/app/serializers/spree/api/v3/shipping_label_event_serializer.rb +22 -4
  448. data/app/serializers/spree/api/v3/stock_level_serializer.rb +1 -7
  449. data/app/serializers/spree/api/v3/stock_location_serializer.rb +8 -1
  450. data/app/serializers/spree/api/v3/stock_movement_serializer.rb +1 -3
  451. data/app/serializers/spree/api/v3/stock_receipt_event_serializer.rb +20 -4
  452. data/app/serializers/spree/api/v3/stock_transfer_serializer.rb +1 -7
  453. data/app/serializers/spree/api/v3/store_credit_event_serializer.rb +2 -13
  454. data/app/serializers/spree/api/v3/store_credit_serializer.rb +3 -27
  455. data/app/serializers/spree/api/v3/supplier_event_serializer.rb +6 -4
  456. data/app/serializers/spree/api/v3/tax_line_serializer.rb +11 -23
  457. data/app/serializers/spree/api/v3/variant_serializer.rb +10 -24
  458. data/app/serializers/spree/api/v3/wishlist_item_serializer.rb +1 -11
  459. data/app/serializers/spree/api/v3/wishlist_serializer.rb +2 -6
  460. data/app/services/spree/api/v3/filter_predicates.rb +29 -0
  461. data/app/services/spree/api/v3/filter_table.rb +337 -0
  462. data/app/services/spree/api/v3/filters_aggregator.rb +2 -2
  463. data/app/services/spree/api/v3/request_schema.rb +430 -0
  464. data/app/services/spree/webhooks/deliver_webhook.rb +7 -3
  465. data/app/subscribers/spree/webhook_event_subscriber.rb +3 -10
  466. data/config/initializers/pagy.rb +1 -1
  467. data/config/initializers/typelizer.rb +7 -9
  468. data/config/locales/ar.yml +15 -0
  469. data/config/locales/be.yml +15 -0
  470. data/config/locales/bg.yml +15 -0
  471. data/config/locales/ca.yml +15 -0
  472. data/config/locales/cs.yml +15 -0
  473. data/config/locales/da.yml +15 -0
  474. data/config/locales/de-CH.yml +11 -0
  475. data/config/locales/de.yml +15 -0
  476. data/config/locales/el.yml +15 -0
  477. data/config/locales/en.yml +5 -40
  478. data/config/locales/es-CL.yml +10 -0
  479. data/config/locales/es-EC.yml +11 -0
  480. data/config/locales/es-MX.yml +12 -0
  481. data/config/locales/es.yml +15 -0
  482. data/config/locales/et.yml +15 -0
  483. data/config/locales/fa.yml +15 -0
  484. data/config/locales/fi.yml +15 -0
  485. data/config/locales/fr.yml +15 -0
  486. data/config/locales/hu.yml +15 -0
  487. data/config/locales/id.yml +15 -0
  488. data/config/locales/it.yml +15 -0
  489. data/config/locales/ja.yml +15 -0
  490. data/config/locales/km.yml +15 -0
  491. data/config/locales/ko.yml +15 -0
  492. data/config/locales/ku.yml +15 -0
  493. data/config/locales/lt.yml +15 -0
  494. data/config/locales/lv.yml +15 -0
  495. data/config/locales/nb.yml +15 -0
  496. data/config/locales/ne.yml +15 -0
  497. data/config/locales/nl.yml +15 -0
  498. data/config/locales/pl.yml +15 -0
  499. data/config/locales/pt-BR.yml +13 -0
  500. data/config/locales/pt.yml +15 -0
  501. data/config/locales/ro.yml +15 -0
  502. data/config/locales/ru.yml +15 -0
  503. data/config/locales/sk.yml +15 -0
  504. data/config/locales/sl-SI.yml +15 -0
  505. data/config/locales/sv.yml +15 -0
  506. data/config/locales/th.yml +15 -0
  507. data/config/locales/tr.yml +15 -0
  508. data/config/locales/uk.yml +15 -0
  509. data/config/locales/vi.yml +15 -0
  510. data/config/locales/zh-CN.yml +15 -0
  511. data/config/locales/zh-TW.yml +15 -0
  512. data/config/routes.rb +54 -102
  513. data/lib/spree/api/configuration.rb +5 -0
  514. data/lib/spree/api/dependencies.rb +54 -274
  515. data/lib/spree/api/middleware/request_size_limit.rb +24 -3
  516. data/lib/spree/api/openapi/filter_documentation.rb +136 -0
  517. data/lib/spree/api/openapi/schema_helper.rb +127 -81
  518. data/lib/spree/api/preference_families.rb +46 -0
  519. data/lib/spree/api/preference_types.rb +138 -0
  520. data/lib/spree/api/typelizer_generation.rb +39 -0
  521. data/lib/spree/api/webhook_event_types.rb +140 -0
  522. data/lib/spree/api.rb +0 -2
  523. data/lib/tasks/filters.rake +12 -0
  524. data/lib/typelizer/open_enums.rb +10 -0
  525. metadata +125 -40
  526. data/app/controllers/concerns/spree/api/v3/address_params.rb +0 -17
  527. data/app/controllers/concerns/spree/api/v3/direct_uploads.rb +0 -35
  528. data/app/controllers/spree/api/v3/admin/direct_uploads_controller.rb +0 -54
  529. data/app/controllers/spree/api/v3/seller/direct_uploads_controller.rb +0 -21
  530. data/config/i18n-tasks.yml +0 -40
  531. data/config/initializers/alba.rb +0 -5
@@ -4,24 +4,13 @@ module Spree
4
4
  class StoreCreditEventSerializer < BaseSerializer
5
5
  typelize action: :string,
6
6
  display_action: [:string, nullable: true],
7
- amount: :string,
8
- display_amount: :string,
9
7
  authorization_code: [:string, nullable: true]
10
8
 
11
9
  attributes :action, :authorization_code
12
10
 
13
- attribute :display_action do |event|
14
- event.display_action
15
- end
16
-
17
- attribute :amount do |event|
18
- event.amount.to_s
19
- end
20
-
21
- attribute :display_amount do |event|
22
- event.display_amount.to_s
23
- end
11
+ attributes :display_action
24
12
 
13
+ money_attributes :amount, :display_amount
25
14
  attributes created_at: :iso8601
26
15
  end
27
16
  end
@@ -2,34 +2,10 @@ module Spree
2
2
  module Api
3
3
  module V3
4
4
  class StoreCreditSerializer < BaseSerializer
5
- typelize amount: :string, amount_used: :string, amount_remaining: :string,
6
- display_amount: :string, display_amount_used: :string, display_amount_remaining: :string,
7
- currency: :string
8
-
9
- attribute :amount do |store_credit|
10
- store_credit.amount.to_s
11
- end
12
-
13
- attribute :amount_used do |store_credit|
14
- store_credit.amount_used.to_s
15
- end
16
-
17
- attribute :amount_remaining do |store_credit|
18
- store_credit.amount_remaining.to_s
19
- end
20
-
21
- attribute :display_amount do |store_credit|
22
- store_credit.display_amount.to_s
23
- end
24
-
25
- attribute :display_amount_used do |store_credit|
26
- store_credit.display_amount_used.to_s
27
- end
28
-
29
- attribute :display_amount_remaining do |store_credit|
30
- store_credit.display_amount_remaining.to_s
31
- end
5
+ typelize currency: [:string, enum: Spree::Money::Rounding::CURRENCY_CODES, enum_type_name: 'CurrencyCode']
32
6
 
7
+ money_attributes :amount, :amount_used, :amount_remaining, :display_amount,
8
+ :display_amount_used, :display_amount_remaining
33
9
  attributes :currency
34
10
  end
35
11
  end
@@ -1,10 +1,12 @@
1
1
  module Spree
2
2
  module Api
3
3
  module V3
4
- # Payload of the supplier.* events. Suppliers have no storefront
5
- # serializer — a customer never sees who the merchant buys from — so the
6
- # event shape is declared here rather than found by convention.
7
- class SupplierEventSerializer < Admin::SupplierSerializer
4
+ # Payload of the supplier.* events. A supplier's contact details stay
5
+ # behind the Admin API.
6
+ class SupplierEventSerializer < BaseSerializer
7
+ typelize name: :string
8
+
9
+ attributes :name, created_at: :iso8601, updated_at: :iso8601
8
10
  end
9
11
  end
10
12
  end
@@ -1,34 +1,22 @@
1
1
  module Spree
2
2
  module Api
3
3
  module V3
4
- # A single tax charge (typed row) on a line item, fulfillment or fee.
4
+ # A single tax charge (typed row) on a line item, fulfillment or fee —
5
+ # or, after the sale, the tax a return, claim or exchange line gives
6
+ # back (`credit`) or charges on an exchange's replacement.
5
7
  class TaxLineSerializer < BaseSerializer
6
- typelize label: :string, rate: :string, included: :boolean,
7
- amount: [:string, nullable: true], display_amount: [:string, nullable: true],
8
+ typelize label: :string, included: :boolean, credit: :boolean,
8
9
  tax_rate_id: [:string, nullable: true], line_item_id: [:string, nullable: true],
9
- fulfillment_id: [:string, nullable: true], fee_id: [:string, nullable: true]
10
+ fulfillment_id: [:string, nullable: true], fee_id: [:string, nullable: true],
11
+ return_line_item_id: [:string, nullable: true], claim_line_item_id: [:string, nullable: true],
12
+ exchange_line_item_id: [:string, nullable: true]
10
13
 
11
- attributes :label, :included
14
+ attributes :label, :included, :credit
12
15
 
13
- attribute :rate do |record|
14
- record.rate&.to_s
15
- end
16
+ rate_attributes :rate
16
17
 
17
- attribute :tax_rate_id do |record|
18
- record.tax_rate&.prefixed_id
19
- end
20
-
21
- attribute :line_item_id do |record|
22
- record.line_item&.prefixed_id
23
- end
24
-
25
- attribute :fulfillment_id do |record|
26
- record.fulfillment&.prefixed_id
27
- end
28
-
29
- attribute :fee_id do |record|
30
- record.fee&.prefixed_id
31
- end
18
+ prefixed_id_attributes :tax_rate, :line_item, :fulfillment, :fee, :return_line_item, :claim_line_item,
19
+ :exchange_line_item
32
20
 
33
21
  money_attributes :amount, :display_amount
34
22
  end
@@ -17,9 +17,7 @@ module Spree
17
17
  purchase_unit: [:string, enum: Spree::Variant::PURCHASE_UNITS], units_per_carton: ['number | null'],
18
18
  seller_id: [:string, nullable: true]
19
19
 
20
- attribute :product_id do |variant|
21
- variant.product&.prefixed_id
22
- end
20
+ prefixed_id_attributes :product
23
21
 
24
22
  attributes :sku, :options_text, :track_inventory, :media_count
25
23
 
@@ -34,21 +32,13 @@ module Spree
34
32
  image_url_for(variant.primary_media)
35
33
  end
36
34
 
37
- attribute :purchasable do |variant|
38
- variant.purchasable?
39
- end
35
+ attribute :purchasable, &:purchasable?
40
36
 
41
- attribute :in_stock do |variant|
42
- variant.in_stock?
43
- end
37
+ attribute :in_stock, &:in_stock?
44
38
 
45
- attribute :backorderable do |variant|
46
- variant.backorderable?
47
- end
39
+ attribute :backorderable, &:backorderable?
48
40
 
49
- attribute :preorder do |variant|
50
- variant.preorder?
51
- end
41
+ attribute :preorder, &:preorder?
52
42
 
53
43
  attribute :weight do |variant|
54
44
  variant.weight&.to_f
@@ -93,14 +83,12 @@ module Spree
93
83
  variant.purchase_unit.presence || 'unit'
94
84
  end
95
85
 
96
- attribute :units_per_carton do |variant|
97
- variant.units_per_carton
98
- end
86
+ attributes :units_per_carton
99
87
 
100
88
  # Price object - calculated price with price list resolution
101
89
  attribute :price do |variant|
102
90
  price = price_for(variant)
103
- Spree.api.price_serializer.new(price, params: params).to_h if price.present?
91
+ price_serializer.new(price, params: params).to_h if price.present?
104
92
  end
105
93
 
106
94
  # Original price - base price without price list resolution (for showing strikethrough)
@@ -110,7 +98,7 @@ module Spree
110
98
  base = price_in(variant)
111
99
 
112
100
  if calculated.present? && base.present? && calculated.id != base.id
113
- Spree.api.price_serializer.new(base, params: params).to_h
101
+ price_serializer.new(base, params: params).to_h
114
102
  end
115
103
  end
116
104
 
@@ -119,9 +107,7 @@ module Spree
119
107
  # listing) or the row itself (a master shared by several sellers). Nil
120
108
  # is first-party. Shoppers comparing offers on one page group by this,
121
109
  # so it is a plain attribute rather than an expand.
122
- attribute :seller_id do |variant|
123
- variant.resolved_seller&.prefixed_id
124
- end
110
+ prefixed_id_attributes seller_id: :resolved_seller
125
111
 
126
112
  one :seller,
127
113
  resource: proc { Spree.api.seller_serializer },
@@ -151,7 +137,7 @@ module Spree
151
137
  attribute :prior_price,
152
138
  if: proc { expand?('prior_price') } do |variant|
153
139
  record = price_in(variant)&.prior_price
154
- Spree.api.price_history_serializer.new(record, params: params).to_h if record
140
+ price_history_serializer.new(record, params: params).to_h if record
155
141
  end
156
142
  end
157
143
  end
@@ -5,17 +5,7 @@ module Spree
5
5
  typelize variant_id: :string, wishlist_id: :string, quantity: :number,
6
6
  product_id: :string
7
7
 
8
- attribute :variant_id do |wishlist_item|
9
- wishlist_item.variant&.prefixed_id
10
- end
11
-
12
- attribute :product_id do |wishlist_item|
13
- wishlist_item.product&.prefixed_id
14
- end
15
-
16
- attribute :wishlist_id do |wishlist_item|
17
- wishlist_item.wishlist&.prefixed_id
18
- end
8
+ prefixed_id_attributes :variant, :product, :wishlist
19
9
 
20
10
  attributes :quantity
21
11
 
@@ -6,13 +6,9 @@ module Spree
6
6
 
7
7
  attributes :name, :token
8
8
 
9
- attribute :is_default do |wishlist|
10
- wishlist.is_default?
11
- end
9
+ attribute :is_default, &:is_default?
12
10
 
13
- attribute :is_private do |wishlist|
14
- wishlist.is_private?
15
- end
11
+ attribute :is_private, &:is_private?
16
12
 
17
13
  many :wishlist_items,
18
14
  key: :items,
@@ -0,0 +1,29 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ # The Ransack predicates the v3 API accepts, per kind of value. Ransack
5
+ # itself would take far more; this is the published contract, so a
6
+ # non-Ruby implementation needs to support exactly these.
7
+ module FilterPredicates
8
+ EQUALITY = %w[eq not_eq in not_in].freeze
9
+ NULLITY = %w[null not_null].freeze
10
+ RANGE = (EQUALITY + %w[lt lteq gt gteq] + NULLITY).freeze
11
+ IDENTITY = (EQUALITY + NULLITY).freeze
12
+
13
+ BY_KIND = {
14
+ 'text' => (EQUALITY + %w[cont i_cont not_cont start end] + NULLITY + %w[present blank]).freeze,
15
+ 'decimal' => RANGE,
16
+ 'integer' => RANGE,
17
+ 'date' => RANGE,
18
+ 'datetime' => RANGE,
19
+ 'enum' => IDENTITY,
20
+ 'id' => IDENTITY,
21
+ 'type' => IDENTITY,
22
+ 'boolean' => (EQUALITY + %w[true false null]).freeze
23
+ }.freeze
24
+
25
+ KINDS = BY_KIND.keys.freeze
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,337 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ # What one model may be filtered and sorted on by one audience, read
5
+ # from the model's Ransack allowlists (see Spree::RansackableAttributes)
6
+ # and its columns. Nothing here declares a filter: the allowlists stay
7
+ # the only source, and this turns them into the published contract that
8
+ # the OpenAPI specs carry and the SDK filter types are generated from.
9
+ #
10
+ # Spree::Api::V3::FilterTable.for_model(Spree::Order, nil).to_h
11
+ # # => { 'attributes' => { 'number' => 'text', 'total' => 'decimal', ... },
12
+ # # 'associations' => { 'line_items' => 'LineItem' },
13
+ # # 'scopes' => { 'complete' => 'boolean', 'search' => 'text' },
14
+ # # 'sortable' => ['number', 'total', ...] }
15
+ class FilterTable
16
+ # Associations deeper than this are not part of the contract.
17
+ MAX_DEPTH = 2
18
+
19
+ COLUMN_KINDS = {
20
+ string: 'text', text: 'text', citext: 'text', uuid: 'text',
21
+ integer: 'integer', bigint: 'integer',
22
+ decimal: 'decimal', float: 'decimal',
23
+ date: 'date',
24
+ datetime: 'datetime', timestamp: 'datetime', timestamptz: 'datetime',
25
+ boolean: 'boolean'
26
+ }.freeze
27
+
28
+ # Raised when an endpoint's table cannot be described — a column of a
29
+ # kind the contract has no predicates for, or two models sharing a name.
30
+ class Error < StandardError; end
31
+
32
+ attr_reader :model, :audience
33
+
34
+ class << self
35
+ # @param model [Class] an ActiveRecord model
36
+ # @param audience [Symbol, nil] the Ransack auth object: nil for the
37
+ # back office, `:store` or `:seller`
38
+ # @return [FilterTable]
39
+ def for_model(model, audience)
40
+ cache[[model.name, audience]] ||= new(model, audience)
41
+ end
42
+
43
+ # @param controller_class [Class] a Spree::Api::V3::ResourceController
44
+ # @return [Endpoint]
45
+ def for(controller_class)
46
+ Endpoint.new(controller_class)
47
+ end
48
+
49
+ # Forgets every computed table, for when the allowlists change at
50
+ # runtime (extensions in `to_prepare`, specs).
51
+ def reset!
52
+ @cache = {}
53
+ end
54
+
55
+ # Every list endpoint the routes serve, as `[api, path, Endpoint]`
56
+ # with the path in OpenAPI form (`/api/v3/admin/orders/{order_id}/items`).
57
+ #
58
+ # @return [Array<Array(String, String, Endpoint)>]
59
+ def endpoints
60
+ Spree::Core::Engine.routes.routes.filter_map do |route|
61
+ defaults = route.defaults
62
+ next unless defaults[:action] == 'index' && defaults[:controller].to_s.start_with?('spree/api/v3/')
63
+
64
+ controller = "#{defaults[:controller]}_controller".camelize.safe_constantize
65
+ next unless controller && controller < Spree::Api::V3::ResourceController
66
+
67
+ api = defaults[:controller].to_s.split('/')[3]
68
+ path = route.path.spec.to_s.delete_suffix('(.:format)').gsub(/:(\w+)/, '{\\1}')
69
+ [api, path, self.for(controller)]
70
+ end.uniq { |api, path, _| [api, path] }
71
+ end
72
+
73
+ # One API's filters in the shape its OpenAPI spec carries them —
74
+ # `paths.<path>.get.x-spree-filters` and the components' tables and
75
+ # predicates — read from the allowlists this app has right now, so an
76
+ # app's own filters are included.
77
+ #
78
+ # @param api [String] `store`, `admin` or `seller`
79
+ # @return [Hash]
80
+ def spec_for(api)
81
+ paths = {}
82
+ tables = {}
83
+ endpoints.each do |endpoint_api, path, endpoint|
84
+ next unless endpoint_api == api && endpoint.filterable?
85
+
86
+ paths[path] = { 'get' => { 'x-spree-filters' => endpoint.to_h } }
87
+ endpoint.tables.each { |name, table| tables[name] ||= table.to_h }
88
+ end
89
+
90
+ {
91
+ 'paths' => paths.sort.to_h,
92
+ 'components' => {
93
+ 'x-spree-filter-tables' => tables.sort.to_h,
94
+ 'x-spree-filter-predicates' => FilterPredicates::BY_KIND
95
+ }
96
+ }
97
+ end
98
+
99
+ # The name a table goes by in the contract: the model's API short
100
+ # name, camelized — `Order`, `LineItem`, `Customer`.
101
+ #
102
+ # @param model [Class]
103
+ # @return [String]
104
+ def name_for(model)
105
+ Spree::Base.polymorphic_api_type(model.name).camelize
106
+ end
107
+
108
+ private
109
+
110
+ def cache
111
+ @cache ||= {}
112
+ end
113
+ end
114
+
115
+ # @param model [Class]
116
+ # @param audience [Symbol, nil]
117
+ def initialize(model, audience)
118
+ @model = model
119
+ @audience = audience
120
+ end
121
+
122
+ # @return [String]
123
+ def name
124
+ self.class.name_for(model)
125
+ end
126
+
127
+ # @return [Hash{String => String, Hash}] attribute => value kind, or
128
+ # `{ 'enum' => [values] }` for a status
129
+ def attributes
130
+ @attributes ||= kinds.reject { |_, kind| kind == :unclassified }.compact
131
+ end
132
+
133
+ # Declared attributes whose value kind could not be determined; a
134
+ # non-empty list fails the filter table spec.
135
+ #
136
+ # @return [Array<String>]
137
+ def unclassified_attributes
138
+ kinds.select { |_, kind| kind == :unclassified }.keys
139
+ end
140
+
141
+ # Renamed columns kept under their old name (`payment_state`, through
142
+ # `alias_attribute`), published until they are removed but left out of
143
+ # the reference. A `ransack_alias` is a deliberate public name and stays.
144
+ #
145
+ # @return [Array<String>]
146
+ def aliased_attributes
147
+ attributes.keys.select { |attribute| model.attribute_aliases.key?(attribute) }
148
+ end
149
+
150
+ # @return [Hash{String => FilterTable}]
151
+ def associations
152
+ @associations ||= model.ransackable_associations(audience).sort.each_with_object({}) do |name, tables|
153
+ reflection = model.reflect_on_association(name.to_sym)
154
+ next if reflection.nil? || reflection.polymorphic?
155
+
156
+ tables[name.to_s] = self.class.for_model(reflection.klass, audience)
157
+ end
158
+ end
159
+
160
+ # @return [Hash{String => String, Array, Hash}] scope => argument type:
161
+ # one kind, a list of kinds (positional arguments), or
162
+ # `{ 'list' => kind }` for any number of arguments
163
+ def scopes
164
+ @scopes ||= begin
165
+ declared = (model.respond_to?(:ransackable_scope_types) ? model.ransackable_scope_types : {}).
166
+ merge(Spree.ransack.custom_scope_types_for(model)).stringify_keys
167
+ model.ransackable_scopes(audience).map(&:to_s).sort.index_with do |scope|
168
+ normalize_scope_type(declared.fetch(scope) { inferred_scope_type(scope) })
169
+ end
170
+ end
171
+ end
172
+
173
+ # @return [Array<String>]
174
+ def sortable
175
+ @sortable ||= model.ransortable_attributes(audience).map(&:to_s).select { |attribute| attributes.key?(attribute) }.sort
176
+ end
177
+
178
+ # Every table reachable from this one within {MAX_DEPTH} hops,
179
+ # including this one.
180
+ #
181
+ # @return [Hash{String => FilterTable}]
182
+ def reachable(depth = 0, found = {})
183
+ if found.key?(name) && found[name].model != model
184
+ raise Error, "#{found[name].model.name} and #{model.name} are both published as #{name}; give one a distinct api_type"
185
+ end
186
+
187
+ found[name] ||= self
188
+ return found if depth >= MAX_DEPTH
189
+
190
+ associations.each_value { |table| table.reachable(depth + 1, found) }
191
+ found
192
+ end
193
+
194
+ # @return [Hash]
195
+ def to_h
196
+ {
197
+ 'attributes' => attributes,
198
+ 'associations' => associations.transform_values(&:name),
199
+ 'scopes' => scopes
200
+ }
201
+ end
202
+
203
+ private
204
+
205
+ def kinds
206
+ @kinds ||= model.ransackable_attributes(audience).map(&:to_s).uniq.sort.index_with { |attribute| attribute_kind(attribute) }
207
+ end
208
+
209
+ # @return [String, Hash, Symbol, nil] the kind; nil for a default
210
+ # attribute the model does not have (`position` on a table without
211
+ # one), `:unclassified` for one the contract cannot describe
212
+ def attribute_kind(attribute)
213
+ aliased = model._ransack_aliases[attribute] || model.attribute_aliases[attribute]
214
+ return attribute_kind(aliased) if aliased
215
+ return ransacker_kind(model._ransackers[attribute]) if model._ransackers.key?(attribute)
216
+ return 'id' if id_attribute?(attribute)
217
+ return 'type' if type_attribute?(attribute)
218
+ return { 'enum' => model.statuses } if attribute == 'status' && model.respond_to?(:statuses)
219
+ return { 'enum' => model.defined_enums[attribute].keys } if model.defined_enums.key?(attribute)
220
+ if (values = inclusion_values(attribute))
221
+ return { 'enum' => values }
222
+ end
223
+
224
+ column = model.columns_hash[attribute]
225
+ return COLUMN_KINDS.fetch(column.type, :unclassified) if column
226
+ return 'text' if translated_attribute?(attribute)
227
+ return nil if model.default_ransackable_attributes.include?(attribute)
228
+
229
+ :unclassified
230
+ end
231
+
232
+ # The fixed list an inclusion validation allows, for a column that
233
+ # holds one of a known set of values (`payment_status`, `kind`).
234
+ def inclusion_values(attribute)
235
+ validator = model.validators_on(attribute.to_sym).find { |candidate| candidate.is_a?(ActiveModel::Validations::InclusionValidator) }
236
+ values = validator&.options&.[](:in)
237
+ values.map(&:to_s).uniq if values.is_a?(Array) && values.all? { |value| value.is_a?(String) || value.is_a?(Symbol) }
238
+ end
239
+
240
+ def ransacker_kind(ransacker)
241
+ COLUMN_KINDS.fetch(ransacker.type.to_sym, :unclassified)
242
+ end
243
+
244
+ def id_attribute?(attribute)
245
+ attribute == model.primary_key ||
246
+ model.reflect_on_all_associations(:belongs_to).any? { |reflection| reflection.foreign_key.to_s == attribute }
247
+ end
248
+
249
+ def type_attribute?(attribute)
250
+ model.respond_to?(:api_type_resolver) && model.api_type_resolver(attribute).present?
251
+ end
252
+
253
+ def translated_attribute?(attribute)
254
+ model.respond_to?(:translatable_fields) && model.translatable_fields.map(&:to_s).include?(attribute)
255
+ end
256
+
257
+ # What a class method's signature says about its arguments. A `scope`
258
+ # lambda hides its signature behind `(*args, **)`, so an undeclared one
259
+ # is published as taking one text value.
260
+ def inferred_scope_type(scope)
261
+ parameters = model.method(scope).parameters
262
+ return 'text' if parameters.any? { |type, _| type == :keyrest }
263
+ return { 'list' => 'text' } if parameters.any? { |type, _| type == :rest }
264
+
265
+ required = parameters.count { |type, _| type == :req }
266
+ case required
267
+ when 0 then 'boolean'
268
+ when 1 then 'text'
269
+ else Array.new(required, 'text')
270
+ end
271
+ end
272
+
273
+ def normalize_scope_type(type)
274
+ case type
275
+ when Hash then { 'list' => validate_kind(type.stringify_keys.fetch('list')) }
276
+ when Array then type.map { |kind| validate_kind(kind) }
277
+ else validate_kind(type)
278
+ end
279
+ end
280
+
281
+ def validate_kind(kind)
282
+ kind = kind.to_s
283
+ return kind if FilterPredicates::KINDS.include?(kind)
284
+
285
+ raise Error, "#{model.name}.ransackable_scope_types names an unknown kind #{kind.inspect}"
286
+ end
287
+
288
+ # One list endpoint: the table its model has for the controller's
289
+ # audience, plus what the controller accepts beyond it.
290
+ class Endpoint
291
+ attr_reader :controller_class
292
+
293
+ # @param controller_class [Class]
294
+ def initialize(controller_class)
295
+ @controller_class = controller_class
296
+ end
297
+
298
+ # @return [Boolean]
299
+ def filterable?
300
+ controller.send(:filterable?)
301
+ end
302
+
303
+ # @return [FilterTable]
304
+ def table
305
+ @table ||= FilterTable.for_model(controller.send(:model_class), controller.send(:ransack_auth_object))
306
+ end
307
+
308
+ # @return [Array<String>]
309
+ def sortable
310
+ (table.sortable | controller.send(:additional_sort_fields).map(&:to_s)).sort
311
+ end
312
+
313
+ # @return [Hash{String => FilterTable}] the tables this endpoint's
314
+ # filters reach, keyed by name
315
+ def tables
316
+ table.reachable
317
+ end
318
+
319
+ # The `x-spree-filters` extension of the endpoint's OpenAPI operation.
320
+ #
321
+ # @return [Hash]
322
+ def to_h
323
+ extension = { 'table' => table.name, 'sortable' => sortable }
324
+ extension['custom_fields'] = true if controller.send(:custom_field_filters?)
325
+ extension
326
+ end
327
+
328
+ private
329
+
330
+ def controller
331
+ @controller ||= controller_class.new
332
+ end
333
+ end
334
+ end
335
+ end
336
+ end
337
+ end
@@ -63,8 +63,8 @@ module Spree
63
63
  {
64
64
  id: 'price',
65
65
  type: 'price_range',
66
- min: min.to_f,
67
- max: max.to_f,
66
+ min: min,
67
+ max: max,
68
68
  currency: @currency
69
69
  }
70
70
  end