diff options
author | Alessandro Desantis <desa.alessandro@gmail.com> | 2020-10-01 14:21:39 +0200 |
---|---|---|
committer | Alessandro Desantis <desa.alessandro@gmail.com> | 2020-10-01 14:46:04 +0200 |
commit | 30d2fdd6d6b621fc3c74fffa25ae8763d04121d4 (patch) | |
tree | a9d912f1d7bbbbd39621e26fdb0255aadaaf2f3d | |
parent | 3bbdfc3ff7a90145780657db094b0451c037f2af (diff) |
Streamline event emission and tracking
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 |