# `Parrhesia.Storage.Groups`

Storage callbacks for NIP-29/NIP-43 group membership and role state.

# `context`

```elixir
@type context() :: map()
```

# `group_id`

```elixir
@type group_id() :: binary()
```

# `membership`

```elixir
@type membership() :: map()
```

# `pubkey`

```elixir
@type pubkey() :: binary()
```

# `reason`

```elixir
@type reason() :: term()
```

# `role`

```elixir
@type role() :: map()
```

# `delete_membership`

```elixir
@callback delete_membership(context(), group_id(), pubkey()) :: :ok | {:error, reason()}
```

# `delete_role`

```elixir
@callback delete_role(context(), group_id(), pubkey(), binary()) ::
  :ok | {:error, reason()}
```

# `get_membership`

```elixir
@callback get_membership(context(), group_id(), pubkey()) ::
  {:ok, membership() | nil} | {:error, reason()}
```

# `list_memberships`

```elixir
@callback list_memberships(context(), group_id()) ::
  {:ok, [membership()]} | {:error, reason()}
```

# `list_roles`

```elixir
@callback list_roles(context(), group_id(), pubkey()) ::
  {:ok, [role()]} | {:error, reason()}
```

# `put_membership`

```elixir
@callback put_membership(context(), membership()) ::
  {:ok, membership()} | {:error, reason()}
```

# `put_role`

```elixir
@callback put_role(context(), role()) :: {:ok, role()} | {:error, reason()}
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
