aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaksim Pechnikov <parallel588@gmail.com>2019-11-15 22:10:41 +0300
committerMaksim Pechnikov <parallel588@gmail.com>2019-11-15 22:46:58 +0300
commitb9041c209787dc279d4dc5194d65dff73684cdb9 (patch)
tree927fab2c4c2577da9c1cafb1c3d95efcdff302b5
parentb5b62f42b2864dc8b95c8ba7d650321ebcc332ad (diff)
downloadpleroma-b9041c209787dc279d4dc5194d65dff73684cdb9.tar.gz
added recount unread notifications to markers
-rw-r--r--lib/pleroma/marker.ex29
-rw-r--r--lib/pleroma/web/mastodon_api/controllers/marker_controller.ex8
-rw-r--r--test/marker_test.exs14
-rw-r--r--test/web/mastodon_api/controllers/marker_controller_test.exs3
4 files changed, 50 insertions, 4 deletions
diff --git a/lib/pleroma/marker.ex b/lib/pleroma/marker.ex
index a32546094..2d217a0b7 100644
--- a/lib/pleroma/marker.ex
+++ b/lib/pleroma/marker.ex
@@ -15,6 +15,7 @@ defmodule Pleroma.Marker do
alias __MODULE__
@timelines ["notifications"]
+ @type t :: %__MODULE__{}
schema "markers" do
field(:last_read_id, :string, default: "")
@@ -26,8 +27,18 @@ defmodule Pleroma.Marker do
timestamps()
end
- def get_markers(user, timelines \\ []) do
- Repo.all(get_query(user, timelines))
+ @doc """
+ 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
def upsert(%User{} = user, attrs) do
@@ -99,4 +110,18 @@ defmodule Pleroma.Marker do
|> by_user_id(user.id)
|> by_timeline(timelines)
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
diff --git a/lib/pleroma/web/mastodon_api/controllers/marker_controller.ex b/lib/pleroma/web/mastodon_api/controllers/marker_controller.ex
index ce025624d..6649ffbda 100644
--- a/lib/pleroma/web/mastodon_api/controllers/marker_controller.ex
+++ b/lib/pleroma/web/mastodon_api/controllers/marker_controller.ex
@@ -18,7 +18,13 @@ defmodule Pleroma.Web.MastodonAPI.MarkerController do
# GET /api/v1/markers
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})
end
diff --git a/test/marker_test.exs b/test/marker_test.exs
index 5d03db48e..7b1d2218a 100644
--- a/test/marker_test.exs
+++ b/test/marker_test.exs
@@ -36,6 +36,20 @@ defmodule Pleroma.MarkerTest do
insert(:marker, timeline: "home", user: user)
assert Marker.get_markers(user, ["notifications"]) == [refresh_record(marker)]
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
describe "upsert/2" do
diff --git a/test/web/mastodon_api/controllers/marker_controller_test.exs b/test/web/mastodon_api/controllers/marker_controller_test.exs
index 8bcfcb7e1..64bf79bb1 100644
--- a/test/web/mastodon_api/controllers/marker_controller_test.exs
+++ b/test/web/mastodon_api/controllers/marker_controller_test.exs
@@ -11,11 +11,12 @@ defmodule Pleroma.Web.MastodonAPI.MarkerControllerTest do
test "gets markers with correct scopes", %{conn: conn} do
user = insert(:user)
token = insert(:oauth_token, user: user, scopes: ["read:statuses"])
+ insert_list(7, :notification, user: user)
{:ok, %{"notifications" => marker}} =
Pleroma.Marker.upsert(
user,
- %{"notifications" => %{"last_read_id" => "69420", "unread_count" => 7}}
+ %{"notifications" => %{"last_read_id" => "69420"}}
)
response =