Browse Source

Add an endpoint to get multiple statuses by IDs

tags/v1.1.4
Egor Kislitsyn 4 years ago
parent
commit
b40b10b53d
7 changed files with 53 additions and 0 deletions
  1. +1
    -0
      CHANGELOG.md
  2. +12
    -0
      docs/api/differences_in_mastoapi_responses.md
  3. +7
    -0
      lib/pleroma/activity.ex
  4. +14
    -0
      lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex
  5. +1
    -0
      lib/pleroma/web/router.ex
  6. +8
    -0
      test/activity_test.exs
  7. +10
    -0
      test/web/mastodon_api/mastodon_api_controller_test.exs

+ 1
- 0
CHANGELOG.md View File

@@ -110,6 +110,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Federation: Remove `likes` from objects.
- Admin API: Added moderation log
- 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
- Configuration: Filter.AnonymizeFilename added ability to retain file extension with custom text


+ 12
- 0
docs/api/differences_in_mastoapi_responses.md View File

@@ -91,6 +91,18 @@ 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.
- `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.

## PATCH `/api/v1/update_credentials`

Additional parameters can be added to the JSON body/Form data:


+ 7
- 0
lib/pleroma/activity.ex View File

@@ -173,6 +173,13 @@ defmodule Pleroma.Activity do
|> Repo.one()
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
from(
activity in Activity,


+ 14
- 0
lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex View File

@@ -427,6 +427,20 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|> render("index.json", %{activities: activities, for: user, as: :activity})
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
with %Activity{} = activity <- Activity.get_by_id_with_object(id),
true <- Visibility.visible_for_user?(activity, user) do


+ 1
- 0
lib/pleroma/web/router.ex View File

@@ -443,6 +443,7 @@ defmodule Pleroma.Web.Router do
get("/timelines/tag/:tag", MastodonAPIController, :hashtag_timeline)
get("/timelines/list/:list_id", MastodonAPIController, :list_timeline)

get("/statuses", MastodonAPIController, :get_statuses)
get("/statuses/:id", MastodonAPIController, :get_status)
get("/statuses/:id/context", MastodonAPIController, :get_context)



+ 8
- 0
test/activity_test.exs View File

@@ -173,4 +173,12 @@ defmodule Pleroma.ActivityTest do
|> where([a], a.activity_id == ^activity.id)
|> Repo.one!()
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

+ 10
- 0
test/web/mastodon_api/mastodon_api_controller_test.exs View File

@@ -744,6 +744,16 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
assert id == to_string(activity.id)
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
test "when you created it", %{conn: conn} do
activity = insert(:note_activity)


Loading…
Cancel
Save