philomena/lib/philomena_web/plugs/notification_count_plug.ex
2024-07-28 12:39:11 -04:00

47 lines
1.1 KiB
Elixir

defmodule PhilomenaWeb.NotificationCountPlug do
@moduledoc """
This plug stores the current notification count.
## Example
plug PhilomenaWeb.NotificationCountPlug
"""
alias Plug.Conn
alias Philomena.Conversations
alias Philomena.Notifications
@doc false
@spec init(any()) :: any()
def init(opts), do: opts
@doc false
@spec call(Plug.Conn.t()) :: Plug.Conn.t()
def call(conn), do: call(conn, nil)
@doc false
@spec call(Plug.Conn.t(), any()) :: Plug.Conn.t()
def call(conn, _opts) do
user = conn.assigns.current_user
conn
|> maybe_assign_notifications(user)
|> maybe_assign_conversations(user)
end
defp maybe_assign_notifications(conn, nil), do: conn
defp maybe_assign_notifications(conn, user) do
notifications = Notifications.total_unread_notification_count(user)
Conn.assign(conn, :notification_count, notifications)
end
defp maybe_assign_conversations(conn, nil), do: conn
defp maybe_assign_conversations(conn, user) do
conversations = Conversations.count_unread_conversations(user)
Conn.assign(conn, :conversation_count, conversations)
end
end