Merge branch 'recipients-filter' into 'develop'
Mastodon API: Add the `recipients` parameter to `GET /api/v1/conversations` See merge request pleroma/pleroma!1948
This commit is contained in:
commit
5bf59f8e66
|
@ -57,6 +57,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
- Admin API: Add `GET /api/pleroma/admin/relay` endpoint - lists all followed relays
|
- Admin API: Add `GET /api/pleroma/admin/relay` endpoint - lists all followed relays
|
||||||
- Pleroma API: `POST /api/v1/pleroma/conversations/read` to mark all conversations as read
|
- Pleroma API: `POST /api/v1/pleroma/conversations/read` to mark all conversations as read
|
||||||
- Mastodon API: Add `/api/v1/markers` for managing timeline read markers
|
- Mastodon API: Add `/api/v1/markers` for managing timeline read markers
|
||||||
|
- Mastodon API: Add the `recipients` parameter to `GET /api/v1/conversations`
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
|
@ -72,6 +72,12 @@ Has an additional field under the `pleroma` object:
|
||||||
|
|
||||||
- `recipients`: The list of the recipients of this Conversation. These will be addressed when replying to this conversation.
|
- `recipients`: The list of the recipients of this Conversation. These will be addressed when replying to this conversation.
|
||||||
|
|
||||||
|
## GET `/api/v1/conversations`
|
||||||
|
|
||||||
|
Accepts additional parameters:
|
||||||
|
|
||||||
|
- `recipients`: Only return conversations with the given recipients (a list of user ids). Usage example: `GET /api/v1/conversations?recipients[]=1&recipients[]=2`
|
||||||
|
|
||||||
## Account Search
|
## Account Search
|
||||||
|
|
||||||
Behavior has changed:
|
Behavior has changed:
|
||||||
|
|
|
@ -122,9 +122,37 @@ def for_user(user, params \\ %{}) do
|
||||||
order_by: [desc: p.updated_at],
|
order_by: [desc: p.updated_at],
|
||||||
preload: [conversation: [:users]]
|
preload: [conversation: [:users]]
|
||||||
)
|
)
|
||||||
|
|> restrict_recipients(user, params)
|
||||||
|> Pleroma.Pagination.fetch_paginated(params)
|
|> Pleroma.Pagination.fetch_paginated(params)
|
||||||
end
|
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
|
def for_user_and_conversation(user, conversation) do
|
||||||
from(p in __MODULE__,
|
from(p in __MODULE__,
|
||||||
where: p.user_id == ^user.id,
|
where: p.user_id == ^user.id,
|
||||||
|
|
|
@ -59,6 +59,59 @@ test "returns a list of conversations", %{conn: conn} do
|
||||||
assert User.get_cached_by_id(user_one.id).unread_conversation_count == 0
|
assert User.get_cached_by_id(user_one.id).unread_conversation_count == 0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "filters conversations by recipients", %{conn: conn} do
|
||||||
|
user_one = insert(:user)
|
||||||
|
user_two = insert(:user)
|
||||||
|
user_three = insert(:user)
|
||||||
|
|
||||||
|
{:ok, direct1} =
|
||||||
|
CommonAPI.post(user_one, %{
|
||||||
|
"status" => "Hi @#{user_two.nickname}!",
|
||||||
|
"visibility" => "direct"
|
||||||
|
})
|
||||||
|
|
||||||
|
{:ok, _direct2} =
|
||||||
|
CommonAPI.post(user_one, %{
|
||||||
|
"status" => "Hi @#{user_three.nickname}!",
|
||||||
|
"visibility" => "direct"
|
||||||
|
})
|
||||||
|
|
||||||
|
{:ok, direct3} =
|
||||||
|
CommonAPI.post(user_one, %{
|
||||||
|
"status" => "Hi @#{user_two.nickname}, @#{user_three.nickname}!",
|
||||||
|
"visibility" => "direct"
|
||||||
|
})
|
||||||
|
|
||||||
|
{:ok, _direct4} =
|
||||||
|
CommonAPI.post(user_two, %{
|
||||||
|
"status" => "Hi @#{user_three.nickname}!",
|
||||||
|
"visibility" => "direct"
|
||||||
|
})
|
||||||
|
|
||||||
|
{:ok, direct5} =
|
||||||
|
CommonAPI.post(user_two, %{
|
||||||
|
"status" => "Hi @#{user_one.nickname}!",
|
||||||
|
"visibility" => "direct"
|
||||||
|
})
|
||||||
|
|
||||||
|
[conversation1, conversation2] =
|
||||||
|
conn
|
||||||
|
|> assign(:user, user_one)
|
||||||
|
|> get("/api/v1/conversations", %{"recipients" => [user_two.id]})
|
||||||
|
|> json_response(200)
|
||||||
|
|
||||||
|
assert conversation1["last_status"]["id"] == direct5.id
|
||||||
|
assert conversation2["last_status"]["id"] == direct1.id
|
||||||
|
|
||||||
|
[conversation1] =
|
||||||
|
conn
|
||||||
|
|> assign(:user, user_one)
|
||||||
|
|> get("/api/v1/conversations", %{"recipients" => [user_two.id, user_three.id]})
|
||||||
|
|> json_response(200)
|
||||||
|
|
||||||
|
assert conversation1["last_status"]["id"] == direct3.id
|
||||||
|
end
|
||||||
|
|
||||||
test "updates the last_status on reply", %{conn: conn} do
|
test "updates the last_status on reply", %{conn: conn} do
|
||||||
user_one = insert(:user)
|
user_one = insert(:user)
|
||||||
user_two = insert(:user)
|
user_two = insert(:user)
|
||||||
|
|
Loading…
Reference in a new issue