spree_api 6.0.0.beta4 → 6.0.0.rc1

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 (342) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +4 -31
  3. data/app/controllers/concerns/spree/api/v3/admin/email_template_lookup.rb +139 -0
  4. data/app/controllers/concerns/spree/api/v3/admin/store_context.rb +1 -1
  5. data/app/controllers/concerns/spree/api/v3/admin/subclassed_resource.rb +1 -1
  6. data/app/controllers/concerns/spree/api/v3/cart_resolvable.rb +7 -0
  7. data/app/controllers/concerns/spree/api/v3/channel_resolution.rb +2 -2
  8. data/app/controllers/concerns/spree/api/v3/current_password_confirmation.rb +1 -1
  9. data/app/controllers/concerns/spree/api/v3/error_handler.rb +7 -2
  10. data/app/controllers/concerns/spree/api/v3/http_caching.rb +44 -11
  11. data/app/controllers/concerns/spree/api/v3/idempotent.rb +20 -5
  12. data/app/controllers/concerns/spree/api/v3/items_payload.rb +1 -1
  13. data/app/controllers/concerns/spree/api/v3/order_lock.rb +2 -2
  14. data/app/controllers/concerns/spree/api/v3/orders/delivery_actions.rb +1 -5
  15. data/app/controllers/concerns/spree/api/v3/orders/fulfillment_actions.rb +2 -10
  16. data/app/controllers/concerns/spree/api/v3/orders/post_sale_actions.rb +2 -10
  17. data/app/controllers/concerns/spree/api/v3/orders/shipping_label_actions.rb +4 -8
  18. data/app/controllers/concerns/spree/api/v3/permission_serialization.rb +9 -1
  19. data/app/controllers/concerns/spree/api/v3/seller/seller_context.rb +1 -1
  20. data/app/controllers/concerns/spree/api/v3/store/storefront_products.rb +5 -4
  21. data/app/controllers/concerns/spree/api/v3/storefront_gating.rb +11 -5
  22. data/app/controllers/spree/api/v3/admin/admin_users_controller.rb +0 -5
  23. data/app/controllers/spree/api/v3/admin/api_keys_controller.rb +1 -1
  24. data/app/controllers/spree/api/v3/admin/catalogs/order_minimums_controller.rb +0 -6
  25. data/app/controllers/spree/api/v3/admin/catalogs/quantity_rules_controller.rb +0 -4
  26. data/app/controllers/spree/api/v3/admin/catalogs_controller.rb +1 -1
  27. data/app/controllers/spree/api/v3/admin/channels_controller.rb +0 -4
  28. data/app/controllers/spree/api/v3/admin/collections/products_controller.rb +1 -2
  29. data/app/controllers/spree/api/v3/admin/commission_rates_controller.rb +2 -2
  30. data/app/controllers/spree/api/v3/admin/companies/addresses_controller.rb +0 -4
  31. data/app/controllers/spree/api/v3/admin/companies/invitations_controller.rb +1 -5
  32. data/app/controllers/spree/api/v3/admin/companies/memberships_controller.rb +0 -4
  33. data/app/controllers/spree/api/v3/admin/companies/tax_exemption_certificates_controller.rb +1 -9
  34. data/app/controllers/spree/api/v3/admin/companies/tax_identifiers_controller.rb +0 -4
  35. data/app/controllers/spree/api/v3/admin/companies_controller.rb +0 -4
  36. data/app/controllers/spree/api/v3/admin/countries_controller.rb +1 -1
  37. data/app/controllers/spree/api/v3/admin/coupon_codes_controller.rb +0 -4
  38. data/app/controllers/spree/api/v3/admin/custom_field_definitions_controller.rb +9 -1
  39. data/app/controllers/spree/api/v3/admin/custom_fields_controller.rb +0 -4
  40. data/app/controllers/spree/api/v3/admin/customer_groups_controller.rb +0 -4
  41. data/app/controllers/spree/api/v3/admin/customers/addresses_controller.rb +0 -4
  42. data/app/controllers/spree/api/v3/admin/customers/credit_cards_controller.rb +0 -4
  43. data/app/controllers/spree/api/v3/admin/customers/store_credits_controller.rb +0 -4
  44. data/app/controllers/spree/api/v3/admin/customers_controller.rb +2 -2
  45. data/app/controllers/spree/api/v3/admin/delivery_methods/rules_controller.rb +1 -1
  46. data/app/controllers/spree/api/v3/admin/delivery_methods_controller.rb +3 -5
  47. data/app/controllers/spree/api/v3/admin/delivery_profiles_controller.rb +1 -6
  48. data/app/controllers/spree/api/v3/admin/email_templates/drafts_controller.rb +40 -0
  49. data/app/controllers/spree/api/v3/admin/email_templates/previews_controller.rb +30 -0
  50. data/app/controllers/spree/api/v3/admin/email_templates/publications_controller.rb +30 -0
  51. data/app/controllers/spree/api/v3/admin/email_templates/restorations_controller.rb +34 -0
  52. data/app/controllers/spree/api/v3/admin/email_templates/revisions_controller.rb +35 -0
  53. data/app/controllers/spree/api/v3/admin/email_templates/sample_records_controller.rb +33 -0
  54. data/app/controllers/spree/api/v3/admin/email_templates/test_emails_controller.rb +40 -0
  55. data/app/controllers/spree/api/v3/admin/email_templates_controller.rb +46 -0
  56. data/app/controllers/spree/api/v3/admin/imports_controller.rb +1 -2
  57. data/app/controllers/spree/api/v3/admin/invitations_controller.rb +0 -7
  58. data/app/controllers/spree/api/v3/admin/me_controller.rb +1 -1
  59. data/app/controllers/spree/api/v3/admin/media_library_controller.rb +5 -5
  60. data/app/controllers/spree/api/v3/admin/order_routing_rules_controller.rb +0 -4
  61. data/app/controllers/spree/api/v3/admin/orders/deliveries_controller.rb +1 -5
  62. data/app/controllers/spree/api/v3/admin/orders/discount_codes_controller.rb +1 -1
  63. data/app/controllers/spree/api/v3/admin/orders/discounts_controller.rb +1 -1
  64. data/app/controllers/spree/api/v3/admin/orders/fulfillments_controller.rb +18 -16
  65. data/app/controllers/spree/api/v3/admin/orders/gift_cards_controller.rb +3 -3
  66. data/app/controllers/spree/api/v3/admin/orders/labels_controller.rb +2 -10
  67. data/app/controllers/spree/api/v3/admin/orders/payments_controller.rb +2 -14
  68. data/app/controllers/spree/api/v3/admin/orders/refunds_controller.rb +1 -5
  69. data/app/controllers/spree/api/v3/admin/orders_controller.rb +3 -3
  70. data/app/controllers/spree/api/v3/admin/password_resets_controller.rb +9 -7
  71. data/app/controllers/spree/api/v3/admin/price_lists_controller.rb +6 -53
  72. data/app/controllers/spree/api/v3/admin/prices_controller.rb +0 -4
  73. data/app/controllers/spree/api/v3/admin/products/digital_assets_controller.rb +2 -6
  74. data/app/controllers/spree/api/v3/admin/products/variants_controller.rb +0 -4
  75. data/app/controllers/spree/api/v3/admin/products_controller.rb +1 -1
  76. data/app/controllers/spree/api/v3/admin/promotion_actions_controller.rb +0 -4
  77. data/app/controllers/spree/api/v3/admin/promotion_rules_controller.rb +0 -4
  78. data/app/controllers/spree/api/v3/admin/purchase_orders_controller.rb +1 -1
  79. data/app/controllers/spree/api/v3/admin/resource_controller.rb +1 -1
  80. data/app/controllers/spree/api/v3/admin/seller_payouts_controller.rb +1 -9
  81. data/app/controllers/spree/api/v3/admin/seller_requirement_submissions_controller.rb +2 -10
  82. data/app/controllers/spree/api/v3/admin/seller_transfers_controller.rb +0 -4
  83. data/app/controllers/spree/api/v3/admin/sellers/invitations_controller.rb +1 -1
  84. data/app/controllers/spree/api/v3/admin/sellers/payouts_controller.rb +1 -1
  85. data/app/controllers/spree/api/v3/admin/sellers_controller.rb +2 -10
  86. data/app/controllers/spree/api/v3/admin/setup_controller.rb +3 -11
  87. data/app/controllers/spree/api/v3/admin/stock_transfers_controller.rb +1 -1
  88. data/app/controllers/spree/api/v3/admin/store_controller.rb +6 -1
  89. data/app/controllers/spree/api/v3/admin/tags_controller.rb +8 -5
  90. data/app/controllers/spree/api/v3/admin/webhook_endpoints_controller.rb +17 -12
  91. data/app/controllers/spree/api/v3/admin/webhook_events_controller.rb +25 -0
  92. data/app/controllers/spree/api/v3/base_controller.rb +10 -0
  93. data/app/controllers/spree/api/v3/resource_controller.rb +44 -1
  94. data/app/controllers/spree/api/v3/seller/auth_controller.rb +2 -2
  95. data/app/controllers/spree/api/v3/seller/countries_controller.rb +1 -1
  96. data/app/controllers/spree/api/v3/seller/exports_controller.rb +3 -3
  97. data/app/controllers/spree/api/v3/seller/invitation_acceptances_controller.rb +3 -3
  98. data/app/controllers/spree/api/v3/seller/invitations_controller.rb +1 -1
  99. data/app/controllers/spree/api/v3/seller/me_controller.rb +1 -1
  100. data/app/controllers/spree/api/v3/seller/orders/labels_controller.rb +1 -1
  101. data/app/controllers/spree/api/v3/seller/password_resets_controller.rb +10 -11
  102. data/app/controllers/spree/api/v3/seller/products_controller.rb +2 -1
  103. data/app/controllers/spree/api/v3/seller/requirement_submissions_controller.rb +1 -1
  104. data/app/controllers/spree/api/v3/seller/team_controller.rb +1 -1
  105. data/app/controllers/spree/api/v3/store/carts/discount_codes_controller.rb +1 -1
  106. data/app/controllers/spree/api/v3/store/carts/fulfillments_controller.rb +3 -11
  107. data/app/controllers/spree/api/v3/store/carts/gift_cards_controller.rb +5 -3
  108. data/app/controllers/spree/api/v3/store/carts/items_controller.rb +6 -2
  109. data/app/controllers/spree/api/v3/store/carts/payment_sessions_controller.rb +1 -1
  110. data/app/controllers/spree/api/v3/store/carts/payments_controller.rb +5 -3
  111. data/app/controllers/spree/api/v3/store/carts/po_documents_controller.rb +2 -2
  112. data/app/controllers/spree/api/v3/store/carts/store_credits_controller.rb +2 -0
  113. data/app/controllers/spree/api/v3/store/carts_controller.rb +9 -6
  114. data/app/controllers/spree/api/v3/store/companies/addresses_controller.rb +0 -4
  115. data/app/controllers/spree/api/v3/store/companies/invitations_controller.rb +1 -5
  116. data/app/controllers/spree/api/v3/store/company_invitations_controller.rb +1 -1
  117. data/app/controllers/spree/api/v3/store/customer/addresses_controller.rb +0 -4
  118. data/app/controllers/spree/api/v3/store/customer/credit_cards_controller.rb +0 -4
  119. data/app/controllers/spree/api/v3/store/customer/data_requests_controller.rb +0 -5
  120. data/app/controllers/spree/api/v3/store/customer/digital_links_controller.rb +0 -4
  121. data/app/controllers/spree/api/v3/store/customer/gift_cards_controller.rb +0 -4
  122. data/app/controllers/spree/api/v3/store/customer/orders_controller.rb +0 -4
  123. data/app/controllers/spree/api/v3/store/customer/password_resets_controller.rb +8 -6
  124. data/app/controllers/spree/api/v3/store/customer/payment_setup_sessions_controller.rb +0 -4
  125. data/app/controllers/spree/api/v3/store/customer/store_credits_controller.rb +0 -5
  126. data/app/controllers/spree/api/v3/store/data_request_downloads_controller.rb +1 -1
  127. data/app/controllers/spree/api/v3/store/delivery_methods_controller.rb +1 -1
  128. data/app/controllers/spree/api/v3/store/newsletter_subscribers_controller.rb +5 -14
  129. data/app/controllers/spree/api/v3/store/orders/claims_controller.rb +1 -5
  130. data/app/controllers/spree/api/v3/store/orders/returns_controller.rb +1 -5
  131. data/app/controllers/spree/api/v3/store/wishlist_items_controller.rb +0 -4
  132. data/app/serializers/spree/api/v3/admin/address_serializer.rb +5 -7
  133. data/app/serializers/spree/api/v3/admin/api_key_serializer.rb +2 -6
  134. data/app/serializers/spree/api/v3/admin/catalog_assignment_serializer.rb +1 -3
  135. data/app/serializers/spree/api/v3/admin/catalog_order_minimum_serializer.rb +1 -7
  136. data/app/serializers/spree/api/v3/admin/catalog_product_term_serializer.rb +1 -3
  137. data/app/serializers/spree/api/v3/admin/catalog_quantity_rule_serializer.rb +1 -3
  138. data/app/serializers/spree/api/v3/admin/channel_serializer.rb +5 -6
  139. data/app/serializers/spree/api/v3/admin/claim_reason_serializer.rb +1 -3
  140. data/app/serializers/spree/api/v3/admin/commission_rule_serializer.rb +1 -3
  141. data/app/serializers/spree/api/v3/admin/coupon_code_serializer.rb +1 -7
  142. data/app/serializers/spree/api/v3/admin/credit_card_serializer.rb +1 -7
  143. data/app/serializers/spree/api/v3/admin/custom_field_definition_serializer.rb +6 -2
  144. data/app/serializers/spree/api/v3/admin/customer_serializer.rb +2 -10
  145. data/app/serializers/spree/api/v3/admin/data_request_serializer.rb +2 -6
  146. data/app/serializers/spree/api/v3/admin/delivery_method_serializer.rb +8 -22
  147. data/app/serializers/spree/api/v3/admin/delivery_origin_group_serializer.rb +1 -3
  148. data/app/serializers/spree/api/v3/admin/delivery_serializer.rb +1 -3
  149. data/app/serializers/spree/api/v3/admin/delivery_zone_serializer.rb +1 -7
  150. data/app/serializers/spree/api/v3/admin/digital_asset_serializer.rb +4 -2
  151. data/app/serializers/spree/api/v3/admin/email_template_draft_serializer.rb +19 -0
  152. data/app/serializers/spree/api/v3/admin/email_template_preview_serializer.rb +38 -0
  153. data/app/serializers/spree/api/v3/admin/email_template_revision_serializer.rb +18 -0
  154. data/app/serializers/spree/api/v3/admin/email_template_sample_record_serializer.rb +13 -0
  155. data/app/serializers/spree/api/v3/admin/email_template_serializer.rb +61 -0
  156. data/app/serializers/spree/api/v3/admin/exchange_serializer.rb +1 -3
  157. data/app/serializers/spree/api/v3/admin/export_serializer.rb +1 -7
  158. data/app/serializers/spree/api/v3/admin/fulfillment_item_serializer.rb +1 -7
  159. data/app/serializers/spree/api/v3/admin/fulfillment_serializer.rb +1 -7
  160. data/app/serializers/spree/api/v3/admin/gift_card_serializer.rb +1 -7
  161. data/app/serializers/spree/api/v3/admin/line_item_serializer.rb +2 -6
  162. data/app/serializers/spree/api/v3/admin/market_serializer.rb +4 -2
  163. data/app/serializers/spree/api/v3/admin/media_serializer.rb +1 -3
  164. data/app/serializers/spree/api/v3/admin/order_cancellation_reason_serializer.rb +1 -3
  165. data/app/serializers/spree/api/v3/admin/order_group_serializer.rb +3 -9
  166. data/app/serializers/spree/api/v3/admin/order_routing_rule_serializer.rb +1 -3
  167. data/app/serializers/spree/api/v3/admin/order_serializer.rb +5 -15
  168. data/app/serializers/spree/api/v3/admin/package_type_serializer.rb +1 -3
  169. data/app/serializers/spree/api/v3/admin/payment_method_serializer.rb +7 -1
  170. data/app/serializers/spree/api/v3/admin/payment_serializer.rb +2 -7
  171. data/app/serializers/spree/api/v3/admin/permission_serializer.rb +4 -4
  172. data/app/serializers/spree/api/v3/admin/price_rule_serializer.rb +1 -3
  173. data/app/serializers/spree/api/v3/admin/product_serializer.rb +2 -10
  174. data/app/serializers/spree/api/v3/admin/product_submission_serializer.rb +2 -10
  175. data/app/serializers/spree/api/v3/admin/product_type_serializer.rb +1 -3
  176. data/app/serializers/spree/api/v3/admin/promotion_action_serializer.rb +1 -3
  177. data/app/serializers/spree/api/v3/admin/promotion_rule_serializer.rb +1 -3
  178. data/app/serializers/spree/api/v3/admin/purchase_order_item_serializer.rb +2 -15
  179. data/app/serializers/spree/api/v3/admin/purchase_order_serializer.rb +2 -15
  180. data/app/serializers/spree/api/v3/admin/refund_reason_serializer.rb +1 -3
  181. data/app/serializers/spree/api/v3/admin/refund_serializer.rb +4 -1
  182. data/app/serializers/spree/api/v3/admin/return_line_item_serializer.rb +1 -0
  183. data/app/serializers/spree/api/v3/admin/return_reason_serializer.rb +1 -3
  184. data/app/serializers/spree/api/v3/admin/return_serializer.rb +3 -11
  185. data/app/serializers/spree/api/v3/admin/saved_report_serializer.rb +1 -3
  186. data/app/serializers/spree/api/v3/admin/seller_payout_serializer.rb +4 -2
  187. data/app/serializers/spree/api/v3/admin/seller_requirement_status_serializer.rb +2 -6
  188. data/app/serializers/spree/api/v3/admin/seller_requirement_submission_serializer.rb +1 -7
  189. data/app/serializers/spree/api/v3/admin/seller_serializer.rb +5 -15
  190. data/app/serializers/spree/api/v3/admin/seller_transfer_serializer.rb +4 -2
  191. data/app/serializers/spree/api/v3/admin/shipping_label_serializer.rb +6 -19
  192. data/app/serializers/spree/api/v3/admin/stock_level_serializer.rb +1 -3
  193. data/app/serializers/spree/api/v3/admin/stock_location_serializer.rb +1 -3
  194. data/app/serializers/spree/api/v3/admin/stock_movement_serializer.rb +1 -3
  195. data/app/serializers/spree/api/v3/admin/stock_receipt_item_serializer.rb +1 -7
  196. data/app/serializers/spree/api/v3/admin/stock_receipt_serializer.rb +1 -3
  197. data/app/serializers/spree/api/v3/admin/stock_reservation_serializer.rb +1 -3
  198. data/app/serializers/spree/api/v3/admin/stock_transfer_item_serializer.rb +1 -3
  199. data/app/serializers/spree/api/v3/admin/store_credit_event_serializer.rb +1 -3
  200. data/app/serializers/spree/api/v3/admin/store_credit_serializer.rb +4 -18
  201. data/app/serializers/spree/api/v3/admin/store_serializer.rb +24 -6
  202. data/app/serializers/spree/api/v3/admin/supplier_serializer.rb +1 -3
  203. data/app/serializers/spree/api/v3/admin/tax_exemption_certificate_serializer.rb +3 -9
  204. data/app/serializers/spree/api/v3/admin/tax_identifier_serializer.rb +1 -3
  205. data/app/serializers/spree/api/v3/admin/tax_line_serializer.rb +5 -1
  206. data/app/serializers/spree/api/v3/admin/tax_rate_serializer.rb +1 -7
  207. data/app/serializers/spree/api/v3/admin/variant_serializer.rb +6 -7
  208. data/app/serializers/spree/api/v3/admin/webhook_delivery_serializer.rb +1 -3
  209. data/app/serializers/spree/api/v3/admin/webhook_event_serializer.rb +23 -0
  210. data/app/serializers/spree/api/v3/applied_promotion_serializer.rb +2 -4
  211. data/app/serializers/spree/api/v3/base_serializer.rb +20 -0
  212. data/app/serializers/spree/api/v3/cart_serializer.rb +17 -45
  213. data/app/serializers/spree/api/v3/category_serializer.rb +5 -15
  214. data/app/serializers/spree/api/v3/claim_line_item_serializer.rb +11 -26
  215. data/app/serializers/spree/api/v3/claim_serializer.rb +2 -15
  216. data/app/serializers/spree/api/v3/collection_serializer.rb +1 -3
  217. data/app/serializers/spree/api/v3/company_serializer.rb +1 -3
  218. data/app/serializers/spree/api/v3/custom_field_serializer.rb +1 -2
  219. data/app/serializers/spree/api/v3/delivery_rate_serializer.rb +3 -23
  220. data/app/serializers/spree/api/v3/digital_asset_serializer.rb +1 -3
  221. data/app/serializers/spree/api/v3/digital_link_serializer.rb +3 -9
  222. data/app/serializers/spree/api/v3/discount_serializer.rb +1 -12
  223. data/app/serializers/spree/api/v3/exchange_line_item_serializer.rb +9 -27
  224. data/app/serializers/spree/api/v3/exchange_serializer.rb +2 -15
  225. data/app/serializers/spree/api/v3/export_serializer.rb +1 -3
  226. data/app/serializers/spree/api/v3/fee_serializer.rb +2 -10
  227. data/app/serializers/spree/api/v3/fulfillment_serializer.rb +4 -11
  228. data/app/serializers/spree/api/v3/gift_card_batch_serializer.rb +1 -3
  229. data/app/serializers/spree/api/v3/gift_card_serializer.rb +5 -17
  230. data/app/serializers/spree/api/v3/import_row_serializer.rb +2 -6
  231. data/app/serializers/spree/api/v3/import_serializer.rb +3 -14
  232. data/app/serializers/spree/api/v3/invitation_serializer.rb +2 -19
  233. data/app/serializers/spree/api/v3/line_item_serializer.rb +6 -20
  234. data/app/serializers/spree/api/v3/media_event_serializer.rb +1 -3
  235. data/app/serializers/spree/api/v3/media_serializer.rb +1 -3
  236. data/app/serializers/spree/api/v3/newsletter_subscriber_request_event_serializer.rb +35 -0
  237. data/app/serializers/spree/api/v3/newsletter_subscriber_serializer.rb +2 -6
  238. data/app/serializers/spree/api/v3/option_value_serializer.rb +1 -3
  239. data/app/serializers/spree/api/v3/order_group_serializer.rb +2 -23
  240. data/app/serializers/spree/api/v3/order_serializer.rb +12 -38
  241. data/app/serializers/spree/api/v3/password_reset_requested_event_serializer.rb +29 -0
  242. data/app/serializers/spree/api/v3/payment_method_serializer.rb +2 -6
  243. data/app/serializers/spree/api/v3/payment_serializer.rb +5 -10
  244. data/app/serializers/spree/api/v3/payment_session_serializer.rb +3 -9
  245. data/app/serializers/spree/api/v3/payment_setup_session_serializer.rb +3 -11
  246. data/app/serializers/spree/api/v3/policy_serializer.rb +1 -3
  247. data/app/serializers/spree/api/v3/price_history_serializer.rb +1 -3
  248. data/app/serializers/spree/api/v3/price_serializer.rb +1 -3
  249. data/app/serializers/spree/api/v3/product_publication_serializer.rb +1 -7
  250. data/app/serializers/spree/api/v3/product_serializer.rb +7 -21
  251. data/app/serializers/spree/api/v3/product_submission_serializer.rb +26 -0
  252. data/app/serializers/spree/api/v3/purchase_order_event_serializer.rb +23 -4
  253. data/app/serializers/spree/api/v3/refund_serializer.rb +3 -11
  254. data/app/serializers/spree/api/v3/return_line_item_serializer.rb +12 -19
  255. data/app/serializers/spree/api/v3/return_serializer.rb +6 -15
  256. data/app/serializers/spree/api/v3/saved_report_event_serializer.rb +23 -0
  257. data/app/serializers/spree/api/v3/seller/delivery_method_serializer.rb +1 -7
  258. data/app/serializers/spree/api/v3/seller/delivery_rate_serializer.rb +1 -7
  259. data/app/serializers/spree/api/v3/seller/delivery_serializer.rb +1 -3
  260. data/app/serializers/spree/api/v3/seller/delivery_zone_serializer.rb +1 -3
  261. data/app/serializers/spree/api/v3/seller/exchange_serializer.rb +1 -3
  262. data/app/serializers/spree/api/v3/seller/fulfillment_item_serializer.rb +1 -7
  263. data/app/serializers/spree/api/v3/seller/fulfillment_serializer.rb +2 -6
  264. data/app/serializers/spree/api/v3/seller/invitation_serializer.rb +1 -3
  265. data/app/serializers/spree/api/v3/seller/order_line_item_serializer.rb +7 -13
  266. data/app/serializers/spree/api/v3/seller/order_serializer.rb +4 -25
  267. data/app/serializers/spree/api/v3/seller/payout_serializer.rb +4 -2
  268. data/app/serializers/spree/api/v3/seller/product_serializer.rb +1 -7
  269. data/app/serializers/spree/api/v3/seller/product_submission_serializer.rb +1 -21
  270. data/app/serializers/spree/api/v3/seller/profile_serializer.rb +2 -6
  271. data/app/serializers/spree/api/v3/seller/requirement_status_serializer.rb +3 -9
  272. data/app/serializers/spree/api/v3/seller/return_serializer.rb +3 -15
  273. data/app/serializers/spree/api/v3/seller/transfer_serializer.rb +4 -2
  274. data/app/serializers/spree/api/v3/seller_serializer.rb +1 -3
  275. data/app/serializers/spree/api/v3/shipping_label_event_serializer.rb +22 -4
  276. data/app/serializers/spree/api/v3/stock_level_serializer.rb +1 -7
  277. data/app/serializers/spree/api/v3/stock_movement_serializer.rb +1 -3
  278. data/app/serializers/spree/api/v3/stock_receipt_event_serializer.rb +20 -4
  279. data/app/serializers/spree/api/v3/stock_transfer_serializer.rb +1 -7
  280. data/app/serializers/spree/api/v3/store_credit_event_serializer.rb +2 -11
  281. data/app/serializers/spree/api/v3/store_credit_serializer.rb +2 -24
  282. data/app/serializers/spree/api/v3/supplier_event_serializer.rb +6 -4
  283. data/app/serializers/spree/api/v3/tax_line_serializer.rb +10 -20
  284. data/app/serializers/spree/api/v3/variant_serializer.rb +7 -21
  285. data/app/serializers/spree/api/v3/wishlist_item_serializer.rb +1 -11
  286. data/app/serializers/spree/api/v3/wishlist_serializer.rb +2 -6
  287. data/app/subscribers/spree/webhook_event_subscriber.rb +3 -10
  288. data/config/initializers/pagy.rb +1 -1
  289. data/config/initializers/typelizer.rb +6 -8
  290. data/config/locales/ar.yml +15 -0
  291. data/config/locales/be.yml +15 -0
  292. data/config/locales/bg.yml +15 -0
  293. data/config/locales/ca.yml +15 -0
  294. data/config/locales/cs.yml +15 -0
  295. data/config/locales/da.yml +15 -0
  296. data/config/locales/de-CH.yml +11 -0
  297. data/config/locales/de.yml +15 -0
  298. data/config/locales/el.yml +15 -0
  299. data/config/locales/en.yml +5 -40
  300. data/config/locales/es-CL.yml +10 -0
  301. data/config/locales/es-EC.yml +11 -0
  302. data/config/locales/es-MX.yml +12 -0
  303. data/config/locales/es.yml +15 -0
  304. data/config/locales/et.yml +15 -0
  305. data/config/locales/fa.yml +15 -0
  306. data/config/locales/fi.yml +15 -0
  307. data/config/locales/fr.yml +15 -0
  308. data/config/locales/hu.yml +15 -0
  309. data/config/locales/id.yml +15 -0
  310. data/config/locales/it.yml +15 -0
  311. data/config/locales/ja.yml +15 -0
  312. data/config/locales/km.yml +15 -0
  313. data/config/locales/ko.yml +15 -0
  314. data/config/locales/ku.yml +15 -0
  315. data/config/locales/lt.yml +15 -0
  316. data/config/locales/lv.yml +15 -0
  317. data/config/locales/nb.yml +15 -0
  318. data/config/locales/ne.yml +15 -0
  319. data/config/locales/nl.yml +15 -0
  320. data/config/locales/pl.yml +15 -0
  321. data/config/locales/pt-BR.yml +13 -0
  322. data/config/locales/pt.yml +15 -0
  323. data/config/locales/ro.yml +15 -0
  324. data/config/locales/ru.yml +15 -0
  325. data/config/locales/sk.yml +15 -0
  326. data/config/locales/sl-SI.yml +15 -0
  327. data/config/locales/sv.yml +15 -0
  328. data/config/locales/th.yml +15 -0
  329. data/config/locales/tr.yml +15 -0
  330. data/config/locales/uk.yml +15 -0
  331. data/config/locales/vi.yml +15 -0
  332. data/config/locales/zh-CN.yml +15 -0
  333. data/config/locales/zh-TW.yml +15 -0
  334. data/config/routes.rb +49 -99
  335. data/lib/spree/api/dependencies.rb +53 -274
  336. data/lib/spree/api/openapi/schema_helper.rb +1 -1
  337. data/lib/spree/api/typelizer_generation.rb +35 -0
  338. data/lib/spree/api/webhook_event_types.rb +140 -0
  339. data/lib/spree/api.rb +0 -2
  340. metadata +71 -36
  341. data/config/i18n-tasks.yml +0 -40
  342. data/config/initializers/alba.rb +0 -5
@@ -30,11 +30,7 @@ module Spree
30
30
  reference: params[:reference].to_s.presence
31
31
  )
32
32
 
33
- if result.success?
34
- render json: serialize_resource(result.value)
35
- else
36
- render_result_error(result)
37
- end
33
+ render_result(result)
38
34
  end
39
35
 
40
36
  protected
@@ -47,10 +43,6 @@ module Spree
47
43
  Spree.api.admin_seller_payout_serializer
48
44
  end
49
45
 
50
- def scope
51
- super.for_store(current_store)
52
- end
53
-
54
46
  # Deliberately without `transfers`: the serializer wants their number,
55
47
  # not the rows, and a monthly settlement can hold hundreds.
56
48
  def collection_includes
@@ -30,11 +30,7 @@ module Spree
30
30
  review_note: params[:review_note]
31
31
  )
32
32
 
33
- if result.success?
34
- render json: serialize_resource(result.value), status: :created
35
- else
36
- render_result_error(result)
37
- end
33
+ render_result(result, status: :created)
38
34
  end
39
35
 
40
36
  # PATCH /api/v3/admin/sellers/:seller_id/requirement_submissions/:id/accept
@@ -126,11 +122,7 @@ module Spree
126
122
  review_note: params[:review_note]
127
123
  )
128
124
 
129
- if result.success?
130
- render json: serialize_resource(result.value)
131
- else
132
- render_result_error(result)
133
- end
125
+ render_result(result)
134
126
  end
135
127
  end
136
128
  end
@@ -20,10 +20,6 @@ module Spree
20
20
  Spree.api.admin_seller_transfer_serializer
21
21
  end
22
22
 
23
- def scope
24
- super.for_store(current_store)
25
- end
26
-
27
23
  # Every association the serializer reads, so a page of rows costs a
28
24
  # fixed number of queries rather than one per row.
29
25
  def collection_includes
@@ -38,7 +38,7 @@ module Spree
38
38
  if @invitation.expired?
39
39
  return render_error(
40
40
  code: ErrorHandler::ERROR_CODES[:processing_error],
41
- message: Spree.t(:invitation_expired),
41
+ message: I18n.t('spree.invitation_expired'),
42
42
  status: :unprocessable_content
43
43
  )
44
44
  end
@@ -47,7 +47,7 @@ module Spree
47
47
  # than a success that produced no payout.
48
48
  render_error(
49
49
  code: ErrorHandler::ERROR_CODES[:validation_error],
50
- message: Spree.t(:seller_payout_nothing_to_settle),
50
+ message: I18n.t('spree.seller_payout_nothing_to_settle'),
51
51
  status: :unprocessable_content
52
52
  )
53
53
  end
@@ -31,11 +31,7 @@ module Spree
31
31
  inviter: try_spree_current_user
32
32
  )
33
33
 
34
- if result.success?
35
- render json: serialize_resource(result.value), status: :created
36
- else
37
- render_result_error(result)
38
- end
34
+ render_result(result, status: :created)
39
35
  end
40
36
 
41
37
  # GET /api/v3/admin/sellers/:id/onboarding
@@ -176,11 +172,7 @@ module Spree
176
172
  def run_workflow(workflow, **arguments)
177
173
  result = workflow.call(seller: @resource, **arguments)
178
174
 
179
- if result.success?
180
- render json: serialize_resource(result.value)
181
- else
182
- render_result_error(result)
183
- end
175
+ render_result(result)
184
176
  end
185
177
 
186
178
  # Read through the seller's own roles: a role id naming somewhere
@@ -149,20 +149,12 @@ module Spree
149
149
  # would point a storefront at a language with nothing behind it.
150
150
  # English closes the gap for countries whose languages all fall
151
151
  # through, and is always offered alongside.
152
- #
153
- # Installs without spree_i18n only have English, and filtering
154
- # against that would leave every country English-only. There the
155
- # unfiltered list is the better answer: the merchant's own language
156
- # is still the right default for their storefront, whether or not
157
- # this install carries a translation bundle for it.
158
152
  def offerable_locales(country)
159
- return country.official_locales if translated_locales.size <= 1
160
-
161
- (country.official_locales & translated_locales).presence || ['en']
153
+ country.official_locales.filter_map { |language| Spree.locale_for_language(language, available_locales) }.presence || ['en']
162
154
  end
163
155
 
164
- def translated_locales
165
- @translated_locales ||= Spree.available_locales.map { |locale| locale.to_s.split('-').first }.uniq
156
+ def available_locales
157
+ @available_locales ||= Spree.available_locales
166
158
  end
167
159
 
168
160
  # Token mismatch, spent token, and already-set-up all render the
@@ -38,7 +38,7 @@ module Spree
38
38
  unless @resource.draft?
39
39
  return render_error(
40
40
  code: 'invalid_status',
41
- message: Spree.t('stock_transfer.errors.only_draft_can_be_deleted'),
41
+ message: I18n.t('spree.stock_transfer.errors.only_draft_can_be_deleted'),
42
42
  status: :unprocessable_content
43
43
  )
44
44
  end
@@ -56,7 +56,6 @@ module Spree
56
56
  {
57
57
  key: provider_class.key,
58
58
  name: provider_class.provider_name,
59
- integration_class: provider_class.integration_class,
60
59
  integration_type: provider_class.integration_class.presence&.safe_constantize&.api_type,
61
60
  available: provider_class.available_for_store?(current_store)
62
61
  }
@@ -117,6 +116,12 @@ module Spree
117
116
  :customer_support_email,
118
117
  :new_order_notifications_email,
119
118
  :preferred_send_consumer_transactional_emails,
119
+ :preferred_email_accent_color,
120
+ :preferred_email_background_color,
121
+ :preferred_email_card_color,
122
+ :preferred_email_text_color,
123
+ :preferred_email_heading_color,
124
+ :preferred_email_font,
120
125
  :mailer_logo
121
126
  )
122
127
  end
@@ -45,16 +45,19 @@ module Spree
45
45
 
46
46
  private
47
47
 
48
+ # The class name taggings store for the requested shorthand
49
+ # (`product` → `Spree::Product`), or nil when it is not taggable.
48
50
  def taggable_type
49
- params[:taggable_type].to_s
51
+ @taggable_type ||= Spree::Base.polymorphic_type_for(params[:taggable_type], allowed_taggable_types)
50
52
  end
51
53
 
52
54
  def valid_taggable_type?
53
- return true if allowed_taggable_types.include?(taggable_type)
55
+ return true if taggable_type
54
56
 
57
+ allowed = allowed_taggable_types.map { |type| Spree::Base.polymorphic_api_type(type) }
55
58
  render_error(
56
59
  code: 'invalid_taggable_type',
57
- message: "taggable_type must be one of #{allowed_taggable_types.join(', ')}",
60
+ message: "taggable_type must be one of #{allowed.join(', ')}",
58
61
  status: :unprocessable_content
59
62
  )
60
63
  false
@@ -83,7 +86,7 @@ module Spree
83
86
  # admins are gated by store membership + CanCanCan, not scopes.
84
87
  def authorize_taggable_scope!
85
88
  return unless current_api_key
86
- return unless allowed_taggable_types.include?(taggable_type)
89
+ return unless taggable_type
87
90
 
88
91
  required = self.class.scope_for_taggable_type.fetch(taggable_type, 'read_all')
89
92
  return if current_api_key.has_scope?(required)
@@ -101,7 +104,7 @@ module Spree
101
104
  # list in an initializer without overriding this controller:
102
105
  # Spree.taggable_types << 'MyApp::Seller'
103
106
  def allowed_taggable_types
104
- Spree.taggable_types
107
+ Spree.taggable_types.map(&:to_s)
105
108
  end
106
109
  end
107
110
  end
@@ -73,27 +73,32 @@ module Spree
73
73
 
74
74
  private
75
75
 
76
- # Customer password reset tokens are account credentials, so the
77
- # webhooks permission alone cannot subscribe an endpoint to them, or
78
- # repoint an endpoint that already receives them.
76
+ # A customer's password reset token is an account credential, so the
77
+ # webhooks permission alone cannot subscribe an endpoint to it, or
78
+ # repoint an endpoint that already receives it: that needs the
79
+ # permission the event catalog names for it (`write_customers`).
79
80
  def reject_unauthorized_credential_subscription!
80
- return if holds_permission?('write_customers')
81
-
82
- requested = Array(permitted_params[:subscriptions]) & Spree::WebhookEndpoint::CREDENTIAL_EVENTS
83
- return if requested.empty? && !repoints_credential_endpoint?
81
+ events = requested_credential_events | repointed_credential_events
82
+ missing = events.reject { |entry| holds_permission?(entry.credential_permission) }
83
+ return if missing.empty?
84
84
 
85
85
  render_error(
86
86
  code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:access_denied],
87
- message: "Receiving #{Spree::WebhookEndpoint::CREDENTIAL_EVENTS.to_sentence} requires permission to manage customers",
87
+ message: "Receiving #{missing.map(&:name).to_sentence} requires the " \
88
+ "#{missing.map(&:credential_permission).uniq.to_sentence} permission",
88
89
  status: :forbidden
89
90
  )
90
91
  end
91
92
 
92
- def repoints_credential_endpoint?
93
- return false unless action_name == 'update'
94
- return false unless permitted_params.key?(:url) || permitted_params.key?(:subscriptions)
93
+ def requested_credential_events
94
+ Spree::Events.catalog.credential_events(Array(permitted_params[:subscriptions]))
95
+ end
96
+
97
+ def repointed_credential_events
98
+ return [] unless action_name == 'update'
99
+ return [] unless permitted_params.key?(:url) || permitted_params.key?(:subscriptions)
95
100
 
96
- current_store.webhook_endpoints.find_by_prefix_id(params[:id])&.receives_credentials?
101
+ current_store.webhook_endpoints.find_by_prefix_id(params[:id])&.credential_subscriptions || []
97
102
  end
98
103
  end
99
104
  end
@@ -0,0 +1,25 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ # The events a webhook endpoint can subscribe to — every event Spree
6
+ # and the installed extensions declare, so the endpoint picker never
7
+ # drifts from what the server really publishes.
8
+ class WebhookEventsController < Admin::BaseController
9
+ scoped_resource :webhooks
10
+
11
+ # GET /api/v3/admin/webhook_events
12
+ def index
13
+ authorize!(:show, Spree::WebhookEndpoint)
14
+ entries = Spree::Events.catalog.webhook_events
15
+
16
+ render json: {
17
+ data: entries.map { |entry| Spree.api.admin_webhook_event_serializer.new(entry).to_h },
18
+ meta: { count: entries.size }
19
+ }
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -70,6 +70,16 @@ module Spree
70
70
  request.headers['x-spree-token']
71
71
  end
72
72
 
73
+ # Renders a workflow's result: the serialized record on success, its
74
+ # errors otherwise.
75
+ def render_result(result, status: :ok)
76
+ if result.success?
77
+ render json: serialize_resource(result.value), status: status
78
+ else
79
+ render_result_error(result)
80
+ end
81
+ end
82
+
73
83
  # Renders a failed service/workflow Result: validation errors become a
74
84
  # 422 field-error payload, anything else a plain service error. Shared
75
85
  # by both APIs — Store endpoints surface workflow failures (a rejected
@@ -80,7 +80,7 @@ module Spree
80
80
  # which raises before the controller hook fires and yields 403.
81
81
  def destroy
82
82
  if @resource.respond_to?(:can_be_deleted?) && !@resource.can_be_deleted?
83
- message = Spree.t(:cannot_delete, scope: 'api', model: @resource.class.model_name.human)
83
+ message = I18n.t('spree.api.cannot_delete', model: @resource.class.model_name.human)
84
84
  return render_error(
85
85
  code: ERROR_CODES[:validation_error],
86
86
  message: message,
@@ -297,6 +297,7 @@ module Spree
297
297
  def ransack_params
298
298
  rp = params[:q]&.to_unsafe_h || params[:q] || {}
299
299
  rp = decode_prefixed_id_predicates(rp)
300
+ rp = decode_api_type_predicates(rp)
300
301
  sort_value = sort_param
301
302
 
302
303
  if sort_value.present?
@@ -329,6 +330,48 @@ module Spree
329
330
  end
330
331
  end
331
332
 
333
+ # Filters on a type column take the same shorthand responses carry
334
+ # (`type_eq=orders`, `receivable_type_eq=purchase_order`), translated
335
+ # here to the class name the column stores. Only the model's own STI
336
+ # column and its polymorphic `*_type` columns are translated; any other
337
+ # `*_type` attribute (`media_type`, `key_type`) is a plain value.
338
+ RANSACK_TYPE_PREDICATE_RE = /\A(?<attribute>(?:\w+_)?type)_(?:eq|not_eq|in|not_in)\z/.freeze
339
+ def decode_api_type_predicates(hash)
340
+ return hash unless hash.is_a?(Hash)
341
+
342
+ hash.each_with_object({}) do |(key, value), result|
343
+ resolver = api_type_resolver(RANSACK_TYPE_PREDICATE_RE.match(key.to_s)&.[](:attribute))
344
+ result[key] = if resolver
345
+ resolve_api_type_values(value, resolver)
346
+ elsif value.is_a?(Hash)
347
+ decode_api_type_predicates(value)
348
+ else
349
+ value
350
+ end
351
+ end
352
+ end
353
+
354
+ # A scalar stays a scalar; a list — including the indexed form
355
+ # (`type_in[0]=orders`) that arrives as a hash — becomes an array.
356
+ def resolve_api_type_values(value, resolver)
357
+ case value
358
+ when Hash, Array then (value.is_a?(Hash) ? value.values : value).map { |entry| resolve_api_type_values(entry, resolver) }
359
+ else resolver.call(value.to_s) || value
360
+ end
361
+ end
362
+
363
+ # @param attribute [String, nil] a `*type` column of {#model_class}
364
+ # @return [Proc, nil] shorthand → stored class name
365
+ def api_type_resolver(attribute)
366
+ return if attribute.nil? || !model_class.respond_to?(:api_type_registry)
367
+
368
+ if attribute == model_class.inheritance_column && model_class.api_type_registry.any?
369
+ ->(api_type) { model_class.class_name_for_api_type(api_type) }
370
+ elsif model_class.reflect_on_all_associations(:belongs_to).any? { |reflection| reflection.polymorphic? && reflection.foreign_type == attribute }
371
+ ->(api_type) { Spree::Base.polymorphic_type_for(api_type) }
372
+ end
373
+ end
374
+
332
375
  # Matches both prefixed-FK predicates (`product_id_in`, `tax_category_id_eq`)
333
376
  # and the bare-`id` predicates (`id_in`, `id_eq`) on the resource's
334
377
  # primary key. Without the bare-id branch, `q[id_in][]=prod_x` would
@@ -48,7 +48,7 @@ module Spree
48
48
  # not enough: without a role on some seller there is no panel to
49
49
  # sign in to, and minting a token would hand out an audience the
50
50
  # holder can do nothing with.
51
- return render_authentication_failed(Spree.t(:seller_membership_required)) unless user.seller_member?
51
+ return render_authentication_failed(I18n.t('spree.seller_membership_required')) unless user.seller_member?
52
52
 
53
53
  set_refresh_cookie(
54
54
  Spree::RefreshToken.create_for(
@@ -100,7 +100,7 @@ module Spree
100
100
  clear_refresh_cookie
101
101
  return render_error(
102
102
  code: ErrorHandler::ERROR_CODES[:access_denied],
103
- message: Spree.t(:seller_membership_required),
103
+ message: I18n.t('spree.seller_membership_required'),
104
104
  status: :forbidden
105
105
  )
106
106
  end
@@ -14,7 +14,7 @@ module Spree
14
14
  # GET /api/v3/seller/countries
15
15
  #
16
16
  # Unpaginated: there are ~250 countries and an address dropdown needs
17
- # them all at once, which Pagy's global max_limit would prevent.
17
+ # them all at once, which Pagy's global client_limit would prevent.
18
18
  def index
19
19
  countries = Spree::Country.all.sort_by(&:name)
20
20
 
@@ -181,9 +181,9 @@ module Spree
181
181
  def render_unsupported_type
182
182
  render_error(
183
183
  code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:validation_error],
184
- message: Spree.t(
185
- 'api.errors.unsupported_export_type',
186
- default: "Unsupported export type. Supported types: #{ALLOWED_TYPES.join(', ')}"
184
+ message: I18n.t(
185
+ 'spree.api.errors.unsupported_export_type',
186
+ types: ALLOWED_TYPES.join(', ')
187
187
  ),
188
188
  status: :unprocessable_content
189
189
  )
@@ -74,7 +74,7 @@ module Spree
74
74
  unless @invitation
75
75
  render_error(
76
76
  code: ErrorHandler::ERROR_CODES[:record_not_found],
77
- message: Spree.t(:invitation_not_acceptable),
77
+ message: I18n.t('spree.invitation_not_acceptable'),
78
78
  status: :not_found
79
79
  )
80
80
  return false
@@ -101,7 +101,7 @@ module Spree
101
101
 
102
102
  render_error(
103
103
  code: ErrorHandler::ERROR_CODES[:authentication_failed],
104
- message: Spree.t(:invalid_password),
104
+ message: I18n.t('spree.invalid_password'),
105
105
  status: :unauthorized
106
106
  )
107
107
  nil
@@ -111,7 +111,7 @@ module Spree
111
111
  if params[:password].blank?
112
112
  render_error(
113
113
  code: ErrorHandler::ERROR_CODES[:parameter_missing],
114
- message: Spree.t(:password_required_to_create_account),
114
+ message: I18n.t('spree.password_required_to_create_account'),
115
115
  status: :unprocessable_content
116
116
  )
117
117
  return nil
@@ -38,7 +38,7 @@ module Spree
38
38
  if @invitation.expired?
39
39
  return render_error(
40
40
  code: ErrorHandler::ERROR_CODES[:processing_error],
41
- message: Spree.t(:invitation_expired),
41
+ message: I18n.t('spree.invitation_expired'),
42
42
  status: :unprocessable_content
43
43
  )
44
44
  end
@@ -83,7 +83,7 @@ module Spree
83
83
 
84
84
  render_error(
85
85
  code: ErrorHandler::ERROR_CODES[:record_not_found],
86
- message: Spree.t(:me_no_current_user),
86
+ message: I18n.t('spree.me_no_current_user'),
87
87
  status: :not_found
88
88
  )
89
89
  false
@@ -27,7 +27,7 @@ module Spree
27
27
  if label_params[:file].blank?
28
28
  return render_error(
29
29
  code: ERROR_CODES[:validation_error],
30
- message: Spree.t('shipping_labels.errors.file_required'),
30
+ message: I18n.t('spree.shipping_labels.errors.file_required'),
31
31
  status: :unprocessable_content
32
32
  )
33
33
  end
@@ -15,6 +15,8 @@ module Spree
15
15
  include Spree::Api::V3::Seller::AuthCookies
16
16
  include Spree::Api::V3::JwtAuthentication
17
17
 
18
+ RESET_REQUESTED_EVENT = 'seller_user.password_reset_requested'.freeze
19
+
18
20
  # No `skip_scope_check!`: this extends the plain v3 base, which has
19
21
  # no authentication or scope gate to lift. The emailed token is the
20
22
  # only credential, exactly as on the admin twin.
@@ -32,12 +34,12 @@ module Spree
32
34
  # them a seller reset link would be an invitation to a session they
33
35
  # cannot hold.
34
36
  if user&.seller_member?
35
- user.publish_event('seller_user.password_reset_requested', event_payload(user))
37
+ user.publish_event(RESET_REQUESTED_EVENT, event_payload(user))
36
38
  end
37
39
 
38
40
  # Always 202, whether or not anything matched — this endpoint must
39
41
  # not become a way to discover which addresses exist.
40
- render json: { message: Spree.t(:password_reset_requested, scope: :api) }, status: :accepted
42
+ render json: { message: I18n.t('spree.api.password_reset_requested') }, status: :accepted
41
43
  end
42
44
 
43
45
  # PATCH /api/v3/seller/auth/password_resets/:id
@@ -79,7 +81,7 @@ module Spree
79
81
  def render_token_invalid
80
82
  render_error(
81
83
  code: ErrorHandler::ERROR_CODES[:password_reset_token_invalid],
82
- message: Spree.t(:password_reset_token_invalid, scope: :api),
84
+ message: I18n.t('spree.api.password_reset_token_invalid'),
83
85
  status: :unprocessable_content
84
86
  )
85
87
  end
@@ -88,14 +90,11 @@ module Spree
88
90
  # right panel origin and locale without a request to read them from.
89
91
  def event_payload(user)
90
92
  store = seller_store(user)
91
- payload = {
92
- reset_token: user.generate_token_for(:password_reset),
93
- email: user.email,
94
- store_id: store&.prefixed_id
95
- }
96
- redirect_url = validated_redirect_url(store)
97
- payload[:redirect_url] = redirect_url if redirect_url.present?
98
- payload
93
+ user.event_payload_for(
94
+ RESET_REQUESTED_EVENT,
95
+ reset_token: user.generate_token_for(:password_reset), store: store,
96
+ redirect_url: validated_redirect_url(store).presence
97
+ )
99
98
  end
100
99
 
101
100
  # Which store's panel to send them to.
@@ -107,7 +107,7 @@ module Spree
107
107
  if resolve_workflow.nil?
108
108
  return render_error(
109
109
  code: 'invalid_status',
110
- message: Spree.t(:invalid_status, scope: 'errors.messages', default: 'Invalid status'),
110
+ message: I18n.t('spree.errors.messages.invalid_status'),
111
111
  status: :unprocessable_content
112
112
  )
113
113
  end
@@ -166,6 +166,7 @@ module Spree
166
166
 
167
167
  def permitted_params
168
168
  attrs = params.permit(
169
+ *model_class.additional_seller_permitted_attributes,
169
170
  :name, :description, :slug,
170
171
  :meta_title, :meta_description, :meta_keywords,
171
172
  :product_type_id, :delivery_profile_id,
@@ -42,7 +42,7 @@ module Spree
42
42
  unless @submission.file.attached?
43
43
  return render_error(
44
44
  code: ErrorHandler::ERROR_CODES[:validation_error],
45
- message: Spree.t(:seller_submission_no_file),
45
+ message: I18n.t('spree.seller_submission_no_file'),
46
46
  status: :unprocessable_content
47
47
  )
48
48
  end
@@ -68,7 +68,7 @@ module Spree
68
68
 
69
69
  render_error(
70
70
  code: ErrorHandler::ERROR_CODES[:processing_error],
71
- message: Spree.t(:seller_team_last_member),
71
+ message: I18n.t('spree.seller_team_last_member'),
72
72
  status: :unprocessable_content
73
73
  )
74
74
  end
@@ -64,7 +64,7 @@ module Spree
64
64
  def attach_pending_coupon_warning
65
65
  @cart.warnings |= [{
66
66
  code: coupon_handler.status_code.to_s,
67
- message: coupon_handler.error.presence || Spree.t(:coupon_code_not_eligible)
67
+ message: coupon_handler.error.presence || I18n.t('spree.coupon_code_not_eligible')
68
68
  }]
69
69
  end
70
70
 
@@ -9,15 +9,6 @@ module Spree
9
9
 
10
10
  before_action :find_cart!
11
11
 
12
- # GET /api/v3/store/carts/:cart_id/fulfillments
13
- def index
14
- fulfillments = @cart.fulfillments.includes(delivery_rates: :delivery_method)
15
- render json: {
16
- data: fulfillments.map { |s| Spree.api.fulfillment_serializer.new(s, params: serializer_params).to_h },
17
- meta: { count: fulfillments.size }
18
- }
19
- end
20
-
21
12
  # PATCH /api/v3/store/carts/:cart_id/fulfillments/:id
22
13
  # Selects a delivery rate, and for pickup_point methods a concrete
23
14
  # pickup point (validated against the provider, then frozen into
@@ -36,6 +27,7 @@ module Spree
36
27
 
37
28
  recalculate
38
29
 
30
+ sweep_unavailable_coupon_code!
39
31
  render_cart
40
32
  end
41
33
  end
@@ -62,7 +54,7 @@ module Spree
62
54
  if provider.nil?
63
55
  render_error(
64
56
  code: ERROR_CODES[:validation_error],
65
- message: Spree.t('errors.messages.no_pickup_point_provider'),
57
+ message: I18n.t('spree.errors.messages.no_pickup_point_provider'),
66
58
  status: :unprocessable_entity
67
59
  )
68
60
  return false
@@ -72,7 +64,7 @@ module Spree
72
64
  if point.nil?
73
65
  render_error(
74
66
  code: ERROR_CODES[:record_not_found],
75
- message: Spree.t('errors.messages.pickup_point_not_found'),
67
+ message: I18n.t('spree.errors.messages.pickup_point_not_found'),
76
68
  status: :not_found
77
69
  )
78
70
  return false
@@ -18,6 +18,7 @@ module Spree
18
18
  result = @cart.apply_gift_card(gift_card)
19
19
 
20
20
  if result.success?
21
+ sweep_unavailable_coupon_code!
21
22
  render_cart(status: :created)
22
23
  else
23
24
  render_service_error(result.error)
@@ -31,6 +32,7 @@ module Spree
31
32
  result = @cart.remove_gift_card
32
33
 
33
34
  if result.success?
35
+ sweep_unavailable_coupon_code!
34
36
  render_cart
35
37
  else
36
38
  render_service_error(result.error)
@@ -44,17 +46,17 @@ module Spree
44
46
  gift_card = @cart.store.gift_cards.find_by(code: permitted_params[:code]&.downcase)
45
47
 
46
48
  if gift_card.nil?
47
- render_error(code: ERROR_CODES[:gift_card_not_found], message: Spree.t(:gift_card_not_found), status: :not_found)
49
+ render_error(code: ERROR_CODES[:gift_card_not_found], message: I18n.t('spree.gift_card_not_found'), status: :not_found)
48
50
  return
49
51
  end
50
52
 
51
53
  if gift_card.expired?
52
- render_error(code: ERROR_CODES[:gift_card_expired], message: Spree.t(:gift_card_expired), status: :unprocessable_content)
54
+ render_error(code: ERROR_CODES[:gift_card_expired], message: I18n.t('spree.gift_card_expired'), status: :unprocessable_content)
53
55
  return
54
56
  end
55
57
 
56
58
  if gift_card.redeemed?
57
- render_error(code: ERROR_CODES[:gift_card_already_redeemed], message: Spree.t(:gift_card_already_redeemed), status: :unprocessable_content)
59
+ render_error(code: ERROR_CODES[:gift_card_already_redeemed], message: I18n.t('spree.gift_card_already_redeemed'), status: :unprocessable_content)
58
60
  return
59
61
  end
60
62