class MailReceiver::Receiver

Public Class Methods

new(message, opts = {}) click to toggle source
# File lib/mail-receiver/receiver.rb, line 5
def initialize(message, opts = {})
  @message = message
  @logger = opts[:logger]
end

Public Instance Methods

body() click to toggle source
# File lib/mail-receiver/receiver.rb, line 30
def body
  return @body if defined?(@body)
  @body = self.extract
  @body
end
current_user() click to toggle source
# File lib/mail-receiver/receiver.rb, line 121
def current_user
  @current_user ||= User.find_by_any_email(from)
end
from() click to toggle source
# File lib/mail-receiver/receiver.rb, line 40
def from
  @from ||= @message.from.is_a?(Array) ? @message.from.first : @message.from
end
hash_data() click to toggle source

foo+p=chair/chair&id=123 => { p: chair/chair, id: 123 }

# File lib/mail-receiver/receiver.rb, line 50
def hash_data
  return @hash_data if defined?(@hash_data)
  return {} if not prefix.include?('+')
  @hash_data = Encoder.decode(prefix.split('+').last)
  return @hash_data
end
inspect() click to toggle source
# File lib/mail-receiver/receiver.rb, line 57
def inspect
  { project_slug: project_slug, issue_id: issue_id, target_id: target_id, merge_request: merge_request?, to: to, body: body}
end
issue_id() click to toggle source
# File lib/mail-receiver/receiver.rb, line 18
def issue_id
  hash_data[:id]
end
logger() click to toggle source
# File lib/mail-receiver/receiver.rb, line 125
def logger
  @logger ||= Logger.new($stdout)
end
mail() click to toggle source
# File lib/mail-receiver/receiver.rb, line 10
def mail
  @message
end
merge_request?() click to toggle source
# File lib/mail-receiver/receiver.rb, line 26
def merge_request?
  @merge_request ||= (hash_data[:t] || 'i').downcase == 'm'
end
prefix() click to toggle source

foo@gmail.com => foo

# File lib/mail-receiver/receiver.rb, line 45
def prefix
  @prefix ||= to.split('@').first
end
process!() click to toggle source
# File lib/mail-receiver/receiver.rb, line 68
def process!
  if current_user.blank?
    logger.warn "Reply user: #{from} not found user in GitLab."
    return
  end

  if project.blank?
    logger.warn "Project #{project_slug} is not found."
    return
  end

  note_params = merge_request? ? process_mr! : process_issue!
  return if note_params.blank?

  note_params[:project_id] = project.id

  # relation to target Note
  if target_id
    target_note = project.notes.find_by_id(target_id)
    if target_note
      note_params[:commit_id] = target_note.commit_id
      note_params[:line_code] = target_note.line_code
    end
  end

  note_params[:note] = body

  @note = Notes::CreateService.new(project, current_user, note_params).execute
  logger.info "Note #{@note.id} created."
end
process_issue!() click to toggle source
# File lib/mail-receiver/receiver.rb, line 110
def process_issue!
  @issue = project.issues.find_by(iid: self.issue_id)
  if @issue.blank?
    logger.warn "Issue #{self.issue_id} not found."
    return nil
  end

  logger.info "Found issue: #{@issue.id}"
  { noteable_type: 'Issue', noteable_id: @issue.id }
end
process_mr!() click to toggle source
# File lib/mail-receiver/receiver.rb, line 99
def process_mr!
  @mr = project.merge_requests.find_by(iid: self.issue_id)
  if @mr.blank?
    logger.warn "MergeRequest #{self.issue_id} not found."
    return nil
  end

  logger.info "Found MergeRequest: #{@mr.id}"
  { noteable_type: 'MergeRequest', noteable_id: @mr.id }
end
project() click to toggle source
# File lib/mail-receiver/receiver.rb, line 61
def project
  @project ||= Project.find_with_namespace(project_slug)
rescue => e
  logger.warn "Project: #{project_slug} record not found."
  nil
end
project_slug() click to toggle source
# File lib/mail-receiver/receiver.rb, line 14
def project_slug
  hash_data[:p]
end
target_id() click to toggle source
# File lib/mail-receiver/receiver.rb, line 22
def target_id
  hash_data[:n]
end
to() click to toggle source
# File lib/mail-receiver/receiver.rb, line 36
def to
  @to ||= @message.to.is_a?(Array) ? @message.to.first : @message.to
end