defmodule SendGrid.LegacyTemplate do
@moduledoc """
Module to interact with transaction email templates.
"""
alias __MODULE__
@derive Jason.Encoder
defstruct [
id: nil,
name: nil,
updated_at: nil,
versions: nil
]
@type t :: %LegacyTemplate{
id: String.t,
name: String.t,
updated_at: DateTime.t | nil,
versions: [Versions.t]
}
@spec new(Map.t, :json) :: LegacyTemplate.t
def new(json, :json) do
# versions.
versions = case json["versions"] do
nil -> []
versions when is_list(versions) ->
for version <- versions do
SendGrid.Template.Version.new(version, :json)
end
end
%LegacyTemplate{
id: json["id"],
name: json["name"],
updated_at: reformat_sendgrid_date(json["updated_at"]),
versions: versions
}
end
defp reformat_sendgrid_date(date = %DateTime{}), do: date
defp reformat_sendgrid_date(date) when is_bitstring(date) do
[a,b] = String.split(date)
case DateTime.from_iso8601("#{a} #{b}.0Z") do
{:ok, d, _} -> d
_ -> nil
end
end
defp reformat_sendgrid_date(_), do: nil
defimpl Jason.Encoder do
def encode(%SendGrid.LegacyTemplate{} = template, opts) do
raw = template
|> Map.from_struct()
|> Map.drop([:updated_at])
|> Enum.filter(fn({_k,v}) -> v != nil end)
|> Map.new()
|> Map.put(:generation, :legacy)
Jason.Encode.map(raw, opts)
end
end
end