aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorkaniini <ariadne@dereferenced.org>2019-11-07 15:13:20 +0000
committerkaniini <ariadne@dereferenced.org>2019-11-07 15:13:20 +0000
commit5bf59f8e66f0c341ee0e667c2d5d78f709f46af8 (patch)
tree31a82ba5fcdbde2e3f045b295764916e7c90ae5d /lib
parent9f9c3c4fbe4a2f95227bc4b32ea8961c4f699ecf (diff)
parent7888803ffed428438ed107d35a856647a46b347d (diff)
downloadpleroma-5bf59f8e66f0c341ee0e667c2d5d78f709f46af8.tar.gz
Merge branch 'recipients-filter' into 'develop'
Mastodon API: Add the `recipients` parameter to `GET /api/v1/conversations` See merge request pleroma/pleroma!1948
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/conversation/participation.ex28
1 files changed, 28 insertions, 0 deletions
diff --git a/lib/pleroma/conversation/participation.ex b/lib/pleroma/conversation/participation.ex
index 176b82a20..aafe57280 100644
--- a/lib/pleroma/conversation/participation.ex
+++ b/lib/pleroma/conversation/participation.ex
@@ -122,9 +122,37 @@ defmodule Pleroma.Conversation.Participation do
order_by: [desc: p.updated_at],
preload: [conversation: [:users]]
)
+ |> restrict_recipients(user, params)
|> Pleroma.Pagination.fetch_paginated(params)
end
+ def restrict_recipients(query, user, %{"recipients" => user_ids}) do
+ user_ids =
+ [user.id | user_ids]
+ |> Enum.uniq()
+ |> Enum.reduce([], fn user_id, acc ->
+ case FlakeId.Ecto.CompatType.dump(user_id) do
+ {:ok, user_id} -> [user_id | acc]
+ _ -> acc
+ end
+ end)
+
+ conversation_subquery =
+ __MODULE__
+ |> group_by([p], p.conversation_id)
+ |> having(
+ [p],
+ count(p.user_id) == ^length(user_ids) and
+ fragment("array_agg(?) @> ?", p.user_id, ^user_ids)
+ )
+ |> select([p], %{id: p.conversation_id})
+
+ query
+ |> join(:inner, [p], c in subquery(conversation_subquery), on: p.conversation_id == c.id)
+ end
+
+ def restrict_recipients(query, _, _), do: query
+
def for_user_and_conversation(user, conversation) do
from(p in __MODULE__,
where: p.user_id == ^user.id,