Guest User

Untitled

a guest
Jul 6th, 2018
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.03 KB | None | 0 0
  1. diff --git a/app/models/event_processor.rb b/app/models/event_processor.rb
  2. new file mode 100644
  3. index 0000000..36a55af
  4. --- /dev/null
  5. +++ b/app/models/event_processor.rb
  6. @@ -0,0 +1,38 @@
  7. +module EventProcessor
  8. + @@processors = []
  9. +
  10. + class <<self
  11. + def register(processor)
  12. + @@processors << processor
  13. + end
  14. +
  15. + def processors
  16. + @@processors
  17. + end
  18. +
  19. + def run(event)
  20. + find_processors(event).each do |processor|
  21. + begin
  22. + processor.new(event).run
  23. + rescue EventProcessor::Error => e
  24. + logger.error("[#{e.class.name}] #{e.message}")
  25. + end
  26. + end
  27. + end
  28. +
  29. + def logger
  30. + @logger ||= RAILS_DEFAULT_LOGGER
  31. + end
  32. + attr_writer :logger
  33. +
  34. + private
  35. +
  36. + def find_processors(event)
  37. + processors.find { |p| p.handle?(event) }
  38. + end
  39. + end
  40. +end
  41. +
  42. +EventProcessor.register(EventProcessor::Renovatix)
  43. +EventProcessor.register(EventProcessor::Soap)
  44. +EventProcessor.register(EventProcessor::Email)
  45. diff --git a/app/models/event_processor/base.rb b/app/models/event_processor/base.rb
  46. new file mode 100644
  47. index 0000000..c412b6d
  48. --- /dev/null
  49. +++ b/app/models/event_processor/base.rb
  50. @@ -0,0 +1,11 @@
  51. +class EventProcessor::Base
  52. + def self.handle?(event)
  53. + false
  54. + end
  55. +
  56. + def initialize(event)
  57. + @event = event
  58. + end
  59. + attr_reader :event
  60. +
  61. +end
  62. diff --git a/app/models/event_processor/email.rb b/app/models/event_processor/email.rb
  63. new file mode 100644
  64. index 0000000..8934ca8
  65. --- /dev/null
  66. +++ b/app/models/event_processor/email.rb
  67. @@ -0,0 +1,27 @@
  68. +class EventProcessor::Event < EventProcessor::Base
  69. + def self.handle?(event)
  70. + event.class.name.is_a?(SubscriptionEvent) && event.reseller.use_setting?("#{event.event_type}_mail_notify")
  71. + end
  72. +
  73. + def run
  74. + case @event.event_type
  75. + when 'cancel'
  76. + send_cancel_notification
  77. + when 'renew'
  78. + send_renew_notification
  79. + end
  80. + end
  81. +
  82. + protected
  83. +
  84. + def send_cancel_notification
  85. + order = @reseller.orders.find_by_partner_order_id(@event.params[:partner_order_id])
  86. + Notifications.deliver_reseller_order_cancelled(order) if Merchant.ever_upgraded_or_renewed?(@merchant.id)
  87. + end
  88. +
  89. + def send_renew_notification
  90. + new_order = Order.find(@event.params[:new_order_id])
  91. + Notifications.deliver_reseller_order_renewed(new_order)
  92. + end
  93. +end
  94. +
  95. diff --git a/app/models/event_processor/error.rb b/app/models/event_processor/error.rb
  96. new file mode 100644
  97. index 0000000..d4660bb
  98. --- /dev/null
  99. +++ b/app/models/event_processor/error.rb
  100. @@ -0,0 +1,2 @@
  101. +class EventProcessor::Error < StandardError
  102. +end
  103. diff --git a/app/models/event_processor/renovatix.rb b/app/models/event_processor/renovatix.rb
  104. new file mode 100644
  105. index 0000000..1b14336
  106. --- /dev/null
  107. +++ b/app/models/event_processor/renovatix.rb
  108. @@ -0,0 +1,27 @@
  109. +require 'renovatix_client'
  110. +
  111. +class EventProcessor::Renovatix < EventProcessor::Base
  112. +
  113. + def self.handle?(event)
  114. + event.class.name.is_a?(SubscriptionEvent) && event.reseller.payment_type == 'renovatix'
  115. + end
  116. +
  117. + def run
  118. + case @event.event_type
  119. + when 'cancel'
  120. + cancel_order! @event.merchant.last_order
  121. + when 'renew'
  122. + cancel_order! @event.merchant.previous_order
  123. + end
  124. + end
  125. +
  126. + protected
  127. +
  128. + def cancel_order!(order)
  129. + Renovatix::Subscription.cancel(order.renovatix_detail.item_id)
  130. + true
  131. + rescue Renovatix::ResponseError => e
  132. + false
  133. + end
  134. +
  135. +end
  136. diff --git a/app/models/event_processor/soap.rb b/app/models/event_processor/soap.rb
  137. new file mode 100644
  138. index 0000000..e376115
  139. --- /dev/null
  140. +++ b/app/models/event_processor/soap.rb
  141. @@ -0,0 +1,118 @@
  142. +require 'fileutils'
  143. +require 'soap/wsdlDriver'
  144. +
  145. +# Override patched method
  146. +require File.join(RAILS_ROOT, 'lib/soap4r/mapping/mapping.rb')
  147. +
  148. +class EventProcessor::Soap << EventProcessor::Base
  149. + # WTF?
  150. + module Reason
  151. + class UnknownReasonError < StandardError
  152. + def initialize(reason_id)
  153. + super("Unknown reason id:#{reason_id}")
  154. + end
  155. + end
  156. +
  157. + CUSTOMER_REQUEST = "CUSTOMER_REQUEST"
  158. + POLICY_VIOLATION = "POLICY_VIOLATION"
  159. +
  160. + DEFAULT = POLICY_VIOLATION
  161. +
  162. + All = [CUSTOMER_REQUEST, POLICY_VIOLATION]
  163. +
  164. + def self.all_with_ids
  165. + All.map {|reason| [reason, reason]}
  166. + end
  167. +
  168. + def self.by_id(reason_id, raise_error = false)
  169. + if not All.include?(reason_id)
  170. + raise UnknownReasonError.new(reason_id) if raise_error
  171. + return DEFAULT
  172. + end
  173. +
  174. + reason_id
  175. + end
  176. + end
  177. +
  178. + def self.handle?(event)
  179. + event.class.name.is_a?(SubscriptionEvent) && event.reseller.use_setting?("#{event.event_type}_postback")
  180. + end
  181. +
  182. + def initialize(event)
  183. + @reseller = event.reseller
  184. + @merchant = event.merchant
  185. +
  186. + super(event)
  187. + end
  188. +
  189. + def run
  190. + case event.event_type
  191. + when 'cancel'
  192. + send_cancel_request
  193. + when 'upgrade'
  194. + send_renew_request
  195. + end
  196. +
  197. + rescue SOAP::FaultError => e
  198. + message = e.message
  199. + message << "\n" << e.detail.inspect if e.respond_to?(:detail)
  200. + raise EventProcessor::Error, message
  201. + end
  202. +
  203. + protected
  204. +
  205. + def send_cancel_request
  206. + params = event.params
  207. + return false if params[:cancel_reason] == Reason::CUSTOMER_REQUEST && !Merchant.ever_upgraded_or_renewed?(@merchant.id)
  208. +
  209. + wsdl_driver.cancelBusinessOrder(
  210. + params[:partner_order_id],
  211. + params[:cancel_reason]
  212. + )
  213. + end
  214. +
  215. + def send_renew_request
  216. + params = event.params
  217. +
  218. + wsdl_driver.upgradeBusinessNotification(
  219. + params[:partner_order_id],
  220. + params[:order_id],
  221. + params[:new_partner_order_id],
  222. + params[:new_order_id],
  223. + params[:product_uid]
  224. + )
  225. + end
  226. +
  227. + private
  228. +
  229. + def endpoint_url
  230. + event.reseller.settings["#{self.event_type}_postback_url"] or raise EventProcessor::Error, 'Postback url not defined'
  231. + end
  232. +
  233. + def wsdl_uri
  234. + File.join(RAILS_ROOT, 'ws/postback/postback_service.wsdl')
  235. + end
  236. +
  237. + def wsdl_driver
  238. + @driver ||= SOAP::WSDLDriverFactory.new(wsdl_uri).create_rpc_driver
  239. +
  240. + user = @reseller.settings['postback_service_user_name']
  241. + pass = @reseller.settings['postback_service_password']
  242. +
  243. + @driver.options["protocol.http.basic_auth"] << [endpoint_url, user, pass] unless (user.blank? || pass.blank?)
  244. +
  245. + @driver.endpoint_url = endpoint_url
  246. +
  247. +
  248. + @driver.wiredump_file_base = wsdl_log
  249. +
  250. + @driver
  251. + end
  252. +
  253. + def wsdl_log
  254. + filename = File.expand_path(File.join(RAILS_ROOT, "log/wsdl/#{Time.now.to_i}"))
  255. + FileUtils.mkdir_p File.dirname(filename)
  256. + filename
  257. + end
  258. +
  259. +end
  260. diff --git a/app/models/tasks/event_processing_task.rb b/app/models/tasks/event_processing_task.rb
  261. new file mode 100644
  262. index 0000000..a2d5db0
  263. --- /dev/null
  264. +++ b/app/models/tasks/event_processing_task.rb
  265. @@ -0,0 +1,7 @@
  266. +class EventProcessingTask < Task
  267. + belongs_to :event, :polymorphic => true, :foreign_type => "notifier_type", :foreign_key => 'notifier_id'
  268. +
  269. + def run
  270. + EventProcessor.run(event)
  271. + end
  272. +end
Add Comment
Please, Sign In to add comment