defmodule Dnsimple.Contacts do @moduledoc """ Provides functions to interact with the [contact endpoints](https://developer.dnsimple.com/v2/contacts/). """ alias Dnsimple.Client alias Dnsimple.Listing alias Dnsimple.Response alias Dnsimple.Contact @doc """ Lists the contacts in an account. See: - https://developer.dnsimple.com/v2/contacts/#list ## Examples: client = %Dnsimple.Client{access_token: "a1b2c3d4"} {:ok, response} = Dnsimple.Contacts.list_contacts(client, account_id = "1010") {:ok, response} = Dnsimple.Contacts.list_contacts(client, account_id = "1010", sort: "email:desc") """ @spec list_contacts(Client.t, String.t | integer) :: {:ok|:error, Response.t} def list_contacts(client, account_id, options \\ []) do url = Client.versioned("/#{account_id}/contacts") Listing.get(client, url, options) |> Response.parse(%{"data" => [%Contact{}], "pagination" => %Response.Pagination{}}) end @doc """ Gets a contact in an account. See: - https://developer.dnsimple.com/v2/contacts/#get ## Examples: client = %Dnsimple.Client{access_token: "a1b2c3d4"} {:ok, response} = Dnsimple.Contacts.get_contact(client, account_id = "1010", contact_id = "123") """ @spec get_contact(Client.t, String.t | integer, String.t | integer, Keyword.t) :: {:ok|:error, Response.t} def get_contact(client, account_id, contact_id, options \\ []) do url = Client.versioned("/#{account_id}/contacts/#{contact_id}") Client.get(client, url, options) |> Response.parse(%{"data" => %Contact{}}) end @doc """ Creates a contact in an account. See: - https://developer.dnsimple.com/v2/contacts/#create ## Examples: client = %Dnsimple.Client{access_token: "a1b2c3d4"} {:ok, response} = Dnsimple.Contacts.create_contact(client, account_id = "1010", %{ first_name: "John", last_name: "Doe", address1: "Italian street, 10", city: "Roma", state_province: "RM", postal_code: "00100", country: "IT", email: "john.doe@email.com", phone: "+18001234567", fax: "+18011234567", }) """ @spec create_contact(Client.t, String.t | integer, Keyword.t, Keyword.t) :: {:ok|:error, Response.t} def create_contact(client, account_id, attributes, options \\ []) do url = Client.versioned("/#{account_id}/contacts") Client.post(client, url, attributes, options) |> Response.parse(%{"data" => %Contact{}}) end @doc """ Updates a contact in an account. See: - https://developer.dnsimple.com/v2/contacts/#update ## Examples: client = %Dnsimple.Client{access_token: "a1b2c3d4"} {:ok, response} = Dnsimple.Contacts.update_contact(client, account_id = "1010", contact_id = "123", %{ email: "johndoe@email-provider.com", }) """ @spec update_contact(Client.t, String.t | integer, String.t | integer, Keyword.t, Keyword.t) :: {:ok|:error, Response.t} def update_contact(client, account_id, contact_id, attributes, options \\ []) do url = Client.versioned("/#{account_id}/contacts/#{contact_id}") Client.patch(client, url, attributes, options) |> Response.parse(%{"data" => %Contact{}}) end @doc """ Deletes a contact from an account. **Warning**: this is a destructive operation. See: - https://developer.dnsimple.com/v2/contacts/#delete ## Examples: client = %Dnsimple.Client{access_token: "a1b2c3d4"} {:ok, response} = Dnsimple.Contacts.delete_contact(client, account_id = "1010", contact_id = "123") """ @spec delete_contact(Client.t, String.t | integer, String.t | integer, Keyword.t) :: {:ok|:error, Response.t} def delete_contact(client, account_id, contact_id, options \\ []) do url = Client.versioned("/#{account_id}/contacts/#{contact_id}") Client.delete(client, url, options) |> Response.parse(nil) end end