Initial event publishing support
This commit is contained in:
parent
238dfec1ac
commit
985f14688e
15 changed files with 97 additions and 37 deletions
7
Gemfile
7
Gemfile
|
@ -70,6 +70,8 @@ gem 'grape-entity', '~> 0.7.1'
|
||||||
gem 'grape-swagger-entity', '~> 0.3.3'
|
gem 'grape-swagger-entity', '~> 0.3.3'
|
||||||
gem 'grape-swagger', '~> 0.33.0'
|
gem 'grape-swagger', '~> 0.33.0'
|
||||||
gem 'grape', '~> 1.2', '>= 1.2.4'
|
gem 'grape', '~> 1.2', '>= 1.2.4'
|
||||||
|
gem 'wisper', '~> 2.0'
|
||||||
|
gem 'wisper-activejob', '~> 1.0.0'
|
||||||
|
|
||||||
group :development do
|
group :development do
|
||||||
gem 'grape_on_rails_routes', '~> 0.3.2'
|
gem 'grape_on_rails_routes', '~> 0.3.2'
|
||||||
|
@ -91,6 +93,8 @@ group :development, :ci, :test do
|
||||||
gem 'ruby-prof', '0.15.9'
|
gem 'ruby-prof', '0.15.9'
|
||||||
gem 'solargraph', '~> 0.35.1'
|
gem 'solargraph', '~> 0.35.1'
|
||||||
gem 'standard', '~> 0.1.2'
|
gem 'standard', '~> 0.1.2'
|
||||||
|
gem 'rspec-rails', '~> 3.8', '>= 3.8.2'
|
||||||
|
gem 'rspec', '~> 3.8'
|
||||||
end
|
end
|
||||||
|
|
||||||
group :ci, :test do
|
group :ci, :test do
|
||||||
|
@ -98,13 +102,12 @@ group :ci, :test do
|
||||||
gem 'database_cleaner', '~> 1.7'
|
gem 'database_cleaner', '~> 1.7'
|
||||||
gem 'factory_bot_rails', '~> 5.0', '>= 5.0.2'
|
gem 'factory_bot_rails', '~> 5.0', '>= 5.0.2'
|
||||||
gem 'factory_bot', '~> 5.0', '>= 5.0.2'
|
gem 'factory_bot', '~> 5.0', '>= 5.0.2'
|
||||||
gem 'rspec-rails', '~> 3.8', '>= 3.8.2'
|
|
||||||
gem 'rspec', '~> 3.8'
|
|
||||||
gem 'simplecov', '~> 0.16.1', require: false
|
gem 'simplecov', '~> 0.16.1', require: false
|
||||||
gem 'stripe-ruby-mock', '~> 2.4.1', require: 'stripe_mock', git: 'https://github.com/commitchange/stripe-ruby-mock.git', branch: '2.4.1'
|
gem 'stripe-ruby-mock', '~> 2.4.1', require: 'stripe_mock', git: 'https://github.com/commitchange/stripe-ruby-mock.git', branch: '2.4.1'
|
||||||
gem 'test-unit', '~> 3.3'
|
gem 'test-unit', '~> 3.3'
|
||||||
gem 'timecop', '~> 0.9.1'
|
gem 'timecop', '~> 0.9.1'
|
||||||
gem 'webmock', '~> 3.6', '>= 3.6.2'
|
gem 'webmock', '~> 3.6', '>= 3.6.2'
|
||||||
|
gem 'wisper-rspec', '~> 1.1.0'
|
||||||
end
|
end
|
||||||
|
|
||||||
group :production do
|
group :production do
|
||||||
|
|
|
@ -492,6 +492,11 @@ GEM
|
||||||
websocket-driver (0.7.1)
|
websocket-driver (0.7.1)
|
||||||
websocket-extensions (>= 0.1.0)
|
websocket-extensions (>= 0.1.0)
|
||||||
websocket-extensions (0.1.4)
|
websocket-extensions (0.1.4)
|
||||||
|
wisper (2.0.1)
|
||||||
|
wisper-activejob (1.0.0)
|
||||||
|
activejob (>= 4.0.0)
|
||||||
|
wisper
|
||||||
|
wisper-rspec (1.1.0)
|
||||||
xml-simple (1.1.5)
|
xml-simple (1.1.5)
|
||||||
yard (0.9.20)
|
yard (0.9.20)
|
||||||
|
|
||||||
|
@ -575,6 +580,9 @@ DEPENDENCIES
|
||||||
traceroute (~> 0.8.0)
|
traceroute (~> 0.8.0)
|
||||||
uglifier (~> 4.1, >= 4.1.20)
|
uglifier (~> 4.1, >= 4.1.20)
|
||||||
webmock (~> 3.6, >= 3.6.2)
|
webmock (~> 3.6, >= 3.6.2)
|
||||||
|
wisper (~> 2.0)
|
||||||
|
wisper-activejob (~> 1.0.0)
|
||||||
|
wisper-rspec (~> 1.1.0)
|
||||||
|
|
||||||
RUBY VERSION
|
RUBY VERSION
|
||||||
ruby 2.5.1p57
|
ruby 2.5.1p57
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
class DirectDebitCreateJob < ApplicationJob
|
|
||||||
queue_as :default
|
|
||||||
|
|
||||||
def perform(donation_id, locale)
|
|
||||||
DirectDebitCreateNotifyDonorJob.perform_later donation_id, locale
|
|
||||||
DirectDebitCreateNotifyNonprofitJob.perform_later donation_id, locale
|
|
||||||
end
|
|
||||||
end
|
|
12
app/listeners/credit_card_payment_listener.rb
Normal file
12
app/listeners/credit_card_payment_listener.rb
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
class CreditCardPaymentListener
|
||||||
|
def donation_create(donation, locale, user=nil)
|
||||||
|
if donation.payment_provider == :credit_card
|
||||||
|
PaymentNotificationEmailDonorJob.perform_later donation, locale
|
||||||
|
PaymentNotificationEmailNonprofitJob.perform_later donation, user
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def recurring_donation_create(donation, locale, user=nil)
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
6
app/listeners/nonprofit_mailer_listener.rb
Normal file
6
app/listeners/nonprofit_mailer_listener.rb
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
class NonprofitMailerListener
|
||||||
|
|
||||||
|
def nonprofit_create(nonprofit)
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
12
app/listeners/sepa_payment_listener.rb
Normal file
12
app/listeners/sepa_payment_listener.rb
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
class SepaPaymentListener
|
||||||
|
def donation_create(donation)
|
||||||
|
if donation.payment_provider == :sepa
|
||||||
|
DirectDebitCreateNotifyNonprofitJob.perform_later(donation.id)
|
||||||
|
DirectDebitCreateNotifyDonorJob.perform_later donation.id, locale
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def recurring_donation_create(donation, locale, user=nil)
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
2
app/listeners/supporter_mailer_listener.rb
Normal file
2
app/listeners/supporter_mailer_listener.rb
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
class SupporterMailerListener
|
||||||
|
end
|
13
app/listeners/wemove_listener.rb
Normal file
13
app/listeners/wemove_listener.rb
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
class WemoveListener
|
||||||
|
def donation_create(donation)
|
||||||
|
WeMoveExecuteForDonationsJob.perform_later(donation)
|
||||||
|
end
|
||||||
|
|
||||||
|
def offsite_donation_create(donation)
|
||||||
|
WeMoveExecuteForDonationsJob.perform_later(donation)
|
||||||
|
end
|
||||||
|
|
||||||
|
def recurring_donation_create(donation)
|
||||||
|
WeMoveExecuteForDonationsJob.perform_later(donation)
|
||||||
|
end
|
||||||
|
end
|
|
@ -30,10 +30,11 @@ module Commitchange
|
||||||
|
|
||||||
# Custom directories with classes and modules you want to be autoloadable.
|
# Custom directories with classes and modules you want to be autoloadable.
|
||||||
# config.autoload_paths += %W(#{config.root}/extras)
|
# config.autoload_paths += %W(#{config.root}/extras)
|
||||||
config.eager_load_paths += Dir["#{config.root}/lib/**/"]
|
config.eager_load_paths += Dir["#{config.root}/lib/**/", ""]
|
||||||
|
|
||||||
config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb')
|
config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb')
|
||||||
config.eager_load_paths += Dir[Rails.root.join('app', 'api', '*')]
|
config.paths.add File.join('app', 'listeners'), glob: File.join('**', '*.rb')
|
||||||
|
config.eager_load_paths += Dir[Rails.root.join('app', 'api', '*'), Rails.root.join('app', 'listeners', '*')]
|
||||||
|
|
||||||
# Only load the plugins named here, in the order given (default is alphabetical).
|
# Only load the plugins named here, in the order given (default is alphabetical).
|
||||||
# :all can be used as a placeholder for all plugins not explicitly named.
|
# :all can be used as a placeholder for all plugins not explicitly named.
|
||||||
|
|
10
config/initializers/houdini_event_publisher.rb
Normal file
10
config/initializers/houdini_event_publisher.rb
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
# License: AGPL-3.0-or-later WITH Web-Template-Output-Additional-Permission-3.0-or-later
|
||||||
|
HoudiniEventPublisher = EventPublisher.new
|
||||||
|
|
||||||
|
Rails.application.config.to_prepare do
|
||||||
|
HoudiniEventPublisher.clear if Rails.env.development?
|
||||||
|
|
||||||
|
HoudiniEventPublisher.subscribe_async(NonprofitMailerListener.new)
|
||||||
|
end
|
14
lib/event_publisher.rb
Normal file
14
lib/event_publisher.rb
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
# License: AGPL-3.0-or-later WITH Web-Template-Output-Additional-Permission-3.0-or-later
|
||||||
|
class EventPublisher
|
||||||
|
include Wisper::Publisher
|
||||||
|
|
||||||
|
def call(event, *args)
|
||||||
|
broadcast(event, *args)
|
||||||
|
end
|
||||||
|
|
||||||
|
def subscribe_async(listener, options = {})
|
||||||
|
subscribe(listener, options.merge(async: true))
|
||||||
|
end
|
||||||
|
end
|
|
@ -43,8 +43,7 @@ module InsertDonation
|
||||||
result['donation'] = insert_donation(data, entities)
|
result['donation'] = insert_donation(data, entities)
|
||||||
update_donation_keys(result)
|
update_donation_keys(result)
|
||||||
result['activity'] = InsertActivities.for_one_time_donations([result['payment'].id])
|
result['activity'] = InsertActivities.for_one_time_donations([result['payment'].id])
|
||||||
PaymentNotificationJob.perform_later result['donation'], entities[:supporter_id].locale
|
HoudiniEventPublisher.call(:donation_create, result['donation'], result['donation'].supporter.locale)
|
||||||
WeMoveExecuteForDonationsJob.perform_later(result['donation'])
|
|
||||||
result
|
result
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -105,9 +104,8 @@ module InsertDonation
|
||||||
result['donation'] = insert_donation(data, entities)
|
result['donation'] = insert_donation(data, entities)
|
||||||
update_donation_keys(result)
|
update_donation_keys(result)
|
||||||
|
|
||||||
DirectDebitCreateJob.perform_later(result['donation'].id, locale_for_supporter(result['donation'].supporter.id))
|
HoudiniEventPublisher.call(:donation_create, result['donation'], locale_for_supporter(result['donation'].supporter.id))
|
||||||
|
|
||||||
WeMoveExecuteForDonationsJob.perform_later(result['donation'])
|
|
||||||
# do this for making test consistent
|
# do this for making test consistent
|
||||||
result['activity'] = {}
|
result['activity'] = {}
|
||||||
result
|
result
|
||||||
|
|
|
@ -71,7 +71,6 @@ module InsertRecurringDonation
|
||||||
end
|
end
|
||||||
# Send receipts
|
# Send receipts
|
||||||
PaymentNotificationJob.perform_later result['donation'], entities[:supporter_id].locale
|
PaymentNotificationJob.perform_later result['donation'], entities[:supporter_id].locale
|
||||||
WeMoveExecuteForDonationsJob.perform_later(result['donation'])
|
|
||||||
result
|
result
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -96,8 +95,6 @@ module InsertRecurringDonation
|
||||||
|
|
||||||
DonorDirectDebitNotificationJob.perform_later(Donation.find(result['donation']['id']), locale_for_supporter(result['donation']['supporter_id']));
|
DonorDirectDebitNotificationJob.perform_later(Donation.find(result['donation']['id']), locale_for_supporter(result['donation']['supporter_id']));
|
||||||
|
|
||||||
WeMoveExecuteForDonationsJob.perform_later(result['donation'])
|
|
||||||
|
|
||||||
{ status: 200, json: result }
|
{ status: 200, json: result }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ require 'support/expect'
|
||||||
require 'support/mock_helpers'
|
require 'support/mock_helpers'
|
||||||
require 'action_mailer_matchers'
|
require 'action_mailer_matchers'
|
||||||
require 'active_job'
|
require 'active_job'
|
||||||
|
require 'wisper/rspec/matchers'
|
||||||
include ActiveJob::TestHelper
|
include ActiveJob::TestHelper
|
||||||
RSpec.configure do |config|
|
RSpec.configure do |config|
|
||||||
# rspec-expectations config goes here. You can use an alternate
|
# rspec-expectations config goes here. You can use an alternate
|
||||||
|
@ -112,4 +113,6 @@ RSpec.configure do |config|
|
||||||
end
|
end
|
||||||
clear_enqueued_jobs
|
clear_enqueued_jobs
|
||||||
end
|
end
|
||||||
|
|
||||||
|
config.include(Wisper::RSpec::BroadcastMatcher)
|
||||||
end
|
end
|
||||||
|
|
|
@ -374,6 +374,9 @@ RSpec.shared_context :shared_rd_donation_value_context do
|
||||||
|
|
||||||
def process_event_donation(data = {})
|
def process_event_donation(data = {})
|
||||||
pay_method = data[:sepa] ? direct_debit_detail : card
|
pay_method = data[:sepa] ? direct_debit_detail : card
|
||||||
|
|
||||||
|
expect(HoudiniEventPublisher).to receive(:call).with(:donation_create,instance_of(Donation), supporter.locale )
|
||||||
|
|
||||||
result = yield
|
result = yield
|
||||||
expected = generate_expected(@donation_id, result['payment'].id, result['charge'].id, pay_method, supporter, nonprofit, @stripe_charge_id, event: event, recurring_donation_expected: data[:recurring_donation], recurring_donation: result['recurring_donation'])
|
expected = generate_expected(@donation_id, result['payment'].id, result['charge'].id, pay_method, supporter, nonprofit, @stripe_charge_id, event: event, recurring_donation_expected: data[:recurring_donation], recurring_donation: result['recurring_donation'])
|
||||||
|
|
||||||
|
@ -385,18 +388,15 @@ RSpec.shared_context :shared_rd_donation_value_context do
|
||||||
if data[:recurring_donation]
|
if data[:recurring_donation]
|
||||||
expect(result['recurring_donation'].attributes).to eq expected[:recurring_donation]
|
expect(result['recurring_donation'].attributes).to eq expected[:recurring_donation]
|
||||||
end
|
end
|
||||||
if (data[:sepa])
|
|
||||||
expect(DirectDebitCreateJob).to have_been_enqueued.with(result['donation']['id'], supporter.locale)
|
|
||||||
else
|
|
||||||
expect(PaymentNotificationJob).to have_been_enqueued.with(result['donation'], supporter.locale)
|
|
||||||
end
|
|
||||||
expect(WeMoveExecuteForDonationsJob).to have_been_enqueued
|
|
||||||
|
|
||||||
result
|
result
|
||||||
end
|
end
|
||||||
|
|
||||||
def process_campaign_donation(data = {})
|
def process_campaign_donation(data = {})
|
||||||
pay_method = data[:sepa] ? direct_debit_detail : card
|
pay_method = data[:sepa] ? direct_debit_detail : card
|
||||||
|
|
||||||
|
expect(HoudiniEventPublisher).to receive(:call).with(:donation_create,instance_of(Donation), supporter.locale )
|
||||||
|
|
||||||
result = yield
|
result = yield
|
||||||
expected = generate_expected(@donation_id, result['payment'].id, result['charge'].id, pay_method, supporter, nonprofit, @stripe_charge_id, campaign: campaign, recurring_donation_expected: data[:recurring_donation], recurring_donation: result['recurring_donation'])
|
expected = generate_expected(@donation_id, result['payment'].id, result['charge'].id, pay_method, supporter, nonprofit, @stripe_charge_id, campaign: campaign, recurring_donation_expected: data[:recurring_donation], recurring_donation: result['recurring_donation'])
|
||||||
|
|
||||||
|
@ -408,17 +408,12 @@ RSpec.shared_context :shared_rd_donation_value_context do
|
||||||
if data[:recurring_donation]
|
if data[:recurring_donation]
|
||||||
expect(result['recurring_donation'].attributes).to eq expected[:recurring_donation]
|
expect(result['recurring_donation'].attributes).to eq expected[:recurring_donation]
|
||||||
end
|
end
|
||||||
if (data[:sepa])
|
|
||||||
|
|
||||||
else
|
|
||||||
expect(PaymentNotificationJob).to have_been_enqueued.with(result['donation'], supporter.locale)
|
|
||||||
end
|
|
||||||
expect(WeMoveExecuteForDonationsJob).to have_been_enqueued
|
|
||||||
result
|
result
|
||||||
end
|
end
|
||||||
|
|
||||||
def process_general_donation(data = {})
|
def process_general_donation(data = {})
|
||||||
pay_method = data[:sepa] ? direct_debit_detail : card
|
pay_method = data[:sepa] ? direct_debit_detail : card
|
||||||
|
expect(HoudiniEventPublisher).to receive(:call).with(:donation_create,instance_of(Donation), supporter.locale )
|
||||||
result = yield
|
result = yield
|
||||||
expect_payment = nil_or_true(data[:expect_payment])
|
expect_payment = nil_or_true(data[:expect_payment])
|
||||||
expect_charge = nil_or_true(data[:expect_charge])
|
expect_charge = nil_or_true(data[:expect_charge])
|
||||||
|
@ -439,12 +434,6 @@ RSpec.shared_context :shared_rd_donation_value_context do
|
||||||
expect(result['recurring_donation'].attributes).to eq expected[:recurring_donation]
|
expect(result['recurring_donation'].attributes).to eq expected[:recurring_donation]
|
||||||
end
|
end
|
||||||
|
|
||||||
if (data[:sepa])
|
|
||||||
|
|
||||||
else
|
|
||||||
expect(PaymentNotificationJob).to have_been_enqueued.with(result['donation'], supporter.locale)
|
|
||||||
end
|
|
||||||
expect(WeMoveExecuteForDonationsJob).to have_been_enqueued
|
|
||||||
result
|
result
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue