Participation: Setting recipients will always add the owner.
authorlain <lain@soykaf.club>
Tue, 6 Aug 2019 12:51:17 +0000 (14:51 +0200)
committerlain <lain@soykaf.club>
Tue, 6 Aug 2019 12:51:17 +0000 (14:51 +0200)
docs/api/pleroma_api.md
lib/pleroma/conversation/participation.ex
test/conversation/participation_test.exs

index 4323e59f0e9db38459541f71b07675e121500212..590f2a3fb7e140c5a064e86d706d45ca8324297c 100644 (file)
@@ -346,5 +346,5 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa
 * Method `PATCH`
 * Authentication: required
 * Params:
-    * `recipients`: A list of ids of users that should receive posts to this conversation.
+    * `recipients`: A list of ids of users that should receive posts to this conversation. This will replace the current list of recipients, so submit the full list. The owner of owner of the conversation will always be part of the set of recipients, though.
 * Response: JSON, statuses (200 - healthy, 503 unhealthy)
index acdee55173617be544b9c3c16e60fad75d39af84..d17b6f7c5a045c63032cb8d118a1b0ffc1a21e88 100644 (file)
@@ -101,6 +101,10 @@ defmodule Pleroma.Conversation.Participation do
   end
 
   def set_recipients(participation, user_ids) do
+    user_ids =
+      [participation.user_id | user_ids]
+      |> Enum.uniq()
+
     Repo.transaction(fn ->
       query =
         from(r in RecipientShip,
@@ -118,5 +122,7 @@ defmodule Pleroma.Conversation.Participation do
       RecipientShip.create(users, participation)
       :ok
     end)
+
+    {:ok, Repo.preload(participation, :recipients, force: true)}
   end
 end
index 4a3c397bdc95c44046bcb9d1a84e21c845a70695..7958e8e89f498aa4cc3247ab02550970b7370a3f 100644 (file)
@@ -132,4 +132,23 @@ defmodule Pleroma.Conversation.ParticipationTest do
 
     [] = Participation.for_user_with_last_activity_id(user)
   end
+
+  test "it sets recipients, always keeping the owner of the participation even when not explicitly set" do
+    user = insert(:user)
+    other_user = insert(:user)
+
+    {:ok, _activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "direct"})
+    [participation] = Participation.for_user_with_last_activity_id(user)
+
+    participation = Repo.preload(participation, :recipients)
+
+    assert participation.recipients |> length() == 1
+    assert user in participation.recipients
+
+    {:ok, participation} = Participation.set_recipients(participation, [other_user.id])
+
+    assert participation.recipients |> length() == 2
+    assert user in participation.recipients
+    assert other_user in participation.recipients
+  end
 end