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
@@ -12,7 +12,7 @@ module Spree
12
12
  # unconditional presigner would let anyone holding one mint blobs in
13
13
  # the merchant's bucket. Reaching this action means holding the cart.
14
14
  #
15
- # Blobs are minted on private storage, because attaching a signed id
15
+ # Files are minted on private storage, because attaching a signed id
16
16
  # never moves a blob between services and a purchase order carries the
17
17
  # buyer's prices, terms and internal cost codes.
18
18
  class PoDocumentsController < Store::BaseController
@@ -21,10 +21,20 @@ module Spree
21
21
 
22
22
  before_action :find_cart!
23
23
 
24
+ request_params 'CreatePoDocumentParams', action: :create do |body|
25
+ body.attribute :filename, :string, required: true
26
+ body.attribute :content_type, :string, required: true
27
+ body.attribute :byte_size, :integer, required: true
28
+ body.attribute :checksum, :string,
29
+ required: true,
30
+ description: 'Base64-encoded MD5 digest of the file; the storage service checks the bytes against it.'
31
+ end
32
+
24
33
  # POST /api/v3/store/carts/:cart_id/po_document
25
34
  #
26
- # Exchanges blob metadata for an upload URL. The returned signed id
27
- # is then sent back as `po_document` on a cart update, which is what
35
+ # Takes the same flat request as the Admin API's `POST /files` and
36
+ # answers with the same shape. The returned signed id is then sent
37
+ # back as `po_document_signed_id` on a cart update, which is what
28
38
  # actually attaches it.
29
39
  #
30
40
  # The declared size and type are checked here, before any URL is
@@ -34,20 +44,20 @@ module Spree
34
44
  # only runs once the bytes are already stored. It is a gate on the
35
45
  # cheap lie, not a substitute: the attach-time check still reads
36
46
  # the stored object, which is what catches an under-declared size.
47
+ # Bytes in the request itself are not accepted here: a publishable
48
+ # key is public.
37
49
  def create
38
- return render_po_document_invalid unless acceptable_upload?
39
-
40
- blob = ActiveStorage::Blob.create_before_direct_upload!(
41
- service_name: Spree.private_storage_service_name, **blob_params
50
+ file_upload = Spree::FileUpload.new(
51
+ store: current_store,
52
+ visibility: 'private',
53
+ max_byte_size: Spree::Purchase::PurchaseOrder::MAX_PO_DOCUMENT_SIZE,
54
+ allowed_content_types: Spree::Purchase::PurchaseOrder::PO_DOCUMENT_CONTENT_TYPES,
55
+ **params.permit(*declared_permitted_attributes).to_h.symbolize_keys
42
56
  )
43
57
 
44
- render json: {
45
- direct_upload: {
46
- url: blob.service_url_for_direct_upload,
47
- headers: blob.service_headers_for_direct_upload
48
- },
49
- signed_id: blob.signed_id
50
- }, status: :created
58
+ return render_po_document_invalid unless file_upload.save
59
+
60
+ render json: Spree.api.file_upload_serializer.new(file_upload, params: serializer_params).to_h, status: :created
51
61
  end
52
62
 
53
63
  # GET /api/v3/store/carts/:cart_id/po_document
@@ -79,23 +89,11 @@ module Spree
79
89
 
80
90
  private
81
91
 
82
- def blob_params
83
- params.require(:blob).permit(:filename, :byte_size, :checksum, :content_type).to_h.symbolize_keys
84
- end
85
-
86
- def acceptable_upload?
87
- declared_size = Integer(blob_params[:byte_size].to_s, exception: false)
88
-
89
- declared_size&.positive? &&
90
- declared_size <= Spree::Purchase::PurchaseOrder::MAX_PO_DOCUMENT_SIZE &&
91
- Spree::Purchase::PurchaseOrder::PO_DOCUMENT_CONTENT_TYPES.include?(blob_params[:content_type])
92
- end
93
-
94
92
  def render_po_document_invalid
95
93
  render_error(
96
94
  code: ERROR_CODES[:parameter_invalid],
97
- message: Spree.t(
98
- :po_document_invalid,
95
+ message: I18n.t(
96
+ 'spree.po_document_invalid',
99
97
  size: ActiveSupport::NumberHelper.number_to_human_size(
100
98
  Spree::Purchase::PurchaseOrder::MAX_PO_DOCUMENT_SIZE
101
99
  )
@@ -10,15 +10,22 @@ module Spree
10
10
  before_action :require_authentication!
11
11
  before_action :find_cart!
12
12
 
13
+ request_params 'ApplyStoreCreditParams', action: :create do |body|
14
+ body.attribute :amount, :decimal,
15
+ example: '10.00',
16
+ description: 'Defaults to as much as the cart can use.'
17
+ end
18
+
13
19
  # POST /api/v3/store/carts/:cart_id/store_credits
14
20
  def create
15
21
  with_order_lock do
16
22
  result = Spree.store_credit_apply_service.call(
17
23
  order: @cart,
18
- amount: params[:amount].try(:to_f)
24
+ amount: money_param(:amount, @cart.currency)
19
25
  )
20
26
 
21
27
  if result.success?
28
+ sweep_unavailable_coupon_code!
22
29
  render_cart
23
30
  else
24
31
  render_service_error(result.error)
@@ -32,6 +39,7 @@ module Spree
32
39
  result = Spree.store_credit_remove_service.call(order: @cart)
33
40
 
34
41
  if result.success?
42
+ sweep_unavailable_coupon_code!
35
43
  render_cart
36
44
  else
37
45
  render_service_error(result.error)
@@ -25,6 +25,10 @@ module Spree
25
25
  # frozen onto the order at completion.
26
26
  before_action :require_kind_and_value!, only: :update
27
27
 
28
+ request_params('TaxIdentifierParams', action: :update) do |body|
29
+ body.include_attributes Spree::Api::V3::TaxIdentifierRequestSchema
30
+ end
31
+
28
32
  # GET /api/v3/store/carts/:cart_id/tax_identifier
29
33
  #
30
34
  # The registration this cart will be taxed against — the override
@@ -73,7 +77,7 @@ module Spree
73
77
  end
74
78
 
75
79
  def permitted_params
76
- params.permit(:kind, :value)
80
+ params.permit(*declared_permitted_attributes)
77
81
  end
78
82
 
79
83
  private
@@ -5,15 +5,66 @@ module Spree
5
5
  class CartsController < Store::ResourceController
6
6
  include Spree::Api::V3::CartResolvable
7
7
  include Spree::Api::V3::OrderLock
8
- # The cart accepts a `po_document` signed blob id.
8
+ # The cart accepts a `po_document_signed_id`.
9
9
  include ActiveStorage::SetCurrent
10
10
 
11
- # A tampered signed id would otherwise surface as a 500.
12
- rescue_from ActiveSupport::MessageVerifier::InvalidSignature, with: :render_invalid_po_document
13
-
14
11
  skip_before_action :set_resource
15
12
  prepend_before_action :require_authentication!, only: [:index, :associate]
16
13
 
14
+ CART_ADDRESS = Spree::Api::V3::RequestSchema.shape('CartAddressParams') do |schema|
15
+ schema.attribute :id, :id,
16
+ description: 'An existing address of the customer to use. The other fields are then ignored.'
17
+ schema.include_attributes Spree::Api::V3::Store::AddressRequestSchema
18
+ schema.attribute :quick_checkout, :boolean,
19
+ description: 'Relaxes validation (name, phone, postal code, street), for express checkouts that share a partial address.'
20
+ end
21
+
22
+ # Creating and updating a cart accept the same fields.
23
+ CART_FIELDS = Spree::Api::V3::RequestSchema.new do |schema|
24
+ schema.attribute :email, :string, format: :email, example: 'customer@example.com'
25
+ schema.attribute :customer_note, :string, example: 'Leave at door'
26
+ schema.attribute :market_id, :id
27
+ schema.attribute :currency, :currency
28
+ schema.attribute :locale, :locale
29
+ schema.attribute :shipping_address_id, :id,
30
+ description: 'An existing address to ship to.',
31
+ example: 'addr_abc123'
32
+ schema.attribute :billing_address_id, :id,
33
+ description: 'An existing address to bill.',
34
+ example: 'addr_def456'
35
+ schema.attribute :preferred_stock_location_id, :id
36
+ schema.attribute :company_id, :id, nullable: true, description: <<~TEXT.squish
37
+ The company node this purchase is for. The buyer must have standing over it: a membership
38
+ on that node or one of its ancestors. Null clears it, and with it the company's catalog,
39
+ pricing and tax anchoring.
40
+ TEXT
41
+ schema.attribute :po_number, :string, nullable: true, description: <<~TEXT.squish
42
+ The buyer's own purchase-order reference. Their accounting reconciles the order, the
43
+ invoice and the payment against it. Blank clears it.
44
+ TEXT
45
+ schema.attribute :po_document_signed_id, :string, nullable: true, description: <<~TEXT.squish
46
+ The `signed_id` of the buyer's purchase order, from `POST /store/carts/:id/po_document`.
47
+ Blank detaches the document.
48
+ TEXT
49
+ schema.attribute :use_shipping, :boolean,
50
+ description: 'When true, copies the shipping address to the billing address.'
51
+ schema.attribute :shipping_address, :object, shape: CART_ADDRESS, description: 'A new shipping address.'
52
+ schema.attribute :billing_address, :object, shape: CART_ADDRESS, description: 'A new billing address.'
53
+ schema.attribute :metadata, :hash,
54
+ description: 'Write-only key-value metadata, merged with what the cart has.'
55
+ schema.attribute :items, :array,
56
+ as: 'LineItemInputParams',
57
+ description: 'Items to upsert: sets the quantity of a variant already in the cart, adds the others.' do |item|
58
+ item.attribute :variant_id, :id, required: true, example: 'variant_abc123'
59
+ item.attribute :quantity, :integer, example: 2, description: 'Defaults to 1.'
60
+ item.attribute :metadata, :hash, description: 'Key-value metadata, merged with what the line item has.'
61
+ item.attribute :options, :hash
62
+ end
63
+ end
64
+
65
+ request_params('CreateCartParams', action: :create) { |body| body.include_attributes CART_FIELDS }
66
+ request_params('UpdateCartParams', action: :update) { |body| body.include_attributes CART_FIELDS }
67
+
17
68
  # GET /api/v3/store/carts/:id
18
69
  # Returns cart by prefixed ID
19
70
  # Auto-advances the checkout state machine so that shipments and
@@ -26,12 +77,13 @@ module Spree
26
77
  # with_order_lock, and a read must not 409 against the fence.
27
78
  if @cart.ship_address_id.present? && @cart.fulfillments.empty? && !@cart.completion_claimed?
28
79
  ActiveRecord::Base.connected_to(role: :writing) do
29
- with_order_lock { Spree::Checkout::Advance.call(order: @cart) }
80
+ with_order_lock { Spree.checkout_advance_service.call(order: @cart) }
30
81
  end
31
82
  end
32
83
 
33
84
  # The customer is returning to a cart that may have sat for days.
34
85
  sweep_unbuyable_lines!
86
+ sweep_unavailable_coupon_code!
35
87
  render_cart
36
88
  end
37
89
 
@@ -39,9 +91,9 @@ module Spree
39
91
  # Creates a new shopping cart (order)
40
92
  # Can be created by guests or authenticated customers
41
93
  def create
42
- result = Spree::Carts::Create.call(
94
+ result = Spree.carts_create_service.call(
43
95
  params: permitted_params.merge(
44
- user: current_user,
96
+ customer: current_user,
45
97
  store: current_store,
46
98
  channel: current_channel,
47
99
  currency: current_currency,
@@ -64,12 +116,13 @@ module Spree
64
116
  find_cart!
65
117
 
66
118
  with_order_lock do
67
- result = Spree::Carts::Update.call(
119
+ result = Spree.carts_update_service.call(
68
120
  cart: @cart,
69
121
  params: permitted_params
70
122
  )
71
123
 
72
124
  if result.success?
125
+ sweep_unavailable_coupon_code!
73
126
  render_cart
74
127
  else
75
128
  render_service_error(result.error, code: ERROR_CODES[:validation_error])
@@ -107,6 +160,7 @@ module Spree
107
160
  if result.success?
108
161
  # Signing in hands back a cart built earlier, possibly long ago.
109
162
  sweep_unbuyable_lines!
163
+ sweep_unavailable_coupon_code!
110
164
  render_cart
111
165
  else
112
166
  render_service_error(result.error.to_s)
@@ -121,7 +175,7 @@ module Spree
121
175
  find_cart!(include_completed: true)
122
176
 
123
177
  if @cart.guest_checkout_disallowed?
124
- return render_authentication_required('api.errors.guest_checkout_not_allowed', 'You must be signed in to complete checkout')
178
+ return render_authentication_required(I18n.t('spree.api.errors.guest_checkout_not_allowed'))
125
179
  end
126
180
 
127
181
  result = Spree::Dependencies.carts_complete_workflow.constantize.call(cart: @cart)
@@ -181,50 +235,8 @@ module Spree
181
235
 
182
236
  private
183
237
 
184
- def render_invalid_po_document
185
- render_error(
186
- code: ERROR_CODES[:validation_error],
187
- message: Spree.t(:po_document_invalid_signed_id),
188
- status: :unprocessable_content
189
- )
190
- end
191
-
192
238
  def permitted_params
193
- params.permit(
194
- *model_additional_permitted_attributes,
195
- :email,
196
- :customer_note,
197
- :market_id,
198
- :currency,
199
- :locale,
200
- :shipping_address_id,
201
- :billing_address_id,
202
- :preferred_stock_location_id,
203
- :company_id,
204
- # The buyer's own purchase-order reference, and the signed blob id
205
- # of the document behind it (from POST .../carts/:id/po_document).
206
- :po_number,
207
- :po_document,
208
- :use_shipping,
209
- shipping_address: address_params,
210
- billing_address: address_params,
211
- metadata: {},
212
- items: item_params
213
- )
214
- end
215
-
216
- def address_params
217
- [
218
- :id, :first_name, :last_name,
219
- :address1, :address2,
220
- :city, :postal_code, :phone, :company,
221
- # country_iso and state_abbr are the legacy write names, accepted until 6.1.
222
- :country_code, :country_iso, :state_code, :state_abbr, :state_name, :quick_checkout
223
- ]
224
- end
225
-
226
- def item_params
227
- [:variant_id, :quantity, { metadata: {}, options: {} }]
239
+ params.permit(*permitted_attributes)
228
240
  end
229
241
 
230
242
  # Find incomplete cart for associate action.
@@ -9,6 +9,18 @@ module Spree
9
9
  class AddressesController < BaseController
10
10
  include Spree::Api::V3::CompanyAddressWrites
11
11
 
12
+ request_params :company_address do |body|
13
+ body.include_attributes Spree::Api::V3::AddressRequestSchema
14
+ body.require_attributes :first_name, :last_name, :address1, :city, :country_code, on: :create
15
+ body.attribute :zipcode, :string, deprecated: 'Use `postal_code`. Removed in 6.1.'
16
+ body.attribute :default_billing, :boolean,
17
+ permit: false,
18
+ description: "True makes this the node's default billing address, false gives that up, and leaving it out changes nothing."
19
+ body.attribute :default_shipping, :boolean,
20
+ permit: false,
21
+ description: "True makes this the node's default shipping address, false gives that up, and leaving it out changes nothing."
22
+ end
23
+
12
24
  # POST /api/v3/store/companies/:company_id/addresses
13
25
  def create
14
26
  result = Spree.address_create_service.call(
@@ -65,14 +77,6 @@ module Spree
65
77
  def scope
66
78
  action_name == 'index' ? @parent.address_book : @parent.addresses
67
79
  end
68
-
69
- def parent_association
70
- :addresses
71
- end
72
-
73
- def permitted_params
74
- params.permit(:label, *Spree::Api::V3::AddressParams::ADDRESS_KEYS)
75
- end
76
80
  end
77
81
  end
78
82
  end
@@ -15,7 +15,7 @@ module Spree
15
15
  else
16
16
  render_error(
17
17
  code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:validation_error],
18
- message: Spree.t('company_invitations.not_pending'),
18
+ message: I18n.t('spree.company_invitations.not_pending'),
19
19
  status: :unprocessable_content
20
20
  )
21
21
  end
@@ -38,10 +38,6 @@ module Spree
38
38
  def scope
39
39
  action_name == 'index' ? @parent.invitations.pending : @parent.invitations
40
40
  end
41
-
42
- def parent_association
43
- :invitations
44
- end
45
41
  end
46
42
  end
47
43
  end
@@ -11,6 +11,10 @@ module Spree
11
11
  # email has an account. Any member can invite; restraint is
12
12
  # Enterprise's policy layer.
13
13
  class MembersController < BaseController
14
+ request_params 'AddCompanyMemberParams', action: :create do |body|
15
+ body.attribute :customer_email, :string, required: true, example: 'colleague@acme.test'
16
+ end
17
+
14
18
  # POST /api/v3/store/companies/:company_id/members
15
19
  def create
16
20
  result = Spree.company_add_member_service.call(
@@ -10,6 +10,10 @@ module Spree
10
10
  class CompaniesController < ResourceController
11
11
  prepend_before_action :require_authentication!
12
12
 
13
+ request_params 'UpdateCompanyParams', action: :update do |body|
14
+ body.attribute :name, :string, example: 'Acme Industrial Group'
15
+ end
16
+
13
17
  # PATCH /api/v3/store/companies/:id
14
18
  def update
15
19
  authorize_storefront_write!(@resource)
@@ -38,7 +42,7 @@ module Spree
38
42
  end
39
43
 
40
44
  def permitted_params
41
- params.permit(:name)
45
+ params.permit(*declared_permitted_attributes)
42
46
  end
43
47
  end
44
48
  end
@@ -17,6 +17,14 @@ module Spree
17
17
  # standing scope would 404 the unauthenticated invitee.
18
18
  skip_before_action :set_resource
19
19
 
20
+ request_params 'AcceptCompanyInvitationParams', action: :accept do |body|
21
+ body.attribute :first_name, :string, example: 'Ada'
22
+ body.attribute :last_name, :string, example: 'Lovelace'
23
+ body.attribute :phone, :string
24
+ body.attribute :password, :string, example: 'a-strong-password'
25
+ body.attribute :password_confirmation, :string, example: 'a-strong-password'
26
+ end
27
+
20
28
  # GET /api/v3/store/company_invitations/:token — what is being
21
29
  # joined. Expired and revoked tokens 404.
22
30
  def show
@@ -52,7 +60,7 @@ module Spree
52
60
  else
53
61
  render_error(
54
62
  code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:validation_error],
55
- message: Spree.t('company_invitations.not_pending'),
63
+ message: I18n.t('spree.company_invitations.not_pending'),
56
64
  status: :unprocessable_content
57
65
  )
58
66
  end
@@ -81,7 +89,7 @@ module Spree
81
89
  end
82
90
 
83
91
  def registration_params
84
- params.permit(:first_name, :last_name, :phone, :password, :password_confirmation)
92
+ params.permit(*declared_permitted_attributes)
85
93
  end
86
94
  end
87
95
  end
@@ -7,6 +7,13 @@ module Spree
7
7
  prepend_before_action :require_authentication!
8
8
  before_action :set_resource, only: [:show, :update, :destroy]
9
9
 
10
+ request_params :address do |body|
11
+ body.include_attributes Spree::Api::V3::Store::AddressRequestSchema
12
+ body.require_attributes :first_name, :last_name, :address1, :city, :country_code, on: :create
13
+ body.attribute :is_default_billing, :boolean, description: 'Makes this the default billing address.'
14
+ body.attribute :is_default_shipping, :boolean, description: 'Makes this the default shipping address.'
15
+ end
16
+
10
17
  # POST /api/v3/store/customers/me/addresses
11
18
  def create
12
19
  result = Spree.address_create_service.call(
@@ -49,10 +56,6 @@ module Spree
49
56
  @parent = current_user
50
57
  end
51
58
 
52
- def parent_association
53
- :addresses
54
- end
55
-
56
59
  def model_class
57
60
  Spree::Address
58
61
  end
@@ -62,13 +65,7 @@ module Spree
62
65
  end
63
66
 
64
67
  def permitted_params
65
- params.permit(
66
- *model_additional_permitted_attributes,
67
- :first_name, :last_name, :address1, :address2, :city,
68
- # country_iso and state_abbr are the legacy write names, accepted until 6.1.
69
- :postal_code, :phone, :company, :country_code, :country_iso, :state_code, :state_abbr, :state_name,
70
- :is_default_billing, :is_default_shipping
71
- )
68
+ params.permit(*permitted_attributes)
72
69
  end
73
70
  end
74
71
  end
@@ -12,10 +12,6 @@ module Spree
12
12
  @parent = current_user
13
13
  end
14
14
 
15
- def parent_association
16
- :credit_cards
17
- end
18
-
19
15
  # Customers are global; a saved card belongs to the store-scoped
20
16
  # payment method it was created against, so the nested collection is
21
17
  # bound to the current store's payment methods.
@@ -15,6 +15,11 @@ module Spree
15
15
 
16
16
  prepend_before_action :require_authentication!
17
17
 
18
+ request_params 'CreateDataRequestParams', action: :create do |body|
19
+ body.attribute :kind, :string, choices: Spree::DataRequest::KINDS, description: 'Defaults to `access`.'
20
+ body.attribute :current_password, :string, description: 'Required for `erasure`.'
21
+ end
22
+
18
23
  # POST /api/v3/store/customers/me/data_requests
19
24
  def create
20
25
  return render_current_password_invalid if erasure? && !valid_current_password?
@@ -46,10 +51,6 @@ module Spree
46
51
  @parent = current_user
47
52
  end
48
53
 
49
- def parent_association
50
- :data_requests
51
- end
52
-
53
54
  # A person sees their own requests and no one else's. The store
54
55
  # narrowing is restated because the parent branch of the base scope
55
56
  # replaces `for_store` with the association, and a customer is
@@ -69,7 +70,6 @@ module Spree
69
70
  def erasure?
70
71
  params[:kind].to_s == Spree::DataRequest::ERASURE
71
72
  end
72
-
73
73
  end
74
74
  end
75
75
  end
@@ -23,10 +23,6 @@ module Spree
23
23
  @parent = current_user
24
24
  end
25
25
 
26
- def parent_association
27
- :digital_links
28
- end
29
-
30
26
  # The `digital_links` association reaches links through orders and
31
27
  # line items, so it carries a DISTINCT and inherits an ORDER BY on
32
28
  # the line items' table. PostgreSQL rejects DISTINCT combined with
@@ -12,10 +12,6 @@ module Spree
12
12
  @parent = current_user
13
13
  end
14
14
 
15
- def parent_association
16
- :gift_cards
17
- end
18
-
19
15
  def model_class
20
16
  Spree::GiftCard
21
17
  end
@@ -20,10 +20,6 @@ module Spree
20
20
  @parent = current_user
21
21
  end
22
22
 
23
- def parent_association
24
- :orders
25
- end
26
-
27
23
  def scope
28
24
  super.for_store(current_store).complete
29
25
  end
@@ -14,6 +14,23 @@ module Spree
14
14
 
15
15
  skip_before_action :authenticate_user
16
16
 
17
+ request_params 'RequestPasswordResetParams', action: :create do |body|
18
+ body.attribute :email, :string,
19
+ required: true,
20
+ format: :email,
21
+ example: 'customer@example.com',
22
+ description: 'The email of the account to reset.'
23
+ body.attribute :redirect_url, :string,
24
+ format: :uri,
25
+ example: 'https://myshop.com/reset-password',
26
+ description: "Where the reset link sends the customer. Ignored unless it matches one of the store's allowed origins."
27
+ end
28
+
29
+ request_params 'ResetPasswordParams', action: :update do |body|
30
+ body.attribute :password, :string, required: true, example: 'newsecurepassword'
31
+ body.attribute :password_confirmation, :string, required: true, example: 'newsecurepassword'
32
+ end
33
+
17
34
  # POST /api/v3/store/password_resets
18
35
  def create
19
36
  redirect_url = params[:redirect_url]
@@ -32,14 +49,16 @@ module Spree
32
49
  user = Spree.customer_class.find_by(email: params[:email])
33
50
 
34
51
  if user
35
- token = user.generate_token_for(:password_reset)
36
- event_payload = { reset_token: token, email: user.email, store_id: current_store.prefixed_id }
37
- event_payload[:redirect_url] = redirect_url if redirect_url.present?
38
- user.publish_event('customer.password_reset_requested', event_payload)
52
+ event_name = 'customer.password_reset_requested'
53
+ payload = user.event_payload_for(
54
+ event_name,
55
+ reset_token: user.generate_token_for(:password_reset), store: current_store, redirect_url: redirect_url.presence
56
+ )
57
+ user.publish_event(event_name, payload)
39
58
  end
40
59
 
41
60
  # Always return 202 to prevent email enumeration
42
- render json: { message: Spree.t(:password_reset_requested, scope: :api) }, status: :accepted
61
+ render json: { message: I18n.t('spree.api.password_reset_requested') }, status: :accepted
43
62
  end
44
63
 
45
64
  # PATCH /api/v3/store/password_resets/:id
@@ -49,7 +68,7 @@ module Spree
49
68
  unless user
50
69
  return render_error(
51
70
  code: ERROR_CODES[:password_reset_token_invalid],
52
- message: Spree.t(:password_reset_token_invalid, scope: :api),
71
+ message: I18n.t('spree.api.password_reset_token_invalid'),
53
72
  status: :unprocessable_content
54
73
  )
55
74
  end
@@ -9,6 +9,15 @@ module Spree
9
9
  skip_before_action :set_resource
10
10
  before_action :set_payment_setup_session, only: [:show, :complete]
11
11
 
12
+ request_params 'CreatePaymentSetupSessionParams', action: :create do |body|
13
+ body.attribute :payment_method_id, :id, required: true, example: 'pm_abc123'
14
+ body.attribute :external_data, :hash, description: 'Provider-specific data passed to the gateway.'
15
+ end
16
+
17
+ request_params 'CompletePaymentSetupSessionParams', action: :complete do |body|
18
+ body.attribute :external_data, :hash, description: 'Provider-specific completion data.'
19
+ end
20
+
12
21
  # POST /api/v3/store/customer/payment_setup_sessions
13
22
  def create
14
23
  payment_method = current_store.payment_methods.find_by_prefix_id!(params[:payment_method_id])
@@ -50,10 +59,6 @@ module Spree
50
59
  @parent = current_user
51
60
  end
52
61
 
53
- def parent_association
54
- :payment_setup_sessions
55
- end
56
-
57
62
  def model_class
58
63
  Spree::PaymentSetupSession
59
64
  end
@@ -62,12 +67,8 @@ module Spree
62
67
  Spree.api.payment_setup_session_serializer
63
68
  end
64
69
 
65
- def resource_permitted_attributes
66
- [:payment_method_id, { external_data: {} }]
67
- end
68
-
69
70
  def complete_params
70
- params.permit({ external_data: {} })
71
+ params.permit(*declared_permitted_attributes)
71
72
  end
72
73
 
73
74
  private