Current section
Files
Jump to
Current section
Files
lib/ex_stream_client/operations/roles.ex
defmodule ExStreamClient.Operations.Roles do
@moduledoc ~S"""
Modules for interacting with the `roles` group of Stream APIs
API Reference: https://getstream.github.io/protocol/?urls.primaryName=Chat%20v2
"""
require Logger
@doc ~S"""
Creates custom role
### Required Arguments:
- `payload`: `Elixir.ExStreamClient.Model.CreateRoleRequest`
### Optional Arguments:
- `client`: HTTP client to use. Must implement `ExStreamClient.Http.Behavior`(e.g., `ExStreamClient.Http`)
"""
@spec create_role(ExStreamClient.Model.CreateRoleRequest.t()) ::
{:ok, ExStreamClient.Model.CreateRoleResponse.t()} | {:error, any()}
@spec create_role(ExStreamClient.Model.CreateRoleRequest.t(), client: module()) ::
{:ok, ExStreamClient.Model.CreateRoleResponse.t()} | {:error, any()}
def create_role(payload, opts \\ []) do
client = get_client(opts)
request_opts = [url: "/api/v2/roles", method: :post, params: []] ++ [json: payload]
r =
Req.new(request_opts)
|> Req.Request.append_response_steps(
decode: fn {request, response} ->
response_type =
if response.status in 200..299 do
:ok
else
:error
end
response_handlers = %{
201 => ExStreamClient.Model.CreateRoleResponse,
400 => ExStreamClient.Model.APIError,
429 => ExStreamClient.Model.APIError
}
parsed =
case Map.get(response_handlers, response.status) do
nil -> {:error, response.body}
mod -> {response_type, mod.decode(response.body)}
end
{request, %{response | body: parsed}}
end
)
case client.request(r, opts) do
{:ok, response} -> response.body
{:error, error} -> {:error, error}
end
end
@doc ~S"""
Lists all available roles
### Optional Arguments:
- `client`: HTTP client to use. Must implement `ExStreamClient.Http.Behavior`(e.g., `ExStreamClient.Http`)
"""
@spec list_roles() :: {:ok, ExStreamClient.Model.ListRolesResponse.t()} | {:error, any()}
@spec list_roles(client: module()) ::
{:ok, ExStreamClient.Model.ListRolesResponse.t()} | {:error, any()}
def list_roles(opts \\ []) do
client = get_client(opts)
request_opts = [url: "/api/v2/roles", method: :get, params: []] ++ []
r =
Req.new(request_opts)
|> Req.Request.append_response_steps(
decode: fn {request, response} ->
response_type =
if response.status in 200..299 do
:ok
else
:error
end
response_handlers = %{
200 => ExStreamClient.Model.ListRolesResponse,
400 => ExStreamClient.Model.APIError,
429 => ExStreamClient.Model.APIError
}
parsed =
case Map.get(response_handlers, response.status) do
nil -> {:error, response.body}
mod -> {response_type, mod.decode(response.body)}
end
{request, %{response | body: parsed}}
end
)
case client.request(r, opts) do
{:ok, response} -> response.body
{:error, error} -> {:error, error}
end
end
@doc ~S"""
Deletes custom role
### Required Arguments:
- `name`
### Optional Arguments:
- `client`: HTTP client to use. Must implement `ExStreamClient.Http.Behavior`(e.g., `ExStreamClient.Http`)
"""
@spec delete_role(String.t()) :: {:ok, ExStreamClient.Model.Response.t()} | {:error, any()}
@spec delete_role(String.t(), client: module()) ::
{:ok, ExStreamClient.Model.Response.t()} | {:error, any()}
def delete_role(name, opts \\ []) do
client = get_client(opts)
request_opts = [url: "/api/v2/roles/#{name}", method: :delete, params: []] ++ []
r =
Req.new(request_opts)
|> Req.Request.append_response_steps(
decode: fn {request, response} ->
response_type =
if response.status in 200..299 do
:ok
else
:error
end
response_handlers = %{
200 => ExStreamClient.Model.Response,
400 => ExStreamClient.Model.APIError,
429 => ExStreamClient.Model.APIError
}
parsed =
case Map.get(response_handlers, response.status) do
nil -> {:error, response.body}
mod -> {response_type, mod.decode(response.body)}
end
{request, %{response | body: parsed}}
end
)
case client.request(r, opts) do
{:ok, response} -> response.body
{:error, error} -> {:error, error}
end
end
defp get_client(opts) do
client = Keyword.get(opts, :client, ExStreamClient.Http)
unless Code.ensure_loaded?(client) and function_exported?(client, :request, 2) do
raise ArgumentError,
"client #{inspect(client)} must implement request/2 to conform to ExStreamClient.Http.Behavior"
end
client
end
end