Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions lib/jellyfish/recording.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
defmodule Jellyfish.Recording do
@moduledoc """
Utilites for manipulating the recordings.

## Examples
```
iex> client = Jellyfish.Client.new()
iex> assert {:ok, []} = Jellyfish.Recording.get_list(client)
iex> assert {:error, "Request failed: Recording not found"} = Jellyfish.Recording.delete(client, "not_exisiting_recording")
```
"""

alias Jellyfish.Exception.StructureError
alias Jellyfish.{Client, Utils}
alias Tesla.Env

@typedoc """
Id for the recording, unique within Jellyfish instance.
"""
@type id :: String.t()

@doc """
Lists all available recordings.
"""
@spec get_list(Client.t()) :: {:ok, [id()]} | {:error, String.t()}
def get_list(client) do
with {:ok, %Env{status: 200, body: body}} <-
Tesla.get(client.http_client, "/recording"),
{:ok, data} <- Map.fetch(body, "recordings") do
{:ok, data}
else
:error -> raise StructureError
error -> Utils.handle_response_error(error)
end
end

@doc """
Deletes the recording with `id`.
"""
@spec delete(Client.t(), id()) :: :ok | {:error, String.t()}
def delete(client, id) do
case Tesla.delete(
client.http_client,
"/recording/#{id}"
) do
{:ok, %Env{status: 204}} -> :ok
error -> Utils.handle_response_error(error)
end
end
end
24 changes: 9 additions & 15 deletions lib/jellyfish/room.ex
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ defmodule Jellyfish.Room do
"""

alias Tesla.Env
alias Jellyfish.{Client, Component, Peer}
alias Jellyfish.{Client, Component, Peer, Utils}
alias Jellyfish.Exception.StructureError

@enforce_keys [
Expand Down Expand Up @@ -84,7 +84,7 @@ defmodule Jellyfish.Room do
{:ok, result}
else
:error -> raise StructureError
error -> handle_response_error(error)
error -> Utils.handle_response_error(error)
end
end

Expand All @@ -100,7 +100,7 @@ defmodule Jellyfish.Room do
{:ok, result}
else
:error -> raise StructureError
error -> handle_response_error(error)
error -> Utils.handle_response_error(error)
end
end

Expand Down Expand Up @@ -132,7 +132,7 @@ defmodule Jellyfish.Room do
{:ok, result, jellyfish_address}
else
:error -> raise StructureError
error -> handle_response_error(error)
error -> Utils.handle_response_error(error)
end
end

Expand All @@ -143,7 +143,7 @@ defmodule Jellyfish.Room do
def delete(client, room_id) do
case Tesla.delete(client.http_client, "/room/#{room_id}") do
{:ok, %Env{status: 204}} -> :ok
error -> handle_response_error(error)
error -> Utils.handle_response_error(error)
end
end

Expand Down Expand Up @@ -171,7 +171,7 @@ defmodule Jellyfish.Room do
{:ok, result, token}
else
:error -> raise StructureError
error -> handle_response_error(error)
error -> Utils.handle_response_error(error)
end
end

Expand All @@ -185,7 +185,7 @@ defmodule Jellyfish.Room do
"/room/#{room_id}/peer/#{peer_id}"
) do
{:ok, %Env{status: 204}} -> :ok
error -> handle_response_error(error)
error -> Utils.handle_response_error(error)
end
end

Expand Down Expand Up @@ -213,7 +213,7 @@ defmodule Jellyfish.Room do
{:ok, result}
else
:error -> raise StructureError
error -> handle_response_error(error)
error -> Utils.handle_response_error(error)
end
end

Expand All @@ -227,7 +227,7 @@ defmodule Jellyfish.Room do
"/room/#{room_id}/component/#{component_id}"
) do
{:ok, %Env{status: 204}} -> :ok
error -> handle_response_error(error)
error -> Utils.handle_response_error(error)
end
end

Expand All @@ -253,12 +253,6 @@ defmodule Jellyfish.Room do
end
end

defp handle_response_error({:ok, %Env{body: %{"errors" => error}}}),
do: {:error, "Request failed: #{error}"}

defp handle_response_error({:ok, %Env{body: _body}}), do: raise(StructureError)
defp handle_response_error({:error, reason}), do: {:error, reason}

defp snake_case_to_camel_case(atom) do
[first | rest] = Atom.to_string(atom) |> String.split("_")
rest = rest |> Enum.map(&String.capitalize/1)
Expand Down
12 changes: 11 additions & 1 deletion lib/jellyfish/utils.ex
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ defmodule Jellyfish.Utils do
@moduledoc false

alias Jellyfish.Client
alias Jellyfish.Exception.ProtocolPrefixError
alias Jellyfish.Exception.{ProtocolPrefixError, StructureError}
alias Tesla.Env

@protocol_prefixes ["http://", "https://", "ws://", "wss://"]

Expand All @@ -27,4 +28,13 @@ defmodule Jellyfish.Utils do
def check_prefixes(server_address) do
if String.starts_with?(server_address, @protocol_prefixes), do: raise(ProtocolPrefixError)
end

@type error :: {:ok, %Env{}} | {:error, term()}

@spec handle_response_error(error()) :: {:error, term()}
def handle_response_error({:ok, %Env{body: %{"errors" => error}}}),
do: {:error, "Request failed: #{error}"}

def handle_response_error({:ok, %Env{body: _body}}), do: raise(StructureError)
def handle_response_error({:error, reason}), do: {:error, reason}
end
9 changes: 6 additions & 3 deletions test/jellyfish/client_test.exs
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
defmodule Jellyfish.ClientTest do
use ExUnit.Case
use ExUnit.Case, async: false

alias Jellyfish.Client

@server_address "localhost:5002"
@server_api_token "valid-token"

describe "creates client struct" do
setup do
env_state = Application.get_all_env(:jellyfish_server_sdk)
on_exit(fn -> Application.put_all_env([{:jellyfish_server_sdk, env_state}]) end)
end

test "with connection options passed explictly" do
address_with_prefix = "http://#{@server_address}"

Expand Down Expand Up @@ -56,8 +61,6 @@ defmodule Jellyfish.ClientTest do
}
} = client

Application.delete_env(:jellyfish_server_sdk, :server_address)
Application.delete_env(:jellyfish_server_sdk, :server_api_token)
Application.delete_env(:jellyfish_server_sdk, :secure?)
end

Expand Down
18 changes: 18 additions & 0 deletions test/jellyfish/recording_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
defmodule Jellyfish.RecordingTest do
use ExUnit.Case
doctest Jellyfish.Recording

alias Jellyfish.{Client, Recording}

setup do
%{client: Client.new()}
end

test "list recordings", %{client: client} do
assert {:ok, []} = Recording.get_list(client)
end

test "delete", %{client: client} do
assert {:error, _reason} = Recording.delete(client, "wrong_id")
end
end