logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://anongit.hacktivis.me/git/pleroma.git/
commit: 49376e6b75e4418da4b6ee08d51e1f7c01091bb4
parent 7e770d73c9e102baad28e5e57719b5d2b4f121fe
Author: lain <lain@soykaf.club>
Date:   Wed, 27 Aug 2025 10:27:25 +0000

Merge branch 'repost-repeat-filtering-3391' into 'develop'

Add only_reblogs parameter to account statuses API

Closes #3391

See merge request pleroma/pleroma!4385

Diffstat:

Achangelog.d/repost-repeat-filtering-3391.add2++
Mdocs/development/API/differences_in_mastoapi_responses.md1+
Mlib/pleroma/web/activity_pub/activity_pub.ex4++++
Mlib/pleroma/web/api_spec/operations/account_operation.ex6++++++
Mtest/pleroma/web/activity_pub/activity_pub_test.exs10++++++++++
Mtest/pleroma/web/mastodon_api/controllers/account_controller_test.exs11+++++++++++
6 files changed, 34 insertions(+), 0 deletions(-)

diff --git a/changelog.d/repost-repeat-filtering-3391.add b/changelog.d/repost-repeat-filtering-3391.add @@ -0,0 +1 @@ +Add only_reblogs parameter to account statuses API for filtering to show only reblogs/reposts +\ No newline at end of file diff --git a/docs/development/API/differences_in_mastoapi_responses.md b/docs/development/API/differences_in_mastoapi_responses.md @@ -88,6 +88,7 @@ The `id` parameter can also be the `nickname` of the user. This only works in th - `only_media`: include only statuses with media attached - `with_muted`: include statuses/reactions from muted accounts - `exclude_reblogs`: exclude reblogs +- `only_reblogs`: include only reblogs - `exclude_replies`: exclude replies - `exclude_visibilities`: exclude visibilities diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -1065,6 +1065,10 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do from(activity in query, where: fragment("?->>'type' != 'Announce'", activity.data)) end + defp restrict_reblogs(query, %{only_reblogs: true}) do + from(activity in query, where: fragment("?->>'type' = 'Announce'", activity.data)) + end + defp restrict_reblogs(query, _), do: query defp restrict_muted(query, %{with_muted: true}), do: query diff --git a/lib/pleroma/web/api_spec/operations/account_operation.ex b/lib/pleroma/web/api_spec/operations/account_operation.ex @@ -143,6 +143,12 @@ defmodule Pleroma.Web.ApiSpec.AccountOperation do "Include statuses from muted accounts." ), Operation.parameter(:exclude_reblogs, :query, BooleanLike.schema(), "Exclude reblogs"), + Operation.parameter( + :only_reblogs, + :query, + BooleanLike.schema(), + "Include only reblogs" + ), Operation.parameter(:exclude_replies, :query, BooleanLike.schema(), "Exclude replies"), Operation.parameter( :exclude_visibilities, diff --git a/test/pleroma/web/activity_pub/activity_pub_test.exs b/test/pleroma/web/activity_pub/activity_pub_test.exs @@ -1270,6 +1270,16 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do assert activity == expected_activity end + test "includes only reblogs on request" do + user = insert(:user) + {:ok, _} = ActivityBuilder.insert(%{"type" => "Create"}, %{:user => user}) + {:ok, expected_activity} = ActivityBuilder.insert(%{"type" => "Announce"}, %{:user => user}) + + [activity] = ActivityPub.fetch_user_activities(user, nil, %{only_reblogs: true}) + + assert activity == expected_activity + end + describe "irreversible filters" do setup do user = insert(:user) diff --git a/test/pleroma/web/mastodon_api/controllers/account_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/account_controller_test.exs @@ -469,6 +469,17 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do assert [%{"id" => ^post_id}] = json_response_and_validate_schema(conn, 200) end + test "gets only a user's reblogs", %{user: user, conn: conn} do + {:ok, %{id: post_id}} = CommonAPI.post(user, %{status: "HI!!!"}) + {:ok, %{id: reblog_id}} = CommonAPI.repeat(post_id, user) + + conn = get(conn, "/api/v1/accounts/#{user.id}/statuses?only_reblogs=true") + assert [%{"id" => ^reblog_id}] = json_response_and_validate_schema(conn, 200) + + conn = get(conn, "/api/v1/accounts/#{user.id}/statuses?only_reblogs=1") + assert [%{"id" => ^reblog_id}] = json_response_and_validate_schema(conn, 200) + end + test "filters user's statuses by a hashtag", %{user: user, conn: conn} do {:ok, %{id: post_id}} = CommonAPI.post(user, %{status: "#hashtag"}) {:ok, _post} = CommonAPI.post(user, %{status: "hashtag"})