ActivitPub: Remove like
function.
We don't need another way to build likes.
This commit is contained in:
parent
1b5f8d19ee
commit
bbf8554c97
@ -398,36 +398,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: This is weird, maybe we shouldn't check here if we can make the activity.
|
|
||||||
@spec like(User.t(), Object.t(), String.t() | nil, boolean()) ::
|
|
||||||
{:ok, Activity.t(), Object.t()} | {:error, any()}
|
|
||||||
def like(user, object, activity_id \\ nil, local \\ true) do
|
|
||||||
with {:ok, result} <- Repo.transaction(fn -> do_like(user, object, activity_id, local) end) do
|
|
||||||
result
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
defp do_like(
|
|
||||||
%User{ap_id: ap_id} = user,
|
|
||||||
%Object{data: %{"id" => _}} = object,
|
|
||||||
activity_id,
|
|
||||||
local
|
|
||||||
) do
|
|
||||||
with nil <- get_existing_like(ap_id, object),
|
|
||||||
like_data <- make_like_data(user, object, activity_id),
|
|
||||||
{:ok, activity} <- insert(like_data, local),
|
|
||||||
{:ok, object} <- add_like_to_object(activity, object),
|
|
||||||
:ok <- maybe_federate(activity) do
|
|
||||||
{:ok, activity, object}
|
|
||||||
else
|
|
||||||
%Activity{} = activity ->
|
|
||||||
{:ok, activity, object}
|
|
||||||
|
|
||||||
{:error, error} ->
|
|
||||||
Repo.rollback(error)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
@spec unlike(User.t(), Object.t(), String.t() | nil, boolean()) ::
|
@spec unlike(User.t(), Object.t(), String.t() | nil, boolean()) ::
|
||||||
{:ok, Activity.t(), Activity.t(), Object.t()} | {:ok, Object.t()} | {:error, any()}
|
{:ok, Activity.t(), Activity.t(), Object.t()} | {:ok, Object.t()} | {:error, any()}
|
||||||
def unlike(%User{} = actor, %Object{} = object, activity_id \\ nil, local \\ true) do
|
def unlike(%User{} = actor, %Object{} = object, activity_id \\ nil, local \\ true) do
|
||||||
|
@ -12,6 +12,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do
|
|||||||
alias Pleroma.Plugs.EnsureAuthenticatedPlug
|
alias Pleroma.Plugs.EnsureAuthenticatedPlug
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
alias Pleroma.Web.ActivityPub.ActivityPub
|
alias Pleroma.Web.ActivityPub.ActivityPub
|
||||||
|
alias Pleroma.Web.ActivityPub.Builder
|
||||||
|
alias Pleroma.Web.ActivityPub.Pipeline
|
||||||
alias Pleroma.Web.ActivityPub.InternalFetchActor
|
alias Pleroma.Web.ActivityPub.InternalFetchActor
|
||||||
alias Pleroma.Web.ActivityPub.ObjectView
|
alias Pleroma.Web.ActivityPub.ObjectView
|
||||||
alias Pleroma.Web.ActivityPub.Relay
|
alias Pleroma.Web.ActivityPub.Relay
|
||||||
@ -421,7 +423,10 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do
|
|||||||
|
|
||||||
defp handle_user_activity(%User{} = user, %{"type" => "Like"} = params) do
|
defp handle_user_activity(%User{} = user, %{"type" => "Like"} = params) do
|
||||||
with %Object{} = object <- Object.normalize(params["object"]),
|
with %Object{} = object <- Object.normalize(params["object"]),
|
||||||
{:ok, activity, _object} <- ActivityPub.like(user, object) do
|
{_, {:ok, like_object, meta}} <- {:build_object, Builder.like(user, object)},
|
||||||
|
{_, {:ok, %Activity{} = activity, _meta}} <-
|
||||||
|
{:common_pipeline,
|
||||||
|
Pipeline.common_pipeline(like_object, Keyword.put(meta, :local, true))} do
|
||||||
{:ok, activity}
|
{:ok, activity}
|
||||||
else
|
else
|
||||||
_ -> {:error, dgettext("errors", "Can't like object")}
|
_ -> {:error, dgettext("errors", "Can't like object")}
|
||||||
|
@ -994,72 +994,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "like an object" do
|
|
||||||
test_with_mock "sends an activity to federation", Federator, [:passthrough], [] do
|
|
||||||
Config.put([:instance, :federating], true)
|
|
||||||
note_activity = insert(:note_activity)
|
|
||||||
assert object_activity = Object.normalize(note_activity)
|
|
||||||
|
|
||||||
user = insert(:user)
|
|
||||||
|
|
||||||
{:ok, like_activity, _object} = ActivityPub.like(user, object_activity)
|
|
||||||
assert called(Federator.publish(like_activity))
|
|
||||||
end
|
|
||||||
|
|
||||||
test "returns exist activity if object already liked" do
|
|
||||||
note_activity = insert(:note_activity)
|
|
||||||
assert object_activity = Object.normalize(note_activity)
|
|
||||||
|
|
||||||
user = insert(:user)
|
|
||||||
|
|
||||||
{:ok, like_activity, _object} = ActivityPub.like(user, object_activity)
|
|
||||||
|
|
||||||
{:ok, like_activity_exist, _object} = ActivityPub.like(user, object_activity)
|
|
||||||
assert like_activity == like_activity_exist
|
|
||||||
end
|
|
||||||
|
|
||||||
test "reverts like activity on error" do
|
|
||||||
note_activity = insert(:note_activity)
|
|
||||||
object = Object.normalize(note_activity)
|
|
||||||
user = insert(:user)
|
|
||||||
|
|
||||||
with_mock(Utils, [:passthrough], maybe_federate: fn _ -> {:error, :reverted} end) do
|
|
||||||
assert {:error, :reverted} = ActivityPub.like(user, object)
|
|
||||||
end
|
|
||||||
|
|
||||||
assert Repo.aggregate(Activity, :count, :id) == 1
|
|
||||||
assert Repo.get(Object, object.id) == object
|
|
||||||
end
|
|
||||||
|
|
||||||
test "adds a like activity to the db" do
|
|
||||||
note_activity = insert(:note_activity)
|
|
||||||
assert object = Object.normalize(note_activity)
|
|
||||||
|
|
||||||
user = insert(:user)
|
|
||||||
user_two = insert(:user)
|
|
||||||
|
|
||||||
{:ok, like_activity, object} = ActivityPub.like(user, object)
|
|
||||||
|
|
||||||
assert like_activity.data["actor"] == user.ap_id
|
|
||||||
assert like_activity.data["type"] == "Like"
|
|
||||||
assert like_activity.data["object"] == object.data["id"]
|
|
||||||
assert like_activity.data["to"] == [User.ap_followers(user), note_activity.data["actor"]]
|
|
||||||
assert like_activity.data["context"] == object.data["context"]
|
|
||||||
assert object.data["like_count"] == 1
|
|
||||||
assert object.data["likes"] == [user.ap_id]
|
|
||||||
|
|
||||||
# Just return the original activity if the user already liked it.
|
|
||||||
{:ok, same_like_activity, object} = ActivityPub.like(user, object)
|
|
||||||
|
|
||||||
assert like_activity == same_like_activity
|
|
||||||
assert object.data["likes"] == [user.ap_id]
|
|
||||||
assert object.data["like_count"] == 1
|
|
||||||
|
|
||||||
{:ok, _like_activity, object} = ActivityPub.like(user_two, object)
|
|
||||||
assert object.data["like_count"] == 2
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe "unliking" do
|
describe "unliking" do
|
||||||
test_with_mock "sends an activity to federation", Federator, [:passthrough], [] do
|
test_with_mock "sends an activity to federation", Federator, [:passthrough], [] do
|
||||||
Config.put([:instance, :federating], true)
|
Config.put([:instance, :federating], true)
|
||||||
@ -1071,7 +1005,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
|
|||||||
{:ok, object} = ActivityPub.unlike(user, object)
|
{:ok, object} = ActivityPub.unlike(user, object)
|
||||||
refute called(Federator.publish())
|
refute called(Federator.publish())
|
||||||
|
|
||||||
{:ok, _like_activity, object} = ActivityPub.like(user, object)
|
{:ok, _like_activity} = CommonAPI.favorite(user, note_activity.id)
|
||||||
|
object = Object.get_by_id(object.id)
|
||||||
assert object.data["like_count"] == 1
|
assert object.data["like_count"] == 1
|
||||||
|
|
||||||
{:ok, unlike_activity, _, object} = ActivityPub.unlike(user, object)
|
{:ok, unlike_activity, _, object} = ActivityPub.unlike(user, object)
|
||||||
@ -1082,10 +1017,10 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
|
|||||||
|
|
||||||
test "reverts unliking on error" do
|
test "reverts unliking on error" do
|
||||||
note_activity = insert(:note_activity)
|
note_activity = insert(:note_activity)
|
||||||
object = Object.normalize(note_activity)
|
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
||||||
{:ok, like_activity, object} = ActivityPub.like(user, object)
|
{:ok, like_activity} = CommonAPI.favorite(user, note_activity.id)
|
||||||
|
object = Object.normalize(note_activity)
|
||||||
assert object.data["like_count"] == 1
|
assert object.data["like_count"] == 1
|
||||||
|
|
||||||
with_mock(Utils, [:passthrough], maybe_federate: fn _ -> {:error, :reverted} end) do
|
with_mock(Utils, [:passthrough], maybe_federate: fn _ -> {:error, :reverted} end) do
|
||||||
@ -1106,7 +1041,9 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
|
|||||||
{:ok, object} = ActivityPub.unlike(user, object)
|
{:ok, object} = ActivityPub.unlike(user, object)
|
||||||
assert object.data["like_count"] == 0
|
assert object.data["like_count"] == 0
|
||||||
|
|
||||||
{:ok, like_activity, object} = ActivityPub.like(user, object)
|
{:ok, like_activity} = CommonAPI.favorite(user, note_activity.id)
|
||||||
|
|
||||||
|
object = Object.get_by_id(object.id)
|
||||||
assert object.data["like_count"] == 1
|
assert object.data["like_count"] == 1
|
||||||
|
|
||||||
{:ok, unlike_activity, _, object} = ActivityPub.unlike(user, object)
|
{:ok, unlike_activity, _, object} = ActivityPub.unlike(user, object)
|
||||||
|
@ -224,8 +224,7 @@ defmodule Pleroma.Web.ActivityPub.UtilsTest do
|
|||||||
|
|
||||||
object = Object.normalize(activity)
|
object = Object.normalize(activity)
|
||||||
{:ok, [vote], object} = CommonAPI.vote(other_user, object, [0])
|
{:ok, [vote], object} = CommonAPI.vote(other_user, object, [0])
|
||||||
vote_object = Object.normalize(vote)
|
{:ok, _activity} = CommonAPI.favorite(user, activity.id)
|
||||||
{:ok, _activity, _object} = ActivityPub.like(user, vote_object)
|
|
||||||
[fetched_vote] = Utils.get_existing_votes(other_user.ap_id, object)
|
[fetched_vote] = Utils.get_existing_votes(other_user.ap_id, object)
|
||||||
assert fetched_vote.id == vote.id
|
assert fetched_vote.id == vote.id
|
||||||
end
|
end
|
||||||
@ -346,7 +345,7 @@ defmodule Pleroma.Web.ActivityPub.UtilsTest do
|
|||||||
|
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
refute Utils.get_existing_like(user.ap_id, object)
|
refute Utils.get_existing_like(user.ap_id, object)
|
||||||
{:ok, like_activity, _object} = ActivityPub.like(user, object)
|
{:ok, like_activity} = CommonAPI.favorite(user, note_activity.id)
|
||||||
|
|
||||||
assert ^like_activity = Utils.get_existing_like(user.ap_id, object)
|
assert ^like_activity = Utils.get_existing_like(user.ap_id, object)
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user