defmodule Surge.Accounts do @moduledoc """ Functions for managing Surge accounts. """ alias Surge.Accounts.Account alias Surge.Accounts.AccountStatus alias Surge.Client @doc """ Archives an account and releases all associated resources. > #### Warning {: .warning} > > This action will: > * Release all phone numbers associated with the account > * Deactivate all campaigns > * Make the account unusable for sending messages > > This operation is irreversible. If you need to send SMS in the future, you > will need to re-register new phone numbers and campaigns. ## Examples Surge.Accounts.archive("acct_01jpqjvfg9enpt7pyxd60pcmxj") #=> {:ok, %Surge.Accounts.Account{}} client = Surge.Client.new("your_api_key") Surge.Accounts.archive(client, "acct_01jpqjvfg9enpt7pyxd60pcmxj") #=> {:ok, %Surge.Accounts.Account{}} """ @spec archive(String.t()) :: {:ok, Account.t()} | {:error, Surge.Error.t()} @spec archive(Client.t(), String.t()) :: {:ok, Account.t()} | {:error, Surge.Error.t()} def archive(client \\ Client.default_client(), account_id) def archive(%Client{} = client, account_id) do opts = [path_params: [account_id: account_id]] case Client.request(client, :delete, "/accounts/:account_id", opts) do {:ok, data} -> {:ok, Account.from_json(data)} error -> error end end @doc """ Creates a new Account within the calling Platform. ## Examples Surge.Accounts.create(%{name: "Test Account"}) #=> {:ok, %Surge.Accounts.Account{}} client = Surge.Client.new("your_api_key") Surge.Accounts.create(client, %{name: "Test Account"}) #=> {:ok, %Surge.Accounts.Account{}} """ @spec create(map()) :: {:ok, Account.t()} | {:error, Surge.Error.t()} @spec create(Client.t(), map()) :: {:ok, Account.t()} | {:error, Surge.Error.t()} def create(client \\ Client.default_client(), params) def create(%Client{} = client, params) do case Client.request(client, :post, "/accounts", json: params) do {:ok, data} -> {:ok, Account.from_json(data)} error -> error end end @doc """ Checks an account's status and capabilities. ## Examples Surge.Accounts.get_status("acct_123", [:local_messaging]) #=> {:ok, %Surge.Accounts.AccountStatus{capabilities: %{local_messaging: %{status: :ready}}}} client = Surge.Client.new("your_api_key") Surge.Accounts.get_status(client, "acct_123", [:local_messaging]) #=> {:ok, %Surge.Accounts.AccountStatus{capabilities: %{local_messaging: %{status: :ready}}}} """ @spec get_status(String.t(), list(AccountStatus.capability())) :: {:ok, AccountStatus.t()} | {:error, Surge.Error.t()} @spec get_status(Client.t(), String.t(), list(AccountStatus.capability())) :: {:ok, AccountStatus.t()} | {:error, Surge.Error.t()} def get_status(client \\ Client.default_client(), account_id, capabilities) def get_status(%Client{} = client, account_id, capabilities) do params = %{"capabilities" => Enum.join(capabilities, ",")} opts = [params: params, path_params: [account_id: account_id]] case Client.request(client, :get, "/accounts/:account_id/status", opts) do {:ok, data} -> {:ok, AccountStatus.from_json(data)} error -> error end end @doc """ Updates an Account ## Examples Surge.Accounts.update("acct_123", %{name: "Updated Account"}) #=> {:ok, %Surge.Accounts.Account{name: "Updated Account"}} client = Surge.Client.new("your_api_key") Surge.Accounts.update(client, "acct_123", %{name: "Updated"}) #=> {:ok, %Surge.Accounts.Account{}} """ @spec update(String.t(), map()) :: {:ok, Account.t()} | {:error, Surge.Error.t()} @spec update(Client.t(), String.t(), map()) :: {:ok, Account.t()} | {:error, Surge.Error.t()} def update(client \\ Client.default_client(), account_id, params) def update(%Client{} = client, account_id, params) do opts = [json: params, path_params: [account_id: account_id]] case Client.request(client, :patch, "/accounts/:account_id", opts) do {:ok, data} -> {:ok, Account.from_json(data)} error -> error end end end