Skip to content

Commit

Permalink
Fixes #156 - Deprecate "shout" event
Browse files Browse the repository at this point in the history
Deprecate "shout" event for conversation channel
in favor of "message:created".
  • Loading branch information
xprazak2 committed Jan 1, 2021
1 parent fa08c57 commit 2bfd0f6
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 28 deletions.
46 changes: 31 additions & 15 deletions lib/chat_api_web/channels/conversation_channel.ex
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ defmodule ChatApiWeb.ConversationChannel do

alias ChatApiWeb.Presence
alias ChatApi.{Messages, Conversations}
require Logger

@impl true
def join("conversation:lobby", payload, socket) do
Expand Down Expand Up @@ -79,20 +80,16 @@ defmodule ChatApiWeb.ConversationChannel do
end

def handle_in("shout", payload, socket) do
with %{conversation: conversation} <- socket.assigns,
%{id: conversation_id, account_id: account_id} <- conversation,
{:ok, message} <-
payload
|> Map.merge(%{"conversation_id" => conversation_id, "account_id" => account_id})
|> Messages.create_message(),
message <- Messages.get_message!(message.id) do
broadcast_new_message(socket, message)
else
_ ->
broadcast(socket, "shout", payload)
end
Logger.warn(
"'shout' is deprecated as event name on a new message and will be removed in a future version. Please migrate to a newer version of a client."
)

{:noreply, socket}
handle_incoming_message("shout", payload, socket)
end

@impl true
def handle_in("message:created", payload, socket) do
handle_incoming_message("message:created", payload, socket)
end

def handle_in("messages:seen", _payload, socket) do
Expand All @@ -119,9 +116,9 @@ defmodule ChatApiWeb.ConversationChannel do
})
end

defp broadcast_new_message(socket, message) do
defp broadcast_new_message(socket, event_name, message) do
broadcast_conversation_update(message)
broadcast(socket, "shout", Messages.Helpers.format(message))
broadcast(socket, event_name, Messages.Helpers.format(message))

message
|> Messages.Notification.notify(:slack)
Expand All @@ -143,4 +140,23 @@ defmodule ChatApiWeb.ConversationChannel do
_ -> false
end
end

# It is also common to receive messages from the client and
# broadcast to everyone in the current topic (conversation:lobby).
defp handle_incoming_message(event_name, payload, socket) do
with %{conversation: conversation} <- socket.assigns,
%{id: conversation_id, account_id: account_id} <- conversation,
{:ok, message} <-
payload
|> Map.merge(%{"conversation_id" => conversation_id, "account_id" => account_id})
|> Messages.create_message(),
message <- Messages.get_message!(message.id) do
broadcast_new_message(socket, event_name, message)
else
_ ->
broadcast(socket, event_name, payload)
end

{:noreply, socket}
end
end
39 changes: 26 additions & 13 deletions lib/chat_api_web/channels/notification_channel.ex
Original file line number Diff line number Diff line change
Expand Up @@ -51,21 +51,16 @@ defmodule ChatApiWeb.NotificationChannel do
end

def handle_in("shout", payload, socket) do
with %{current_user: current_user} <- socket.assigns,
%{id: user_id, account_id: account_id} <- current_user do
{:ok, message} =
payload
|> Map.merge(%{"user_id" => user_id, "account_id" => account_id})
|> Messages.create_message()
Logger.warn(
"'shout' is deprecated as event name on a new message and will be removed in a future version. Please migrate to a newer version of a client."
)

message
|> Map.get(:id)
|> Messages.get_message!()
|> broadcast_new_message()
|> maybe_update_conversation_assignee()
end
handle_incoming_message(payload, socket)
end

{:noreply, socket}
@impl true
def handle_in("message:created", payload, socket) do
handle_incoming_message(payload, socket)
end

@impl true
Expand Down Expand Up @@ -168,4 +163,22 @@ defmodule ChatApiWeb.NotificationChannel do
_ -> false
end
end

defp handle_incoming_message(payload, socket) do
with %{current_user: current_user} <- socket.assigns,
%{id: user_id, account_id: account_id} <- current_user do
{:ok, message} =
payload
|> Map.merge(%{"user_id" => user_id, "account_id" => account_id})
|> Messages.create_message()

message
|> Map.get(:id)
|> Messages.get_message!()
|> broadcast_new_message()
|> maybe_update_conversation_assignee()
end

{:noreply, socket}
end
end
6 changes: 6 additions & 0 deletions test/chat_api_web/channels/conversation_channel_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@ defmodule ChatApiWeb.ConversationChannelTest do
assert_broadcast "shout", _msg
end

test "message:created broadcasts to conversation:lobby", %{socket: socket, account: account} do
msg = %{body: "Hello world!", account_id: account.id}
push(socket, "message:created", msg)
assert_broadcast "message:created", _msg
end

test "broadcasts are pushed to the client", %{socket: socket} do
broadcast_from!(socket, "broadcast", %{"some" => "data"})
assert_push "broadcast", %{"some" => "data"}
Expand Down
16 changes: 16 additions & 0 deletions test/chat_api_web/channels/notification_channel_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,22 @@ defmodule ChatApiWeb.NotificationChannelTest do
assert_push("shout", _msg)
end

test "message:created broadcasts to notification:lobby", %{
socket: socket,
account: account,
conversation: conversation
} do
msg = %{
body: "Hello world!",
account_id: account.id,
conversation_id: conversation.id
}

push(socket, "message:created", msg)

assert_push("message:created", _msg)
end

test "broadcasts are pushed to the client", %{socket: socket} do
broadcast_from!(socket, "broadcast", %{"some" => "data"})
assert_push "broadcast", %{"some" => "data"}
Expand Down

0 comments on commit 2bfd0f6

Please sign in to comment.