class Nuntius::BaseMessageBox
Message boxes process inbound messages
def deliver(message)
def deliver(message) klasses = message_box_for(transport: message.transport.to_sym, provider: message.provider.to_sym) klass, method = message_box_for_route(klasses, message) if method klass.new(message).send(method) true end end
def descendants
def descendants ObjectSpace.each_object(Class).select { |k| k < self } end
def initialize(message)
def initialize(message) @message = message end
def mail
-
(Mail::Message)-
def mail return nil unless self.class.transport.to_sym == :mail return @mail if @mail @mail = Mail.new(message.raw_message.download) end
def message_box_for(transport: nil, provider: nil)
def message_box_for(transport: nil, provider: nil) result = descendants result = result.select { |message_box| message_box.transport == transport } if transport result = result.select { |message_box| message_box.provider == provider } if provider result end
def message_box_for_route(message_boxes, message)
def message_box_for_route(message_boxes, message) klass = message_boxes.find do |message_box| routes = message_box.routes || {} routes.any? do |attribute, hash| value = message.send(attribute) if value.is_a? Array value.any? { |value_item| hash[:test].match(value_item) } else hash[:test].match(value) end end end route = klass&.routes&.find do |attribute, hash| value = message.send(attribute) if value.is_a? Array value.any? { |value_item| hash[:test].match(value_item) } else hash[:test].match(value) end end [klass, route.last[:to]] if route end
def provider(value = nil)
def provider(value = nil) @provider = value.to_sym if value @provider end
def route(attribute = :to, test = /.*/, to:)
def route(attribute = :to, test = /.*/, to:) @routes ||= {} @routes[attribute] = {test: test, to: to} @routes end
def settings(hash = nil)
def settings(hash = nil) @settings = hash if hash @settings end
def transport(value = nil)
def transport(value = nil) @transport = value.to_sym if value @transport end