class MailHogwarts::Mailer

Attributes

body[R]
domain[R]
messages[R]
path[R]
url[R]

Public Class Methods

new(args) click to toggle source
# File lib/mailhogwarts/mailer.rb, line 5
def initialize(args)
  @url = "#{@domain = args[:url]}#{@path = args[:path]}"
end

Public Instance Methods

[](index) click to toggle source
# File lib/mailhogwarts/mailer.rb, line 25
def [](index)
  @messages[index]
end
call() click to toggle source
# File lib/mailhogwarts/mailer.rb, line 9
def call
  response = RestClient::Request.execute method: :get, url: @url, verify_ssl: false
  @body = JSON.parse(response.body)

  @messages = body['items'].map do |message|
    Message.new id: message['ID'],
                created_at: Time.parse(message['Created']).to_i,
                from: message['Raw']['From'],
                to: message['Raw']['To'],
                subject: readable_subject(message['Content']['Headers']['Subject'].join(' ')),
                body: readable_body(message['Content']['Body'])
  end

  @messages.size
end
count() click to toggle source
# File lib/mailhogwarts/mailer.rb, line 33
def count
  body['count']
end
ids() click to toggle source
# File lib/mailhogwarts/mailer.rb, line 29
def ids
  @ids = @messages.map(&:id)
end
select(filters) click to toggle source
# File lib/mailhogwarts/mailer.rb, line 41
def select(filters)
  messages = @messages
  filtered_messages = []

  (%i[from to subject body] & filters.keys).each do |filter|
    messages.each do |message|
      filtered_messages << message if message.send(filter).include?(filters[filter])
    end

    messages = filtered_messages
    filtered_messages = []
  end

  messages
end
total() click to toggle source
# File lib/mailhogwarts/mailer.rb, line 37
def total
  body['total']
end

Private Instance Methods

readable_body(body) click to toggle source
# File lib/mailhogwarts/mailer.rb, line 59
def readable_body(body)
  Base64.decode64(body).force_encoding('utf-8')
end
readable_subject(subject) click to toggle source
# File lib/mailhogwarts/mailer.rb, line 63
def readable_subject(subject)
  subject.split('=?UTF-8?Q?').map do |word|
    next if word.size.zero?

    word.strip.gsub(/(\?=)/, '').tr('_', ' ')
  end.reject(&:nil?).map do |word|
    next if word.nil?

    word.unpack('M').join('')
  end.join('').strip.force_encoding('utf-8')
end