From 7b416e354fb9423044290c419fbb5b7a35ea3c06 Mon Sep 17 00:00:00 2001 From: meppu Date: Wed, 5 Jul 2023 00:52:32 +0300 Subject: [PATCH] handle empty array --- README.md | 2 +- lib/revard/gateway/listener.ex | 28 +++++++++++++++++----------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index b72e6e9..49de19d 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,7 @@ To subscribe to one or more users, make use of the `subscribe` event: } ``` -By doing so, you will receive real-time updates for the specified users within the `ids` array. +By doing so, you will receive real-time updates for the specified users within the `ids` array. If the `ids` is an empty list (`[]`) or `null`, it will unsubscribe from all the subscriptions without returning anything. To update subscribers, resend the same data with the updated `ids` value. diff --git a/lib/revard/gateway/listener.ex b/lib/revard/gateway/listener.ex index 3dd9458..3663fe6 100644 --- a/lib/revard/gateway/listener.ex +++ b/lib/revard/gateway/listener.ex @@ -48,20 +48,33 @@ defmodule Revard.Gateway.Listener do {:ok, state} end + defp match_message(%{"event" => "subscribe", "ids" => nil}, state) do + # Unsubscribe all + Enum.each(state, &Phoenix.PubSub.unsubscribe(@pubsub, &1)) + + {:ok, []} + end + + defp match_message(%{"event" => "subscribe", "ids" => []} = message, state) do + message + |> Map.put("ids", nil) + |> match_message(state) + end + defp match_message(%{"event" => "subscribe", "ids" => ids}, state) when is_list(ids) do # Check format if Enum.all?(ids, &check_id/1) do # Unsubscribe all Enum.each(state, &Phoenix.PubSub.unsubscribe(@pubsub, &1)) - # Subscribe given ones - Enum.each(ids, &Phoenix.PubSub.subscribe(@pubsub, &1)) - # Debug message Logger.debug( - "Connection #{inspect(self())} subscribed to following id(s): #{inspect(ids)} (socket)" + "Connection #{inspect(self())} subscribing to following id(s): #{inspect(ids)} (socket)" ) + # Subscribe given ones + Enum.each(ids, &Phoenix.PubSub.subscribe(@pubsub, &1)) + # Reply with initial message initial_message = %{type: "init", data: Revard.Storage.Users.get(ids)} @@ -73,13 +86,6 @@ defmodule Revard.Gateway.Listener do end end - defp match_message(%{"event" => "subscribe", "ids" => nil}, state) do - # Unsubscribe all - Enum.each(state, &Phoenix.PubSub.unsubscribe(@pubsub, &1)) - - {:ok, []} - end - defp match_message(_message, state) do invalid_payload_error(state) end