marks notifications as read after mute
This commit is contained in:
parent
51844b1e42
commit
f0fefc4f5c
3 changed files with 79 additions and 1 deletions
|
@ -648,4 +648,16 @@ def for_user_and_activity(user, activity) do
|
||||||
)
|
)
|
||||||
|> Repo.one()
|
|> Repo.one()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@spec mark_as_read(User.t(), Activity.t()) :: {integer(), nil | [term()]}
|
||||||
|
def mark_as_read(%User{id: id}, %Activity{data: %{"context" => context}}) do
|
||||||
|
from(
|
||||||
|
n in Notification,
|
||||||
|
join: a in assoc(n, :activity),
|
||||||
|
where: n.user_id == ^id,
|
||||||
|
where: n.seen == false,
|
||||||
|
where: fragment("?->>'context'", a.data) == ^context
|
||||||
|
)
|
||||||
|
|> Repo.update_all(set: [seen: true])
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -452,7 +452,8 @@ def unpin(id, user) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def add_mute(user, activity) do
|
def add_mute(user, activity) do
|
||||||
with {:ok, _} <- ThreadMute.add_mute(user.id, activity.data["context"]) do
|
with {:ok, _} <- ThreadMute.add_mute(user.id, activity.data["context"]),
|
||||||
|
_ <- Pleroma.Notification.mark_as_read(user, activity) do
|
||||||
{:ok, activity}
|
{:ok, activity}
|
||||||
else
|
else
|
||||||
{:error, _} -> {:error, dgettext("errors", "conversation is already muted")}
|
{:error, _} -> {:error, dgettext("errors", "conversation is already muted")}
|
||||||
|
|
|
@ -9,6 +9,7 @@ defmodule Pleroma.Web.CommonAPITest do
|
||||||
alias Pleroma.Conversation.Participation
|
alias Pleroma.Conversation.Participation
|
||||||
alias Pleroma.Notification
|
alias Pleroma.Notification
|
||||||
alias Pleroma.Object
|
alias Pleroma.Object
|
||||||
|
alias Pleroma.Repo
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
alias Pleroma.Web.ActivityPub.ActivityPub
|
alias Pleroma.Web.ActivityPub.ActivityPub
|
||||||
alias Pleroma.Web.ActivityPub.Transmogrifier
|
alias Pleroma.Web.ActivityPub.Transmogrifier
|
||||||
|
@ -18,6 +19,7 @@ defmodule Pleroma.Web.CommonAPITest do
|
||||||
|
|
||||||
import Pleroma.Factory
|
import Pleroma.Factory
|
||||||
import Mock
|
import Mock
|
||||||
|
import Ecto.Query, only: [from: 2]
|
||||||
|
|
||||||
require Pleroma.Constants
|
require Pleroma.Constants
|
||||||
|
|
||||||
|
@ -808,6 +810,69 @@ test "should unpin when deleting a status", %{user: user, activity: activity} do
|
||||||
[user: user, activity: activity]
|
[user: user, activity: activity]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "marks notifications as read after mute" do
|
||||||
|
author = insert(:user)
|
||||||
|
activity = insert(:note_activity, user: author)
|
||||||
|
|
||||||
|
friend1 = insert(:user)
|
||||||
|
friend2 = insert(:user)
|
||||||
|
|
||||||
|
{:ok, reply_activity} =
|
||||||
|
CommonAPI.post(
|
||||||
|
friend2,
|
||||||
|
%{
|
||||||
|
status: "@#{author.nickname} @#{friend1.nickname} test reply",
|
||||||
|
in_reply_to_status_id: activity.id
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
{:ok, favorite_activity} = CommonAPI.favorite(friend2, activity.id)
|
||||||
|
{:ok, repeat_activity} = CommonAPI.repeat(activity.id, friend1)
|
||||||
|
|
||||||
|
assert Repo.aggregate(
|
||||||
|
from(n in Notification, where: n.seen == false and n.user_id == ^friend1.id),
|
||||||
|
:count
|
||||||
|
) == 1
|
||||||
|
|
||||||
|
unread_notifications =
|
||||||
|
Repo.all(from(n in Notification, where: n.seen == false, where: n.user_id == ^author.id))
|
||||||
|
|
||||||
|
assert Enum.any?(unread_notifications, fn n ->
|
||||||
|
n.type == "favourite" && n.activity_id == favorite_activity.id
|
||||||
|
end)
|
||||||
|
|
||||||
|
assert Enum.any?(unread_notifications, fn n ->
|
||||||
|
n.type == "reblog" && n.activity_id == repeat_activity.id
|
||||||
|
end)
|
||||||
|
|
||||||
|
assert Enum.any?(unread_notifications, fn n ->
|
||||||
|
n.type == "mention" && n.activity_id == reply_activity.id
|
||||||
|
end)
|
||||||
|
|
||||||
|
{:ok, _} = CommonAPI.add_mute(author, activity)
|
||||||
|
assert CommonAPI.thread_muted?(author, activity)
|
||||||
|
|
||||||
|
assert Repo.aggregate(
|
||||||
|
from(n in Notification, where: n.seen == false and n.user_id == ^friend1.id),
|
||||||
|
:count
|
||||||
|
) == 1
|
||||||
|
|
||||||
|
read_notifications =
|
||||||
|
Repo.all(from(n in Notification, where: n.seen == true, where: n.user_id == ^author.id))
|
||||||
|
|
||||||
|
assert Enum.any?(read_notifications, fn n ->
|
||||||
|
n.type == "favourite" && n.activity_id == favorite_activity.id
|
||||||
|
end)
|
||||||
|
|
||||||
|
assert Enum.any?(read_notifications, fn n ->
|
||||||
|
n.type == "reblog" && n.activity_id == repeat_activity.id
|
||||||
|
end)
|
||||||
|
|
||||||
|
assert Enum.any?(read_notifications, fn n ->
|
||||||
|
n.type == "mention" && n.activity_id == reply_activity.id
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
test "add mute", %{user: user, activity: activity} do
|
test "add mute", %{user: user, activity: activity} do
|
||||||
{:ok, _} = CommonAPI.add_mute(user, activity)
|
{:ok, _} = CommonAPI.add_mute(user, activity)
|
||||||
assert CommonAPI.thread_muted?(user, activity)
|
assert CommonAPI.thread_muted?(user, activity)
|
||||||
|
|
Loading…
Reference in a new issue