removeing corresponding add activity

This commit is contained in:
Alexander Strizhakov 2021-03-09 11:57:20 +03:00
parent 5ae9b05600
commit 8857242c95
No known key found for this signature in database
GPG key ID: 022896A53AEF1381
4 changed files with 78 additions and 0 deletions

View file

@ -391,4 +391,13 @@ defmodule Pleroma.Activity do
end end
def get_by_object_ap_id_with_object(_), do: nil def get_by_object_ap_id_with_object(_), do: nil
@spec add_by_params_query(String.t(), String.t(), String.t()) :: Ecto.Query.t()
def add_by_params_query(object_id, actor, target) do
object_id
|> Queries.by_object_id()
|> Queries.by_type("Add")
|> Queries.by_actor(actor)
|> where([a], fragment("?->>'target' = ?", a.data, ^target))
end
end end

View file

@ -340,11 +340,16 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do
# Tasks this handles: # Tasks this handles:
# - removes pin from user # - removes pin from user
# - removes corresponding Add activity
# - if activity had expiration, recreates activity expiration job # - if activity had expiration, recreates activity expiration job
@impl true @impl true
def handle(%{data: %{"type" => "Remove"} = data} = object, meta) do def handle(%{data: %{"type" => "Remove"} = data} = object, meta) do
with %User{} = user <- User.get_cached_by_ap_id(data["actor"]), with %User{} = user <- User.get_cached_by_ap_id(data["actor"]),
{:ok, _user} <- User.remove_pinned_object_id(user, data["object"]) do {:ok, _user} <- User.remove_pinned_object_id(user, data["object"]) do
data["object"]
|> Activity.add_by_params_query(user.ap_id, user.featured_address)
|> Repo.delete_all()
# if pinned activity was scheduled for deletion, we reschedule it for deletion # if pinned activity was scheduled for deletion, we reschedule it for deletion
if meta[:expires_at] do if meta[:expires_at] do
# MRF.ActivityExpirationPolicy used UTC timestamps for expires_at in original implementation # MRF.ActivityExpirationPolicy used UTC timestamps for expires_at in original implementation

View file

@ -254,4 +254,26 @@ defmodule Pleroma.ActivityTest do
assert %{id: ^id} = Activity.get_by_object_ap_id_with_object(obj_id) assert %{id: ^id} = Activity.get_by_object_ap_id_with_object(obj_id)
end end
test "add_by_params_query/3" do
user = insert(:user)
note = insert(:note_activity, user: user)
insert(:add_activity, user: user, note: note)
insert(:add_activity, user: user, note: note)
insert(:add_activity, user: user)
assert Repo.aggregate(Activity, :count, :id) == 4
add_query =
Activity.add_by_params_query(note.data["object"], user.ap_id, user.featured_address)
assert Repo.aggregate(add_query, :count, :id) == 2
Repo.delete_all(add_query)
assert Repo.aggregate(add_query, :count, :id) == 0
assert Repo.aggregate(Activity, :count, :id) == 2
end
end end

View file

@ -4,6 +4,9 @@
defmodule Pleroma.Factory do defmodule Pleroma.Factory do
use ExMachina.Ecto, repo: Pleroma.Repo use ExMachina.Ecto, repo: Pleroma.Repo
require Pleroma.Constants
alias Pleroma.Object alias Pleroma.Object
alias Pleroma.User alias Pleroma.User
@ -225,6 +228,45 @@ defmodule Pleroma.Factory do
} }
end end
def add_activity_factory(attrs \\ %{}) do
featured_collection_activity(attrs, "Add")
end
def remove_activity_factor(attrs \\ %{}) do
featured_collection_activity(attrs, "Remove")
end
defp featured_collection_activity(attrs, type) do
user = attrs[:user] || insert(:user)
note = attrs[:note] || insert(:note, user: user)
data_attrs =
attrs
|> Map.get(:data_attrs, %{})
|> Map.put(:type, type)
attrs = Map.drop(attrs, [:user, :note, :data_attrs])
data =
%{
"id" => Pleroma.Web.ActivityPub.Utils.generate_activity_id(),
"target" => user.featured_address,
"object" => note.data["object"],
"actor" => note.data["actor"],
"type" => "Add",
"to" => [Pleroma.Constants.as_public()],
"cc" => [user.follower_address]
}
|> Map.merge(data_attrs)
%Pleroma.Activity{
data: data,
actor: data["actor"],
recipients: data["to"]
}
|> Map.merge(attrs)
end
def note_activity_factory(attrs \\ %{}) do def note_activity_factory(attrs \\ %{}) do
user = attrs[:user] || insert(:user) user = attrs[:user] || insert(:user)
note = attrs[:note] || insert(:note, user: user) note = attrs[:note] || insert(:note, user: user)