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
@@ -9,9 +9,15 @@ module Spree
9
9
  # broad customer access.
10
10
  scoped_resource :store_credits
11
11
 
12
+ request_params :customer_store_credit do |body|
13
+ body.attribute :amount, :decimal, required: true, on: :create, example: '50.00'
14
+ body.attribute :currency, :currency, required: true, on: :create, only: :create, example: 'USD'
15
+ body.attribute :memo, :string
16
+ end
17
+
12
18
  # POST /api/v3/admin/customers/:customer_id/store_credits
13
19
  def create
14
- @resource = @parent.store_credits.new(create_attrs)
20
+ @resource = @parent.store_credits.new(store_credit_attributes)
15
21
  @resource.created_by = try_spree_current_user
16
22
  @resource.store ||= current_store
17
23
  authorize_resource!(@resource, :create)
@@ -27,7 +33,7 @@ module Spree
27
33
  def update
28
34
  authorize_resource!(@resource)
29
35
 
30
- if @resource.amount_used.positive? && update_attrs.key?(:amount)
36
+ if @resource.amount_used.positive? && store_credit_attributes.key?(:amount)
31
37
  render_error(
32
38
  code: 'store_credit_in_use',
33
39
  message: 'Cannot change amount on a store credit that has already been used',
@@ -36,7 +42,7 @@ module Spree
36
42
  return
37
43
  end
38
44
 
39
- if @resource.update(update_attrs)
45
+ if @resource.update(store_credit_attributes)
40
46
  render json: serialize_resource(@resource.reload)
41
47
  else
42
48
  render_validation_error(@resource.errors)
@@ -62,10 +68,6 @@ module Spree
62
68
 
63
69
  protected
64
70
 
65
- def parent_association
66
- :store_credits
67
- end
68
-
69
71
  # Customers are global; store credits belong to a store, so the
70
72
  # nested collection is bound to the current store.
71
73
  def scope
@@ -82,12 +84,8 @@ module Spree
82
84
 
83
85
  private
84
86
 
85
- def create_attrs
86
- params.permit(:amount, :currency, :memo).to_h
87
- end
88
-
89
- def update_attrs
90
- params.permit(:memo, :amount).to_h
87
+ def store_credit_attributes
88
+ params.permit(*declared_permitted_attributes).to_h
91
89
  end
92
90
  end
93
91
  end
@@ -8,6 +8,11 @@ module Spree
8
8
 
9
9
  include Spree::Api::V3::TaxIdentifierValidation
10
10
 
11
+ request_params :tax_identifier do |body|
12
+ body.include_attributes Spree::Api::V3::Admin::TaxIdentifierRequestSchema
13
+ body.require_attributes :kind, :value, on: :create
14
+ end
15
+
11
16
  # Re-declaring the filter replaces the inherited options, so the
12
17
  # standard actions have to be listed alongside the custom one.
13
18
  before_action :set_resource, only: [:show, :update, :destroy, :validate]
@@ -33,7 +38,7 @@ module Spree
33
38
  end
34
39
 
35
40
  def permitted_params
36
- params.permit(:kind, :value)
41
+ params.permit(*declared_permitted_attributes)
37
42
  end
38
43
  end
39
44
  end
@@ -7,6 +7,40 @@ module Spree
7
7
 
8
8
  scoped_resource :customers
9
9
 
10
+ request_params :customer do |body|
11
+ body.attribute :email, :string, required: true, on: :create, example: 'new@example.com'
12
+ body.attribute :first_name, :string
13
+ body.attribute :last_name, :string
14
+ body.attribute :phone, :string
15
+ body.attribute :password, :string,
16
+ description: 'Optional: a customer created without one claims the account through a password reset.'
17
+ body.attribute :password_confirmation, :string,
18
+ description: 'Optional: a customer created without one claims the account through a password reset.'
19
+ body.attribute :selected_locale, :string
20
+ body.attribute :avatar_signed_id, :string, description: 'A `signed_id` from `files.upload()`.'
21
+ body.attribute :accepts_email_marketing, :boolean
22
+ body.attribute :internal_note, :string,
23
+ description: 'Rich text HTML. Reads come back as this plus `internal_note_html`.'
24
+ body.attribute :metadata, :hash
25
+ body.attribute :tags, :array, of: :string
26
+ body.attribute :customer_group_ids, :array, of: :id,
27
+ description: "Replaces the customer's group membership."
28
+ end
29
+
30
+ %i[bulk_add_to_groups bulk_remove_from_groups].each do |action|
31
+ request_params 'CustomerBulkGroupsParams', action: action do |body|
32
+ body.attribute :ids, :array, of: :id, required: true, example: %w[cus_UkLWZg9DAJ cus_QrLWXg9CAJ]
33
+ body.attribute :customer_group_ids, :array, of: :id,
34
+ required: true,
35
+ example: %w[cg_UkLWZg9DAJ],
36
+ description: 'Groups from other stores are ignored.'
37
+ end
38
+ end
39
+
40
+ %i[bulk_add_tags bulk_remove_tags].each do |action|
41
+ request_params('BulkTagsParams', action: action) { |body| body.include_attributes Spree::Api::V3::Admin::BulkTagsRequestSchema }
42
+ end
43
+
10
44
  # Re-declaring a `before_action` for the same method REPLACES the
11
45
  # inherited registration rather than adding to it, so the inherited
12
46
  # actions have to be repeated here or show/update/destroy silently
@@ -51,7 +85,7 @@ module Spree
51
85
  rescue Spree::Core::DestroyWithOrdersError => e
52
86
  render_error(
53
87
  code: 'customer_has_orders',
54
- message: e.message.presence || Spree.t(:error_user_destroy_with_orders),
88
+ message: e.message.presence || I18n.t('spree.error_user_destroy_with_orders'),
55
89
  status: :unprocessable_content
56
90
  )
57
91
  end
@@ -108,7 +142,7 @@ module Spree
108
142
  if @resource.anonymized?
109
143
  return render_error(
110
144
  code: ERROR_CODES[:validation_error],
111
- message: Spree.t('data_request_errors.already_anonymized'),
145
+ message: I18n.t('spree.data_request_errors.already_anonymized'),
112
146
  status: :unprocessable_content
113
147
  )
114
148
  end
@@ -258,13 +292,7 @@ module Spree
258
292
  end
259
293
 
260
294
  def permitted_params
261
- params.permit(
262
- *model_additional_permitted_attributes,
263
- :email, :first_name, :last_name, :phone,
264
- :password, :password_confirmation, :selected_locale,
265
- :avatar, :accepts_email_marketing, :internal_note,
266
- metadata: {}, tags: [], customer_group_ids: []
267
- )
295
+ params.permit(*permitted_attributes)
268
296
  end
269
297
 
270
298
  # Authorises bulk group mutation, decodes prefixed IDs, then dispatches
@@ -11,6 +11,14 @@ module Spree
11
11
  class DataRequestsController < ResourceController
12
12
  scoped_resource :customers
13
13
 
14
+ request_params 'DataRequestCreateParams', action: :create do |body|
15
+ body.attribute :customer_id, :id, required: true
16
+ body.attribute :kind, :string,
17
+ required: true,
18
+ choices: Spree::DataRequest::KINDS,
19
+ description: "`access` asks for a copy of the customer's personal data; `erasure` asks for it to be erased."
20
+ end
21
+
14
22
  def create
15
23
  authorize! :create, Spree::DataRequest
16
24
 
@@ -15,7 +15,7 @@ module Spree
15
15
  type: klass.api_type,
16
16
  name: klass.human_name,
17
17
  description: klass.human_description,
18
- preference_schema: klass.serialized_preference_schema,
18
+ schema: klass.preference_json_schema,
19
19
  # Association-backed config (e.g. `product_ids`) a rule accepts
20
20
  # beyond its preferences, so admin UIs can render the right
21
21
  # editor without hardcoding rule types.
@@ -8,6 +8,18 @@ module Spree
8
8
  class RulesController < ResourceController
9
9
  scoped_resource :delivery_methods
10
10
 
11
+ request_params :delivery_method_rule do |body|
12
+ body.attribute :type, :string,
13
+ required: true,
14
+ only: :create,
15
+ example: 'excluded_products_rule',
16
+ description: 'A rule kind from the delivery method rule types endpoint.'
17
+ body.attribute :active, :boolean, description: 'Defaults to true on create.'
18
+ body.attribute :preferences, :hash, description: "Values for the rule kind's preference schema."
19
+ body.attribute :product_ids, :array, of: :id,
20
+ description: 'Products an association-backed rule (`excluded_products_rule`) applies to. An empty list clears them.'
21
+ end
22
+
11
23
  def create
12
24
  rule_class = Spree.delivery_method_rules.detect do |klass|
13
25
  klass.api_type == params[:type].to_s
@@ -16,8 +28,8 @@ module Spree
16
28
  if rule_class.nil?
17
29
  return render_error(
18
30
  code: ERROR_CODES[:validation_error],
19
- message: Spree.t('errors.messages.invalid_delivery_method_rule'),
20
- status: :unprocessable_entity
31
+ message: I18n.t('spree.errors.messages.invalid_delivery_method_rule'),
32
+ status: :unprocessable_content
21
33
  )
22
34
  end
23
35
 
@@ -62,7 +74,7 @@ module Spree
62
74
  end
63
75
 
64
76
  def permitted_params
65
- params.permit(*model_additional_permitted_attributes, :type, :active, preferences: {}, product_ids: [])
77
+ params.permit(*permitted_attributes)
66
78
  end
67
79
 
68
80
  private
@@ -86,11 +98,7 @@ module Spree
86
98
  end
87
99
 
88
100
  def assign_rule_preferences(rule)
89
- (permitted_params[:preferences] || {}).each do |key, value|
90
- next unless rule.has_preference?(key)
91
-
92
- rule.set_preference(key, value)
93
- end
101
+ rule.assign_preferences(permitted_params[:preferences]) if permitted_params[:preferences]
94
102
  end
95
103
 
96
104
  # Association-backed rule config (ExcludedProductsRule). Products are
@@ -5,6 +5,88 @@ module Spree
5
5
  class DeliveryMethodsController < ResourceController
6
6
  scoped_resource :delivery_methods
7
7
 
8
+ # A single POST/PATCH can ship eligibility rules and carrier service
9
+ # rows alongside the basics; `DeliveryMethod#rules=` / `#services=`
10
+ # reconcile to the desired set, so the dashboard saves the whole
11
+ # sheet in one round-trip.
12
+ request_params :delivery_method do |body|
13
+ body.attribute :name, :string, required: true, on: :create, example: 'Express'
14
+ body.attribute :admin_name, :string, nullable: true
15
+ body.attribute :code, :string, nullable: true
16
+ body.attribute :fulfillment_provider, :string,
17
+ example: 'manual',
18
+ description: 'Fulfillment provider shorthand (see the fulfillment providers endpoint), e.g. `manual`.'
19
+ body.attribute :pickup_point_provider, :string, nullable: true
20
+ body.attribute :rate_provider, :string,
21
+ nullable: true,
22
+ description: 'Rate provider shorthand (see the rate providers endpoint), e.g. `easy_post`. Omit or send null for the built-in provider, which prices through the method\'s calculator.'
23
+ body.attribute :storefront_visible, :boolean
24
+ body.attribute :available_to_sellers, :boolean,
25
+ description: "Marketplace only: whether a seller's packages may be quoted by this method. Off by default, and refused on a method that belongs to a seller."
26
+ body.attribute :tracking_url, :string, nullable: true
27
+ body.attribute :estimated_transit_business_days_min, :integer, nullable: true
28
+ body.attribute :estimated_transit_business_days_max, :integer, nullable: true
29
+ body.attribute :tax_category_id, :id,
30
+ nullable: true,
31
+ description: 'Prefixed tax category ID (`taxcat_...`), or null to clear.'
32
+ body.attribute :markup_flat, :decimal,
33
+ nullable: true,
34
+ description: 'Method-level flat handling fee added on top of provider-quoted rates.'
35
+ body.attribute :markup_percent, :decimal,
36
+ nullable: true,
37
+ description: 'Method-level percentage handling fee added on top of provider-quoted rates. Ignored for calculator-priced methods.'
38
+ body.attribute :delivery_profile_id, :id,
39
+ example: 'fp_86Rf07xd4z',
40
+ description: 'Delivery profile this method belongs to (`fp_...`); defaults to the store default profile.'
41
+ body.attribute :delivery_origin_group_id, :id,
42
+ description: "Origin group offering this method (`og_...`); defaults to the zone's group, else the profile's default group."
43
+ body.attribute :delivery_zone_id, :id,
44
+ nullable: true,
45
+ description: "Delivery zone narrowing destinations (`dz_...`), or null for no restriction. Must belong to the method's profile."
46
+ body.attribute :stock_location_ids, :array, of: :id,
47
+ description: 'Pickup locations (`sloc_...`); replaces the full set.'
48
+ body.attribute :calculator, :object,
49
+ description: "How the method prices a shipment: a type from the calculators endpoint and its preferences, matching that type's `schema`." do |calculator|
50
+ calculator.attribute :type, :string, example: 'flat_rate'
51
+ calculator.attribute :preferences, :hash, example: { amount: '12.5' }
52
+ end
53
+ # Permitted by `rule_attributes`, which adds the association-backed
54
+ # config each registered rule kind declares.
55
+ body.attribute :rules, :array,
56
+ permit: false,
57
+ description: 'Eligibility rules. Replaces the full set: omitted rules are removed.' do |rule|
58
+ rule.attribute :id, :id
59
+ rule.attribute :type, :string, description: 'A rule kind from the delivery method rule types endpoint.'
60
+ rule.attribute :active, :boolean
61
+ rule.attribute :preferences, :hash
62
+ rule.attribute :product_ids, :array, of: :id,
63
+ description: 'Products an association-backed rule (`excluded_products_rule`) applies to.'
64
+ end
65
+ body.attribute :services, :array,
66
+ as: 'DeliveryMethodServiceParams',
67
+ description: 'Carrier service rows: which provider services this method offers. Replaces the full set: omitted rows are removed; no rows means every service the provider returns is offered.' do |service|
68
+ service.attribute :id, :id, description: 'Prefixed row ID (`dms_...`) when updating an existing row.'
69
+ service.attribute :carrier, :string,
70
+ required: true,
71
+ example: 'UPS',
72
+ description: "Carrier identifier as the provider's API knows it."
73
+ service.attribute :service, :string,
74
+ required: true,
75
+ example: 'Ground',
76
+ description: "Service identifier as the provider's API knows it."
77
+ service.attribute :label, :string,
78
+ nullable: true,
79
+ description: 'Display label shown to customers instead of the carrier-derived name.'
80
+ service.attribute :markup_flat, :decimal,
81
+ nullable: true,
82
+ description: 'Overrides the method-level flat markup for this service.'
83
+ service.attribute :markup_percent, :decimal,
84
+ nullable: true,
85
+ description: 'Overrides the method-level percentage markup for this service.'
86
+ service.attribute :position, :integer
87
+ end
88
+ end
89
+
8
90
  # GET /api/v3/admin/delivery_methods/calculators
9
91
  # Registered delivery calculator classes with their preference
10
92
  # schemas, so admin UIs can render configuration forms.
@@ -15,7 +97,7 @@ module Spree
15
97
  {
16
98
  type: calculator_class.api_type,
17
99
  name: calculator_class.description,
18
- preference_schema: calculator_class.respond_to?(:serialized_preference_schema) ? calculator_class.serialized_preference_schema : []
100
+ schema: calculator_class.preference_json_schema
19
101
  }
20
102
  end
21
103
 
@@ -31,9 +113,8 @@ module Spree
31
113
 
32
114
  data = Spree.fulfillment_providers.map do |provider_class|
33
115
  {
34
- type: provider_class.to_s,
116
+ type: provider_class.api_type,
35
117
  name: provider_class.provider_name,
36
- integration_class: provider_class.integration_class,
37
118
  integration_type: integration_api_type(provider_class),
38
119
  available: provider_class.available_for_store?(current_store),
39
120
  digital: provider_class.digital?,
@@ -61,9 +142,8 @@ module Spree
61
142
  catalog = provider_class.service_catalog(integration)
62
143
 
63
144
  {
64
- type: provider_class.to_s,
145
+ type: provider_class.api_type,
65
146
  name: provider_class.provider_name,
66
- integration_class: provider_class.integration_class,
67
147
  integration_type: integration_api_type(provider_class),
68
148
  available: provider_class.available_for_store?(current_store),
69
149
  requires_address: provider_class.requires_address?,
@@ -76,15 +156,15 @@ module Spree
76
156
  }
77
157
  end
78
158
 
79
- render json: { data: data, default: Spree::DeliveryMethod::DEFAULT_RATE_PROVIDER }
159
+ render json: { data: data, default: Spree::ApiTyped.api_type_for(Spree::DeliveryMethod::DEFAULT_RATE_PROVIDER) }
80
160
  end
81
161
 
82
162
  def create
83
163
  @resource = model_class.new(assignable_params)
84
164
  authorize_resource!(@resource, :create)
85
- assign_calculator(@resource)
165
+ @resource.assign_calculator_attributes(permitted_params[:calculator])
86
166
 
87
- if @resource.errors.empty? && @resource.save
167
+ if @resource.save
88
168
  render json: serialize_resource(@resource), status: :created
89
169
  else
90
170
  render_validation_error(@resource.errors)
@@ -92,10 +172,12 @@ module Spree
92
172
  end
93
173
 
94
174
  def update
95
- @resource.assign_attributes(assignable_params)
96
- assign_calculator(@resource)
175
+ saved = save_atomically do
176
+ @resource.assign_attributes(assignable_params)
177
+ @resource.assign_calculator_attributes(permitted_params[:calculator])
178
+ end
97
179
 
98
- if @resource.errors.empty? && @resource.save
180
+ if saved
99
181
  render json: serialize_resource(@resource)
100
182
  else
101
183
  render_validation_error(@resource.errors)
@@ -120,23 +202,8 @@ module Spree
120
202
  Spree.api.admin_delivery_method_serializer
121
203
  end
122
204
 
123
- # A single POST/PATCH can ship eligibility rules and carrier service
124
- # rows alongside the basics; `DeliveryMethod#rules=` / `#services=`
125
- # reconcile to the desired set, so the dashboard saves the whole
126
- # sheet in one round-trip.
127
205
  def permitted_params
128
- params.permit(
129
- *model_additional_permitted_attributes,
130
- :name, :admin_name, :code, :fulfillment_provider,
131
- :pickup_point_provider, :rate_provider, :storefront_visible, :tracking_url,
132
- :available_to_sellers,
133
- :estimated_transit_business_days_min, :estimated_transit_business_days_max,
134
- :tax_category_id, :calculator_type, :markup_flat, :markup_percent,
135
- :delivery_profile_id, :delivery_origin_group_id, :delivery_zone_id,
136
- stock_location_ids: [], calculator_preferences: {},
137
- rules: rule_attributes,
138
- services: [:id, :carrier, :service, :label, :markup_flat, :markup_percent, :position]
139
- )
206
+ params.permit(*permitted_attributes, rules: rule_attributes)
140
207
  end
141
208
 
142
209
  def rule_attributes
@@ -160,7 +227,7 @@ module Spree
160
227
 
161
228
  # Resolves prefixed-ID params to records; calculator handled separately.
162
229
  def assignable_params
163
- attributes = permitted_params.except(:tax_category_id, :delivery_profile_id, :delivery_origin_group_id, :delivery_zone_id, :stock_location_ids, :calculator_type, :calculator_preferences)
230
+ attributes = permitted_params.except(:tax_category_id, :delivery_profile_id, :delivery_origin_group_id, :delivery_zone_id, :stock_location_ids, :calculator)
164
231
  if params.key?(:tax_category_id)
165
232
  attributes[:tax_category] = params[:tax_category_id].present? ? Spree::TaxCategory.accessible_by(current_ability, :show).find_by_prefix_id!(params[:tax_category_id]) : nil
166
233
  end
@@ -202,40 +269,6 @@ module Spree
202
269
  where(id: decode_prefixed_ids(ids)).
203
270
  pluck(:id)
204
271
  end
205
-
206
- def assign_calculator(delivery_method)
207
- calculator_type = permitted_params[:calculator_type]
208
- preferences = permitted_params[:calculator_preferences]
209
-
210
- if calculator_type.present? && delivery_method.calculator&.class&.api_type != calculator_type
211
- selected_calculator_class = Spree::DeliveryMethod.calculators.find do |klass|
212
- klass.api_type == calculator_type
213
- end
214
- unless selected_calculator_class
215
- delivery_method.errors.add(:calculator_type, :invalid)
216
- return
217
- end
218
-
219
- delivery_method.calculator = selected_calculator_class.new
220
- end
221
-
222
- return if preferences.blank?
223
-
224
- # A payload may carry preferences without naming a calculator —
225
- # editing the amount on a method that already has one, or creating
226
- # with the default. The model only builds the default calculator
227
- # at validation, so without this the preferences land on nothing
228
- # and the amount the merchant typed is silently replaced by a free
229
- # rate.
230
- delivery_method.ensure_calculator
231
- return if delivery_method.calculator.nil?
232
-
233
- preferences.each do |key, value|
234
- next unless delivery_method.calculator.has_preference?(key)
235
-
236
- delivery_method.calculator.set_preference(key, value)
237
- end
238
- end
239
272
  end
240
273
  end
241
274
  end
@@ -10,6 +10,13 @@ module Spree
10
10
  class OriginGroupsController < ResourceController
11
11
  scoped_resource :settings
12
12
 
13
+ request_params 'DeliveryOriginGroupParams' do |body|
14
+ body.attribute :name, :string, nullable: true, example: 'EU warehouse'
15
+ body.attribute :position, :integer
16
+ body.attribute :stock_location_ids, :array, of: :id,
17
+ description: 'Prefixed stock location IDs (`sloc_...`); replaces the full set. Empty means every store location.'
18
+ end
19
+
13
20
  def create
14
21
  @resource = scope.new(assignable_params)
15
22
  authorize_resource!(@resource, :create)
@@ -46,7 +53,7 @@ module Spree
46
53
  end
47
54
 
48
55
  def permitted_params
49
- params.permit(*model_additional_permitted_attributes, :name, :position, stock_location_ids: [])
56
+ params.permit(*permitted_attributes)
50
57
  end
51
58
 
52
59
  def collection_includes
@@ -9,18 +9,25 @@ module Spree
9
9
  class DeliveryProfilesController < ResourceController
10
10
  scoped_resource :settings
11
11
 
12
+ request_params :delivery_profile do |body|
13
+ body.attribute :name, :string, required: true, on: :create, example: 'Oversized'
14
+ body.attribute :kind, :string,
15
+ example: 'shipping',
16
+ description: 'Registered profile kind (`shipping`, `digital`, extension kinds) from the kinds endpoint. Read on create only; defaults to shipping.'
17
+ body.attribute :default, :boolean,
18
+ description: 'Promotes this profile to the store default; the previous default is demoted.'
19
+ body.attribute :position, :integer
20
+ body.attribute :stock_location_ids, :array, of: :id,
21
+ description: 'Prefixed stock location IDs (`sloc_...`); replaces the full set. Empty means every store location.'
22
+ end
23
+
12
24
  # GET /api/v3/admin/delivery_profiles/kinds
13
25
  # Registered profile kinds, so admin UIs offer extension-added
14
26
  # kinds without hardcoding the built-ins.
15
27
  def kinds
16
28
  authorize! :create, model_class
17
29
 
18
- data = Spree.delivery_profile_types.map do |profile_class|
19
- {
20
- type: profile_class.to_s,
21
- kind: profile_class.api_type
22
- }
23
- end
30
+ data = Spree.delivery_profile_types.map { |profile_class| { kind: profile_class.api_type } }
24
31
 
25
32
  render json: { data: data }
26
33
  end
@@ -63,7 +70,7 @@ module Spree
63
70
  end
64
71
 
65
72
  def permitted_params
66
- params.permit(*model_additional_permitted_attributes, :name, :default, :position, :kind, stock_location_ids: [])
73
+ params.permit(*permitted_attributes)
67
74
  end
68
75
 
69
76
  def collection_includes
@@ -8,6 +8,26 @@ module Spree
8
8
  class DeliveryZonesController < ResourceController
9
9
  scoped_resource :settings
10
10
 
11
+ request_params :delivery_zone do |body|
12
+ body.attribute :name, :string, required: true, on: :create, example: 'US North-East'
13
+ body.attribute :description, :string, nullable: true
14
+ body.attribute :delivery_profile_id, :id,
15
+ description: 'Delivery profile this zone belongs to (`fp_...`); defaults to the store default profile.'
16
+ body.attribute :delivery_origin_group_id, :id,
17
+ description: 'Origin group this zone belongs to (`og_...`).'
18
+ body.attribute :members, :array,
19
+ as: 'DeliveryZoneMemberParams',
20
+ description: "Replaces the zone's full member set atomically." do |member|
21
+ member.attribute :member_type, :string, required: true, choices: Spree::DeliveryZoneMember::MEMBER_TYPES
22
+ member.attribute :country_code, :country, example: 'US'
23
+ member.attribute :state_code, :string,
24
+ description: 'A subdivision code or name. Without `country_code` the country is inferred when only one country matches.'
25
+ member.attribute :postal_code_prefix, :string
26
+ member.attribute :postal_code_from, :string
27
+ member.attribute :postal_code_to, :string
28
+ end
29
+ end
30
+
11
31
  def create
12
32
  @resource = model_class.new(zone_params)
13
33
  authorize_resource!(@resource, :create)
@@ -50,11 +70,7 @@ module Spree
50
70
  end
51
71
 
52
72
  def permitted_params
53
- params.permit(
54
- *model_additional_permitted_attributes,
55
- :name, :description, :delivery_profile_id, :delivery_origin_group_id,
56
- members: [:member_type, :country_code, :state_code, :postal_code_prefix, :postal_code_from, :postal_code_to]
57
- )
73
+ params.permit(*permitted_attributes)
58
74
  end
59
75
 
60
76
  def collection_includes
@@ -0,0 +1,53 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ module EmailTemplates
6
+ # The draft of an editable email template: saved in any state, while
7
+ # customers keep receiving the published version.
8
+ class DraftsController < Admin::BaseController
9
+ include Spree::Api::V3::Admin::EmailTemplateLookup
10
+
11
+ request_params 'EmailTemplateDraftParams' do |body|
12
+ body.include_attributes Spree::Api::V3::Admin::EmailTemplateLanguageRequestSchema
13
+ body.attribute :subject, :string, nullable: true, example: 'Your order {{ order.number }} is confirmed'
14
+ body.attribute :body, :string,
15
+ example: '<mj-section><mj-column><mj-text>Thanks, {{ order.customer_name }}!</mj-text></mj-column></mj-section>'
16
+ body.attribute :lock_version, :integer,
17
+ nullable: true,
18
+ example: 0,
19
+ description: 'The `lock_version` the draft was loaded with, or null when there was no draft; a save from an older copy is refused with 409. Omit it to save without checking.'
20
+ body.attribute :rebase, :boolean,
21
+ description: "Marks the draft as based on Spree's current default, after reviewing what changed in it."
22
+ end
23
+
24
+ # PUT /api/v3/admin/email_templates/:email_template_id/draft
25
+ #
26
+ # Send the `lock_version` the draft was loaded with: a save made from
27
+ # an older copy is refused with 409, naming who saved last. `rebase`
28
+ # marks the draft as based on Spree's current default.
29
+ def update
30
+ authorize! :update, Spree::EmailTemplate
31
+
32
+ result = Spree.email_template_save_draft_workflow.call(
33
+ store: current_store, key: email_template.key, locale: language, actor: current_actor,
34
+ attributes: params.permit(*declared_permitted_attributes).to_h.symbolize_keys
35
+ )
36
+ render_email_template_result(result)
37
+ end
38
+
39
+ # DELETE /api/v3/admin/email_templates/:email_template_id/draft
40
+ def destroy
41
+ authorize! :update, Spree::EmailTemplate
42
+
43
+ result = Spree.email_template_discard_draft_workflow.call(
44
+ store: current_store, key: email_template.key, locale: language, lock_version: params[:lock_version].presence
45
+ )
46
+ render_email_template_result(result)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,34 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ module EmailTemplates
6
+ class PreviewsController < Admin::BaseController
7
+ include Spree::Api::V3::Admin::EmailTemplateLookup
8
+
9
+ request_params 'EmailTemplatePreviewParams' do |body|
10
+ body.include_attributes Spree::Api::V3::Admin::EmailTemplatePreviewRequestSchema
11
+ end
12
+
13
+ before_action :authorize_sample_data!
14
+
15
+ # POST /api/v3/admin/email_templates/:email_template_id/preview
16
+ #
17
+ # Renders the template with sample data built from the store's latest
18
+ # matching record, or the one `record_id` names. An unsaved `subject`
19
+ # and `body` take the place of the current version. Returns the
20
+ # rendered email and the variables it was rendered with.
21
+ def create
22
+ authorize! :update, Spree::EmailTemplate
23
+
24
+ preview = build_preview
25
+ preview.call
26
+
27
+ render json: Spree.api.admin_email_template_preview_serializer.new(preview, params: serializer_params).to_h
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end