schema "markers" do
field(:last_read_id, :string, default: "")
field(:timeline, :string, default: "")
field(:lock_version, :integer, default: 0)
schema "markers" do
field(:last_read_id, :string, default: "")
field(:timeline, :string, default: "")
field(:lock_version, :integer, default: 0)
- field(:unread_count, :integer, default: 0)
+ field(:unread_count, :integer, default: 0, virtual: true)
Multi.insert(multi, timeline, marker,
returning: true,
Multi.insert(multi, timeline, marker,
returning: true,
- on_conflict: {:replace, [:last_read_id, :unread_count]},
+ on_conflict: {:replace, [:last_read_id]},
- @spec multi_set_unread_count(Multi.t(), User.t(), String.t()) :: Multi.t()
- def multi_set_unread_count(multi, %User{} = user, "notifications") do
+ @spec multi_set_last_read_id(Multi.t(), User.t(), String.t()) :: Multi.t()
+ def multi_set_last_read_id(multi, %User{} = user, "notifications") do
- query =
- from(q in Pleroma.Notification,
- where: q.user_id == ^user.id,
- select: %{
- timeline: "notifications",
- user_id: ^user.id,
- unread_count: fragment("SUM( CASE WHEN seen = false THEN 1 ELSE 0 END ) as unread_count")
- }
- )
-
- {:ok, Repo.one(query)}
+ {:ok, %{last_read_id: Repo.one(Notification.last_read_query(user))}}
- on_conflict: {:replace, [:last_read_id, :unread_count]},
+ on_conflict: {:replace, [:last_read_id]},
- def set_unread_count(%User{} = user, timeline) do
- Multi.new()
- |> multi_set_unread_count(user, timeline)
- |> Repo.transaction()
- end
+ def multi_set_last_read_id(multi, _, _), do: multi
defp get_marker(user, timeline) do
case Repo.find_resource(get_query(user, timeline)) do
defp get_marker(user, timeline) do
case Repo.find_resource(get_query(user, timeline)) do
|> validate_required([:user_id, :timeline, :last_read_id])
|> validate_inclusion(:timeline, @timelines)
end
|> validate_required([:user_id, :timeline, :last_read_id])
|> validate_inclusion(:timeline, @timelines)
end
+
+ defp unread_count_query(query) do
+ from(
+ q in query,
+ left_join: n in "notifications",
+ on: n.user_id == q.user_id and n.seen == false,
+ group_by: [:id],
+ select_merge: %{
+ unread_count: fragment("count(?)", n.id)
+ }
+ )
+ end