From 590405a8ed9fa11ae3825051532e3834668982eb Mon Sep 17 00:00:00 2001 From: KarolK99 Date: Fri, 27 Oct 2023 14:51:44 +0200 Subject: [PATCH 1/3] Add recording API support --- lib/jellyfish/recording.ex | 50 +++++++++++++++++++++++++++++++ lib/jellyfish/room.ex | 24 ++++++--------- lib/jellyfish/utils.ex | 12 +++++++- test/jellyfish/client_test.exs | 11 +++++-- test/jellyfish/recording_test.exs | 18 +++++++++++ 5 files changed, 96 insertions(+), 19 deletions(-) create mode 100644 lib/jellyfish/recording.ex create mode 100644 test/jellyfish/recording_test.exs diff --git a/lib/jellyfish/recording.ex b/lib/jellyfish/recording.ex new file mode 100644 index 0000000..4c7ec9a --- /dev/null +++ b/lib/jellyfish/recording.ex @@ -0,0 +1,50 @@ +defmodule Jellyfish.Recording do + @moduledoc """ + Utilites for manipulating the rooms. + + ## 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..b77b351 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 @@ -30,6 +30,8 @@ defmodule Jellyfish.ClientTest do end test "with connection options from config" do + env_state = Application.get_all_env(:jellyfish_server_sdk) + :ok = Application.put_all_env([ { @@ -56,8 +58,7 @@ defmodule Jellyfish.ClientTest do } } = client - Application.delete_env(:jellyfish_server_sdk, :server_address) - Application.delete_env(:jellyfish_server_sdk, :server_api_token) + Application.put_all_env([{:jellyfish_server_sdk, env_state}]) Application.delete_env(:jellyfish_server_sdk, :secure?) end @@ -73,6 +74,8 @@ defmodule Jellyfish.ClientTest do end test "when options are not passed and config is not set" do + env_state = Application.get_all_env(:jellyfish_server_sdk) + :ok = Application.delete_env(:jellyfish_server_sdk, :server_address, []) :ok = Application.delete_env(:jellyfish_server_sdk, :server_api_token, []) @@ -80,6 +83,8 @@ defmodule Jellyfish.ClientTest do ArgumentError, fn -> Client.new() end ) + + Application.put_all_env([{:jellyfish_server_sdk, env_state}]) end 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 From cf72efb2755d8d1f06936f1b151627cc8bc2e3fd Mon Sep 17 00:00:00 2001 From: KarolK99 Date: Fri, 27 Oct 2023 16:17:55 +0200 Subject: [PATCH 2/3] Refactor client_test --- test/jellyfish/client_test.exs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/test/jellyfish/client_test.exs b/test/jellyfish/client_test.exs index b77b351..fa22ecb 100644 --- a/test/jellyfish/client_test.exs +++ b/test/jellyfish/client_test.exs @@ -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}" @@ -30,8 +35,6 @@ defmodule Jellyfish.ClientTest do end test "with connection options from config" do - env_state = Application.get_all_env(:jellyfish_server_sdk) - :ok = Application.put_all_env([ { @@ -58,7 +61,6 @@ defmodule Jellyfish.ClientTest do } } = client - Application.put_all_env([{:jellyfish_server_sdk, env_state}]) Application.delete_env(:jellyfish_server_sdk, :secure?) end @@ -74,8 +76,6 @@ defmodule Jellyfish.ClientTest do end test "when options are not passed and config is not set" do - env_state = Application.get_all_env(:jellyfish_server_sdk) - :ok = Application.delete_env(:jellyfish_server_sdk, :server_address, []) :ok = Application.delete_env(:jellyfish_server_sdk, :server_api_token, []) @@ -83,8 +83,6 @@ defmodule Jellyfish.ClientTest do ArgumentError, fn -> Client.new() end ) - - Application.put_all_env([{:jellyfish_server_sdk, env_state}]) end end From 83aa2eaa46241bf086f3ec59661338db5e8c78d8 Mon Sep 17 00:00:00 2001 From: KarolK99 Date: Tue, 31 Oct 2023 16:09:05 +0100 Subject: [PATCH 3/3] Requested changes --- lib/jellyfish/recording.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jellyfish/recording.ex b/lib/jellyfish/recording.ex index 4c7ec9a..0427b49 100644 --- a/lib/jellyfish/recording.ex +++ b/lib/jellyfish/recording.ex @@ -1,6 +1,6 @@ defmodule Jellyfish.Recording do @moduledoc """ - Utilites for manipulating the rooms. + Utilites for manipulating the recordings. ## Examples ```