Rename handlers and introduce Handler.for
This commit is contained in:
parent
ee548b6ed0
commit
75415663f8
5 changed files with 74 additions and 64 deletions
|
@ -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
|
||||
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
|
||||
|
||||
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
|
||||
|
|
57
lib/gitlab/email/handler/base_handler.rb
Normal file
57
lib/gitlab/email/handler/base_handler.rb
Normal file
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue