From 75415663f84ac006c5a4d5a6896ece50c299c03e Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Sat, 21 May 2016 09:40:08 -0700 Subject: [PATCH] Rename handlers and introduce Handler.for --- lib/gitlab/email/handler.rb | 57 +++---------------- lib/gitlab/email/handler/base_handler.rb | 57 +++++++++++++++++++ ...reate_issue.rb => create_issue_handler.rb} | 6 +- ...{create_note.rb => create_note_handler.rb} | 6 +- lib/gitlab/email/receiver.rb | 12 +--- 5 files changed, 74 insertions(+), 64 deletions(-) create mode 100644 lib/gitlab/email/handler/base_handler.rb rename lib/gitlab/email/handler/{create_issue.rb => create_issue_handler.rb} (89%) rename lib/gitlab/email/handler/{create_note.rb => create_note_handler.rb} (92%) diff --git a/lib/gitlab/email/handler.rb b/lib/gitlab/email/handler.rb index 56d848cdd7b..b9221f1210c 100644 --- a/lib/gitlab/email/handler.rb +++ b/lib/gitlab/email/handler.rb @@ -1,54 +1,15 @@ +require 'gitlab/email/handler/create_note_handler' +require 'gitlab/email/handler/create_issue_handler' + module Gitlab module Email - class Handler - attr_reader :mail, :mail_key - - def initialize(mail, mail_key) - @mail = mail - @mail_key = mail_key - end - - def message - @message ||= process_message - end - - def author - raise NotImplementedError - end - - def project - raise NotImplementedError - end - - private - def validate_permission!(permission) - raise UserNotFoundError unless author - raise UserBlockedError if author.blocked? - raise ProjectNotFound unless author.can?(:read_project, project) - raise UserNotAuthorizedError unless author.can?(permission, project) - end - - def process_message - add_attachments(ReplyParser.new(mail).execute.strip) - end - - def add_attachments(reply) - attachments = Email::AttachmentUploader.new(mail).execute(project) - - reply + attachments.map do |link| - "\n\n#{link[:markdown]}" - end.join - end - - def verify_record(record, exception, error_title) - return if record.persisted? - - msg = error_title + record.errors.full_messages.map do |error| - "\n\n- #{error}" - end.join - - raise exception, msg + module Handler + def self.for(mail, mail_key) + [CreateNoteHandler, CreateIssueHandler].find do |klass| + handler = klass.new(mail, mail_key) + break handler if handler.can_handle? + end end end end diff --git a/lib/gitlab/email/handler/base_handler.rb b/lib/gitlab/email/handler/base_handler.rb new file mode 100644 index 00000000000..230d13feea9 --- /dev/null +++ b/lib/gitlab/email/handler/base_handler.rb @@ -0,0 +1,57 @@ + +module Gitlab + module Email + module Handler + class BaseHandler + attr_reader :mail, :mail_key + + def initialize(mail, mail_key) + @mail = mail + @mail_key = mail_key + end + + def message + @message ||= process_message + end + + def author + raise NotImplementedError + end + + def project + raise NotImplementedError + end + + private + def validate_permission!(permission) + raise UserNotFoundError unless author + raise UserBlockedError if author.blocked? + raise ProjectNotFound unless author.can?(:read_project, project) + raise UserNotAuthorizedError unless author.can?(permission, project) + end + + def process_message + add_attachments(ReplyParser.new(mail).execute.strip) + end + + def add_attachments(reply) + attachments = Email::AttachmentUploader.new(mail).execute(project) + + reply + attachments.map do |link| + "\n\n#{link[:markdown]}" + end.join + end + + def verify_record(record, exception, error_title) + return if record.persisted? + + msg = error_title + record.errors.full_messages.map do |error| + "\n\n- #{error}" + end.join + + raise exception, msg + end + end + end + end +end diff --git a/lib/gitlab/email/handler/create_issue.rb b/lib/gitlab/email/handler/create_issue_handler.rb similarity index 89% rename from lib/gitlab/email/handler/create_issue.rb rename to lib/gitlab/email/handler/create_issue_handler.rb index 72d49ec6c96..259d74a83bf 100644 --- a/lib/gitlab/email/handler/create_issue.rb +++ b/lib/gitlab/email/handler/create_issue_handler.rb @@ -1,10 +1,10 @@ -require 'gitlab/email/handler' +require 'gitlab/email/handler/base_handler' module Gitlab module Email - class Handler - class CreateIssue < Handler + module Handler + class CreateIssueHandler < BaseHandler def can_handle? !!project end diff --git a/lib/gitlab/email/handler/create_note.rb b/lib/gitlab/email/handler/create_note_handler.rb similarity index 92% rename from lib/gitlab/email/handler/create_note.rb rename to lib/gitlab/email/handler/create_note_handler.rb index 32deb5a311e..7252906fd48 100644 --- a/lib/gitlab/email/handler/create_note.rb +++ b/lib/gitlab/email/handler/create_note_handler.rb @@ -1,10 +1,10 @@ -require 'gitlab/email/handler' +require 'gitlab/email/handler/base_handler' module Gitlab module Email - class Handler - class CreateNote < Handler + module Handler + class CreateNoteHandler < BaseHandler def can_handle? !!sent_notification end diff --git a/lib/gitlab/email/receiver.rb b/lib/gitlab/email/receiver.rb index da4299ebcb3..7038346192b 100644 --- a/lib/gitlab/email/receiver.rb +++ b/lib/gitlab/email/receiver.rb @@ -1,6 +1,5 @@ -require 'gitlab/email/handler/create_note' -require 'gitlab/email/handler/create_issue' +require 'gitlab/email/handler' # Inspired in great part by Discourse's Email::Receiver module Gitlab @@ -31,7 +30,7 @@ module Gitlab raise SentNotificationNotFoundError unless mail_key - if handler = find_handler(mail, mail_key) + if handler = Handler.for(mail, mail_key) handler.execute elsif mail_key =~ %r{/|\+} # Sent Notification mail_key would not have / or + @@ -65,13 +64,6 @@ module Gitlab break key if key end end - - def find_handler(mail, mail_key) - [Handler::CreateNote, Handler::CreateIssue].find do |klass| - handler = klass.new(mail, mail_key) - break handler if handler.can_handle? - end - end end end end