Skip to content

Commit

Permalink
Adding agent for caching recipient ids and extra tests for these addi…
Browse files Browse the repository at this point in the history
…tional implementations
  • Loading branch information
Matthew committed Aug 1, 2024
1 parent 7f78ff6 commit e15a45b
Show file tree
Hide file tree
Showing 5 changed files with 102 additions and 18 deletions.
17 changes: 17 additions & 0 deletions lib/turn_junebug_expressway/agent.ex
Original file line number Diff line number Diff line change
@@ -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
2 changes: 2 additions & 0 deletions lib/turn_junebug_expressway/application.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
35 changes: 22 additions & 13 deletions lib/turn_junebug_expressway_web/utils.ex
Original file line number Diff line number Diff line change
@@ -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)

Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
64 changes: 60 additions & 4 deletions test/turn_junebug_expressway_web/utils_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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 ->
Expand Down

0 comments on commit e15a45b

Please sign in to comment.