update Marker.multi_set_unread_count

This commit is contained in:
Maksim Pechnikov 2019-11-12 15:59:34 +03:00
parent ddbfc995ac
commit b5b62f42b2
2 changed files with 20 additions and 8 deletions

View 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 @@ def upsert(%User{} = user, attrs) 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,

View file

@ -36,15 +36,22 @@ def changeset(%Notification{} = notification, attrs) 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