spree_core 5.2.6 → 5.3.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 (294) hide show
  1. checksums.yaml +4 -4
  2. data/app/helpers/spree/addresses_helper.rb +1 -23
  3. data/app/helpers/spree/base_helper.rb +25 -77
  4. data/app/helpers/spree/currency_helper.rb +2 -2
  5. data/app/helpers/spree/images_helper.rb +5 -0
  6. data/app/helpers/spree/mail_helper.rb +1 -1
  7. data/app/helpers/spree/products_helper.rb +1 -1
  8. data/app/jobs/spree/events/subscriber_job.rb +58 -0
  9. data/app/jobs/spree/products/refresh_metrics_job.rb +14 -0
  10. data/app/jobs/spree/products/touch_taxons_job.rb +0 -1
  11. data/app/jobs/spree/variants/touch_job.rb +9 -0
  12. data/app/models/concerns/spree/adjustment_source.rb +8 -0
  13. data/app/models/concerns/spree/parameterizable_name.rb +1 -1
  14. data/app/models/concerns/spree/product_scopes.rb +54 -8
  15. data/app/models/concerns/spree/publishable.rb +253 -0
  16. data/app/models/concerns/spree/unique_name.rb +1 -1
  17. data/app/models/concerns/spree/user_methods.rb +21 -1
  18. data/app/models/spree/ability.rb +3 -3
  19. data/app/models/spree/address.rb +0 -3
  20. data/app/models/spree/adjustable/promotion_accumulator.rb +1 -1
  21. data/app/models/spree/adjustment.rb +32 -6
  22. data/app/models/spree/asset.rb +6 -3
  23. data/app/models/spree/base.rb +3 -1
  24. data/app/models/spree/classification.rb +2 -2
  25. data/app/models/spree/credit_card.rb +0 -3
  26. data/app/models/spree/current.rb +24 -3
  27. data/app/models/spree/custom_domain.rb +1 -1
  28. data/app/models/spree/customer_group.rb +94 -0
  29. data/app/models/spree/customer_group_user.rb +16 -0
  30. data/app/models/spree/customer_return.rb +2 -3
  31. data/app/models/spree/digital.rb +2 -4
  32. data/app/models/spree/digital_link.rb +2 -3
  33. data/app/models/spree/event.rb +104 -0
  34. data/app/models/spree/export.rb +7 -1
  35. data/app/models/spree/gift_card.rb +13 -1
  36. data/app/models/spree/gift_card_batch.rb +3 -1
  37. data/app/models/spree/image.rb +20 -5
  38. data/app/models/spree/import.rb +17 -12
  39. data/app/models/spree/import_row.rb +13 -26
  40. data/app/models/spree/inventory_unit.rb +0 -3
  41. data/app/models/spree/invitation.rb +12 -6
  42. data/app/models/spree/line_item.rb +57 -4
  43. data/app/models/spree/newsletter_subscriber.rb +2 -0
  44. data/app/models/spree/option_type.rb +2 -5
  45. data/app/models/spree/option_value.rb +1 -4
  46. data/app/models/spree/order/checkout.rb +7 -2
  47. data/app/models/spree/order/emails.rb +3 -11
  48. data/app/models/spree/order/store_credit.rb +5 -1
  49. data/app/models/spree/order.rb +80 -31
  50. data/app/models/spree/order_updater.rb +28 -9
  51. data/app/models/spree/payment/custom_events.rb +37 -0
  52. data/app/models/spree/payment.rb +13 -4
  53. data/app/models/spree/payment_capture_event.rb +0 -4
  54. data/app/models/spree/payment_method.rb +1 -1
  55. data/app/models/spree/permission_sets/default_customer.rb +3 -3
  56. data/app/models/spree/policy.rb +1 -8
  57. data/app/models/spree/post.rb +2 -7
  58. data/app/models/spree/post_category.rb +2 -0
  59. data/app/models/spree/price.rb +8 -6
  60. data/app/models/spree/price_list.rb +263 -0
  61. data/app/models/spree/price_rule.rb +26 -0
  62. data/app/models/spree/price_rules/customer_group_rule.rb +21 -0
  63. data/app/models/spree/price_rules/user_rule.rb +19 -0
  64. data/app/models/spree/price_rules/volume_rule.rb +21 -0
  65. data/app/models/spree/price_rules/zone_rule.rb +19 -0
  66. data/app/models/spree/product.rb +117 -76
  67. data/app/models/spree/product_property.rb +2 -2
  68. data/app/models/spree/promotion/rules/customer_group.rb +22 -0
  69. data/app/models/spree/promotion/rules/user.rb +2 -2
  70. data/app/models/spree/promotion.rb +3 -4
  71. data/app/models/spree/promotion_handler/coupon.rb +3 -3
  72. data/app/models/spree/property.rb +3 -6
  73. data/app/models/spree/prototype.rb +0 -3
  74. data/app/models/spree/refund.rb +2 -3
  75. data/app/models/spree/reimbursement.rb +5 -3
  76. data/app/models/spree/report.rb +7 -1
  77. data/app/models/spree/reports/products_performance.rb +1 -1
  78. data/app/models/spree/reports/sales_total.rb +1 -1
  79. data/app/models/spree/return_authorization.rb +7 -3
  80. data/app/models/spree/return_item.rb +15 -4
  81. data/app/models/spree/shipment/custom_events.rb +47 -0
  82. data/app/models/spree/shipment.rb +12 -5
  83. data/app/models/spree/shipping_category.rb +0 -3
  84. data/app/models/spree/shipping_method.rb +0 -3
  85. data/app/models/spree/stock/quantifier.rb +1 -1
  86. data/app/models/spree/stock_item.rb +2 -0
  87. data/app/models/spree/stock_location.rb +0 -3
  88. data/app/models/spree/stock_movement/custom_events.rb +44 -0
  89. data/app/models/spree/stock_movement.rb +3 -0
  90. data/app/models/spree/stock_transfer.rb +2 -3
  91. data/app/models/spree/store.rb +64 -92
  92. data/app/models/spree/store_credit.rb +3 -4
  93. data/app/models/spree/store_product.rb +14 -0
  94. data/app/models/spree/subscriber.rb +186 -0
  95. data/app/models/spree/tax_category.rb +0 -4
  96. data/app/models/spree/tax_rate.rb +0 -3
  97. data/app/models/spree/taxon.rb +3 -36
  98. data/app/models/spree/taxonomy.rb +0 -3
  99. data/app/models/spree/variant.rb +114 -21
  100. data/app/models/spree/webhook_delivery.rb +60 -0
  101. data/app/models/spree/webhook_endpoint.rb +53 -0
  102. data/app/models/spree/wished_item.rb +2 -4
  103. data/app/models/spree/wishlist.rb +2 -3
  104. data/app/models/spree/zone.rb +0 -9
  105. data/app/paginators/spree/shared/paginate.rb +4 -0
  106. data/app/serializers/spree/events/asset_serializer.rb +22 -0
  107. data/app/serializers/spree/events/base_serializer.rb +61 -0
  108. data/app/serializers/spree/events/customer_return_serializer.rb +20 -0
  109. data/app/serializers/spree/events/digital_link_serializer.rb +20 -0
  110. data/app/serializers/spree/events/digital_serializer.rb +18 -0
  111. data/app/serializers/spree/events/export_serializer.rb +22 -0
  112. data/app/serializers/spree/events/gift_card_batch_serializer.rb +24 -0
  113. data/app/serializers/spree/events/gift_card_serializer.rb +29 -0
  114. data/app/serializers/spree/events/image_serializer.rb +9 -0
  115. data/app/serializers/spree/events/import_row_serializer.rb +23 -0
  116. data/app/serializers/spree/events/import_serializer.rb +24 -0
  117. data/app/serializers/spree/events/invitation_serializer.rb +28 -0
  118. data/app/serializers/spree/events/line_item_serializer.rb +31 -0
  119. data/app/serializers/spree/events/newsletter_subscriber_serializer.rb +21 -0
  120. data/app/serializers/spree/events/order_serializer.rb +39 -0
  121. data/app/serializers/spree/events/payment_serializer.rb +24 -0
  122. data/app/serializers/spree/events/post_category_serializer.rb +20 -0
  123. data/app/serializers/spree/events/post_serializer.rb +26 -0
  124. data/app/serializers/spree/events/price_serializer.rb +22 -0
  125. data/app/serializers/spree/events/product_serializer.rb +24 -0
  126. data/app/serializers/spree/events/promotion_serializer.rb +32 -0
  127. data/app/serializers/spree/events/refund_serializer.rb +23 -0
  128. data/app/serializers/spree/events/reimbursement_serializer.rb +22 -0
  129. data/app/serializers/spree/events/report_serializer.rb +23 -0
  130. data/app/serializers/spree/events/return_authorization_serializer.rb +22 -0
  131. data/app/serializers/spree/events/return_item_serializer.rb +27 -0
  132. data/app/serializers/spree/events/shipment_serializer.rb +24 -0
  133. data/app/serializers/spree/events/stock_item_serializer.rb +22 -0
  134. data/app/serializers/spree/events/stock_movement_serializer.rb +22 -0
  135. data/app/serializers/spree/events/stock_transfer_serializer.rb +22 -0
  136. data/app/serializers/spree/events/store_credit_serializer.rb +30 -0
  137. data/app/serializers/spree/events/user_serializer.rb +18 -0
  138. data/app/serializers/spree/events/variant_serializer.rb +34 -0
  139. data/app/serializers/spree/events/wished_item_serializer.rb +20 -0
  140. data/app/serializers/spree/events/wishlist_serializer.rb +22 -0
  141. data/app/services/spree/addresses/update.rb +1 -1
  142. data/app/services/spree/cart/add_item.rb +1 -1
  143. data/app/services/spree/coupon_codes/coupon_codes_handler.rb +2 -1
  144. data/app/services/spree/data_feeds/google/required_attributes.rb +4 -4
  145. data/app/services/spree/newsletter/verify.rb +5 -0
  146. data/app/services/spree/products/auto_match_taxons.rb +1 -1
  147. data/app/services/spree/seeds/all.rb +1 -1
  148. data/app/services/spree/taxons/add_products.rb +8 -4
  149. data/app/services/spree/taxons/regenerate_products.rb +8 -0
  150. data/app/services/spree/taxons/remove_products.rb +12 -7
  151. data/app/subscribers/spree/event_log_subscriber.rb +64 -0
  152. data/app/subscribers/spree/export_subscriber.rb +26 -0
  153. data/app/subscribers/spree/invitation_email_subscriber.rb +40 -0
  154. data/app/subscribers/spree/product_metrics_subscriber.rb +29 -0
  155. data/app/subscribers/spree/report_subscriber.rb +26 -0
  156. data/config/locales/en.yml +126 -0
  157. data/db/migrate/20251110120000_create_spree_price_lists.rb +22 -0
  158. data/db/migrate/20251110120001_create_spree_price_rules.rb +13 -0
  159. data/db/migrate/20251110120002_add_price_list_id_to_spree_prices.rb +6 -0
  160. data/db/migrate/20251110120003_add_price_list_id_to_spree_line_items.rb +5 -0
  161. data/db/migrate/20251201172118_fix_indexes_on_friendly_id_slugs.rb +8 -0
  162. data/db/migrate/20251214000001_create_spree_webhook_endpoints.rb +19 -0
  163. data/db/migrate/20251214000002_create_spree_webhook_deliveries.rb +23 -0
  164. data/db/migrate/20251222000000_add_performance_indexes_to_spree_adjustments.rb +25 -0
  165. data/db/migrate/20260112000000_fix_spree_prices_unique_indexes.rb +33 -0
  166. data/db/migrate/20260115120000_create_spree_customer_groups.rb +14 -0
  167. data/db/migrate/20260115120001_create_spree_customer_group_users.rb +14 -0
  168. data/db/migrate/20260117140831_remove_not_null_constraint_from_policy_name.rb +5 -0
  169. data/db/migrate/20260118120000_add_statistics_to_store_products.rb +11 -0
  170. data/db/migrate/20260119120000_add_counter_caches_to_spree_products.rb +9 -0
  171. data/db/migrate/20260119170000_add_counter_caches_to_spree_taxons.rb +9 -0
  172. data/db/migrate/20260120120000_add_image_count_to_spree_variants.rb +9 -0
  173. data/lib/generators/spree/dummy/dummy_generator.rb +14 -2
  174. data/lib/spree/core/configuration.rb +1 -0
  175. data/lib/spree/core/controller_helpers/auth.rb +0 -15
  176. data/lib/spree/core/controller_helpers/currency.rb +13 -9
  177. data/lib/spree/core/controller_helpers/search.rb +1 -1
  178. data/lib/spree/core/controller_helpers/store.rb +5 -1
  179. data/lib/spree/core/engine.rb +61 -78
  180. data/lib/spree/core/importer/order.rb +1 -1
  181. data/lib/spree/core/importer/product.rb +1 -1
  182. data/lib/spree/core/preferences/preferable.rb +14 -1
  183. data/lib/spree/core/pricing/context.rb +63 -0
  184. data/lib/spree/core/pricing/resolver.rb +129 -0
  185. data/lib/spree/core/search/base.rb +1 -1
  186. data/lib/spree/core/token_generator.rb +1 -1
  187. data/lib/spree/core/version.rb +1 -1
  188. data/lib/spree/core.rb +42 -47
  189. data/lib/spree/events/adapters/active_support_notifications.rb +112 -0
  190. data/lib/spree/events/adapters/base.rb +193 -0
  191. data/lib/spree/events/registry.rb +99 -0
  192. data/lib/spree/events.rb +240 -0
  193. data/lib/spree/permitted_attributes.rb +13 -2
  194. data/lib/spree/testing_support/common_rake.rb +68 -35
  195. data/lib/spree/testing_support/factories/customer_group_factory.rb +6 -0
  196. data/lib/spree/testing_support/factories/customer_group_user_factory.rb +6 -0
  197. data/lib/spree/testing_support/factories/price_factory.rb +4 -0
  198. data/lib/spree/testing_support/factories/price_list_factory.rb +34 -0
  199. data/lib/spree/testing_support/factories/price_rule_factory.rb +49 -0
  200. data/lib/spree/testing_support/factories/promotion_rule_factory.rb +12 -0
  201. data/lib/spree/testing_support/factories/stock_item_factory.rb +6 -4
  202. data/lib/spree/testing_support/factories/store_product_factory.rb +6 -0
  203. data/lib/spree/testing_support/factories/taxon_factory.rb +0 -1
  204. data/lib/spree/testing_support/factories/webhook_delivery_factory.rb +48 -0
  205. data/lib/spree/testing_support/factories/webhook_endpoint_factory.rb +22 -0
  206. data/lib/spree/testing_support/lifecycle_events.rb +38 -0
  207. data/lib/spree/testing_support/store.rb +4 -2
  208. data/lib/spree/webhooks.rb +22 -0
  209. data/lib/tasks/products.rake +40 -0
  210. data/lib/tasks/taxons.rake +19 -0
  211. data/lib/tasks/variants.rake +18 -0
  212. metadata +112 -114
  213. data/app/jobs/spree/themes/duplicate_components_job.rb +0 -59
  214. data/app/jobs/spree/themes/screenshot_job.rb +0 -81
  215. data/app/models/concerns/spree/has_page_links.rb +0 -53
  216. data/app/models/spree/page.rb +0 -188
  217. data/app/models/spree/page_block.rb +0 -73
  218. data/app/models/spree/page_blocks/buttons.rb +0 -29
  219. data/app/models/spree/page_blocks/heading.rb +0 -18
  220. data/app/models/spree/page_blocks/image.rb +0 -20
  221. data/app/models/spree/page_blocks/link.rb +0 -21
  222. data/app/models/spree/page_blocks/mega_nav.rb +0 -33
  223. data/app/models/spree/page_blocks/mega_nav_with_subcategories.rb +0 -32
  224. data/app/models/spree/page_blocks/metafields.rb +0 -18
  225. data/app/models/spree/page_blocks/nav.rb +0 -15
  226. data/app/models/spree/page_blocks/newsletter_form.rb +0 -18
  227. data/app/models/spree/page_blocks/products/brand.rb +0 -15
  228. data/app/models/spree/page_blocks/products/buy_buttons.rb +0 -24
  229. data/app/models/spree/page_blocks/products/description.rb +0 -18
  230. data/app/models/spree/page_blocks/products/price.rb +0 -18
  231. data/app/models/spree/page_blocks/products/quantity_selector.rb +0 -20
  232. data/app/models/spree/page_blocks/products/share.rb +0 -8
  233. data/app/models/spree/page_blocks/products/title.rb +0 -19
  234. data/app/models/spree/page_blocks/products/variant_picker.rb +0 -13
  235. data/app/models/spree/page_blocks/subheading.rb +0 -17
  236. data/app/models/spree/page_blocks/text.rb +0 -16
  237. data/app/models/spree/page_link.rb +0 -60
  238. data/app/models/spree/page_section.rb +0 -222
  239. data/app/models/spree/page_sections/announcement_bar.rb +0 -28
  240. data/app/models/spree/page_sections/breadcrumbs.rb +0 -12
  241. data/app/models/spree/page_sections/collection_banner.rb +0 -18
  242. data/app/models/spree/page_sections/custom_code.rb +0 -11
  243. data/app/models/spree/page_sections/featured_posts.rb +0 -45
  244. data/app/models/spree/page_sections/featured_product.rb +0 -50
  245. data/app/models/spree/page_sections/featured_taxon.rb +0 -90
  246. data/app/models/spree/page_sections/featured_taxons.rb +0 -45
  247. data/app/models/spree/page_sections/footer.rb +0 -101
  248. data/app/models/spree/page_sections/header.rb +0 -62
  249. data/app/models/spree/page_sections/image_banner.rb +0 -55
  250. data/app/models/spree/page_sections/image_with_text.rb +0 -65
  251. data/app/models/spree/page_sections/main_password_footer.rb +0 -18
  252. data/app/models/spree/page_sections/main_password_header.rb +0 -20
  253. data/app/models/spree/page_sections/newsletter.rb +0 -54
  254. data/app/models/spree/page_sections/page_title.rb +0 -19
  255. data/app/models/spree/page_sections/post_details.rb +0 -19
  256. data/app/models/spree/page_sections/post_grid.rb +0 -19
  257. data/app/models/spree/page_sections/product_details.rb +0 -53
  258. data/app/models/spree/page_sections/product_grid.rb +0 -13
  259. data/app/models/spree/page_sections/related_products.rb +0 -58
  260. data/app/models/spree/page_sections/rich_text.rb +0 -31
  261. data/app/models/spree/page_sections/taxon_banner.rb +0 -18
  262. data/app/models/spree/page_sections/taxon_grid.rb +0 -17
  263. data/app/models/spree/page_sections/video.rb +0 -107
  264. data/app/models/spree/pages/account.rb +0 -19
  265. data/app/models/spree/pages/cart.rb +0 -19
  266. data/app/models/spree/pages/checkout.rb +0 -15
  267. data/app/models/spree/pages/custom.rb +0 -38
  268. data/app/models/spree/pages/homepage.rb +0 -72
  269. data/app/models/spree/pages/login.rb +0 -19
  270. data/app/models/spree/pages/password.rb +0 -59
  271. data/app/models/spree/pages/post.rb +0 -27
  272. data/app/models/spree/pages/post_list.rb +0 -36
  273. data/app/models/spree/pages/product_details.rb +0 -30
  274. data/app/models/spree/pages/search_results.rb +0 -43
  275. data/app/models/spree/pages/shop_all.rb +0 -40
  276. data/app/models/spree/pages/taxon.rb +0 -29
  277. data/app/models/spree/pages/taxon_list.rb +0 -41
  278. data/app/models/spree/pages/wishlist.rb +0 -15
  279. data/app/models/spree/theme.rb +0 -233
  280. data/app/models/spree/themes/default.rb +0 -97
  281. data/app/services/spree/taxons/touch_featured_sections.rb +0 -21
  282. data/db/migrate/20250120094216_create_page_builder_models.rb +0 -78
  283. data/db/migrate/20250305121352_remove_page_builder_indices.rb +0 -11
  284. data/db/migrate/20250825175217_add_missing_page_builder_indexes.rb +0 -7
  285. data/db/migrate/20250913130044_add_page_links_counter_cache_to_spree_stores.rb +0 -10
  286. data/lib/generators/spree/dummy/templates/initializers/devise.rb +0 -3
  287. data/lib/generators/spree/install/install_generator.rb +0 -219
  288. data/lib/generators/spree/install/templates/config/initializers/spree.rb +0 -126
  289. data/lib/spree/core/webhooks.rb +0 -21
  290. data/lib/spree/testing_support/factories/page_block_factory.rb +0 -22
  291. data/lib/spree/testing_support/factories/page_factory.rb +0 -33
  292. data/lib/spree/testing_support/factories/page_link_factory.rb +0 -7
  293. data/lib/spree/testing_support/factories/page_section_factory.rb +0 -27
  294. data/lib/spree/testing_support/factories/theme_factory.rb +0 -14
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ class WebhookEndpoint < Spree.base_class
5
+ acts_as_paranoid
6
+
7
+ include Spree::SingleStoreResource
8
+
9
+ belongs_to :store, class_name: 'Spree::Store'
10
+ has_many :webhook_deliveries, class_name: 'Spree::WebhookDelivery', dependent: :destroy_async
11
+
12
+ validates :store, :url, presence: true
13
+ validates :url, format: { with: URI::DEFAULT_PARSER.make_regexp(%w[http https]), message: :invalid_url }
14
+ validates :active, inclusion: { in: [true, false] }
15
+
16
+ before_create :generate_secret_key
17
+
18
+ scope :active, -> { where(active: true) }
19
+ scope :inactive, -> { where(active: false) }
20
+
21
+ # Check if this endpoint is subscribed to a specific event
22
+ #
23
+ # @param event_name [String] the event name to check
24
+ # @return [Boolean]
25
+ def subscribed_to?(event_name)
26
+ return true if subscriptions.blank? || subscriptions.include?('*')
27
+
28
+ subscriptions.any? do |subscription|
29
+ if subscription.include?('*')
30
+ pattern = Regexp.escape(subscription).gsub('\*', '.*')
31
+ event_name.match?(Regexp.new("^#{pattern}$"))
32
+ else
33
+ subscription == event_name
34
+ end
35
+ end
36
+ end
37
+
38
+ # Returns all events this endpoint is subscribed to
39
+ #
40
+ # @return [Array<String>]
41
+ def subscribed_events
42
+ return ['*'] if subscriptions.blank?
43
+
44
+ subscriptions
45
+ end
46
+
47
+ private
48
+
49
+ def generate_secret_key
50
+ self.secret_key ||= SecureRandom.hex(32)
51
+ end
52
+ end
53
+ end
@@ -1,12 +1,10 @@
1
1
  module Spree
2
2
  class WishedItem < Spree.base_class
3
- if defined?(Spree::Webhooks::HasWebhooks)
4
- include Spree::Webhooks::HasWebhooks
5
- end
6
-
7
3
  extend DisplayMoney
8
4
  money_methods :total, :price
9
5
 
6
+ publishes_lifecycle_events
7
+
10
8
  belongs_to :variant, class_name: 'Spree::Variant'
11
9
  belongs_to :wishlist, class_name: 'Spree::Wishlist'
12
10
 
@@ -1,9 +1,8 @@
1
1
  module Spree
2
2
  class Wishlist < Spree.base_class
3
3
  include Spree::SingleStoreResource
4
- if defined?(Spree::Webhooks::HasWebhooks)
5
- include Spree::Webhooks::HasWebhooks
6
- end
4
+
5
+ publishes_lifecycle_events
7
6
 
8
7
  if Rails::VERSION::STRING >= '7.1.0'
9
8
  has_secure_token on: :save
@@ -1,9 +1,6 @@
1
1
  module Spree
2
2
  class Zone < Spree.base_class
3
3
  include Spree::UniqueName
4
- if defined?(Spree::Webhooks::HasWebhooks)
5
- include Spree::Webhooks::HasWebhooks
6
- end
7
4
 
8
5
  with_options dependent: :destroy, inverse_of: :zone do
9
6
  has_many :zone_members, class_name: 'Spree::ZoneMember'
@@ -74,12 +71,6 @@ module Spree
74
71
  matches.first
75
72
  end
76
73
 
77
- def self.default_checkout_zone
78
- Spree::Deprecation.warn('Spree::Zone.default_checkout_zone is deprecated and will be removed in Spree 5')
79
-
80
- first
81
- end
82
-
83
74
  def kind
84
75
  if self[:kind].present?
85
76
  self[:kind]
@@ -2,6 +2,10 @@ module Spree
2
2
  module Shared
3
3
  class Paginate
4
4
  def initialize(collection, params)
5
+ Spree::Deprecation.warn('Spree::Shared::Paginate is deprecated and will be removed in Spree 5.5. Please use Kaminari instead.')
6
+
7
+ raise 'Kaminari is not installed. Please add it to your Gemfile.' unless defined?(Kaminari)
8
+
5
9
  @collection = collection
6
10
  @page = params[:page]
7
11
 
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Events
5
+ class AssetSerializer < BaseSerializer
6
+ protected
7
+
8
+ def attributes
9
+ {
10
+ id: resource.id,
11
+ type: resource.type,
12
+ viewable_type: resource.viewable_type,
13
+ viewable_id: resource.viewable_id,
14
+ position: resource.position,
15
+ alt: resource.alt,
16
+ created_at: timestamp(resource.created_at),
17
+ updated_at: timestamp(resource.updated_at)
18
+ }
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Events
5
+ class BaseSerializer
6
+ attr_reader :resource, :context
7
+
8
+ def initialize(resource, context = {})
9
+ @resource = resource
10
+ @context = context
11
+ end
12
+
13
+ # Main serialization method
14
+ def as_json
15
+ attributes
16
+ end
17
+
18
+ # Class method for convenience
19
+ def self.serialize(resource, context = {})
20
+ new(resource, context).as_json
21
+ end
22
+
23
+ protected
24
+
25
+ # Override in subclasses to define attributes
26
+ def attributes
27
+ {
28
+ id: resource.id
29
+ }
30
+ end
31
+
32
+ # Context helpers
33
+ def event_name
34
+ context[:event_name]
35
+ end
36
+
37
+ def triggered_at
38
+ context[:triggered_at] || Time.current
39
+ end
40
+
41
+ # Attribute helpers
42
+
43
+ # Safely get attribute, returns nil if not present
44
+ def attribute(name)
45
+ resource.public_send(name) if resource.respond_to?(name)
46
+ end
47
+
48
+ # Timestamp helper - ISO8601 format
49
+ def timestamp(time)
50
+ time&.iso8601
51
+ end
52
+
53
+ # Money helper - decimal value for events
54
+ def money(amount)
55
+ return nil if amount.nil?
56
+
57
+ amount.respond_to?(:to_d) ? amount.to_d : amount
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Events
5
+ class CustomerReturnSerializer < BaseSerializer
6
+ protected
7
+
8
+ def attributes
9
+ {
10
+ id: resource.id,
11
+ number: resource.number,
12
+ stock_location_id: resource.stock_location_id,
13
+ store_id: resource.store_id,
14
+ created_at: timestamp(resource.created_at),
15
+ updated_at: timestamp(resource.updated_at)
16
+ }
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Events
5
+ class DigitalLinkSerializer < BaseSerializer
6
+ protected
7
+
8
+ def attributes
9
+ {
10
+ id: resource.id,
11
+ digital_id: resource.digital_id,
12
+ line_item_id: resource.line_item_id,
13
+ access_counter: resource.access_counter,
14
+ created_at: timestamp(resource.created_at),
15
+ updated_at: timestamp(resource.updated_at)
16
+ }
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Events
5
+ class DigitalSerializer < BaseSerializer
6
+ protected
7
+
8
+ def attributes
9
+ {
10
+ id: resource.id,
11
+ variant_id: resource.variant_id,
12
+ created_at: timestamp(resource.created_at),
13
+ updated_at: timestamp(resource.updated_at)
14
+ }
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Events
5
+ class ExportSerializer < BaseSerializer
6
+ protected
7
+
8
+ def attributes
9
+ {
10
+ id: resource.id,
11
+ number: resource.number,
12
+ type: resource.type,
13
+ format: resource.format,
14
+ user_id: resource.user_id,
15
+ store_id: resource.store_id,
16
+ created_at: timestamp(resource.created_at),
17
+ updated_at: timestamp(resource.updated_at)
18
+ }
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Events
5
+ class GiftCardBatchSerializer < BaseSerializer
6
+ protected
7
+
8
+ def attributes
9
+ {
10
+ id: resource.id,
11
+ codes_count: resource.codes_count,
12
+ amount: money(resource.amount),
13
+ currency: resource.currency,
14
+ prefix: resource.prefix,
15
+ expires_at: resource.expires_at&.to_s,
16
+ store_id: resource.store_id,
17
+ created_by_id: resource.created_by_id,
18
+ created_at: timestamp(resource.created_at),
19
+ updated_at: timestamp(resource.updated_at)
20
+ }
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Events
5
+ class GiftCardSerializer < BaseSerializer
6
+ protected
7
+
8
+ def attributes
9
+ {
10
+ id: resource.id,
11
+ code: resource.code,
12
+ state: resource.state.to_s,
13
+ amount: money(resource.amount),
14
+ amount_used: money(resource.amount_used),
15
+ amount_authorized: money(resource.amount_authorized),
16
+ amount_remaining: money(resource.amount_remaining),
17
+ currency: resource.currency,
18
+ expires_at: resource.expires_at&.iso8601,
19
+ redeemed_at: timestamp(resource.redeemed_at),
20
+ user_id: resource.user_id,
21
+ store_id: resource.store_id,
22
+ gift_card_batch_id: resource.gift_card_batch_id,
23
+ created_at: timestamp(resource.created_at),
24
+ updated_at: timestamp(resource.updated_at)
25
+ }
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Events
5
+ # Image serializer - uses the same attributes as AssetSerializer
6
+ class ImageSerializer < AssetSerializer
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Events
5
+ class ImportRowSerializer < BaseSerializer
6
+ protected
7
+
8
+ def attributes
9
+ {
10
+ id: resource.id,
11
+ import_id: resource.import_id,
12
+ row_number: resource.row_number,
13
+ status: resource.status,
14
+ validation_errors: resource.validation_errors,
15
+ item_type: resource.item_type,
16
+ item_id: resource.item_id,
17
+ created_at: timestamp(resource.created_at),
18
+ updated_at: timestamp(resource.updated_at)
19
+ }
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Events
5
+ class ImportSerializer < BaseSerializer
6
+ protected
7
+
8
+ def attributes
9
+ {
10
+ id: resource.id,
11
+ number: resource.number,
12
+ type: resource.type,
13
+ status: resource.status.to_s,
14
+ owner_type: resource.owner_type,
15
+ owner_id: resource.owner_id,
16
+ user_id: resource.user_id,
17
+ rows_count: resource.rows_count,
18
+ created_at: timestamp(resource.created_at),
19
+ updated_at: timestamp(resource.updated_at)
20
+ }
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Events
5
+ class InvitationSerializer < BaseSerializer
6
+ protected
7
+
8
+ def attributes
9
+ {
10
+ id: resource.id,
11
+ email: resource.email,
12
+ status: resource.status.to_s,
13
+ resource_type: resource.resource_type,
14
+ resource_id: resource.resource_id,
15
+ inviter_type: resource.inviter_type,
16
+ inviter_id: resource.inviter_id,
17
+ invitee_type: resource.invitee_type,
18
+ invitee_id: resource.invitee_id,
19
+ role_id: resource.role_id,
20
+ expires_at: timestamp(resource.expires_at),
21
+ accepted_at: timestamp(resource.accepted_at),
22
+ created_at: timestamp(resource.created_at),
23
+ updated_at: timestamp(resource.updated_at)
24
+ }
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Events
5
+ class LineItemSerializer < BaseSerializer
6
+ protected
7
+
8
+ def attributes
9
+ {
10
+ id: resource.id,
11
+ quantity: resource.quantity,
12
+ price: money(resource.price),
13
+ currency: resource.currency,
14
+ cost_price: money(resource.cost_price),
15
+ adjustment_total: money(resource.adjustment_total),
16
+ additional_tax_total: money(resource.additional_tax_total),
17
+ promo_total: money(resource.promo_total),
18
+ included_tax_total: money(resource.included_tax_total),
19
+ pre_tax_amount: money(resource.pre_tax_amount),
20
+ taxable_adjustment_total: money(resource.taxable_adjustment_total),
21
+ non_taxable_adjustment_total: money(resource.non_taxable_adjustment_total),
22
+ variant_id: resource.variant_id,
23
+ order_id: resource.order_id,
24
+ tax_category_id: resource.tax_category_id,
25
+ created_at: timestamp(resource.created_at),
26
+ updated_at: timestamp(resource.updated_at)
27
+ }
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Events
5
+ class NewsletterSubscriberSerializer < BaseSerializer
6
+ protected
7
+
8
+ def attributes
9
+ {
10
+ id: resource.id,
11
+ email: resource.email,
12
+ verified: resource.verified?,
13
+ verified_at: timestamp(resource.verified_at),
14
+ user_id: resource.user_id,
15
+ created_at: timestamp(resource.created_at),
16
+ updated_at: timestamp(resource.updated_at)
17
+ }
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Events
5
+ class OrderSerializer < BaseSerializer
6
+ protected
7
+
8
+ def attributes
9
+ {
10
+ id: resource.id,
11
+ number: resource.number,
12
+ state: resource.state.to_s,
13
+ payment_state: resource.payment_state.to_s,
14
+ shipment_state: resource.shipment_state.to_s,
15
+ total: money(resource.total),
16
+ item_total: money(resource.item_total),
17
+ shipment_total: money(resource.shipment_total),
18
+ adjustment_total: money(resource.adjustment_total),
19
+ promo_total: money(resource.promo_total),
20
+ included_tax_total: money(resource.included_tax_total),
21
+ additional_tax_total: money(resource.additional_tax_total),
22
+ item_count: resource.item_count,
23
+ currency: resource.currency,
24
+ email: resource.email,
25
+ user_id: resource.user_id,
26
+ store_id: resource.store_id,
27
+ canceler_id: resource.canceler_id,
28
+ approver_id: resource.approver_id,
29
+ considered_risky: resource.considered_risky,
30
+ completed_at: timestamp(resource.completed_at),
31
+ canceled_at: timestamp(resource.canceled_at),
32
+ approved_at: timestamp(resource.approved_at),
33
+ created_at: timestamp(resource.created_at),
34
+ updated_at: timestamp(resource.updated_at)
35
+ }
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Events
5
+ class PaymentSerializer < BaseSerializer
6
+ protected
7
+
8
+ def attributes
9
+ {
10
+ id: resource.id,
11
+ number: resource.number,
12
+ state: resource.state.to_s,
13
+ amount: money(resource.amount),
14
+ order_id: resource.order_id,
15
+ payment_method_id: resource.payment_method_id,
16
+ source_type: resource.source_type,
17
+ source_id: resource.source_id,
18
+ created_at: timestamp(resource.created_at),
19
+ updated_at: timestamp(resource.updated_at)
20
+ }
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Events
5
+ class PostCategorySerializer < BaseSerializer
6
+ protected
7
+
8
+ def attributes
9
+ {
10
+ id: resource.id,
11
+ title: resource.title,
12
+ slug: resource.slug,
13
+ store_id: resource.store_id,
14
+ created_at: timestamp(resource.created_at),
15
+ updated_at: timestamp(resource.updated_at)
16
+ }
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Events
5
+ class PostSerializer < BaseSerializer
6
+ protected
7
+
8
+ def attributes
9
+ {
10
+ id: resource.id,
11
+ title: resource.title,
12
+ slug: resource.slug,
13
+ meta_title: resource.meta_title,
14
+ meta_description: resource.meta_description,
15
+ published_at: timestamp(resource.published_at),
16
+ deleted_at: timestamp(resource.deleted_at),
17
+ author_id: resource.author_id,
18
+ post_category_id: resource.post_category_id,
19
+ store_id: resource.store_id,
20
+ created_at: timestamp(resource.created_at),
21
+ updated_at: timestamp(resource.updated_at)
22
+ }
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Events
5
+ class PriceSerializer < BaseSerializer
6
+ protected
7
+
8
+ def attributes
9
+ {
10
+ id: resource.id,
11
+ amount: money(resource.amount),
12
+ compare_at_amount: money(resource.compare_at_amount),
13
+ currency: resource.currency,
14
+ variant_id: resource.variant_id,
15
+ deleted_at: timestamp(resource.deleted_at),
16
+ created_at: timestamp(resource.created_at),
17
+ updated_at: timestamp(resource.updated_at)
18
+ }
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Events
5
+ class ProductSerializer < BaseSerializer
6
+ protected
7
+
8
+ def attributes
9
+ {
10
+ id: resource.id,
11
+ name: resource.name,
12
+ slug: resource.slug,
13
+ status: resource.status.to_s,
14
+ tax_category_id: resource.tax_category_id,
15
+ shipping_category_id: resource.shipping_category_id,
16
+ available_on: timestamp(resource.available_on),
17
+ discontinue_on: timestamp(resource.discontinue_on),
18
+ created_at: timestamp(resource.created_at),
19
+ updated_at: timestamp(resource.updated_at)
20
+ }
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Events
5
+ class PromotionSerializer < BaseSerializer
6
+ protected
7
+
8
+ def attributes
9
+ {
10
+ id: resource.id,
11
+ name: resource.name,
12
+ description: resource.description,
13
+ code: resource.code,
14
+ type: resource.type,
15
+ kind: resource.kind,
16
+ path: resource.path,
17
+ match_policy: resource.match_policy,
18
+ usage_limit: resource.usage_limit,
19
+ advertise: resource.advertise,
20
+ multi_codes: resource.multi_codes,
21
+ code_prefix: resource.code_prefix,
22
+ number_of_codes: resource.number_of_codes,
23
+ starts_at: timestamp(resource.starts_at),
24
+ expires_at: timestamp(resource.expires_at),
25
+ promotion_category_id: resource.promotion_category_id,
26
+ created_at: timestamp(resource.created_at),
27
+ updated_at: timestamp(resource.updated_at)
28
+ }
29
+ end
30
+ end
31
+ end
32
+ end