forked from AkkomaGang/akkoma
added recount unread notifications to markers
This commit is contained in:
parent
b5b62f42b2
commit
b9041c2097
4 changed files with 50 additions and 4 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 =
|
||||||
|
|
Loading…
Reference in a new issue