forked from AkkomaGang/akkoma
ActivityPub: Save emoji reactions in object.
This commit is contained in:
parent
b770ed1d99
commit
9bc12b88b3
3 changed files with 30 additions and 4 deletions
|
@ -317,7 +317,8 @@ def react_with_emoji(user, object, emoji, options \\ []) do
|
|||
activity_id <- Keyword.get(options, :activity_id, nil),
|
||||
is_emoji?(emoji),
|
||||
reaction_data <- make_emoji_reaction_data(user, object, emoji, activity_id),
|
||||
{:ok, activity} <- insert(reaction_data, local) do
|
||||
{:ok, activity} <- insert(reaction_data, local),
|
||||
{:ok, object} <- add_emoji_reaction_to_object(activity, object) do
|
||||
{:ok, activity, object}
|
||||
end
|
||||
end
|
||||
|
|
|
@ -321,10 +321,21 @@ def make_like_data(
|
|||
@spec update_element_in_object(String.t(), list(any), Object.t()) ::
|
||||
{:ok, Object.t()} | {:error, Ecto.Changeset.t()}
|
||||
def update_element_in_object(property, element, object) do
|
||||
length =
|
||||
if is_map(element) do
|
||||
element
|
||||
|> Map.values()
|
||||
|> List.flatten()
|
||||
|> length()
|
||||
else
|
||||
element
|
||||
|> length()
|
||||
end
|
||||
|
||||
data =
|
||||
Map.merge(
|
||||
object.data,
|
||||
%{"#{property}_count" => length(element), "#{property}s" => element}
|
||||
%{"#{property}_count" => length, "#{property}s" => element}
|
||||
)
|
||||
|
||||
object
|
||||
|
@ -332,6 +343,20 @@ def update_element_in_object(property, element, object) do
|
|||
|> Object.update_and_set_cache()
|
||||
end
|
||||
|
||||
@spec add_emoji_reaction_to_object(Activity.t(), Object.t()) ::
|
||||
{:ok, Object.t()} | {:error, Ecto.Changeset.t()}
|
||||
|
||||
def add_emoji_reaction_to_object(
|
||||
%Activity{data: %{"content" => emoji, "actor" => actor}},
|
||||
object
|
||||
) do
|
||||
reactions = object.data["reactions"] || %{}
|
||||
emoji_actors = reactions[emoji] || []
|
||||
new_emoji_actors = [actor | emoji_actors] |> Enum.uniq()
|
||||
new_reactions = Map.put(reactions, emoji, new_emoji_actors)
|
||||
update_element_in_object("reaction", new_reactions, object)
|
||||
end
|
||||
|
||||
@spec add_like_to_object(Activity.t(), Object.t()) ::
|
||||
{:ok, Object.t()} | {:error, Ecto.Changeset.t()}
|
||||
def add_like_to_object(%Activity{data: %{"actor" => actor}}, object) do
|
||||
|
|
|
@ -694,8 +694,8 @@ test "adds an emoji reaction activity to the db" do
|
|||
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"] == [user.ap_id]
|
||||
assert object.data["reaction_count"] == 1
|
||||
assert object.data["reactions"]["🔥"] == [reactor.ap_id]
|
||||
end
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in a new issue