diff --git a/lib/turn_junebug_expressway/agent.ex b/lib/turn_junebug_expressway/agent.ex new file mode 100644 index 0000000..ce34caf --- /dev/null +++ b/lib/turn_junebug_expressway/agent.ex @@ -0,0 +1,17 @@ +defmodule TurnJunebugExpressway.TurnAgent do + use Agent + + def start_link(_) do + Agent.start_link(fn -> %{} end, name: __MODULE__) + end + + def put(key, value) do + Agent.update(__MODULE__, &Map.put(&1, key, value)) + end + + def get(key) do + Agent.get(__MODULE__, &Map.get(&1, key)) + end + + # TODO: Add a way to clear the cache after a set time +end diff --git a/lib/turn_junebug_expressway/application.ex b/lib/turn_junebug_expressway/application.ex index 8edb90b..10f0225 100644 --- a/lib/turn_junebug_expressway/application.ex +++ b/lib/turn_junebug_expressway/application.ex @@ -11,6 +11,8 @@ defmodule TurnJunebugExpressway.Application do # Define workers and child supervisors to be supervised children = [ + # Start Agent + TurnJunebugExpressway.TurnAgent, # Start the endpoint when the application starts TurnJunebugExpresswayWeb.Endpoint, # Start your own worker by calling: TurnJunebugExpressway.Worker.start_link(arg1, arg2, arg3) diff --git a/lib/turn_junebug_expressway_web/utils.ex b/lib/turn_junebug_expressway_web/utils.ex index 94c8f1c..56a59f3 100644 --- a/lib/turn_junebug_expressway_web/utils.ex +++ b/lib/turn_junebug_expressway_web/utils.ex @@ -1,6 +1,6 @@ defmodule TurnJunebugExpresswayWeb.Utils do use Tesla - + alias TurnJunebugExpressway.TurnAgent @turn_client Application.compile_env(:turn_junebug_expressway, :turn_client) @rapidpro_client Application.compile_env(:turn_junebug_expressway, :rapidpro_client) @@ -62,6 +62,11 @@ defmodule TurnJunebugExpresswayWeb.Utils do end def send_message(message) do + key = Map.get(message, "user_message_id") + value = Map.get(message, "recipient_id") + #IO.puts("#{message}") + #IO.puts("#{inspect(key)}, #{inspect(value)}") + TurnJunebugExpressway.TurnAgent.put(key, value) TurnJunebugExpressway.MessageEngine.publish_message(message) end @@ -113,24 +118,28 @@ defmodule TurnJunebugExpresswayWeb.Utils do end def forward_event(event) do - IO.puts("FORWARD_EVENT: #{inspect(event)}") + #IO.puts("#{inspect(event)}") + IO.inspect("#{inspect(TurnAgent.get(Map.get(event, "user_message_id")))}") case event |> get_event_status do {:ignore, _} -> :ok {:ok, status} -> - @turn_client.client() - |> @turn_client.post_event(%{ - "statuses" => [ - %{ - "id" => Map.get(event, "user_message_id"), - "recipient_id" => nil, - "status" => status, - "timestamp" => get_event_timestamp(event, :second) - } - ] - }) + if recipient_id = TurnAgent.get(Map.get(event, "user_message_id")) != nil do + @turn_client.client() + |> @turn_client.post_event(%{ + "statuses" => [ + %{ + "id" => Map.get(event, "user_message_id"), + #"recipient_id" => nil, + "recipient_id" => TurnAgent.get(Map.get(event, "user_message_id")), + "status" => status, + "timestamp" => get_event_timestamp(event, :second) + } + ] + }) + end end end diff --git a/mix.exs b/mix.exs index 07a737c..e0e6529 100644 --- a/mix.exs +++ b/mix.exs @@ -5,7 +5,7 @@ defmodule TurnJunebugExpressway.Mixfile do [ app: :turn_junebug_expressway, version: "0.0.18", - elixir: "~> 1.17", + elixir: "~> 1.16", elixirc_paths: elixirc_paths(Mix.env()), compilers: [:gettext] ++ Mix.compilers(), start_permanent: Mix.env() == :prod, diff --git a/test/turn_junebug_expressway_web/utils_test.exs b/test/turn_junebug_expressway_web/utils_test.exs index 82ca5f1..83d25b3 100644 --- a/test/turn_junebug_expressway_web/utils_test.exs +++ b/test/turn_junebug_expressway_web/utils_test.exs @@ -34,18 +34,73 @@ defmodule TurnJunebugExpresswayWeb.UtilsTest do end describe "handle_incoming_event" do + # test "sends event back to turn, recipient_id not found", %{} do + # body = %{ + # "statuses" => [ + # %{ + # "id" => "f74c4e6108d8418ab53dbcfd628242f3", + # "recipient_id" => nil, + # "status" => "sent", + # "timestamp" => "1572525144" + # } + # ] + # } + + # TurnJunebugExpressway.Backends.ClientMock + # |> expect(:client, fn -> :client end) + # |> expect(:post_event, fn :client, ^body -> :not_called end) + + # event = %{ + # "transport_name" => "d49d3569-47d5-47a0-8074-5a7ffa684832", + # "event_type" => "ack", + # "event_id" => "b3db4f670d4c4e2297c58a6dc5b72980", + # "sent_message_id" => "f74c4e6108d8418ab53dbcfd628242f3", + # "helper_metadata" => %{}, + # "routing_metadata" => %{}, + # "message_version" => "20110921", + # "timestamp" => "2019-10-31 12:32:24.930687", + # "transport_metadata" => %{}, + # "user_message_id" => "f74c4e6108d8418ab53dbcfd628242f3", + # "message_type" => "event" + # } + # assert Utils.handle_incoming_event(Jason.encode!(event)) == nil + + # end + test "sends event back to turn, recipient_id not found", %{} do + TurnJunebugExpressway.Backends.ClientMock + |> expect(:client, fn -> :client end) + |> expect(:post_event, fn :client, _ -> raise "Shouldnt be called" end) + + event = %{ + "transport_name" => "d49d3569-47d5-47a0-8074-5a7ffa684832", + "event_type" => "ack", + "event_id" => "b3db4f670d4c4e2297c58a6dc5b72980", + "sent_message_id" => "f74c4e6108d8418ab53dbcfd628242f3", + "helper_metadata" => %{}, + "routing_metadata" => %{}, + "message_version" => "20110921", + "timestamp" => "2019-10-31 12:32:24.930687", + "transport_metadata" => %{}, + "user_message_id" => "f74c4e6108d8418ab53dbcfd628242f3", + "message_type" => "event" + } + + assert Utils.handle_incoming_event(Jason.encode!(event)) == nil + end + test "sends event back to turn", %{} do body = %{ "statuses" => [ %{ "id" => "f74c4e6108d8418ab53dbcfd628242f3", - "recipient_id" => nil, + "recipient_id" => "1234", "status" => "sent", "timestamp" => "1572525144" } ] } - + message = %{"content" => "something", "recipient_id"=> "1234","user_message_id" => "f74c4e6108d8418ab53dbcfd628242f3"} + Utils.send_message(message) TurnJunebugExpressway.Backends.ClientMock |> expect(:client, fn -> :client end) |> expect(:post_event, fn :client, ^body -> :ok end) @@ -72,13 +127,14 @@ defmodule TurnJunebugExpresswayWeb.UtilsTest do "statuses" => [ %{ "id" => "f74c4e6108d8418ab53dbcfd628242f3", - "recipient_id" => nil, + "recipient_id" => 1234, "status" => "sent", "timestamp" => "1572525144930" } ] } - + message = %{"content" => "something", "recipient_id"=> "1234","user_message_id" => "16e42b66-03b7-4558-8a72-e9db481fdb4c"} + Utils.send_message(message) TurnJunebugExpressway.Backends.ClientMock |> expect(:client, fn -> :client end) |> expect(:post_event, fn :client, _new_body ->