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
@@ -0,0 +1,37 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ module EmailTemplates
6
+ class PublicationsController < Admin::BaseController
7
+ include Spree::Api::V3::Admin::EmailTemplateLookup
8
+
9
+ request_params 'EmailTemplateVersionParams' do |body|
10
+ body.include_attributes Spree::Api::V3::Admin::EmailTemplateLanguageRequestSchema
11
+ body.attribute :lock_version, :integer,
12
+ permit: false,
13
+ description: "The draft's `lock_version` as reviewed. A draft saved since is refused with 409."
14
+ end
15
+
16
+ before_action :authorize_sample_data!
17
+
18
+ # POST /api/v3/admin/email_templates/:email_template_id/publication
19
+ #
20
+ # Makes the draft live. A draft that does not render with sample data
21
+ # (for the layout or a partial: in any email using it) is refused with
22
+ # 422 and each problem's email and line.
23
+ def create
24
+ authorize! :update, Spree::EmailTemplate
25
+
26
+ result = Spree.email_template_publish_workflow.call(
27
+ store: current_store, key: email_template.key, locale: language, actor: current_actor,
28
+ lock_version: params[:lock_version].presence
29
+ )
30
+ render_email_template_result(result, status: :created)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,42 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ module EmailTemplates
6
+ class RestorationsController < Admin::BaseController
7
+ include Spree::Api::V3::Admin::EmailTemplateLookup
8
+
9
+ request_params 'EmailTemplateRestoreParams' do |body|
10
+ body.include_attributes Spree::Api::V3::Admin::EmailTemplateLanguageRequestSchema
11
+ body.attribute :lock_version, :integer,
12
+ nullable: true,
13
+ permit: false,
14
+ description: "The open draft's `lock_version`, or null when there is none; checked as when saving."
15
+ end
16
+
17
+ # POST /api/v3/admin/email_templates/:email_template_id/revisions/:revision_id/restoration
18
+ #
19
+ # Copies the revision into the language's draft, to be published
20
+ # like any change. A language without a version of its own can
21
+ # restore one of the version for every language its customers get.
22
+ def create
23
+ authorize! :update, Spree::EmailTemplate
24
+
25
+ revision = Spree::EmailTemplateRevision.where(
26
+ email_template: current_store.email_templates.where(
27
+ key: email_template.key, locale: [language, Spree::EmailTemplate::ANY_LOCALE]
28
+ )
29
+ ).find_by_prefix_id!(params[:revision_id])
30
+
31
+ result = Spree.email_template_restore_revision_workflow.call(
32
+ revision: revision, actor: current_actor, locale: language,
33
+ draft_version: params.key?(:lock_version) ? { lock_version: params[:lock_version] } : {}
34
+ )
35
+ render_email_template_result(result, status: :created)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,35 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ module EmailTemplates
6
+ # The published versions of an email template in one language, newest
7
+ # first. Reverting keeps them, so they outlive the published version.
8
+ class RevisionsController < ResourceController
9
+ include Spree::Api::V3::Admin::EmailTemplateLookup
10
+
11
+ before_action { authorize! :read, Spree::EmailTemplate }
12
+
13
+ protected
14
+
15
+ def model_class
16
+ Spree::EmailTemplateRevision
17
+ end
18
+
19
+ def serializer_class
20
+ Spree.api.admin_email_template_revision_serializer
21
+ end
22
+
23
+ def scope
24
+ email_template_revisions.order(created_at: :desc)
25
+ end
26
+
27
+ def collection_includes
28
+ [:published_by]
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,33 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ module EmailTemplates
6
+ class SampleRecordsController < Admin::BaseController
7
+ include Spree::Api::V3::Admin::EmailTemplateLookup
8
+
9
+ before_action :authorize_sample_data!
10
+
11
+ # GET /api/v3/admin/email_templates/:email_template_id/sample_records
12
+ #
13
+ # The store's five latest records the template can be previewed
14
+ # with (for the layout and partials, those of the email `email_key`
15
+ # names). Empty for an email that needs no record.
16
+ def index
17
+ authorize! :update, Spree::EmailTemplate
18
+
19
+ records = build_preview.email.sample_class.new(store: current_store).recent_records
20
+ render json: { data: records.map { |record| serializer_class.new(record, params: serializer_params).to_h } }
21
+ end
22
+
23
+ private
24
+
25
+ def serializer_class
26
+ Spree.api.admin_email_template_sample_record_serializer
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,44 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ module EmailTemplates
6
+ class TestEmailsController < 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/test_email
16
+ #
17
+ # Sends the template, rendered as the preview renders it, to the
18
+ # signed-in admin. Never to another address: the sample data comes
19
+ # from a real customer's records.
20
+ def create
21
+ authorize! :update, Spree::EmailTemplate
22
+ return render_no_recipient unless current_user
23
+
24
+ build_preview.call
25
+ Spree::EmailTemplateMailer.test_email(current_store, current_user.email, email_template.key, **preview_arguments).deliver_later
26
+
27
+ render json: { sent_to: current_user.email }, status: :accepted
28
+ end
29
+
30
+ private
31
+
32
+ def render_no_recipient
33
+ render_error(
34
+ code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:invalid_request],
35
+ message: I18n.t('spree.email_templates.test_email_needs_admin'),
36
+ status: :unprocessable_content
37
+ )
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,46 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ # The customer email templates, layout and shared partials merchants
6
+ # may edit, addressed by their key with dots
7
+ # (`spree.order_mailer.confirm_email`). `language` picks the version:
8
+ # a language code, or `any` (the default) for every language.
9
+ class EmailTemplatesController < Admin::BaseController
10
+ include Spree::Api::V3::Admin::EmailTemplateLookup
11
+
12
+ skip_before_action :load_email_template, only: :index
13
+
14
+ # GET /api/v3/admin/email_templates
15
+ def index
16
+ authorize! :read, Spree::EmailTemplate
17
+
18
+ entries = Spree::EmailTemplates::Entry.all(current_store, locale: language)
19
+ render json: { data: serialize_collection(entries), meta: {} }
20
+ end
21
+
22
+ # GET /api/v3/admin/email_templates/:id
23
+ def show
24
+ authorize! :read, Spree::EmailTemplate
25
+
26
+ render json: serialize_email_template
27
+ end
28
+
29
+ # DELETE /api/v3/admin/email_templates/:id
30
+ #
31
+ # Goes back to Spree's default for this language. The store's version
32
+ # and its history are kept, so a revision can still be restored.
33
+ def destroy
34
+ authorize! :update, Spree::EmailTemplate
35
+
36
+ result = Spree.email_template_revert_workflow.call(
37
+ store: current_store, key: email_template.key, locale: language, actor: current_actor,
38
+ lock_version: params[:lock_version].presence
39
+ )
40
+ render_email_template_result(result)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -16,6 +16,26 @@ module Spree
16
16
  # readable ones instead of gating on a single scope.
17
17
  skip_scope_check! only: :index
18
18
 
19
+ request_params :export do |body|
20
+ body.attribute :type, :string,
21
+ required: true, on: :create,
22
+ example: 'products',
23
+ description: 'Which dataset to export, as its shorthand: `products`, `orders`, `customers`, `product_translations`, `gift_cards`, `coupon_codes`, `newsletter_subscribers`, `price_list_prices`, `purchase_orders`, or a type an extension registers.'
24
+ body.attribute :record_selection, :string,
25
+ choices: %w[filtered all],
26
+ example: 'filtered',
27
+ description: '`filtered` (the default) keeps `search_params`; `all` ignores them and exports every record in scope.'
28
+ body.attribute :results_url, :string,
29
+ example: 'https://admin.example.com/store_abc/exports',
30
+ description: "Absolute URL of your admin exports view; the export-done email uses it as the download button target. Only honored when it matches one of the store's allowed origins."
31
+ # Read from the raw params: a Ransack hash nests groupings, which
32
+ # `permit(search_params: {})` rejects.
33
+ body.attribute :search_params, :hash,
34
+ permit: false,
35
+ example: { name_cont: 'shirt' },
36
+ description: 'A Ransack query, with the predicates the list endpoint accepts. A `price_list_prices` export requires `price_list_id_eq` naming a price list of the current store, and refuses `record_selection: "all"`.'
37
+ end
38
+
19
39
  # We stream the CSV inline rather than redirecting to ActiveStorage's
20
40
  # signed-URL endpoint because the SPA's Vite proxy only forwards
21
41
  # `/api/*`. A cross-origin redirect to `/rails/active_storage/...`
@@ -92,13 +112,10 @@ module Spree
92
112
  klass.new(attrs)
93
113
  end
94
114
 
95
- # `search_params` carries an arbitrary Ransack hash with nested
96
- # groupings (`{ g: [{ name_cont: 'foo' }] }`). Rails' `permit(k: {})`
97
- # rejects nested hashes, so we extract via `to_unsafe_h`. `:format`
98
- # is intentionally dropped — only CSV is supported and Rails' request
99
- # format would otherwise overwrite the model's enum.
115
+ # `:format` is intentionally dropped — only CSV is supported and Rails'
116
+ # request format would otherwise overwrite the model's enum.
100
117
  def permitted_params
101
- attrs = params.permit(*model_additional_permitted_attributes, :type, :record_selection, :results_url)
118
+ attrs = params.permit(*permitted_attributes)
102
119
  raw = params[:search_params]
103
120
  attrs[:search_params] = raw.respond_to?(:to_unsafe_h) ? raw.to_unsafe_h : raw if raw.present?
104
121
  attrs
@@ -0,0 +1,29 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ class FilesController < Admin::BaseController
6
+ include Spree::Api::V3::FileUploads
7
+
8
+ # The endpoint that uses a file checks its own scope (`write_customers`
9
+ # for an avatar, and so on), so this gate is the floor, not the only
10
+ # check. `write_products` covers the dominant flow, product media.
11
+ scoped_resource :products
12
+
13
+ skip_before_action :authenticate_user
14
+
15
+ # Permitted by Spree::Api::V3::FileUploads, shared with the seller branch.
16
+ request_params 'FileUploadCreateParams', action: :create do |body|
17
+ body.include_attributes Spree::Api::V3::FileUploadRequestSchema
18
+ end
19
+
20
+ private
21
+
22
+ def file_upload_serializer
23
+ Spree.api.admin_file_upload_serializer
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -11,6 +11,25 @@ module Spree
11
11
  class GiftCardBatchesController < ResourceController
12
12
  scoped_resource :gift_cards
13
13
 
14
+ request_params :gift_card_batch do |body|
15
+ body.attribute :prefix, :string,
16
+ required: true, on: :create,
17
+ example: 'WELCOME',
18
+ description: 'Lowercased and prepended to every generated code.'
19
+ body.attribute :amount, :decimal,
20
+ required: true, on: :create,
21
+ example: '25.00',
22
+ description: 'The amount of each card, greater than zero.'
23
+ body.attribute :codes_count, :integer,
24
+ required: true, on: :create,
25
+ example: 100,
26
+ description: 'How many cards to generate. Capped at `gift_card_batch_limit`; batches over `gift_card_batch_web_limit` generate in the background.'
27
+ body.attribute :currency, :currency,
28
+ example: 'USD',
29
+ description: 'ISO 4217 currency code. Defaults to the store currency.'
30
+ body.attribute :expires_at, :date, nullable: true, example: '2030-12-31'
31
+ end
32
+
14
33
  protected
15
34
 
16
35
  def model_class
@@ -22,7 +41,7 @@ module Spree
22
41
  end
23
42
 
24
43
  def permitted_params
25
- params.permit(*model_additional_permitted_attributes, :prefix, :codes_count, :amount, :expires_at, :currency)
44
+ params.permit(*permitted_attributes)
26
45
  end
27
46
  end
28
47
  end
@@ -13,6 +13,24 @@ module Spree
13
13
  class GiftCardsController < ResourceController
14
14
  scoped_resource :gift_cards
15
15
 
16
+ request_params :gift_card do |body|
17
+ body.attribute :amount, :decimal,
18
+ required: true, on: :create,
19
+ example: '25.00',
20
+ description: 'Greater than zero.'
21
+ body.attribute :currency, :currency,
22
+ example: 'USD',
23
+ description: 'ISO 4217 currency code. Defaults to the store currency.'
24
+ body.attribute :code, :string, example: 'WELCOME50', description: 'Generated when omitted.'
25
+ body.attribute :expires_at, :date, nullable: true, example: '2030-12-31'
26
+ # Resolved through the caller's ability by `resolve_customer`.
27
+ body.attribute :customer_id, :id,
28
+ nullable: true,
29
+ permit: false,
30
+ example: 'cus_UkLWZg9DAJ',
31
+ description: 'The customer the card belongs to. Needs the `read_customers` permission; null detaches it.'
32
+ end
33
+
16
34
  before_action :resolve_customer, only: [:create, :update]
17
35
 
18
36
  protected
@@ -26,7 +44,7 @@ module Spree
26
44
  end
27
45
 
28
46
  def permitted_params
29
- params.permit(*model_additional_permitted_attributes, :code, :amount, :expires_at, :currency).tap do |attributes|
47
+ params.permit(*permitted_attributes).tap do |attributes|
30
48
  attributes[:customer] = @customer if params.key?(:customer_id)
31
49
  end
32
50
  end
@@ -17,10 +17,43 @@ module Spree
17
17
  # writable ones instead of gating on a single scope.
18
18
  skip_scope_check! only: :index
19
19
 
20
+ request_params :import do |body|
21
+ body.attribute :type, :string,
22
+ required: true, on: :create,
23
+ example: 'products',
24
+ description: 'Which dataset to import, as its shorthand: `products`, `customers`, `product_translations`, `price_list_prices`, `purchase_orders`, or a type an extension registers.'
25
+ body.attribute :attachment_signed_id, :string,
26
+ required: true, on: :create,
27
+ description: 'The `signed_id` of the uploaded CSV, from `files.upload()` with `visibility: "private"`.'
28
+ body.attribute :delimiter, :string,
29
+ choices: [',', ';', '|', "\t"],
30
+ example: ',',
31
+ description: 'CSV column separator. Defaults to a comma.'
32
+ body.attribute :results_url, :string,
33
+ example: 'https://admin.example.com/store_abc/settings/imports',
34
+ description: "Absolute URL of your admin imports view; the import-done email links back to it with `?import=<id>` appended. Only honored when it matches one of the store's allowed origins."
35
+ body.attribute :price_list_id, :id,
36
+ description: 'For `price_list_prices` imports: the price list the rows are merged into. Must belong to the current store; other types ignore it.'
37
+ end
38
+
39
+ request_params 'ImportCompleteMappingParams', action: :complete_mapping do |body|
40
+ body.attribute :mappings, :array,
41
+ description: 'Column assignments to apply before processing starts. Omit to accept the ones assigned on create.' do |mapping|
42
+ mapping.attribute :schema_field, :string,
43
+ required: true,
44
+ example: 'slug',
45
+ description: "A schema field name from the import's `schema_fields`."
46
+ mapping.attribute :file_column, :string,
47
+ nullable: true,
48
+ example: 'Product Handle',
49
+ description: 'The CSV header to read the field from; null unmaps the field.'
50
+ end
51
+ end
52
+
20
53
  # POST /api/v3/admin/imports
21
54
  #
22
- # `attachment` is an ActiveStorage signed blob id obtained from
23
- # POST /api/v3/admin/direct_uploads. On success the import advances
55
+ # `attachment_signed_id` is a signed id obtained from
56
+ # POST /api/v3/admin/files. On success the import advances
24
57
  # straight into `mapping` (auto-assigning file columns from the CSV
25
58
  # headers), so the response already carries the mapping payload.
26
59
  def create
@@ -48,12 +81,6 @@ module Spree
48
81
  else
49
82
  render_errors(@resource.errors)
50
83
  end
51
- rescue ActiveSupport::MessageVerifier::InvalidSignature
52
- render_error(
53
- code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:validation_error],
54
- message: 'Invalid attachment signed id',
55
- status: :unprocessable_content
56
- )
57
84
  end
58
85
 
59
86
  # PATCH /api/v3/admin/imports/:id/complete_mapping
@@ -259,7 +286,7 @@ module Spree
259
286
  end
260
287
 
261
288
  def permitted_params
262
- params.permit(*model_additional_permitted_attributes, :type, :attachment, :preferred_delimiter, :results_url, :price_list_id)
289
+ params.permit(*permitted_attributes)
263
290
  end
264
291
 
265
292
  # A price-list import writes into one list, named by its prefixed id.
@@ -312,8 +339,7 @@ module Spree
312
339
 
313
340
  render_error(
314
341
  code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:validation_error],
315
- message: Spree.t(:cannot_modify_seller_import, scope: 'api',
316
- default: "This import belongs to a seller. It can be viewed here, but only the seller can retry or delete it."),
342
+ message: I18n.t('spree.api.cannot_modify_seller_import'),
317
343
  status: :unprocessable_content
318
344
  )
319
345
  true
@@ -15,6 +15,18 @@ module Spree
15
15
  subclassed_via -> { Spree::Integration.registered_classes },
16
16
  unknown_type_error: 'unknown_integration_type'
17
17
 
18
+ request_params :integration do |body|
19
+ body.attribute :type, :string,
20
+ required: true,
21
+ only: :create,
22
+ example: 'carrier',
23
+ description: 'Wire shorthand from the integration types endpoint.'
24
+ body.attribute :active, :boolean,
25
+ description: 'Activating runs the connection check, and a failed check is a 422.'
26
+ body.attribute :preferences, :hash,
27
+ description: 'Credential values. Secret preferences come back masked, and sending a masked value back keeps the stored secret.'
28
+ end
29
+
18
30
  # GET /api/v3/admin/integrations/types
19
31
  # Pure registry discovery — which integrations are installed and how
20
32
  # they're configured. Deliberately carries no per-store connected
@@ -47,7 +59,7 @@ module Spree
47
59
  end
48
60
 
49
61
  def permitted_params
50
- params.permit(*model_additional_permitted_attributes, :type, :active, preferences: {})
62
+ params.permit(*permitted_attributes)
51
63
  end
52
64
 
53
65
  # `types` is read-only discovery — maps to the read scope.
@@ -10,6 +10,14 @@ module Spree
10
10
  skip_scope_check!
11
11
  skip_before_action :authenticate_admin!, only: [:lookup, :accept]
12
12
 
13
+ request_params 'InvitationAcceptParams', action: :accept do |body|
14
+ body.attribute :password, :string,
15
+ description: 'Required when the invitee has no account yet: it creates one. An existing account signs in without it.'
16
+ body.attribute :password_confirmation, :string
17
+ body.attribute :first_name, :string
18
+ body.attribute :last_name, :string
19
+ end
20
+
13
21
  rate_limit to: Spree::Api::Config[:rate_limit_login],
14
22
  within: Spree::Api::Config[:rate_limit_window].seconds,
15
23
  store: Rails.cache,
@@ -24,7 +32,6 @@ module Spree
24
32
  end
25
33
 
26
34
  # POST /api/v3/admin/auth/invitations/:id/accept?token=:token
27
- # Body: { password?, password_confirmation?, first_name?, last_name? }
28
35
  def accept
29
36
  return unless load_invitation
30
37
 
@@ -99,7 +106,7 @@ module Spree
99
106
  end
100
107
 
101
108
  def signup_params(invitation)
102
- params.permit(:password, :password_confirmation, :first_name, :last_name).
109
+ params.permit(*declared_permitted_attributes).
103
110
  merge(email: invitation.email)
104
111
  end
105
112
 
@@ -13,6 +13,13 @@ module Spree
13
13
  # grantable separately from store configuration (6.0-admin-rbac.md).
14
14
  scoped_resource :staff
15
15
 
16
+ request_params :invitation do |body|
17
+ body.attribute :email, :string, required: true, on: :create
18
+ body.attribute :role_id, :id,
19
+ required: true, on: :create,
20
+ description: 'The role (`role_...`) the invitee gets on accepting.'
21
+ end
22
+
16
23
  # POST /api/v3/admin/invitations
17
24
  # Guards against inviting a new staff member straight into the admin
18
25
  # super-role unless the inviter already holds it.
@@ -34,13 +41,6 @@ module Spree
34
41
  render json: serialize_resource(@resource)
35
42
  end
36
43
 
37
- # Invitations are immutable post-create — UI calls `resend` for
38
- # token rotation, `destroy` to revoke. Clearing the action set
39
- # keeps the surface honest if a client ever fires PATCH directly.
40
- def update
41
- head :method_not_allowed
42
- end
43
-
44
44
  protected
45
45
 
46
46
  def model_class
@@ -72,7 +72,7 @@ module Spree
72
72
  # No extension union: an invitation carries only the role grant, which is
73
73
  # the authorization surface itself, not extensible resource data.
74
74
  def permitted_params
75
- attrs = params.permit(:email, :role_id)
75
+ attrs = params.permit(*declared_permitted_attributes)
76
76
  if attrs[:role_id].present? && Spree::PrefixedId.prefixed_id?(attrs[:role_id])
77
77
  attrs[:role_id] = Spree::PrefixedId.decode_prefixed_id(attrs[:role_id])
78
78
  end
@@ -14,7 +14,7 @@ module Spree
14
14
  def index
15
15
  render json: {
16
16
  data: current_store.supported_locales.map do |locale|
17
- Spree.api.locale_serializer.new(locale).to_h
17
+ Spree.api.admin_locale_serializer.new(locale).to_h
18
18
  end
19
19
  }
20
20
  end
@@ -13,6 +13,36 @@ module Spree
13
13
  class MarketsController < ResourceController
14
14
  scoped_resource :settings
15
15
 
16
+ request_params :market do |body|
17
+ body.attribute :name, :string,
18
+ required: true, on: :create,
19
+ example: 'Europe',
20
+ description: 'Display name, unique within the store.'
21
+ body.attribute :currency, :currency,
22
+ required: true, on: :create,
23
+ example: 'EUR',
24
+ description: 'ISO 4217 currency code.'
25
+ body.attribute :default_locale, :locale,
26
+ required: true, on: :create,
27
+ example: 'de',
28
+ description: 'Locale used as the market default. Always part of `supported_locales`.'
29
+ body.attribute :tax_inclusive, :boolean, description: 'Display prices with tax included.'
30
+ body.attribute :tax_provider, :string,
31
+ nullable: true,
32
+ example: 'internal',
33
+ description: 'Shorthand of the tax engine that prices this market, from the tax providers endpoint. Null uses the installation default.'
34
+ body.attribute :default, :boolean,
35
+ description: 'Setting true demotes the previous default market of the store.'
36
+ body.attribute :position, :integer, description: 'Sort order within the store; lower comes first.'
37
+ body.attribute :supported_locales, :array, of: :locale,
38
+ example: %w[de en],
39
+ description: 'Locales available in this market. The default locale is always included.'
40
+ body.attribute :country_codes, :array, of: :country,
41
+ required: true, on: :create,
42
+ example: %w[DE FR],
43
+ description: 'ISO 3166-1 alpha-2 codes of the countries in this market. At least one is required.'
44
+ end
45
+
16
46
  protected
17
47
 
18
48
  def model_class
@@ -30,15 +60,6 @@ module Spree
30
60
  def scope
31
61
  super.ordered
32
62
  end
33
-
34
- def permitted_params
35
- normalize_params(
36
- params.permit(
37
- :name, :currency, :default_locale, :tax_inclusive, :tax_provider,
38
- :default, :position, supported_locales: [], country_codes: []
39
- )
40
- )
41
- end
42
63
  end
43
64
  end
44
65
  end
@@ -7,6 +7,15 @@ module Spree
7
7
 
8
8
  skip_scope_check!
9
9
 
10
+ request_params :me do |body|
11
+ body.attribute :selected_locale, :string, example: 'de', description: 'The dashboard display language.'
12
+ body.attribute :first_name, :string
13
+ body.attribute :last_name, :string
14
+ body.attribute :avatar_signed_id, :string,
15
+ nullable: true,
16
+ description: 'A `signed_id` from `files.upload()` to set the avatar, or null to remove it. Omit it to keep the current photo.'
17
+ end
18
+
10
19
  before_action :require_current_user!
11
20
 
12
21
  # GET /api/v3/admin/me
@@ -33,8 +42,8 @@ module Spree
33
42
  # name, admin UI language, and avatar) — it operates on `current_user`
34
43
  # directly, so it needs no per-record authorization. Distinct from
35
44
  # PATCH /admin_users/:id, which is store-scoped staff management of
36
- # *other* users. `avatar` accepts an ActiveStorage direct-upload
37
- # signed id to set the photo, or `null` to remove it.
45
+ # *other* users. `avatar_signed_id` takes a signed id from
46
+ # POST /files to set the photo, or `null` to remove it.
38
47
  def update
39
48
  if current_user.update(permitted_params)
40
49
  render json: me_response
@@ -53,7 +62,7 @@ module Spree
53
62
 
54
63
  render_error(
55
64
  code: ERROR_CODES[:record_not_found],
56
- message: Spree.t(:me_no_current_user),
65
+ message: I18n.t('spree.me_no_current_user'),
57
66
  status: :not_found
58
67
  )
59
68
  end
@@ -70,7 +79,7 @@ module Spree
70
79
  end
71
80
 
72
81
  def permitted_params
73
- params.permit(:selected_locale, :first_name, :last_name, :avatar)
82
+ params.permit(*declared_permitted_attributes)
74
83
  end
75
84
 
76
85
  def me_response