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