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