From 95e27c541d67f30bae9859662088028b32a5c2e3 Mon Sep 17 00:00:00 2001
From: Ondrej Prazak <o.prazak5@seznam.cz>
Date: Tue, 22 Dec 2020 11:46:49 +0100
Subject: [PATCH] Fixes #156 - Deprecate "shout" event

Deprecate "shout" event for conversation channel
in favor of "message:created".
---
 .../channels/conversation_channel.ex          | 23 +++++++++++++++----
 .../channels/conversation_channel_test.exs    |  6 +++++
 2 files changed, 24 insertions(+), 5 deletions(-)

diff --git a/lib/chat_api_web/channels/conversation_channel.ex b/lib/chat_api_web/channels/conversation_channel.ex
index e6ea1a17e..dbb40b45f 100644
--- a/lib/chat_api_web/channels/conversation_channel.ex
+++ b/lib/chat_api_web/channels/conversation_channel.ex
@@ -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
@@ -80,9 +81,21 @@ defmodule ChatApiWeb.ConversationChannel do
     {:reply, {:ok, payload}, socket}
   end
 
+  def handle_in("shout", payload, socket) do
+    Logger.notice(
+      "'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."
+    )
+
+    handle_in_msg("shout", payload, socket)
+  end
+
+  def handle_in("message:created", payload, socket) do
+    handle_in_msg("message:created", payload, socket)
+  end
+
   # It is also common to receive messages from the client and
   # broadcast to everyone in the current topic (conversation:lobby).
-  def handle_in("shout", payload, socket) do
+  defp handle_in_msg(event_name, payload, socket) do
     with %{conversation: conversation} <- socket.assigns,
          %{id: conversation_id, account_id: account_id} <- conversation,
          {:ok, message} <-
@@ -90,10 +103,10 @@ defmodule ChatApiWeb.ConversationChannel do
            |> 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)
+      broadcast_new_message(socket, event_name, message)
     else
       _ ->
-        broadcast(socket, "shout", payload)
+        broadcast(socket, event_name, payload)
     end
 
     {:noreply, socket}
@@ -123,9 +136,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)
diff --git a/test/chat_api_web/channels/conversation_channel_test.exs b/test/chat_api_web/channels/conversation_channel_test.exs
index 06d550687..d64ef58f9 100644
--- a/test/chat_api_web/channels/conversation_channel_test.exs
+++ b/test/chat_api_web/channels/conversation_channel_test.exs
@@ -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"}