forked from AkkomaGang/akkoma
ActivityPub: Remove react_with_emoji
.
This commit is contained in:
parent
ad771546d8
commit
db55dc9445
11 changed files with 23 additions and 110 deletions
|
@ -349,30 +349,6 @@ def update(%{to: to, cc: cc, actor: actor, object: object} = params) do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec react_with_emoji(User.t(), Object.t(), String.t(), keyword()) ::
|
|
||||||
{:ok, Activity.t(), Object.t()} | {:error, any()}
|
|
||||||
def react_with_emoji(user, object, emoji, options \\ []) do
|
|
||||||
with {:ok, result} <-
|
|
||||||
Repo.transaction(fn -> do_react_with_emoji(user, object, emoji, options) end) do
|
|
||||||
result
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
defp do_react_with_emoji(user, object, emoji, options) do
|
|
||||||
with local <- Keyword.get(options, :local, true),
|
|
||||||
activity_id <- Keyword.get(options, :activity_id, nil),
|
|
||||||
true <- Pleroma.Emoji.is_unicode_emoji?(emoji),
|
|
||||||
reaction_data <- make_emoji_reaction_data(user, object, emoji, activity_id),
|
|
||||||
{:ok, activity} <- insert(reaction_data, local),
|
|
||||||
{:ok, object} <- add_emoji_reaction_to_object(activity, object),
|
|
||||||
:ok <- maybe_federate(activity) do
|
|
||||||
{:ok, activity, object}
|
|
||||||
else
|
|
||||||
false -> {:error, false}
|
|
||||||
{:error, error} -> Repo.rollback(error)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
@spec unreact_with_emoji(User.t(), String.t(), keyword()) ::
|
@spec unreact_with_emoji(User.t(), String.t(), keyword()) ::
|
||||||
{:ok, Activity.t(), Object.t()} | {:error, any()}
|
{:ok, Activity.t(), Object.t()} | {:error, any()}
|
||||||
def unreact_with_emoji(user, reaction_id, options \\ []) do
|
def unreact_with_emoji(user, reaction_id, options \\ []) do
|
||||||
|
|
|
@ -11,8 +11,8 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do
|
||||||
|
|
||||||
alias Pleroma.Object
|
alias Pleroma.Object
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
alias Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator
|
|
||||||
alias Pleroma.Web.ActivityPub.ObjectValidators.EmojiReactValidator
|
alias Pleroma.Web.ActivityPub.ObjectValidators.EmojiReactValidator
|
||||||
|
alias Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator
|
||||||
|
|
||||||
@spec validate(map(), keyword()) :: {:ok, map(), keyword()} | {:error, any()}
|
@spec validate(map(), keyword()) :: {:ok, map(), keyword()} | {:error, any()}
|
||||||
def validate(object, meta)
|
def validate(object, meta)
|
||||||
|
|
|
@ -177,8 +177,10 @@ def unfavorite(id, user) do
|
||||||
|
|
||||||
def react_with_emoji(id, user, emoji) do
|
def react_with_emoji(id, user, emoji) do
|
||||||
with %Activity{} = activity <- Activity.get_by_id(id),
|
with %Activity{} = activity <- Activity.get_by_id(id),
|
||||||
object <- Object.normalize(activity) do
|
object <- Object.normalize(activity),
|
||||||
ActivityPub.react_with_emoji(user, object, emoji)
|
{:ok, emoji_react, _} <- Builder.emoji_react(user, object, emoji),
|
||||||
|
{:ok, activity, _} <- Pipeline.common_pipeline(emoji_react, local: true) do
|
||||||
|
{:ok, activity}
|
||||||
else
|
else
|
||||||
_ ->
|
_ ->
|
||||||
{:error, dgettext("errors", "Could not add reaction emoji")}
|
{:error, dgettext("errors", "Could not add reaction emoji")}
|
||||||
|
|
|
@ -86,7 +86,7 @@ def emoji_reactions_by(%{assigns: %{user: user}} = conn, %{"id" => activity_id}
|
||||||
end
|
end
|
||||||
|
|
||||||
def react_with_emoji(%{assigns: %{user: user}} = conn, %{"id" => activity_id, "emoji" => emoji}) do
|
def react_with_emoji(%{assigns: %{user: user}} = conn, %{"id" => activity_id, "emoji" => emoji}) do
|
||||||
with {:ok, _activity, _object} <- CommonAPI.react_with_emoji(activity_id, user, emoji),
|
with {:ok, _activity} <- CommonAPI.react_with_emoji(activity_id, user, emoji),
|
||||||
activity <- Activity.get_by_id(activity_id) do
|
activity <- Activity.get_by_id(activity_id) do
|
||||||
conn
|
conn
|
||||||
|> put_view(StatusView)
|
|> put_view(StatusView)
|
||||||
|
|
|
@ -24,7 +24,7 @@ test "creates a notification for an emoji reaction" do
|
||||||
other_user = insert(:user)
|
other_user = insert(:user)
|
||||||
|
|
||||||
{:ok, activity} = CommonAPI.post(user, %{"status" => "yeah"})
|
{:ok, activity} = CommonAPI.post(user, %{"status" => "yeah"})
|
||||||
{:ok, activity, _object} = CommonAPI.react_with_emoji(activity.id, other_user, "☕")
|
{:ok, activity} = CommonAPI.react_with_emoji(activity.id, other_user, "☕")
|
||||||
|
|
||||||
{:ok, [notification]} = Notification.create_notifications(activity)
|
{:ok, [notification]} = Notification.create_notifications(activity)
|
||||||
|
|
||||||
|
|
|
@ -874,71 +874,6 @@ test "returns reblogs for users for whom reblogs have not been muted" do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "react to an object" do
|
|
||||||
test_with_mock "sends an activity to federation", Federator, [:passthrough], [] do
|
|
||||||
Config.put([:instance, :federating], true)
|
|
||||||
user = insert(:user)
|
|
||||||
reactor = insert(:user)
|
|
||||||
{:ok, activity} = CommonAPI.post(user, %{"status" => "YASSSS queen slay"})
|
|
||||||
assert object = Object.normalize(activity)
|
|
||||||
|
|
||||||
{:ok, reaction_activity, _object} = ActivityPub.react_with_emoji(reactor, object, "🔥")
|
|
||||||
|
|
||||||
assert called(Federator.publish(reaction_activity))
|
|
||||||
end
|
|
||||||
|
|
||||||
test "adds an emoji reaction activity to the db" do
|
|
||||||
user = insert(:user)
|
|
||||||
reactor = insert(:user)
|
|
||||||
third_user = insert(:user)
|
|
||||||
fourth_user = insert(:user)
|
|
||||||
{:ok, activity} = CommonAPI.post(user, %{"status" => "YASSSS queen slay"})
|
|
||||||
assert object = Object.normalize(activity)
|
|
||||||
|
|
||||||
{:ok, reaction_activity, object} = ActivityPub.react_with_emoji(reactor, object, "🔥")
|
|
||||||
|
|
||||||
assert reaction_activity
|
|
||||||
|
|
||||||
assert reaction_activity.data["actor"] == reactor.ap_id
|
|
||||||
assert reaction_activity.data["type"] == "EmojiReact"
|
|
||||||
assert reaction_activity.data["content"] == "🔥"
|
|
||||||
assert reaction_activity.data["object"] == object.data["id"]
|
|
||||||
assert reaction_activity.data["to"] == [User.ap_followers(reactor), activity.data["actor"]]
|
|
||||||
assert reaction_activity.data["context"] == object.data["context"]
|
|
||||||
assert object.data["reaction_count"] == 1
|
|
||||||
assert object.data["reactions"] == [["🔥", [reactor.ap_id]]]
|
|
||||||
|
|
||||||
{:ok, _reaction_activity, object} = ActivityPub.react_with_emoji(third_user, object, "☕")
|
|
||||||
|
|
||||||
assert object.data["reaction_count"] == 2
|
|
||||||
assert object.data["reactions"] == [["🔥", [reactor.ap_id]], ["☕", [third_user.ap_id]]]
|
|
||||||
|
|
||||||
{:ok, _reaction_activity, object} = ActivityPub.react_with_emoji(fourth_user, object, "🔥")
|
|
||||||
|
|
||||||
assert object.data["reaction_count"] == 3
|
|
||||||
|
|
||||||
assert object.data["reactions"] == [
|
|
||||||
["🔥", [fourth_user.ap_id, reactor.ap_id]],
|
|
||||||
["☕", [third_user.ap_id]]
|
|
||||||
]
|
|
||||||
end
|
|
||||||
|
|
||||||
test "reverts emoji reaction on error" do
|
|
||||||
[user, reactor] = insert_list(2, :user)
|
|
||||||
|
|
||||||
{:ok, activity} = CommonAPI.post(user, %{"status" => "Status"})
|
|
||||||
object = Object.normalize(activity)
|
|
||||||
|
|
||||||
with_mock(Utils, [:passthrough], maybe_federate: fn _ -> {:error, :reverted} end) do
|
|
||||||
assert {:error, :reverted} = ActivityPub.react_with_emoji(reactor, object, "😀")
|
|
||||||
end
|
|
||||||
|
|
||||||
object = Object.get_by_ap_id(object.data["id"])
|
|
||||||
refute object.data["reaction_count"]
|
|
||||||
refute object.data["reactions"]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe "unreacting to an object" do
|
describe "unreacting to an object" 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)
|
||||||
|
@ -947,7 +882,7 @@ test "reverts emoji reaction on error" do
|
||||||
{:ok, activity} = CommonAPI.post(user, %{"status" => "YASSSS queen slay"})
|
{:ok, activity} = CommonAPI.post(user, %{"status" => "YASSSS queen slay"})
|
||||||
assert object = Object.normalize(activity)
|
assert object = Object.normalize(activity)
|
||||||
|
|
||||||
{:ok, reaction_activity, _object} = ActivityPub.react_with_emoji(reactor, object, "🔥")
|
{:ok, reaction_activity} = CommonAPI.react_with_emoji(activity.id, reactor, "🔥")
|
||||||
|
|
||||||
assert called(Federator.publish(reaction_activity))
|
assert called(Federator.publish(reaction_activity))
|
||||||
|
|
||||||
|
@ -963,7 +898,7 @@ test "adds an undo activity to the db" do
|
||||||
{:ok, activity} = CommonAPI.post(user, %{"status" => "YASSSS queen slay"})
|
{:ok, activity} = CommonAPI.post(user, %{"status" => "YASSSS queen slay"})
|
||||||
assert object = Object.normalize(activity)
|
assert object = Object.normalize(activity)
|
||||||
|
|
||||||
{:ok, reaction_activity, _object} = ActivityPub.react_with_emoji(reactor, object, "🔥")
|
{:ok, reaction_activity} = CommonAPI.react_with_emoji(activity.id, reactor, "🔥")
|
||||||
|
|
||||||
{:ok, unreaction_activity, _object} =
|
{:ok, unreaction_activity, _object} =
|
||||||
ActivityPub.unreact_with_emoji(reactor, reaction_activity.data["id"])
|
ActivityPub.unreact_with_emoji(reactor, reaction_activity.data["id"])
|
||||||
|
@ -981,7 +916,7 @@ test "reverts emoji unreact on error" do
|
||||||
{:ok, activity} = CommonAPI.post(user, %{"status" => "Status"})
|
{:ok, activity} = CommonAPI.post(user, %{"status" => "Status"})
|
||||||
object = Object.normalize(activity)
|
object = Object.normalize(activity)
|
||||||
|
|
||||||
{:ok, reaction_activity, _object} = ActivityPub.react_with_emoji(reactor, object, "😀")
|
{:ok, reaction_activity} = CommonAPI.react_with_emoji(activity.id, reactor, "😀")
|
||||||
|
|
||||||
with_mock(Utils, [:passthrough], maybe_federate: fn _ -> {:error, :reverted} end) do
|
with_mock(Utils, [:passthrough], maybe_federate: fn _ -> {:error, :reverted} end) do
|
||||||
assert {:error, :reverted} =
|
assert {:error, :reverted} =
|
||||||
|
|
|
@ -329,7 +329,7 @@ test "it works for incoming emoji reaction undos" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
||||||
{:ok, activity} = CommonAPI.post(user, %{"status" => "hello"})
|
{:ok, activity} = CommonAPI.post(user, %{"status" => "hello"})
|
||||||
{:ok, reaction_activity, _object} = CommonAPI.react_with_emoji(activity.id, user, "👌")
|
{:ok, reaction_activity} = CommonAPI.react_with_emoji(activity.id, user, "👌")
|
||||||
|
|
||||||
data =
|
data =
|
||||||
File.read!("test/fixtures/mastodon-undo-like.json")
|
File.read!("test/fixtures/mastodon-undo-like.json")
|
||||||
|
@ -562,7 +562,7 @@ test "it strips internal likes" do
|
||||||
test "it strips internal reactions" do
|
test "it strips internal reactions" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
{:ok, activity} = CommonAPI.post(user, %{"status" => "#cofe"})
|
{:ok, activity} = CommonAPI.post(user, %{"status" => "#cofe"})
|
||||||
{:ok, _, _} = CommonAPI.react_with_emoji(activity.id, user, "📢")
|
{:ok, _} = CommonAPI.react_with_emoji(activity.id, user, "📢")
|
||||||
|
|
||||||
%{object: object} = Activity.get_by_id_with_object(activity.id)
|
%{object: object} = Activity.get_by_id_with_object(activity.id)
|
||||||
assert Map.has_key?(object.data, "reactions")
|
assert Map.has_key?(object.data, "reactions")
|
||||||
|
|
|
@ -278,7 +278,7 @@ test "reacting to a status with an emoji" do
|
||||||
|
|
||||||
{:ok, activity} = CommonAPI.post(other_user, %{"status" => "cofe"})
|
{:ok, activity} = CommonAPI.post(other_user, %{"status" => "cofe"})
|
||||||
|
|
||||||
{:ok, reaction, _} = CommonAPI.react_with_emoji(activity.id, user, "👍")
|
{:ok, reaction} = CommonAPI.react_with_emoji(activity.id, user, "👍")
|
||||||
|
|
||||||
assert reaction.data["actor"] == user.ap_id
|
assert reaction.data["actor"] == user.ap_id
|
||||||
assert reaction.data["content"] == "👍"
|
assert reaction.data["content"] == "👍"
|
||||||
|
@ -293,7 +293,7 @@ test "unreacting to a status with an emoji" do
|
||||||
other_user = insert(:user)
|
other_user = insert(:user)
|
||||||
|
|
||||||
{:ok, activity} = CommonAPI.post(other_user, %{"status" => "cofe"})
|
{:ok, activity} = CommonAPI.post(other_user, %{"status" => "cofe"})
|
||||||
{:ok, reaction, _} = CommonAPI.react_with_emoji(activity.id, user, "👍")
|
{:ok, reaction} = CommonAPI.react_with_emoji(activity.id, user, "👍")
|
||||||
|
|
||||||
{:ok, unreaction, _} = CommonAPI.unreact_with_emoji(activity.id, user, "👍")
|
{:ok, unreaction, _} = CommonAPI.unreact_with_emoji(activity.id, user, "👍")
|
||||||
|
|
||||||
|
|
|
@ -156,7 +156,7 @@ test "EmojiReact notification" do
|
||||||
other_user = insert(:user)
|
other_user = insert(:user)
|
||||||
|
|
||||||
{:ok, activity} = CommonAPI.post(user, %{"status" => "#cofe"})
|
{:ok, activity} = CommonAPI.post(user, %{"status" => "#cofe"})
|
||||||
{:ok, _activity, _} = CommonAPI.react_with_emoji(activity.id, other_user, "☕")
|
{:ok, _activity} = CommonAPI.react_with_emoji(activity.id, other_user, "☕")
|
||||||
|
|
||||||
activity = Repo.get(Activity, activity.id)
|
activity = Repo.get(Activity, activity.id)
|
||||||
|
|
||||||
|
|
|
@ -32,9 +32,9 @@ test "has an emoji reaction list" do
|
||||||
third_user = insert(:user)
|
third_user = insert(:user)
|
||||||
{:ok, activity} = CommonAPI.post(user, %{"status" => "dae cofe??"})
|
{:ok, activity} = CommonAPI.post(user, %{"status" => "dae cofe??"})
|
||||||
|
|
||||||
{:ok, _, _} = CommonAPI.react_with_emoji(activity.id, user, "☕")
|
{:ok, _} = CommonAPI.react_with_emoji(activity.id, user, "☕")
|
||||||
{:ok, _, _} = CommonAPI.react_with_emoji(activity.id, third_user, "🍵")
|
{:ok, _} = CommonAPI.react_with_emoji(activity.id, third_user, "🍵")
|
||||||
{:ok, _, _} = CommonAPI.react_with_emoji(activity.id, other_user, "☕")
|
{:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "☕")
|
||||||
activity = Repo.get(Activity, activity.id)
|
activity = Repo.get(Activity, activity.id)
|
||||||
status = StatusView.render("show.json", activity: activity)
|
status = StatusView.render("show.json", activity: activity)
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ test "DELETE /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do
|
||||||
other_user = insert(:user)
|
other_user = insert(:user)
|
||||||
|
|
||||||
{:ok, activity} = CommonAPI.post(user, %{"status" => "#cofe"})
|
{:ok, activity} = CommonAPI.post(user, %{"status" => "#cofe"})
|
||||||
{:ok, activity, _object} = CommonAPI.react_with_emoji(activity.id, other_user, "☕")
|
{:ok, activity} = CommonAPI.react_with_emoji(activity.id, other_user, "☕")
|
||||||
|
|
||||||
result =
|
result =
|
||||||
conn
|
conn
|
||||||
|
@ -71,8 +71,8 @@ test "GET /api/v1/pleroma/statuses/:id/reactions", %{conn: conn} do
|
||||||
|
|
||||||
assert result == []
|
assert result == []
|
||||||
|
|
||||||
{:ok, _, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅")
|
{:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅")
|
||||||
{:ok, _, _} = CommonAPI.react_with_emoji(activity.id, doomed_user, "🎅")
|
{:ok, _} = CommonAPI.react_with_emoji(activity.id, doomed_user, "🎅")
|
||||||
|
|
||||||
User.perform(:delete, doomed_user)
|
User.perform(:delete, doomed_user)
|
||||||
|
|
||||||
|
@ -109,8 +109,8 @@ test "GET /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do
|
||||||
|
|
||||||
assert result == []
|
assert result == []
|
||||||
|
|
||||||
{:ok, _, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅")
|
{:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅")
|
||||||
{:ok, _, _} = CommonAPI.react_with_emoji(activity.id, other_user, "☕")
|
{:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "☕")
|
||||||
|
|
||||||
result =
|
result =
|
||||||
conn
|
conn
|
||||||
|
|
Loading…
Reference in a new issue