diff --git a/lib/jellyfish/recording.ex b/lib/jellyfish/recording.ex new file mode 100644 index 0000000..0427b49 --- /dev/null +++ b/lib/jellyfish/recording.ex @@ -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 diff --git a/lib/jellyfish/room.ex b/lib/jellyfish/room.ex index 5602215..e153d5f 100644 --- a/lib/jellyfish/room.ex +++ b/lib/jellyfish/room.ex @@ -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 [ @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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) diff --git a/lib/jellyfish/utils.ex b/lib/jellyfish/utils.ex index d3cc6ea..ef6d7bf 100644 --- a/lib/jellyfish/utils.ex +++ b/lib/jellyfish/utils.ex @@ -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://"] @@ -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 diff --git a/test/jellyfish/client_test.exs b/test/jellyfish/client_test.exs index b46e75b..fa22ecb 100644 --- a/test/jellyfish/client_test.exs +++ b/test/jellyfish/client_test.exs @@ -1,5 +1,5 @@ defmodule Jellyfish.ClientTest do - use ExUnit.Case + use ExUnit.Case, async: false alias Jellyfish.Client @@ -7,6 +7,11 @@ defmodule Jellyfish.ClientTest do @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}" @@ -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 diff --git a/test/jellyfish/recording_test.exs b/test/jellyfish/recording_test.exs new file mode 100644 index 0000000..0bba404 --- /dev/null +++ b/test/jellyfish/recording_test.exs @@ -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