added recount unread notifications to markers

This commit is contained in:
Maksim Pechnikov 2019-11-15 22:10:41 +03:00
parent b5b62f42b2
commit b9041c2097
4 changed files with 50 additions and 4 deletions

View file

@ -15,6 +15,7 @@ defmodule Pleroma.Marker do
alias __MODULE__ alias __MODULE__
@timelines ["notifications"] @timelines ["notifications"]
@type t :: %__MODULE__{}
schema "markers" do schema "markers" do
field(:last_read_id, :string, default: "") field(:last_read_id, :string, default: "")
@ -26,8 +27,18 @@ defmodule Pleroma.Marker do
timestamps() timestamps()
end end
def get_markers(user, timelines \\ []) do @doc """
Repo.all(get_query(user, timelines)) Gets markers by user and timeline.
opts:
`recount_unread` - run force recount unread notifications for `true` value
"""
@spec get_markers(User.t(), list(String), map()) :: list(t())
def get_markers(user, timelines \\ [], opts \\ %{}) do
user
|> get_query(timelines)
|> recount_unread_notifications(opts[:recount_unread])
|> Repo.all()
end end
def upsert(%User{} = user, attrs) do def upsert(%User{} = user, attrs) do
@ -99,4 +110,18 @@ defp get_query(user, timelines) do
|> by_user_id(user.id) |> by_user_id(user.id)
|> by_timeline(timelines) |> by_timeline(timelines)
end end
defp recount_unread_notifications(query, true) 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
defp recount_unread_notifications(query, _), do: query
end end

View file

@ -18,7 +18,13 @@ defmodule Pleroma.Web.MastodonAPI.MarkerController do
# GET /api/v1/markers # GET /api/v1/markers
def index(%{assigns: %{user: user}} = conn, params) do def index(%{assigns: %{user: user}} = conn, params) do
markers = Pleroma.Marker.get_markers(user, params["timeline"]) markers =
Pleroma.Marker.get_markers(
user,
params["timeline"],
%{recount_unread: true}
)
render(conn, "markers.json", %{markers: markers}) render(conn, "markers.json", %{markers: markers})
end end

View file

@ -36,6 +36,20 @@ test "returns user markers" do
insert(:marker, timeline: "home", user: user) insert(:marker, timeline: "home", user: user)
assert Marker.get_markers(user, ["notifications"]) == [refresh_record(marker)] assert Marker.get_markers(user, ["notifications"]) == [refresh_record(marker)]
end end
test "returns user markers with recount unread notifications" do
user = insert(:user)
marker = insert(:marker, user: user)
insert(:notification, user: user)
insert(:notification, user: user)
insert(:marker, timeline: "home", user: user)
assert Marker.get_markers(
user,
["notifications"],
%{recount_unread: true}
) == [%Marker{refresh_record(marker) | unread_count: 2}]
end
end end
describe "upsert/2" do describe "upsert/2" do

View file

@ -11,11 +11,12 @@ defmodule Pleroma.Web.MastodonAPI.MarkerControllerTest do
test "gets markers with correct scopes", %{conn: conn} do test "gets markers with correct scopes", %{conn: conn} do
user = insert(:user) user = insert(:user)
token = insert(:oauth_token, user: user, scopes: ["read:statuses"]) token = insert(:oauth_token, user: user, scopes: ["read:statuses"])
insert_list(7, :notification, user: user)
{:ok, %{"notifications" => marker}} = {:ok, %{"notifications" => marker}} =
Pleroma.Marker.upsert( Pleroma.Marker.upsert(
user, user,
%{"notifications" => %{"last_read_id" => "69420", "unread_count" => 7}} %{"notifications" => %{"last_read_id" => "69420"}}
) )
response = response =