defmodule Meilisearch.Key do
@moduledoc """
Manipulate Meilisearch api keys.
[Key API](https://www.meilisearch.com/docs/reference/api/keys)
"""
use TypedEctoSchema
@primary_key false
typed_embedded_schema null: false do
field(:name, :string, null: true)
field(:description, :string, null: true)
field(:key, :string)
field(:uid, :string)
field(:actions, {:array, :string})
field(:indexes, {:array, :string})
field(:expiresAt, :utc_datetime, null: true)
field(:createdAt, :utc_datetime)
field(:updatedAt, :utc_datetime)
end
def cast(data) when is_list(data), do: Enum.map(data, &cast(&1))
def cast(data) when is_map(data) do
%__MODULE__{}
|> Ecto.Changeset.cast(data, [
:name,
:description,
:key,
:uid,
:actions,
:indexes,
:expiresAt,
:createdAt,
:updatedAt
])
|> Ecto.Changeset.apply_changes()
end
@doc """
List keys of your Meilisearch instance.
[Meilisearch documentation](https://www.meilisearch.com/docs/reference/api/keys#get-all-keys)
## Examples
iex> client = Meilisearch.Client.new(endpoint: "http://localhost:7700", key: "master_key_test")
iex> Meilisearch.Key.list(client, limit: 20, offset: 0)
{:ok, %{offset: 0, limit: 20, total: 1, results: [%{
name: "Default Search API Key",
description: "Use it to search from the frontend code",
key: "0a6e572506c52ab0bd6195921575d23092b7f0c284ab4ac86d12346c33057f99",
uid: "74c9c733-3368-4738-bbe5-1d18a5fecb37",
actions: ["search"],
indexes: ["*"],
expiresAt: nil,
createdAt: ~U[2021-08-12 10:00:00],
updatedAt: ~U[2021-08-12 10:00:00]
}]}}
"""
@spec list(Tesla.Client.t(), offset: integer(), limit: integer()) ::
{:ok, Meilisearch.Pagination.t(__MODULE__.t())}
| {:error, Meilisearch.Client.error()}
def list(client, opts \\ []) do
with {:ok, data} <-
client
|> Tesla.get("/keys", query: opts)
|> Meilisearch.Client.handle_response() do
{:ok, Meilisearch.Pagination.cast(data, &__MODULE__.cast/1)}
end
end
@doc """
Get a Key of your Meilisearch instance.
[Meilisearch documentation](https://www.meilisearch.com/docs/reference/api/keys#get-one-key)
## Examples
iex> client = Meilisearch.Client.new(endpoint: "http://localhost:7700", key: "master_key_test")
iex> Meilisearch.Key.get(client, "74c9c733-3368-4738-bbe5-1d18a5fecb37")
{:ok, %{
name: "Default Search API Key",
description: "Use it to search from the frontend code",
key: "0a6e572506c52ab0bd6195921575d23092b7f0c284ab4ac86d12346c33057f99",
uid: "74c9c733-3368-4738-bbe5-1d18a5fecb37",
actions: ["search"],
indexes: ["*"],
expiresAt: nil,
createdAt: ~U[2021-08-12 10:00:00],
updatedAt: ~U[2021-08-12 10:00:00]
}}
"""
@spec get(Tesla.Client.t(), String.t()) ::
{:ok, __MODULE__.t()} | {:error, Meilisearch.Client.error()}
def get(client, key_uid) do
with {:ok, data} <-
client
|> Tesla.get("/keys/:key_uid", opts: [path_params: [key_uid: key_uid]])
|> Meilisearch.Client.handle_response() do
{:ok, cast(data)}
end
end
@doc """
Create a new Key in your Meilisearch instance.
[Meilisearch documentation](https://www.meilisearch.com/docs/reference/api/keys#create-a-key)
## Examples
iex> client = Meilisearch.Client.new(endpoint: "http://localhost:7700", key: "master_key_test")
iex> Meilisearch.Key.create(client, %{actions: ["*"], indexes: ["*"], expiresAt: nil})
{:ok, %{
uid: "6062abda-a5aa-4414-ac91-ecd7944c0f8d",
key: "d0552b41536279a0ad88bd595327b96f01176a60c2243e906c52ac02375f9bc4",
name: nil,
description: nil,
actions: ["*"],
indexes: ["*"],
expiresAt: nil,
createdAt: ~U[2021-08-12 10:00:00],
updatedAt: ~U[2021-08-12 10:00:00],
}}
"""
@spec create(Tesla.Client.t(), %{
uid: String.t() | nil,
name: String.t() | nil,
description: String.t() | nil,
actions: list(String.t()),
indexes: list(String.t()),
expiresAt: DateTime.t() | nil
}) ::
{:ok, __MODULE__.t()} | {:error, Meilisearch.Client.error()}
def create(client, params) do
with {:ok, data} <-
client
|> Tesla.post("/keys", params)
|> Meilisearch.Client.handle_response() do
{:ok, cast(data)}
end
end
@doc """
Update an existing Key in your Meilisearch instance.
[Meilisearch documentation](https://www.meilisearch.com/docs/reference/api/keys#update-a-key)
## Examples
iex> client = Meilisearch.Client.new(endpoint: "http://localhost:7700", key: "master_key_test")
iex> Meilisearch.Key.update(client, "6062abda-a5aa-4414-ac91-ecd7944c0f8d", %{name: "Products/Reviews API key", description: "Manage documents: Products/Reviews API key"})
{:ok, %{
uid: "6062abda-a5aa-4414-ac91-ecd7944c0f8d",
key: "d0552b41536279a0ad88bd595327b96f01176a60c2243e906c52ac02375f9bc4",
name: "Products/Reviews API key",
description: "Manage documents: Products/Reviews API key",
actions: ["*"],
indexes: ["*"],
expiresAt: nil,
createdAt: ~U[2021-08-12 10:00:00],
updatedAt: ~U[2021-08-12 10:00:00],
}}
"""
@spec update(Tesla.Client.t(), String.t(), %{
name: String.t() | nil,
description: String.t() | nil
}) ::
{:ok, __MODULE__.t()} | {:error, Meilisearch.Client.error()}
def update(client, key_uid, params) do
with {:ok, data} <-
client
|> Tesla.patch("/keys/:key_uid", params, opts: [path_params: [key_uid: key_uid]])
|> Meilisearch.Client.handle_response() do
{:ok, cast(data)}
end
end
@doc """
Delete an existing Index in your Meilisearch instance.
[Meilisearch documentation](https://docs.meilisearch.com/reference/api/indexes.html#delete-a-key)
## Examples
iex> client = Meilisearch.Client.new(endpoint: "http://localhost:7700", key: "master_key_test")
iex> Meilisearch.Key.delete(client, "6062abda-a5aa-4414-ac91-ecd7944c0f8d")
{:ok, nil}
"""
@spec delete(Tesla.Client.t(), String.t()) ::
{:ok, nil} | {:error, Meilisearch.Client.error()}
def delete(client, key_uid) do
with {:ok, _} <-
client
|> Tesla.delete("/keys/:key_uid", opts: [path_params: [key_uid: key_uid]])
|> Meilisearch.Client.handle_response() do
{:ok, nil}
end
end
end