lib/active_campaign/contact/custom_field.ex

defmodule ActiveCampaign.Contact.CustomField do
  @moduledoc """
  Documentation for `ActiveCampaign.Contact.CustomField`.
  """

  alias ActiveCampaign.Http

  @doc """
  Create a custom field
  """
  @spec create(map()) :: {:ok, map()} | {:error, any()}
  def create(field) do
    Http.post("fields", %{field: field})
  end

  @doc """
  Retrieve a custom field

  ## Examples

      iex> ActiveCampaign.Contact.CustomField.get(1)
      {:ok, %{"field" => %{...}}}
  """
  @spec get(integer()) :: {:ok, map()} | {:error, any()}
  def get(id) do
    Http.get("fields/#{id}")
  end

  @doc """
  Update a custom field
  """
  @spec update(integer(), map()) :: {:ok, map()} | {:error, any()}
  def update(id, field) do
    Http.put("fields/#{id}", %{field: field})
  end

  @doc """
  Delete a custom field
  """
  @spec delete(integer()) :: {:ok, map()} | {:error, any()}
  def delete(id) do
    Http.delete("fields/#{id}")
  end

  @doc """
  List all custom fields

  ## Examples

      iex> ActiveCampaign.Branding.list()
      {:ok, %{"fieldOptions" => [...], "fieldRels" => [...], "fields" => [...], "meta" => [...]}}
  """
  @spec list :: {:ok, map()} | {:error, any()}
  def list do
    Http.get("fields")
  end

  @doc """
  Create a custom field relationship to list(s)

  Setting `list_id` to `0` makes the field available on all lists.
  """
  @spec create_field_relationship(integer(), integer()) :: {:ok, map()} | {:error, any()}
  def create_field_relationship(field_id, list_id) do
    Http.post("fieldRels", %{fieldRel: %{field: field_id, relid: list_id}})
  end

  @doc """
  Bulk create custom field options
  """
  @spec create_field_options(map()) :: {:ok, map()} | {:error, any()}
  def create_field_options(field_options) do
    Http.post("fieldOption/bulk", %{fieldOptions: field_options})
  end

  @doc """
  Delete a custom field relationship to list(s)
  """
  @spec delete_field_relationship(integer()) :: {:ok, map()} | {:error, any()}
  def delete_field_relationship(field_relationship_id) do
    Http.delete("fieldRels/#{field_relationship_id}")
  end
end