Skip to main content

lib/sendgrid/templates/template/versions.ex

defmodule SendGrid.Template.Versions do
  alias SendGrid.Template.Version

  @success_codes [200,201,202,203,204]

  @spec activate(Version.t, SendGrid.query()) :: Version.t | {:error, [String.t]} | {:error, String.t}
  def activate(%Version{} = version, options \\ []) do
    case SendGrid.post(base_url(version.template_id, version.id) <> "/activate", version, options) do
      { :ok, response = %SendGrid.Response{ status: status_code } } when status_code in @success_codes ->
        Version.new(response.body, :json)
      { :ok, %SendGrid.Response{ body: body } } -> { :error, body["errors"]  || body["error"]}
      _ -> { :error, "Unable to communicate with SendGrid API." }
    end
  end

  @spec get(String.t, String.t, SendGrid.query()) :: Version.t | {:error, [String.t]} | {:error, String.t}
  def get(template, version, options \\ []) do
    case SendGrid.get(base_url(template,version), options) do
      { :ok, response = %SendGrid.Response{ status: status_code } } when status_code in @success_codes ->
        Version.new(response.body, :json)
      { :ok, %SendGrid.Response{ body: body } } ->
        { :error, body["errors"] || body["error"] }
      _ -> { :error, "Unable to communicate with SendGrid API." }
    end
  end

  @spec update(Version.t, SendGrid.query()) :: Version.t | {:error, [String.t]} | {:error, String.t}
  def update(%Version{} = version, options \\ []) do
    case SendGrid.patch(base_url(version.template_id, version.id), version, options) do
      { :ok, response = %SendGrid.Response{ status: status_code } } when status_code in @success_codes ->
        response = Version.new(response.body, :json)
        put_in(response, [Access.key(:template_id)], version.template_id)
      { :ok, %SendGrid.Response{ body: body } } -> { :error, body["errors"] || body["error"] }
      _ -> { :error, "Unable to communicate with SendGrid API." }
    end
  end

  @spec create(Version.t, SnedGrid.query()) :: Version.t | {:error, [String.t]} | {:error, String.t}
  def create(%Version{} = version, options \\ []) do
    case SendGrid.post(base_url(version.template_id), version, options) do
      { :ok, response = %SendGrid.Response{ status: status_code } } when status_code in @success_codes ->
        response = Version.new(response.body, :json)
        if response.id != nil do
          get(version.template_id, response.id)
        else
          {:error, :post_create_fetch_failure}
        end

      { :ok, %SendGrid.Response{ body: body } } -> { :error, body["errors"] || body["error"]}
      _ -> { :error, "Unable to communicate with SendGrid API." }
    end
  end

  @spec delete(Version.t, SendGrid.query()) :: :ok | {:error, [String.t]} | {:error, String.t}
  def delete(%Version{} = version, options \\ []) do
    case SendGrid.delete(base_url(version.template_id, version.id), options) do
      { :ok, %SendGrid.Response{ status: status_code } } when status_code in @success_codes ->
        :ok
      { :ok, %SendGrid.Response{ body: body } } -> { :error, body["errors"] || body["error"] }
      _ -> { :error, "Unable to communicate with SendGrid API." }
    end
  end

  defp base_url(template) do
    "/v3/templates/#{template}/versions"
  end

  defp base_url(template, version) do
    "/v3/templates/#{template}/versions/#{version}"
  end

end