1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Attach a concrete router to the root mailbox and use it

Don't think this is how it's going to stay. Doesn't feel like the right place for it.
This commit is contained in:
David Heinemeier Hansson 2018-09-19 15:52:16 -07:00
parent ee6d9545dd
commit da697e8444
6 changed files with 56 additions and 15 deletions

View file

@ -3,7 +3,7 @@ module ActionMailroom
queue_as :action_mailroom_inbound_email
def perform(inbound_email)
# ActionMailroom::Router.receive inbound_email
ActionMailroom::Mailbox.route inbound_email
end
end
end

View file

@ -1,22 +1,20 @@
require "active_support/rescuable"
require "action_mailroom/mailbox/callbacks"
require "action_mailroom/mailbox/routing"
class ActionMailroom::Mailbox
include ActiveSupport::Rescuable, Callbacks
class << self
def receive(inbound_email)
new(inbound_email).perform_processing
end
def routing(routes)
@router = ActionMailroom::Router.new(routes)
end
end
include ActiveSupport::Rescuable
include Callbacks, Routing
attr_reader :inbound_email
delegate :mail, to: :inbound_email
def self.receive(inbound_email)
new(inbound_email).perform_processing
end
def initialize(inbound_email)
@inbound_email = inbound_email
end

View file

@ -0,0 +1,15 @@
module ActionMailroom::Mailbox::Routing
extend ActiveSupport::Concern
class_methods do
attr_reader :router
def routing(routes)
(@router ||= ActionMailroom::Router.new).add_routes(routes)
end
def route(inbound_email)
@router.route(inbound_email)
end
end
end

View file

@ -1,6 +1,10 @@
class ActionMailroom::Router
def initialize(routes)
@routes = routes
def initialize
@routes = {}
end
def add_routes(routes)
@routes.merge!(routes)
end
def route(inbound_email)

View file

@ -0,0 +1,23 @@
require_relative '../../test_helper'
class ApplicationMailbox < ActionMailroom::Mailbox
routing "replies@example.com" => :replies
end
class RepliesMailbox < ActionMailroom::Mailbox
def process
$processed = mail.subject
end
end
class ActionMailroom::Mailbox::RoutingTest < ActiveSupport::TestCase
setup do
$processed = false
@inbound_email = create_inbound_email("welcome.eml")
end
test "string routing" do
ApplicationMailbox.route @inbound_email
assert_equal "Discussion: Let's debate these attachments", $processed
end
end

View file

@ -9,7 +9,8 @@ end
module ActionMailroom
class RouterTest < ActiveSupport::TestCase
setup do
@router = ActionMailroom::Router.new('replies@example.com' => :replies)
@router = ActionMailroom::Router.new
@router.add_routes('replies@example.com' => :replies)
$processed = false
end