Skip to main content

lib/meili/network.ex

defmodule Meili.Network do
  @moduledoc """
  Manages multi-node network configurations in Meilisearch.
  """

  alias Meili.Client

  @doc """
  Retrieves multi-node network configuration.

  ## Examples
      Meili.Network.get()
      Meili.Network.get(client)
  """
  @spec get(Meili.Client.t() | nil) :: {:ok, map()} | {:error, Meili.Error.t()}
  def get(client \\ nil) do
    client = client || Meili.default_client()
    Client.request(client, :get, "/network")
  end

  @doc """
  Retrieves multi-node network configuration, raising on error.

  ## Examples
      Meili.Network.get!()
      Meili.Network.get!(client)
  """
  @spec get!(Meili.Client.t() | nil) :: map() | no_return()
  def get!(client \\ nil) do
    case get(client) do
      {:ok, body} -> body
      {:error, exception} -> raise exception
    end
  end

  @doc """
  Updates multi-node network configuration.

  ## Examples
      params = %{
        leader: %{
          endpoint: "https://leader.meili.com",
          key: "leader-key"
        }
      }
      Meili.Network.update(params)
      Meili.Network.update(client, params)
  """
  @spec update(Meili.Client.t() | map() | Keyword.t(), map() | Keyword.t() | nil) ::
          {:ok, map()} | {:error, Meili.Error.t()}
  def update(client_or_params, params_or_nil \\ nil) do
    case client_or_params do
      %Client{} = client ->
        do_update(client, params_or_nil)

      params when is_map(params) or is_list(params) ->
        do_update(Meili.default_client(), params)
    end
  end

  @doc """
  Updates network configuration, raising on error.

  ## Examples
      params = %{
        leader: %{
          endpoint: "https://leader.meili.com",
          key: "leader-key"
        }
      }
      Meili.Network.update!(params)
      Meili.Network.update!(client, params)
  """
  @spec update!(Meili.Client.t() | map() | Keyword.t(), map() | Keyword.t() | nil) ::
          map() | no_return()
  def update!(client_or_params, params_or_nil \\ nil) do
    case update(client_or_params, params_or_nil) do
      {:ok, body} -> body
      {:error, exception} -> raise exception
    end
  end

  defp do_update(client, params) do
    body = Meili.Util.camelize_keys(params)
    Client.request(client, :patch, "/network", json: body)
  end
end