defmodule SendGrid.Template.Version do @moduledoc """ Module to interact with transaction email template versions. """ alias __MODULE__ @derive Jason.Encoder defstruct [ id: nil, template_id: nil, updated_at: nil, thumbnail_url: nil, warnings: nil, active: nil, name: nil, html_content: "", plain_content: "", generate_plain_content: nil, subject: "", editor: nil, test_data: nil, ] @type t :: %Version{ id: String.t, template_id: String.t, updated_at: DateTime.t, thumbnail_url: String.t, warnings: list | nil, active: integer | nil, name: String.t, html_content: String.t, plain_content: String.t, generate_plain_content: boolean | nil, subject: String.t, editor: String.t | nil, test_data: Map.t | nil, } @spec new(Map.t, :json) :: Version.t def new(json, :json) do %Version{ id: json["id"], template_id: json["template_id"], updated_at: reformat_sendgrid_date(json["updated_at"]), thumbnail_url: json["thumbnail_url"], warnings: json["warnings"], active: json["active"], name: json["name"], # content only returned when specifically fetching entry by id. Will be null otherwise. html_content: json["html_content"], plain_content: json["plain_content"], generate_plain_content: json["generate_plain_content"], subject: json["subject"], editor: json["editor"], test_data: json["test_data"] } 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.Template.Version{} = version, opts) do raw = version |> Map.from_struct() |> Map.drop([:updated_at, :editor, :thumbnail_url]) |> Enum.filter(fn({_k,v}) -> v != nil end) |> Map.new() Jason.Encode.map(raw, opts) end end end