update Marker.multi_set_unread_count
authorMaksim Pechnikov <parallel588@gmail.com>
Tue, 12 Nov 2019 12:59:34 +0000 (15:59 +0300)
committerMaksim Pechnikov <parallel588@gmail.com>
Tue, 12 Nov 2019 12:59:34 +0000 (15:59 +0300)
lib/pleroma/marker.ex
lib/pleroma/notification.ex

index d5ca27bf202beefac048a74e02ff2b08d22fdb8e..a3254609488cfc3136b1d2b9ecad3c335be6a4fa 100644 (file)
@@ -9,6 +9,7 @@ defmodule Pleroma.Marker do
   import Ecto.Query
 
   alias Ecto.Multi
+  alias Pleroma.Notification
   alias Pleroma.Repo
   alias Pleroma.User
   alias __MODULE__
@@ -51,7 +52,11 @@ defmodule Pleroma.Marker do
   def multi_set_unread_count(multi, %User{} = user, "notifications") do
     multi
     |> Multi.run(:counters, fn _repo, _changes ->
-      {:ok, Repo.one(Pleroma.Notification.notifications_info_query(user))}
+      {:ok,
+       %{
+         unread_count: Repo.aggregate(Notification.unread_count_query(user), :count, :id),
+         last_read_id: Repo.one(Notification.last_read_query(user))
+       }}
     end)
     |> Multi.insert(
       :marker,
index 158903c4b2f1d41693f9d8589353c4de37c7bb21..1cc6a4735c094f3ed5df2306934680bf4cb68ac1 100644 (file)
@@ -36,15 +36,22 @@ defmodule Pleroma.Notification do
     |> cast(attrs, [:seen])
   end
 
-  @spec notifications_info_query(User.t()) :: Ecto.Queryable.t()
-  def notifications_info_query(user) do
+  @spec unread_count_query(User.t()) :: Ecto.Queryable.t()
+  def unread_count_query(user) do
     from(q in Pleroma.Notification,
       where: q.user_id == ^user.id,
-      select: %{
-        unread_count: fragment("SUM( CASE WHEN seen = false THEN 1 ELSE 0 END )"),
-        last_read_id:
-          type(fragment("MAX( CASE WHEN seen = true THEN id ELSE null END )"), :string)
-      }
+      where: q.seen == false
+    )
+  end
+
+  @spec last_read_query(User.t()) :: Ecto.Queryable.t()
+  def last_read_query(user) do
+    from(q in Pleroma.Notification,
+      where: q.user_id == ^user.id,
+      where: q.seen == true,
+      select: type(q.id, :string),
+      limit: 1,
+      order_by: [desc: :id]
     )
   end