diff options
author | eugenijm <eugenijm@protonmail.com> | 2019-11-07 03:00:21 +0300 |
---|---|---|
committer | eugenijm <eugenijm@protonmail.com> | 2019-11-07 08:26:24 +0300 |
commit | 7888803ffed428438ed107d35a856647a46b347d (patch) | |
tree | 31a82ba5fcdbde2e3f045b295764916e7c90ae5d /lib | |
parent | 9f9c3c4fbe4a2f95227bc4b32ea8961c4f699ecf (diff) | |
download | pleroma-7888803ffed428438ed107d35a856647a46b347d.tar.gz |
Mastodon API: Add the `recipients` parameter to `GET /api/v1/conversations`
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/conversation/participation.ex | 28 |
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, |