Current section
Files
Jump to
Current section
Files
lib/courier/web/serializers/message.ex
defmodule Courier.Web.Serializers.Message do
use JaSerializer
alias JaSerializer.Formatter.Utils
alias Courier.Web.Serializers.Contact
attributes [:headers, :body, :parts]
has_one :from,
serializer: Contact,
include: true,
field: :from,
type: :contact
has_many :recipients,
serializer: Contact,
include: true,
field: :recipients,
type: :contact
def id(%Mail.Message{} = message, _conn),
do: Mail.Message.get_header(message, :id)
def headers(%Mail.Message{} = message, _conn) do
message
|> Mail.Message.delete_header(:id)
|> Mail.Message.delete_header(:from)
|> Mail.Message.delete_header(:to)
|> Mail.Message.delete_header(:cc)
|> Mail.Message.delete_header(:bcc)
|> Map.get(:headers)
|> Enum.into(%{}, fn({key, value}) -> {Utils.format_key(key), format_value(value)} end)
end
def parts(%Mail.Message{parts: []}, _conn), do: nil
def parts(%Mail.Message{} = message, _conn) do
message.parts
|> Enum.map(fn(part) ->
__MODULE__.format(part, %{})
|> get_in([:data, :attributes])
end)
end
def from(%Mail.Message{} = message, _conn) do
%{contact: Mail.Message.get_header(message, :from), message_id: [message_id(message)]}
end
def recipients(%Mail.Message{} = message, _conn) do
Mail.all_recipients(message)
|> Enum.map(&(%{contact: &1, message_id: [message_id(message)]}))
end
defp message_id(%Mail.Message{} = message), do: Mail.Message.get_header(message, :id)
defp format_value(list) when is_list(list) do
list
|> Keyword.to_list()
|> Enum.map(fn
value when is_tuple(value) ->
value
|> Tuple.to_list()
|> Enum.map(&format_value(&1))
value -> format_value(value)
end)
end
defp format_value(value) when is_atom(value) do
value
|> Atom.to_string()
|> Utils.format_key()
end
defp format_value(value), do: value
end