Add an endpoint to get multiple statuses by IDs Closes #1240 See merge request pleroma/pleroma!1621tags/v1.1.4
@@ -110,6 +110,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). | |||||
- Federation: Remove `likes` from objects. | - Federation: Remove `likes` from objects. | ||||
- Admin API: Added moderation log | - Admin API: Added moderation log | ||||
- Web response cache (currently, enabled for ActivityPub) | - Web response cache (currently, enabled for ActivityPub) | ||||
- Mastodon API: Added an endpoint to get multiple statuses by IDs (`GET /api/v1/statuses/?ids[]=1&ids[]=2`) | |||||
### Changed | ### Changed | ||||
- Configuration: Filter.AnonymizeFilename added ability to retain file extension with custom text | - Configuration: Filter.AnonymizeFilename added ability to retain file extension with custom text | ||||
@@ -91,6 +91,20 @@ Additional parameters can be added to the JSON body/Form data: | |||||
- `expires_in`: The number of seconds the posted activity should expire in. When a posted activity expires it will be deleted from the server, and a delete request for it will be federated. This needs to be longer than an hour. | - `expires_in`: The number of seconds the posted activity should expire in. When a posted activity expires it will be deleted from the server, and a delete request for it will be federated. This needs to be longer than an hour. | ||||
- `in_reply_to_conversation_id`: Will reply to a given conversation, addressing only the people who are part of the recipient set of that conversation. Sets the visibility to `direct`. | - `in_reply_to_conversation_id`: Will reply to a given conversation, addressing only the people who are part of the recipient set of that conversation. Sets the visibility to `direct`. | ||||
## GET `/api/v1/statuses` | |||||
An endpoint to get multiple statuses by IDs. | |||||
Required parameters: | |||||
- `ids`: array of activity ids | |||||
Usage example: `GET /api/v1/statuses/?ids[]=1&ids[]=2`. | |||||
Returns: array of Status. | |||||
The maximum number of statuses is limited to 100 per request. | |||||
## PATCH `/api/v1/update_credentials` | ## PATCH `/api/v1/update_credentials` | ||||
Additional parameters can be added to the JSON body/Form data: | Additional parameters can be added to the JSON body/Form data: | ||||
@@ -173,6 +173,13 @@ defmodule Pleroma.Activity do | |||||
|> Repo.one() | |> Repo.one() | ||||
end | end | ||||
def all_by_ids_with_object(ids) do | |||||
Activity | |||||
|> where([a], a.id in ^ids) | |||||
|> with_preloaded_object() | |||||
|> Repo.all() | |||||
end | |||||
def by_object_ap_id(ap_id) do | def by_object_ap_id(ap_id) do | ||||
from( | from( | ||||
activity in Activity, | activity in Activity, | ||||
@@ -427,6 +427,20 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do | |||||
|> render("index.json", %{activities: activities, for: user, as: :activity}) | |> render("index.json", %{activities: activities, for: user, as: :activity}) | ||||
end | end | ||||
def get_statuses(%{assigns: %{user: user}} = conn, %{"ids" => ids}) do | |||||
limit = 100 | |||||
activities = | |||||
ids | |||||
|> Enum.take(limit) | |||||
|> Activity.all_by_ids_with_object() | |||||
|> Enum.filter(&Visibility.visible_for_user?(&1, user)) | |||||
conn | |||||
|> put_view(StatusView) | |||||
|> render("index.json", activities: activities, for: user, as: :activity) | |||||
end | |||||
def get_status(%{assigns: %{user: user}} = conn, %{"id" => id}) do | def get_status(%{assigns: %{user: user}} = conn, %{"id" => id}) do | ||||
with %Activity{} = activity <- Activity.get_by_id_with_object(id), | with %Activity{} = activity <- Activity.get_by_id_with_object(id), | ||||
true <- Visibility.visible_for_user?(activity, user) do | true <- Visibility.visible_for_user?(activity, user) do | ||||
@@ -443,6 +443,7 @@ defmodule Pleroma.Web.Router do | |||||
get("/timelines/tag/:tag", MastodonAPIController, :hashtag_timeline) | get("/timelines/tag/:tag", MastodonAPIController, :hashtag_timeline) | ||||
get("/timelines/list/:list_id", MastodonAPIController, :list_timeline) | get("/timelines/list/:list_id", MastodonAPIController, :list_timeline) | ||||
get("/statuses", MastodonAPIController, :get_statuses) | |||||
get("/statuses/:id", MastodonAPIController, :get_status) | get("/statuses/:id", MastodonAPIController, :get_status) | ||||
get("/statuses/:id/context", MastodonAPIController, :get_context) | get("/statuses/:id/context", MastodonAPIController, :get_context) | ||||
@@ -173,4 +173,12 @@ defmodule Pleroma.ActivityTest do | |||||
|> where([a], a.activity_id == ^activity.id) | |> where([a], a.activity_id == ^activity.id) | ||||
|> Repo.one!() | |> Repo.one!() | ||||
end | end | ||||
test "all_by_ids_with_object/1" do | |||||
%{id: id1} = insert(:note_activity) | |||||
%{id: id2} = insert(:note_activity) | |||||
assert [%{id: ^id1, object: %Object{}}, %{id: ^id2, object: %Object{}}] = | |||||
Activity.all_by_ids_with_object([id1, id2]) | |||||
end | |||||
end | end |
@@ -744,6 +744,16 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do | |||||
assert id == to_string(activity.id) | assert id == to_string(activity.id) | ||||
end | end | ||||
test "get statuses by IDs", %{conn: conn} do | |||||
%{id: id1} = insert(:note_activity) | |||||
%{id: id2} = insert(:note_activity) | |||||
query_string = "ids[]=#{id1}&ids[]=#{id2}" | |||||
conn = get(conn, "/api/v1/statuses/?#{query_string}") | |||||
assert [%{"id" => ^id1}, %{"id" => ^id2}] = json_response(conn, :ok) | |||||
end | |||||
describe "deleting a status" do | describe "deleting a status" do | ||||
test "when you created it", %{conn: conn} do | test "when you created it", %{conn: conn} do | ||||
activity = insert(:note_activity) | activity = insert(:note_activity) | ||||