Add a view for the move notification

This commit is contained in:
Egor Kislitsyn 2019-11-26 18:48:56 +07:00
parent 3c0abfca53
commit 1fc28a4b44
No known key found for this signature in database
GPG key ID: 1B49CB15B71E7805
6 changed files with 77 additions and 25 deletions

View file

@ -92,6 +92,12 @@ Has these additional fields under the `pleroma` object:
- `is_seen`: true if the notification was read by the user - `is_seen`: true if the notification was read by the user
### Move Notification
The `type` value is `move`. Has an additional field:
- `target`: new account
## GET `/api/v1/notifications` ## GET `/api/v1/notifications`
Accepts additional parameters: Accepts additional parameters:

View file

@ -28,7 +28,8 @@ defmodule Pleroma.Activity do
"Create" => "mention", "Create" => "mention",
"Follow" => "follow", "Follow" => "follow",
"Announce" => "reblog", "Announce" => "reblog",
"Like" => "favourite" "Like" => "favourite",
"Move" => "move"
} }
@mastodon_to_ap_notification_types for {k, v} <- @mastodon_notification_types, @mastodon_to_ap_notification_types for {k, v} <- @mastodon_notification_types,

View file

@ -37,32 +37,24 @@ def render("show.json", %{
} }
case mastodon_type do case mastodon_type do
"mention" -> "mention" -> put_status(response, activity, user)
response "favourite" -> put_status(response, parent_activity, user)
|> Map.merge(%{ "reblog" -> put_status(response, parent_activity, user)
status: StatusView.render("show.json", %{activity: activity, for: user}) "move" -> put_target(response, activity, user)
}) "follow" -> response
_ -> nil
"favourite" ->
response
|> Map.merge(%{
status: StatusView.render("show.json", %{activity: parent_activity, for: user})
})
"reblog" ->
response
|> Map.merge(%{
status: StatusView.render("show.json", %{activity: parent_activity, for: user})
})
"follow" ->
response
_ ->
nil
end end
else else
_ -> nil _ -> nil
end end
end end
defp put_status(response, activity, user) do
Map.put(response, :status, StatusView.render("show.json", %{activity: activity, for: user}))
end
defp put_target(response, activity, user) do
target = User.get_cached_by_ap_id(activity.data["target"])
Map.put(response, :target, AccountView.render("show.json", %{user: target, for: user}))
end
end end

View file

@ -16,7 +16,7 @@ defmodule Pleroma.Web.Push.Impl do
require Logger require Logger
import Ecto.Query import Ecto.Query
@types ["Create", "Follow", "Announce", "Like"] @types ["Create", "Follow", "Announce", "Like", "Move"]
@doc "Performs sending notifications for user subscriptions" @doc "Performs sending notifications for user subscriptions"
@spec perform(Notification.t()) :: list(any) | :error @spec perform(Notification.t()) :: list(any) | :error

View file

@ -630,6 +630,35 @@ test "notifications are deleted if a remote user is deleted" do
assert Enum.empty?(Notification.for_user(local_user)) assert Enum.empty?(Notification.for_user(local_user))
end end
test "move activity generates a notification" do
%{ap_id: old_ap_id} = old_user = insert(:user)
%{ap_id: new_ap_id} = new_user = insert(:user, also_known_as: [old_ap_id])
follower = insert(:user)
other_follower = insert(:user, %{allow_following_move: false})
User.follow(follower, old_user)
User.follow(other_follower, old_user)
Pleroma.Web.ActivityPub.ActivityPub.move(old_user, new_user)
ObanHelpers.perform_all()
assert [
%{
activity: %{
data: %{"type" => "Move", "actor" => ^old_ap_id, "target" => ^new_ap_id}
}
}
] = Notification.for_user(follower)
assert [
%{
activity: %{
data: %{"type" => "Move", "actor" => ^old_ap_id, "target" => ^new_ap_id}
}
}
] = Notification.for_user(other_follower)
end
end end
describe "for_user" do describe "for_user" do

View file

@ -107,4 +107,28 @@ test "Follow notification" do
assert [] == assert [] ==
NotificationView.render("index.json", %{notifications: [notification], for: followed}) NotificationView.render("index.json", %{notifications: [notification], for: followed})
end end
test "Move notification" do
%{ap_id: old_ap_id} = old_user = insert(:user)
%{ap_id: _new_ap_id} = new_user = insert(:user, also_known_as: [old_ap_id])
follower = insert(:user)
User.follow(follower, old_user)
Pleroma.Web.ActivityPub.ActivityPub.move(old_user, new_user)
Pleroma.Tests.ObanHelpers.perform_all()
[notification] = Notification.for_user(follower)
expected = %{
id: to_string(notification.id),
pleroma: %{is_seen: false},
type: "move",
account: AccountView.render("show.json", %{user: old_user, for: follower}),
target: AccountView.render("show.json", %{user: new_user, for: follower}),
created_at: Utils.to_masto_date(notification.inserted_at)
}
assert [expected] ==
NotificationView.render("index.json", %{notifications: [notification], for: follower})
end
end end