Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/app/models/event_processor.rb b/app/models/event_processor.rb
- new file mode 100644
- index 0000000..36a55af
- --- /dev/null
- +++ b/app/models/event_processor.rb
- @@ -0,0 +1,38 @@
- +module EventProcessor
- + @@processors = []
- +
- + class <<self
- + def register(processor)
- + @@processors << processor
- + end
- +
- + def processors
- + @@processors
- + end
- +
- + def run(event)
- + find_processors(event).each do |processor|
- + begin
- + processor.new(event).run
- + rescue EventProcessor::Error => e
- + logger.error("[#{e.class.name}] #{e.message}")
- + end
- + end
- + end
- +
- + def logger
- + @logger ||= RAILS_DEFAULT_LOGGER
- + end
- + attr_writer :logger
- +
- + private
- +
- + def find_processors(event)
- + processors.find { |p| p.handle?(event) }
- + end
- + end
- +end
- +
- +EventProcessor.register(EventProcessor::Renovatix)
- +EventProcessor.register(EventProcessor::Soap)
- +EventProcessor.register(EventProcessor::Email)
- diff --git a/app/models/event_processor/base.rb b/app/models/event_processor/base.rb
- new file mode 100644
- index 0000000..c412b6d
- --- /dev/null
- +++ b/app/models/event_processor/base.rb
- @@ -0,0 +1,11 @@
- +class EventProcessor::Base
- + def self.handle?(event)
- + false
- + end
- +
- + def initialize(event)
- + @event = event
- + end
- + attr_reader :event
- +
- +end
- diff --git a/app/models/event_processor/email.rb b/app/models/event_processor/email.rb
- new file mode 100644
- index 0000000..8934ca8
- --- /dev/null
- +++ b/app/models/event_processor/email.rb
- @@ -0,0 +1,27 @@
- +class EventProcessor::Event < EventProcessor::Base
- + def self.handle?(event)
- + event.class.name.is_a?(SubscriptionEvent) && event.reseller.use_setting?("#{event.event_type}_mail_notify")
- + end
- +
- + def run
- + case @event.event_type
- + when 'cancel'
- + send_cancel_notification
- + when 'renew'
- + send_renew_notification
- + end
- + end
- +
- + protected
- +
- + def send_cancel_notification
- + order = @reseller.orders.find_by_partner_order_id(@event.params[:partner_order_id])
- + Notifications.deliver_reseller_order_cancelled(order) if Merchant.ever_upgraded_or_renewed?(@merchant.id)
- + end
- +
- + def send_renew_notification
- + new_order = Order.find(@event.params[:new_order_id])
- + Notifications.deliver_reseller_order_renewed(new_order)
- + end
- +end
- +
- diff --git a/app/models/event_processor/error.rb b/app/models/event_processor/error.rb
- new file mode 100644
- index 0000000..d4660bb
- --- /dev/null
- +++ b/app/models/event_processor/error.rb
- @@ -0,0 +1,2 @@
- +class EventProcessor::Error < StandardError
- +end
- diff --git a/app/models/event_processor/renovatix.rb b/app/models/event_processor/renovatix.rb
- new file mode 100644
- index 0000000..1b14336
- --- /dev/null
- +++ b/app/models/event_processor/renovatix.rb
- @@ -0,0 +1,27 @@
- +require 'renovatix_client'
- +
- +class EventProcessor::Renovatix < EventProcessor::Base
- +
- + def self.handle?(event)
- + event.class.name.is_a?(SubscriptionEvent) && event.reseller.payment_type == 'renovatix'
- + end
- +
- + def run
- + case @event.event_type
- + when 'cancel'
- + cancel_order! @event.merchant.last_order
- + when 'renew'
- + cancel_order! @event.merchant.previous_order
- + end
- + end
- +
- + protected
- +
- + def cancel_order!(order)
- + Renovatix::Subscription.cancel(order.renovatix_detail.item_id)
- + true
- + rescue Renovatix::ResponseError => e
- + false
- + end
- +
- +end
- diff --git a/app/models/event_processor/soap.rb b/app/models/event_processor/soap.rb
- new file mode 100644
- index 0000000..e376115
- --- /dev/null
- +++ b/app/models/event_processor/soap.rb
- @@ -0,0 +1,118 @@
- +require 'fileutils'
- +require 'soap/wsdlDriver'
- +
- +# Override patched method
- +require File.join(RAILS_ROOT, 'lib/soap4r/mapping/mapping.rb')
- +
- +class EventProcessor::Soap << EventProcessor::Base
- + # WTF?
- + module Reason
- + class UnknownReasonError < StandardError
- + def initialize(reason_id)
- + super("Unknown reason id:#{reason_id}")
- + end
- + end
- +
- + CUSTOMER_REQUEST = "CUSTOMER_REQUEST"
- + POLICY_VIOLATION = "POLICY_VIOLATION"
- +
- + DEFAULT = POLICY_VIOLATION
- +
- + All = [CUSTOMER_REQUEST, POLICY_VIOLATION]
- +
- + def self.all_with_ids
- + All.map {|reason| [reason, reason]}
- + end
- +
- + def self.by_id(reason_id, raise_error = false)
- + if not All.include?(reason_id)
- + raise UnknownReasonError.new(reason_id) if raise_error
- + return DEFAULT
- + end
- +
- + reason_id
- + end
- + end
- +
- + def self.handle?(event)
- + event.class.name.is_a?(SubscriptionEvent) && event.reseller.use_setting?("#{event.event_type}_postback")
- + end
- +
- + def initialize(event)
- + @reseller = event.reseller
- + @merchant = event.merchant
- +
- + super(event)
- + end
- +
- + def run
- + case event.event_type
- + when 'cancel'
- + send_cancel_request
- + when 'upgrade'
- + send_renew_request
- + end
- +
- + rescue SOAP::FaultError => e
- + message = e.message
- + message << "\n" << e.detail.inspect if e.respond_to?(:detail)
- + raise EventProcessor::Error, message
- + end
- +
- + protected
- +
- + def send_cancel_request
- + params = event.params
- + return false if params[:cancel_reason] == Reason::CUSTOMER_REQUEST && !Merchant.ever_upgraded_or_renewed?(@merchant.id)
- +
- + wsdl_driver.cancelBusinessOrder(
- + params[:partner_order_id],
- + params[:cancel_reason]
- + )
- + end
- +
- + def send_renew_request
- + params = event.params
- +
- + wsdl_driver.upgradeBusinessNotification(
- + params[:partner_order_id],
- + params[:order_id],
- + params[:new_partner_order_id],
- + params[:new_order_id],
- + params[:product_uid]
- + )
- + end
- +
- + private
- +
- + def endpoint_url
- + event.reseller.settings["#{self.event_type}_postback_url"] or raise EventProcessor::Error, 'Postback url not defined'
- + end
- +
- + def wsdl_uri
- + File.join(RAILS_ROOT, 'ws/postback/postback_service.wsdl')
- + end
- +
- + def wsdl_driver
- + @driver ||= SOAP::WSDLDriverFactory.new(wsdl_uri).create_rpc_driver
- +
- + user = @reseller.settings['postback_service_user_name']
- + pass = @reseller.settings['postback_service_password']
- +
- + @driver.options["protocol.http.basic_auth"] << [endpoint_url, user, pass] unless (user.blank? || pass.blank?)
- +
- + @driver.endpoint_url = endpoint_url
- +
- +
- + @driver.wiredump_file_base = wsdl_log
- +
- + @driver
- + end
- +
- + def wsdl_log
- + filename = File.expand_path(File.join(RAILS_ROOT, "log/wsdl/#{Time.now.to_i}"))
- + FileUtils.mkdir_p File.dirname(filename)
- + filename
- + end
- +
- +end
- diff --git a/app/models/tasks/event_processing_task.rb b/app/models/tasks/event_processing_task.rb
- new file mode 100644
- index 0000000..a2d5db0
- --- /dev/null
- +++ b/app/models/tasks/event_processing_task.rb
- @@ -0,0 +1,7 @@
- +class EventProcessingTask < Task
- + belongs_to :event, :polymorphic => true, :foreign_type => "notifier_type", :foreign_key => 'notifier_id'
- +
- + def run
- + EventProcessor.run(event)
- + end
- +end
Add Comment
Please, Sign In to add comment