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
@@ -18,9 +18,7 @@ module Spree
18
18
  large_url: [:string, nullable: true], xlarge_url: [:string, nullable: true],
19
19
  og_image_url: [:string, nullable: true]
20
20
 
21
- attribute :product_id do |asset|
22
- asset.product&.prefixed_id
23
- end
21
+ prefixed_id_attributes :product
24
22
 
25
23
  # Returns prefixed IDs of variants this media is associated with.
26
24
  # Two paths coexist in 5.5:
@@ -34,8 +32,13 @@ module Spree
34
32
  ids.compact.uniq
35
33
  end
36
34
 
37
- attributes :position, :alt, :media_type,
38
- :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
39
42
 
40
43
  # Spree parses the YouTube/Vimeo link once, here, so no storefront has
41
44
  # to reimplement it. Nil on anything that isn't an external video.
@@ -0,0 +1,35 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ # The event shape for `newsletter_subscriber.subscription_requested` and
5
+ # `newsletter_subscriber.unsubscribe_requested`: the tokens a storefront
6
+ # needs to build the confirmation or unsubscribe link itself.
7
+ # `verification_token` is present only on a subscription request.
8
+ class NewsletterSubscriberRequestEventSerializer < BaseSerializer
9
+ typelize email: :string, unsubscribe_token: :string, verification_token: [:string, optional: true],
10
+ store_id: [:string, nullable: true], customer_id: [:string, nullable: true],
11
+ redirect_url: [:string, optional: true]
12
+
13
+ attributes :email
14
+
15
+ attribute :verification_token, if: proc { params[:include_verification_token] }, &:verification_token
16
+
17
+ attribute :unsubscribe_token do |subscriber|
18
+ subscriber.generate_token_for(:unsubscribe)
19
+ end
20
+
21
+ attribute :store_id do
22
+ params[:store]&.prefixed_id
23
+ end
24
+
25
+ attribute :customer_id do |subscriber|
26
+ subscriber.customer&.prefixed_id
27
+ end
28
+
29
+ attribute :redirect_url, if: proc { params[:redirect_url].present? } do
30
+ params[:redirect_url]
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -10,17 +10,13 @@ module Spree
10
10
 
11
11
  attributes :email, created_at: :iso8601, updated_at: :iso8601
12
12
 
13
- attribute :verified do |subscriber|
14
- subscriber.verified?
15
- end
13
+ attribute :verified, &:verified?
16
14
 
17
15
  attribute :verified_at do |subscriber|
18
16
  subscriber.verified_at&.iso8601
19
17
  end
20
18
 
21
- attribute :customer_id do |subscriber|
22
- subscriber.customer&.prefixed_id
23
- end
19
+ prefixed_id_attributes :customer
24
20
  end
25
21
  end
26
22
  end
@@ -6,9 +6,7 @@ module Spree
6
6
  option_type_name: :string, option_type_label: :string,
7
7
  color_code: 'string | null', image_url: 'string | null'
8
8
 
9
- attribute :option_type_id do |option_value|
10
- option_value.option_type&.prefixed_id
11
- end
9
+ prefixed_id_attributes :option_type
12
10
 
13
11
  attributes :name, :label, :position, :color_code
14
12
 
@@ -8,9 +8,7 @@ module Spree
8
8
  # their order history shows them — with the per-seller orders nested
9
9
  # inside it, each carrying its own items, delivery and tracking.
10
10
  class OrderGroupSerializer < BaseSerializer
11
- typelize number: :string, email: [:string, nullable: true], currency: :string,
12
- total: [:string, nullable: true], display_total: [:string, nullable: true],
13
- item_total: [:string, nullable: true], display_item_total: [:string, nullable: true],
11
+ typelize number: :string, email: [:string, nullable: true], currency: [:string, enum: Spree::Money::Rounding::CURRENCY_CODES, enum_type_name: 'CurrencyCode'],
14
12
  fulfillment_status: [:string, nullable: true, enum: Spree::Order::FULFILLMENT_STATUSES],
15
13
  payment_status: [:string, nullable: true, enum: Spree::Order::PAYMENT_STATUSES],
16
14
  completed_at: [:string, nullable: true],
@@ -18,31 +16,14 @@ module Spree
18
16
 
19
17
  attributes :number, :email, :currency
20
18
 
21
- attribute :total do |group|
22
- group.total.to_s
23
- end
24
-
25
- attribute :display_total do |group|
26
- group.display_total.to_s
27
- end
28
-
29
- attribute :item_total do |group|
30
- group.item_total.to_s
31
- end
32
-
33
- attribute :display_item_total do |group|
34
- group.display_item_total.to_s
35
- end
19
+ # Every figure is rolled up from the children, never prorated back
20
+ # down. The payments are the group's own: a split checkout pays once,
21
+ # against the group, so a child holds none.
22
+ include Spree::Api::V3::PurchaseSummary
36
23
 
37
24
  # Rolled up across the children rather than stored, so it can never
38
25
  # disagree with the orders it describes.
39
- attribute :fulfillment_status do |group|
40
- group.fulfillment_status
41
- end
42
-
43
- attribute :payment_status do |group|
44
- group.payment_status
45
- end
26
+ attributes :fulfillment_status, :payment_status
46
27
 
47
28
  attribute :completed_at do |group|
48
29
  group.created_at
@@ -51,6 +32,12 @@ module Spree
51
32
  one :billing_address, resource: proc { Spree.api.address_serializer }
52
33
  one :shipping_address, resource: proc { Spree.api.address_serializer }
53
34
 
35
+ # The card itself is deliberately not nested here — the split copies it
36
+ # onto every child, so it is already in the payload, and a group this
37
+ # deep pushes the generated Zod schema past what TypeScript will
38
+ # serialize into a declaration file. `gift_card_total` is the figure a
39
+ # summary needs, and only the group can answer it.
40
+
54
41
  # The whole point of the group: the customer sees one purchase, and the
55
42
  # seller orders inside it are how it will arrive.
56
43
  many :orders, resource: proc { Spree.api.order_serializer }
@@ -4,40 +4,21 @@ module Spree
4
4
  # Store API Order Serializer
5
5
  # Post-purchase order data (completed orders)
6
6
  class OrderSerializer < BaseSerializer
7
- typelize cart_id: [:string, nullable: true],
8
- number: :string, email: :string,
9
- customer_note: [:string, nullable: true],
10
- market_id: [:string, nullable: true], channel_id: [:string, nullable: true],
11
- company_id: [:string, nullable: true], company_name: [:string, nullable: true],
12
- po_number: [:string, nullable: true],
13
- po_document_filename: [:string, nullable: true],
14
- po_document_byte_size: ['number | null'],
15
- currency: :string, locale: [:string, nullable: true], total_quantity: :number,
7
+ typelize cart_id: [:string, nullable: true], number: :string, email: :string,
8
+ customer_note: [:string, nullable: true], market_id: [:string, nullable: true],
9
+ channel_id: [:string, nullable: true], company_id: [:string, nullable: true],
10
+ company_name: [:string, nullable: true], po_number: [:string, nullable: true],
11
+ po_document_filename: [:string, nullable: true], po_document_byte_size: ['number | null'],
12
+ currency: [:string, enum: Spree::Money::Rounding::CURRENCY_CODES, enum_type_name: 'CurrencyCode'], locale: [:string, nullable: true, enum: Spree::Locales::ALL, enum_type_name: 'LocaleCode'], total_quantity: :number,
16
13
  coupon_code: [:string, nullable: true],
17
14
  fulfillment_status: [:string, nullable: true, enum: Spree::Order::FULFILLMENT_STATUSES],
18
15
  payment_status: [:string, nullable: true, enum: Spree::Order::PAYMENT_STATUSES],
19
- item_total: [:string, nullable: true], display_item_total: [:string, nullable: true],
20
- delivery_total: [:string, nullable: true], display_delivery_total: [:string, nullable: true],
21
- adjustment_total: [:string, nullable: true], display_adjustment_total: [:string, nullable: true],
22
- discount_total: [:string, nullable: true], display_discount_total: [:string, nullable: true],
23
- tax_total: [:string, nullable: true], display_tax_total: [:string, nullable: true],
24
- included_tax_total: [:string, nullable: true], display_included_tax_total: [:string, nullable: true],
25
- additional_tax_total: [:string, nullable: true], display_additional_tax_total: [:string, nullable: true],
26
- fee_total: [:string, nullable: true], display_fee_total: [:string, nullable: true],
27
- store_credit_total: [:string, nullable: true], display_store_credit_total: [:string, nullable: true],
28
- gift_card_total: [:string, nullable: true], display_gift_card_total: [:string, nullable: true],
29
- covered_by_store_credit: :boolean,
30
- total: [:string, nullable: true], display_total: [:string, nullable: true],
31
- amount_due: [:string, nullable: true], display_amount_due: [:string, nullable: true],
32
16
  completed_at: [:string, nullable: true],
33
- withdrawal_period_ends_at: [:string, nullable: true],
34
- within_withdrawal_period: :boolean,
17
+ withdrawal_period_ends_at: [:string, nullable: true], within_withdrawal_period: :boolean,
35
18
  billing_address: { nullable: true }, shipping_address: { nullable: true },
36
19
  gift_card: { nullable: true }, market: { nullable: true }
37
20
 
38
- attribute :market_id do |order|
39
- order.market&.prefixed_id
40
- end
21
+ prefixed_id_attributes :market
41
22
 
42
23
  # The EU cooling-off deadline. Customer-facing by design: a buyer
43
24
  # deciding whether they can still send something back should not have
@@ -46,9 +27,7 @@ module Spree
46
27
  order.withdrawal_period_ends_at&.iso8601
47
28
  end
48
29
 
49
- attribute :within_withdrawal_period do |order|
50
- order.within_withdrawal_period?
51
- end
30
+ attribute :within_withdrawal_period, &:within_withdrawal_period?
52
31
 
53
32
  # The checkout handle this order was born from (nil for admin drafts).
54
33
  # Lets abandonment tooling match cart.* events to the conversion.
@@ -58,14 +37,10 @@ module Spree
58
37
  Spree::Cart.prefixed_id_for(order.cart_id)
59
38
  end
60
39
 
61
- attribute :channel_id do |order|
62
- order.channel&.prefixed_id
63
- end
40
+ prefixed_id_attributes :channel
64
41
 
65
42
  # Which company node the order was placed for — frozen at completion.
66
- attribute :company_id do |order|
67
- order.company&.prefixed_id
68
- end
43
+ prefixed_id_attributes :company
69
44
 
70
45
  attribute :company_name do |order|
71
46
  order.company&.name
@@ -88,27 +63,9 @@ module Spree
88
63
 
89
64
  # Nulled for gated (prices_hidden) guests, consistent with cart and
90
65
  # catalog price hiding.
91
- money_attributes :item_total, :display_item_total,
92
- :adjustment_total, :display_adjustment_total,
93
- :discount_total, :display_discount_total,
94
- :tax_total, :display_tax_total, :included_tax_total, :display_included_tax_total,
95
- :additional_tax_total, :display_additional_tax_total, :total, :display_total,
96
- :gift_card_total, :display_gift_card_total,
97
- :amount_due, :display_amount_due,
98
- :delivery_total, :display_delivery_total,
99
- :fee_total, :display_fee_total
100
-
101
- attribute :store_credit_total do |order|
102
- order.total_applied_store_credit.to_s unless params[:hide_prices]
103
- end
104
-
105
- attribute :display_store_credit_total do |order|
106
- order.display_total_applied_store_credit.to_s unless params[:hide_prices]
107
- end
108
-
109
- attribute :covered_by_store_credit do |order|
110
- order.covered_by_store_credit?
111
- end
66
+ include Spree::Api::V3::PurchaseSummary
67
+ money_attributes :adjustment_total, :display_adjustment_total,
68
+ descriptions: { adjustment_total: 'Every discount, fee and added tax together, as one amount.' }
112
69
 
113
70
  many :order_promotions, key: :discounts, resource: proc { Spree.api.applied_promotion_serializer }
114
71
  # Itemized charges (duties, surcharges, COD, handling) — see the cart
@@ -116,7 +73,6 @@ module Spree
116
73
  many :fees, resource: proc { Spree.api.fee_serializer }
117
74
  many :line_items, key: :items, resource: proc { Spree.api.line_item_serializer }
118
75
  many :fulfillments, resource: proc { Spree.api.fulfillment_serializer }
119
- many :payments, resource: proc { Spree.api.payment_serializer }
120
76
  one :billing_address, resource: proc { Spree.api.address_serializer }
121
77
  one :shipping_address, resource: proc { Spree.api.address_serializer }
122
78
  one :gift_card, resource: proc { Spree.api.gift_card_serializer }
@@ -0,0 +1,29 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ # The event shape for `customer.password_reset_requested`,
5
+ # `admin_user.password_reset_requested` and
6
+ # `seller_user.password_reset_requested`: what a storefront or back office
7
+ # needs to email the reset link itself. `reset_token` is a live credential,
8
+ # so these events reach only endpoints that name them.
9
+ class PasswordResetRequestedEventSerializer < BaseSerializer
10
+ typelize email: :string, reset_token: :string, store_id: [:string, nullable: true],
11
+ redirect_url: [:string, optional: true]
12
+
13
+ attributes :email
14
+
15
+ attribute :reset_token do
16
+ params[:reset_token]
17
+ end
18
+
19
+ attribute :store_id do
20
+ params[:store]&.prefixed_id
21
+ end
22
+
23
+ attribute :redirect_url, if: proc { params[:redirect_url].present? } do
24
+ params[:redirect_url]
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -11,13 +11,9 @@ module Spree
11
11
  payment_method.class.api_type
12
12
  end
13
13
 
14
- attribute :session_required do |payment_method|
15
- payment_method.session_required?
16
- end
14
+ attribute :session_required, &:session_required?
17
15
 
18
- attribute :source_required do |payment_method|
19
- payment_method.source_required?
20
- end
16
+ attribute :source_required, &:source_required?
21
17
  end
22
18
  end
23
19
  end
@@ -2,15 +2,12 @@ module Spree
2
2
  module Api
3
3
  module V3
4
4
  class PaymentSerializer < BaseSerializer
5
- typelize status: [:string, enum: Spree::Payment.statuses, enum_type_name: 'PaymentStatus'], payment_method_id: :string, response_code: [:string, nullable: true],
6
- number: :string, amount: [:string, nullable: true], display_amount: [:string, nullable: true],
5
+ typelize status: [:string, enum: Spree::Payment.statuses, enum_type_name: 'PaymentStatus'],
6
+ payment_method_id: :string, response_code: [:string, nullable: true], number: :string,
7
7
  source_type: [:string, nullable: true, enum: %w[credit_card store_credit payment_source]],
8
- source_id: [:string, nullable: true],
9
- source: 'CreditCard | StoreCredit | PaymentSource | null'
8
+ source_id: [:string, nullable: true], source: 'CreditCard | StoreCredit | PaymentSource | null'
10
9
 
11
- attribute :payment_method_id do |payment|
12
- payment.payment_method&.prefixed_id
13
- end
10
+ prefixed_id_attributes :payment_method
14
11
 
15
12
  attributes :response_code, :number, :status
16
13
 
@@ -31,9 +28,7 @@ module Spree
31
28
  end
32
29
  end
33
30
 
34
- attribute :source_id do |payment|
35
- payment.source&.prefixed_id
36
- end
31
+ prefixed_id_attributes :source
37
32
 
38
33
  attribute :source do |payment|
39
34
  next nil if payment.source.blank?
@@ -2,7 +2,7 @@ module Spree
2
2
  module Api
3
3
  module V3
4
4
  class PaymentSessionSerializer < BaseSerializer
5
- typelize status: [:string, enum: Spree::PaymentSession.statuses, enum_type_name: 'PaymentSessionStatus'], amount: :string, currency: :string,
5
+ typelize status: [:string, enum: Spree::PaymentSession.statuses, enum_type_name: 'PaymentSessionStatus'], currency: [:string, enum: Spree::Money::Rounding::CURRENCY_CODES, enum_type_name: 'CurrencyCode'],
6
6
  external_id: :string, external_data: 'Record<string, unknown>',
7
7
  expires_at: [:string, nullable: true], customer_external_id: [:string, nullable: true],
8
8
  payment_method_id: :string, order_id: [:string, nullable: true],
@@ -12,23 +12,15 @@ module Spree
12
12
  :customer_external_id,
13
13
  expires_at: :iso8601
14
14
 
15
- attribute :amount do |session|
16
- session.amount&.to_s
17
- end
15
+ money_attributes :amount
18
16
 
19
- attribute :payment_method_id do |session|
20
- session.payment_method&.prefixed_id
21
- end
17
+ prefixed_id_attributes :payment_method
22
18
 
23
19
  # Bridge: reports the owner (cart during checkout, order after
24
20
  # completion) until clients migrate to cart_id/order_id.
25
- attribute :order_id do |session|
26
- session.owner&.prefixed_id
27
- end
21
+ prefixed_id_attributes order_id: :owner
28
22
 
29
- attribute :cart_id do |session|
30
- session.cart&.prefixed_id
31
- end
23
+ prefixed_id_attributes :cart
32
24
 
33
25
  one :payment_method, resource: proc { Spree.api.payment_method_serializer }
34
26
  one :payment, resource: proc { Spree.api.payment_serializer },
@@ -9,21 +9,13 @@ module Spree
9
9
 
10
10
  attributes :status, :external_id, :external_client_secret, :external_data
11
11
 
12
- attribute :payment_method_id do |session|
13
- session.payment_method&.prefixed_id
14
- end
15
-
16
- attribute :payment_source_id do |session|
17
- session.payment_source&.prefixed_id
18
- end
12
+ prefixed_id_attributes :payment_method, :payment_source
19
13
 
20
14
  attribute :payment_source_type do |session|
21
- session.payment_source_type
15
+ Spree::Base.polymorphic_api_type(session.payment_source_type)
22
16
  end
23
17
 
24
- attribute :customer_id do |session|
25
- session.customer&.prefixed_id
26
- end
18
+ prefixed_id_attributes :customer
27
19
 
28
20
  one :payment_method, resource: proc { Spree.api.payment_method_serializer }
29
21
  end
@@ -11,9 +11,7 @@ module Spree
11
11
  Spree::RichTextHelper.to_plain_text(policy.body)
12
12
  end
13
13
 
14
- attribute :body_html do |policy|
15
- policy.body_html
16
- end
14
+ attributes :body_html
17
15
 
18
16
  # The one timestamp a store serializer carries. When a legal document
19
17
  # last changed is what a shopper is entitled to see on the page —
@@ -4,17 +4,15 @@ module Spree
4
4
  module Api
5
5
  module V3
6
6
  class PriceHistorySerializer < BaseSerializer
7
- typelize amount: :string,
8
- amount_in_cents: :number,
9
- display_amount: :string,
10
- currency: :string,
7
+ typelize display_amount: display_money_type(:display_amount, nullable: false),
8
+ currency: [:string, enum: Spree::Money::Rounding::CURRENCY_CODES, enum_type_name: 'CurrencyCode'],
11
9
  recorded_at: :string
12
10
 
13
- attributes :amount, :amount_in_cents, :currency
11
+ attributes :currency
14
12
 
15
- attribute :display_amount do |price_history|
16
- price_history.display_amount
17
- end
13
+ money_attributes :amount, unit_price: true
14
+
15
+ attributes :display_amount
18
16
 
19
17
  attribute :recorded_at do |price_history|
20
18
  price_history.recorded_at&.iso8601
@@ -5,17 +5,14 @@ module Spree
5
5
  # Represents a resolved/calculated price for storefront display
6
6
  # Can represent either a calculated price (with price list resolution) or a base price
7
7
  class PriceSerializer < BaseSerializer
8
- typelize amount: [:string, nullable: true],
9
- amount_in_cents: [:number, nullable: true],
10
- display_amount: [:string, nullable: true],
11
- compare_at_amount: [:string, nullable: true],
12
- compare_at_amount_in_cents: [:number, nullable: true],
13
- display_compare_at_amount: [:string, nullable: true],
14
- currency: [:string, nullable: true],
8
+ typelize display_amount: display_money_type(:display_amount),
9
+ display_compare_at_amount: display_money_type(:display_compare_at_amount),
10
+ currency: [:string, nullable: true, enum: Spree::Money::Rounding::CURRENCY_CODES, enum_type_name: 'CurrencyCode'],
15
11
  price_list_id: [:string, nullable: true]
16
12
 
17
- attributes :amount, :amount_in_cents, :compare_at_amount,
18
- :compare_at_amount_in_cents, :currency
13
+ attributes :currency
14
+
15
+ money_attributes :amount, :compare_at_amount, unit_price: true
19
16
 
20
17
  attribute :display_amount do |price|
21
18
  price.display_amount&.to_s
@@ -25,9 +22,7 @@ module Spree
25
22
  price.display_compare_at_amount&.to_s
26
23
  end
27
24
 
28
- attribute :price_list_id do |price|
29
- price.price_list&.prefixed_id
30
- end
25
+ prefixed_id_attributes :price_list
31
26
  end
32
27
  end
33
28
  end
@@ -4,11 +4,17 @@ module Spree
4
4
  class ProductFilterPriceRangeSerializer < BaseSerializer
5
5
  typelize id: :string,
6
6
  type: "'price_range'",
7
- min: :number,
8
- max: :number,
9
- currency: :string
7
+ min: :string,
8
+ max: :string,
9
+ currency: [:string, enum: Spree::Money::Rounding::CURRENCY_CODES, enum_type_name: 'CurrencyCode']
10
10
 
11
- attributes :id, :type, :min, :max, :currency
11
+ attributes :id, :type
12
+
13
+ # Search providers hand the bounds over as numbers.
14
+ attribute(:min) { |range| Spree::Money::Rounding.format(range[:min], range[:currency], unit_price: true) }
15
+ attribute(:max) { |range| Spree::Money::Rounding.format(range[:max], range[:currency], unit_price: true) }
16
+
17
+ attributes :currency
12
18
  end
13
19
  end
14
20
  end
@@ -9,13 +9,7 @@ module Spree
9
9
 
10
10
  attributes published_at: :iso8601, unpublished_at: :iso8601
11
11
 
12
- attribute :product_id do |publication|
13
- publication.product&.prefixed_id
14
- end
15
-
16
- attribute :channel_id do |publication|
17
- publication.channel&.prefixed_id
18
- end
12
+ prefixed_id_attributes :product, :channel
19
13
  end
20
14
  end
21
15
  end
@@ -24,27 +24,17 @@ module Spree
24
24
  :variant_count,
25
25
  available_on: :iso8601, preorder_ships_at: :iso8601
26
26
 
27
- attribute :purchasable do |product|
28
- product.purchasable?
29
- end
27
+ attribute :purchasable, &:purchasable?
30
28
 
31
29
  # True when this product is currently offered as a pre-order on the
32
30
  # requesting channel.
33
- attribute :preorder do |product|
34
- product.preorder?
35
- end
31
+ attribute :preorder, &:preorder?
36
32
 
37
- attribute :in_stock do |product|
38
- product.in_stock?
39
- end
33
+ attribute :in_stock, &:in_stock?
40
34
 
41
- attribute :backorderable do |product|
42
- product.backorderable?
43
- end
35
+ attribute :backorderable, &:backorderable?
44
36
 
45
- attribute :available do |product|
46
- product.available?
47
- end
37
+ attribute :available, &:available?
48
38
 
49
39
  attribute :description do |product|
50
40
  next if product.description.blank?
@@ -60,9 +50,7 @@ module Spree
60
50
  # buy-box winner: that moves with price and stock, and a client that
61
51
  # cached or linked this id must not find it pointing at a different
62
52
  # row tomorrow. On a single-seller catalog the two coincide anyway.
63
- attribute :default_variant_id do |product|
64
- product.default_variant&.prefixed_id
65
- end
53
+ prefixed_id_attributes :default_variant
66
54
 
67
55
  # The offer a storefront should lead with when several sellers share
68
56
  # the listing — the buy-box winner in the request's currency. Nil when
@@ -91,7 +79,7 @@ module Spree
91
79
  # single-seller catalog winner and default variant are the same row.
92
80
  attribute :price do |product|
93
81
  price = price_for(featured_variant(product))
94
- Spree.api.price_serializer.new(price, params: params).to_h if price.present?
82
+ price_serializer.new(price, params: params).to_h if price.present?
95
83
  end
96
84
 
97
85
  # Original price - base price without price list resolution (for showing strikethrough)
@@ -102,16 +90,14 @@ module Spree
102
90
  base = price_in(variant)
103
91
 
104
92
  if calculated.present? && base.present? && calculated.id != base.id
105
- Spree.api.price_serializer.new(base, params: params).to_h
93
+ price_serializer.new(base, params: params).to_h
106
94
  end
107
95
  end
108
96
 
109
97
  # Nil on the marketplace's own first-party products. The id is always
110
98
  # present so a storefront can group or link by seller without paying
111
99
  # for the expand; `?expand=seller` adds the public profile.
112
- attribute :seller_id do |product|
113
- product.seller&.prefixed_id
114
- end
100
+ prefixed_id_attributes :seller
115
101
 
116
102
  # Conditional associations
117
103
  one :seller,
@@ -162,7 +148,7 @@ module Spree
162
148
  attribute :prior_price,
163
149
  if: proc { expand?('prior_price') } do |product|
164
150
  record = price_in(featured_variant(product))&.prior_price
165
- Spree.api.price_history_serializer.new(record, params: params).to_h if record
151
+ price_history_serializer.new(record, params: params).to_h if record
166
152
  end
167
153
  end
168
154
  end
@@ -0,0 +1,26 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ # The marketplace's answer on a listing, as the seller sees it and as
5
+ # the `product_submission.*` webhook events carry it.
6
+ #
7
+ # The reviewer's identity is deliberately absent: a seller needs to
8
+ # know what to change, not which member of the marketplace's staff
9
+ # decided (docs/plans/6.0-seller-product-submission.md).
10
+ class ProductSubmissionSerializer < BaseSerializer
11
+ typelize status: [:string, enum: Spree::ProductSubmission.statuses, enum_type_name: 'ProductSubmissionStatus'],
12
+ product_id: :string,
13
+ review_note: [:string, nullable: true],
14
+ reviewed_at: [:string, nullable: true]
15
+
16
+ attributes :status, :review_note,
17
+ reviewed_at: :iso8601,
18
+ created_at: :iso8601
19
+
20
+ # A subscriber holding only the submission id would otherwise have to
21
+ # fetch the row back to learn which product was decided on.
22
+ prefixed_id_attributes :product
23
+ end
24
+ end
25
+ end
26
+ end