defmodule Typesense.Collections do
@moduledoc """
Methods for interaction with Typesense collections.
"""
@type schema :: %{
required(:name) => String.t(),
required(:fields) =>
list(%{
required(:name) => String.t(),
required(:type) => String.t(),
optional(:facet) => boolean(),
optional(:optional) => boolean()
}),
optional(:default_sorting_field) => integer()
}
@doc """
Create a Collection.
## Examples
```
schema = %{
name: "companies",
fields: [
%{name: "company_name", type: "string"},
%{name: "num_employees", type: "int32"},
%{name: "country", type: "string", facet: true},
],
default_sorting_field: "num_employees"
}
Typesense.Collections.create(schema)
```
"""
@spec create(schema) :: {:ok, map()} | {:error, map()}
def create(schema) do
Typesense.post("/collections", schema)
end
@doc """
Retrieve a collection.
## Examples
```elixir
iex> Typesense.Collections.retrieve("companies")
{:ok, company}
```
"""
@spec retrieve(binary()) :: {:ok, map()} | {:error, any()}
def retrieve(collection) do
Typesense.get("/collections/#{collection}")
end
@doc """
List all collections.
## Examples
```elixir
iex> Typesense.Collections.list()
{:ok, collections}
```
"""
@spec list() :: {:ok, list()} | {:error, any()}
def list do
Typesense.get("/collections")
end
@doc """
Delete a collection.
## Examples
```elixir
iex> Typesense.Collections.delete(collection_id)
{:ok, _collection}
```
"""
@spec delete(binary()) :: {:ok, any()} | {:error, any()}
def delete(id) do
Typesense.delete("/collections/#{id}")
end
end