summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlessandro Desantis <desa.alessandro@gmail.com>2020-10-01 14:21:39 +0200
committerAlessandro Desantis <desa.alessandro@gmail.com>2020-10-01 14:46:04 +0200
commit30d2fdd6d6b621fc3c74fffa25ae8763d04121d4 (patch)
treea9d912f1d7bbbbd39621e26fdb0255aadaaf2f3d
parent3bbdfc3ff7a90145780657db094b0451c037f2af (diff)
Streamline event emission and tracking
-rw-r--r--app/models/solidus_subscriptions/line_item.rb32
-rw-r--r--app/models/solidus_subscriptions/subscription.rb22
-rw-r--r--app/models/solidus_subscriptions/subscription_event.rb13
-rw-r--r--app/subscribers/solidus_subscriptions/event_storage_subscriber.rb48
-rw-r--r--config/initializers/subscribers.rb5
-rw-r--r--spec/models/solidus_subscriptions/line_item_spec.rb12
-rw-r--r--spec/models/solidus_subscriptions/subscription_event_spec.rb15
7 files changed, 76 insertions, 71 deletions
diff --git a/app/models/solidus_subscriptions/line_item.rb b/app/models/solidus_subscriptions/line_item.rb
index 0acdc02..d2e3b77 100644
--- a/app/models/solidus_subscriptions/line_item.rb
+++ b/app/models/solidus_subscriptions/line_item.rb
@@ -39,9 +39,9 @@ module SolidusSubscriptions
validates :quantity, numericality: { greater_than: 0 }
validates :interval_length, numericality: { greater_than: 0 }, unless: -> { subscription }
- after_create :track_creation_event
- after_update :track_update_event
- after_destroy :track_destroy_event
+ after_create :emit_event_for_repopulation
+ after_update :emit_event_for_repopulation
+ after_destroy :emit_event_for_repopulation
def as_json(**options)
options[:methods] ||= [:dummy_line_item]
@@ -72,32 +72,10 @@ module SolidusSubscriptions
order.freeze
end
- def as_json_for_event
- as_json.with_indifferent_access.except(
- :dummy_line_item,
- :interval_units,
- :interval_length,
- :end_date,
- :spree_line_item_id,
- )
- end
-
- def track_creation_event
- return unless subscription
-
- subscription.events.create!(event_type: 'line_item_created', details: as_json_for_event)
- end
-
- def track_update_event
- return unless subscription
-
- subscription.events.create!(event_type: 'line_item_updated', details: as_json_for_event)
- end
-
- def track_destroy_event
+ def emit_event_for_repopulation
return unless subscription
- subscription.events.create!(event_type: 'line_item_destroyed', details: as_json_for_event)
+ ::Spree::Event.fire('solidus_subscriptions.subscription_repopulated', subscription: subscription)
end
end
end
diff --git a/app/models/solidus_subscriptions/subscription.rb b/app/models/solidus_subscriptions/subscription.rb
index 295d19b..e8aff4c 100644
--- a/app/models/solidus_subscriptions/subscription.rb
+++ b/app/models/solidus_subscriptions/subscription.rb
@@ -31,7 +31,7 @@ module SolidusSubscriptions
accepts_nested_attributes_for :line_items, allow_destroy: true, reject_if: ->(p) { p[:quantity].blank? }
before_validation :set_payment_method
- after_create :track_creation_event
+ after_create :emit_event_for_creation
before_update :update_actionable_date_if_interval_changed
# Find all subscriptions that are "actionable"; that is, ones that have an
@@ -113,7 +113,7 @@ module SolidusSubscriptions
end
after_transition to: :active, do: :advance_actionable_date
- after_transition do: :track_transition_event
+ after_transition do: :emit_event_for_transition
end
# This method determines if a subscription may be canceled. Canceled
@@ -274,15 +274,14 @@ module SolidusSubscriptions
end
end
- def as_json_for_event
- as_json
+ def emit_event_for_creation
+ ::Spree::Event.fire(
+ 'solidus_subscriptions.subscription_created',
+ subscription: self,
+ )
end
- def track_creation_event
- events.create!(event_type: 'subscription_created', details: as_json_for_event)
- end
-
- def track_transition_event
+ def emit_event_for_transition
event_type = {
active: 'subscription_activated',
canceled: 'subscription_canceled',
@@ -290,7 +289,10 @@ module SolidusSubscriptions
inactive: 'subscription_ended',
}[state.to_sym]
- events.create!(event_type: event_type, details: as_json_for_event)
+ ::Spree::Event.fire(
+ "solidus_subscriptions.#{event_type}",
+ subscription: self,
+ )
end
end
end
diff --git a/app/models/solidus_subscriptions/subscription_event.rb b/app/models/solidus_subscriptions/subscription_event.rb
index 8476470..6f81ef7 100644
--- a/app/models/solidus_subscriptions/subscription_event.rb
+++ b/app/models/solidus_subscriptions/subscription_event.rb
@@ -7,18 +7,5 @@ module SolidusSubscriptions
after_initialize do
self.details ||= {}
end
-
- after_create :emit_event
-
- private
-
- def emit_event
- return unless defined?(::Spree::Event)
-
- ::Spree::Event.fire(
- "solidus_subscriptions.#{event_type}",
- details.deep_symbolize_keys.merge(subscription: subscription),
- )
- end
end
end
diff --git a/app/subscribers/solidus_subscriptions/event_storage_subscriber.rb b/app/subscribers/solidus_subscriptions/event_storage_subscriber.rb
new file mode 100644
index 0000000..1a6ec7c
--- /dev/null
+++ b/app/subscribers/solidus_subscriptions/event_storage_subscriber.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+module SolidusSubscriptions
+ module EventStorageSubscriber
+ include ::Spree::Event::Subscriber
+
+ event_action :track_subscription_created, event_name: 'solidus_subscriptions.subscription_created'
+ event_action :track_subscription_activated, event_name: 'solidus_subscriptions.subscription_activated'
+ event_action :track_subscription_canceled, event_name: 'solidus_subscriptions.subscription_canceled'
+ event_action :track_subscription_ended, event_name: 'solidus_subscriptions.subscription_ended'
+ event_action :track_subscription_repopulated, event_name: 'solidus_subscriptions.subscription_repopulated'
+
+ def track_subscription_created(event)
+ event.payload.fetch(:subscription).events.create!(
+ event_type: 'subscription_created',
+ details: event.payload.fetch(:subscription).as_json,
+ )
+ end
+
+ def track_subscription_activated(event)
+ event.payload.fetch(:subscription).events.create!(
+ event_type: 'subscription_activated',
+ details: event.payload.fetch(:subscription).as_json,
+ )
+ end
+
+ def track_subscription_canceled(event)
+ event.payload.fetch(:subscription).events.create!(
+ event_type: 'subscription_canceled',
+ details: event.payload.fetch(:subscription).as_json,
+ )
+ end
+
+ def track_subscription_ended(event)
+ event.payload.fetch(:subscription).events.create!(
+ event_type: 'subscription_ended',
+ details: event.payload.fetch(:subscription).as_json,
+ )
+ end
+
+ def track_subscription_repopulated(event)
+ event.payload.fetch(:subscription).events.create!(
+ event_type: 'subscription_repopulated',
+ details: event.payload.fetch(:subscription).as_json,
+ )
+ end
+ end
+end
diff --git a/config/initializers/subscribers.rb b/config/initializers/subscribers.rb
new file mode 100644
index 0000000..fe4c88b
--- /dev/null
+++ b/config/initializers/subscribers.rb
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+Spree.config do |config|
+ config.events.subscribers << 'SolidusSubscriptions::EventStorageSubscriber'
+end
diff --git a/spec/models/solidus_subscriptions/line_item_spec.rb b/spec/models/solidus_subscriptions/line_item_spec.rb
index 7312b33..163e701 100644
--- a/spec/models/solidus_subscriptions/line_item_spec.rb
+++ b/spec/models/solidus_subscriptions/line_item_spec.rb
@@ -8,27 +8,27 @@ RSpec.describe SolidusSubscriptions::LineItem, type: :model do
describe '#save!' do
context 'when the line item is new' do
- it 'tracks a line_item_created event' do
+ it 'tracks a subscription_repopulated event' do
line_item = build(:subscription_line_item, :with_subscription)
line_item.save!
expect(line_item.subscription.events.last).to have_attributes(
- event_type: 'line_item_created',
+ event_type: 'subscription_repopulated',
details: a_hash_including('id' => line_item.id),
)
end
end
context 'when the line item is persisted' do
- it 'tracks a line_item_updated event' do
+ it 'tracks a subscription_repopulated event' do
line_item = create(:subscription_line_item, :with_subscription)
line_item.quantity = 2
line_item.save!
expect(line_item.subscription.events.last).to have_attributes(
- event_type: 'line_item_updated',
+ event_type: 'subscription_repopulated',
details: a_hash_including('id' => line_item.id),
)
end
@@ -36,13 +36,13 @@ RSpec.describe SolidusSubscriptions::LineItem, type: :model do
end
describe '#destroy!' do
- it 'tracks a line_item_destroyed event' do
+ it 'tracks a subscription_repopulated event' do
line_item = create(:subscription_line_item, :with_subscription)
line_item.destroy!
expect(line_item.subscription.events.last).to have_attributes(
- event_type: 'line_item_destroyed',
+ event_type: 'subscription_repopulated',
details: a_hash_including('id' => line_item.id),
)
end
diff --git a/spec/models/solidus_subscriptions/subscription_event_spec.rb b/spec/models/solidus_subscriptions/subscription_event_spec.rb
deleted file mode 100644
index d4602f3..0000000
--- a/spec/models/solidus_subscriptions/subscription_event_spec.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-require 'spec_helper'
-
-RSpec.describe SolidusSubscriptions::SubscriptionEvent do
- describe '#save' do
- it 'emits a Solidus event' do
- event_klass = class_spy('Spree::Event')
- stub_const('Spree::Event', event_klass)
-
- subscription = create(:subscription)
- subscription_event = create(:subscription_event, subscription: subscription, event_type: 'test_event', details: { foo: 'bar' })
-
- expect(event_klass).to have_received(:fire).with('solidus_subscriptions.test_event', subscription: subscription_event.subscription, foo: 'bar')
- end
- end
-end