Add pagination to follow requests

This commit is contained in:
FloatingGhost 2023-01-30 12:01:11 +00:00
parent 56c37dc6b3
commit daa011d085
7 changed files with 43 additions and 8 deletions

View file

@ -155,14 +155,14 @@ def following_count(%User{} = user) do
|> Repo.aggregate(:count, :id) |> Repo.aggregate(:count, :id)
end end
def get_follow_requests(%User{id: id}) do def get_follow_requests_query(%User{id: id}) do
__MODULE__ __MODULE__
|> join(:inner, [r], f in assoc(r, :follower)) |> join(:inner, [r], f in assoc(r, :follower))
|> where([r], r.state == ^:follow_pending) |> where([r], r.state == ^:follow_pending)
|> where([r], r.following_id == ^id) |> where([r], r.following_id == ^id)
|> where([r, f], f.is_active == true) |> where([r, f], f.is_active == true)
|> select([r, f], f) |> select([r, f], f)
|> Repo.all() |> order_by([r, f], r.inserted_at)
end end
def following?(%User{id: follower_id}, %User{id: followed_id}) do def following?(%User{id: follower_id}, %User{id: followed_id}) do

View file

@ -273,7 +273,11 @@ def cached_muted_users_ap_ids(user) do
defdelegate following(user), to: FollowingRelationship defdelegate following(user), to: FollowingRelationship
defdelegate following?(follower, followed), to: FollowingRelationship defdelegate following?(follower, followed), to: FollowingRelationship
defdelegate following_ap_ids(user), to: FollowingRelationship defdelegate following_ap_ids(user), to: FollowingRelationship
defdelegate get_follow_requests(user), to: FollowingRelationship defdelegate get_follow_requests_query(user), to: FollowingRelationship
def get_follow_requests(user) do
get_follow_requests_query(user)
|> Repo.all()
end
defdelegate search(query, opts \\ []), to: User.Search defdelegate search(query, opts \\ []), to: User.Search
@doc """ @doc """

View file

@ -19,6 +19,7 @@ def index_operation do
summary: "Retrieve follow requests", summary: "Retrieve follow requests",
security: [%{"oAuth" => ["read:follows", "follow"]}], security: [%{"oAuth" => ["read:follows", "follow"]}],
operationId: "FollowRequestController.index", operationId: "FollowRequestController.index",
parameters: pagination_params(),
responses: %{ responses: %{
200 => 200 =>
Operation.response("Array of Account", "application/json", %Schema{ Operation.response("Array of Account", "application/json", %Schema{
@ -62,4 +63,23 @@ defp id_param do
required: true required: true
) )
end end
defp pagination_params do
[
Operation.parameter(:max_id, :query, :integer, "Return items older than this ID"),
Operation.parameter(
:since_id,
:query,
:integer,
"Return the oldest items newer than this ID"
),
Operation.parameter(
:limit,
:query,
%Schema{type: :integer, default: 20},
"Maximum number of items to return. Will be ignored if it's more than 40"
)
]
end
end end

View file

@ -4,10 +4,12 @@
defmodule Pleroma.Web.MastodonAPI.FollowRequestController do defmodule Pleroma.Web.MastodonAPI.FollowRequestController do
use Pleroma.Web, :controller use Pleroma.Web, :controller
import Pleroma.Web.ControllerHelper,
only: [add_link_headers: 2]
alias Pleroma.User alias Pleroma.User
alias Pleroma.Web.CommonAPI alias Pleroma.Web.CommonAPI
alias Pleroma.Web.Plugs.OAuthScopesPlug alias Pleroma.Web.Plugs.OAuthScopesPlug
alias Pleroma.Pagination
plug(Pleroma.Web.ApiSpec.CastAndValidate) plug(Pleroma.Web.ApiSpec.CastAndValidate)
plug(:assign_follower when action != :index) plug(:assign_follower when action != :index)
@ -24,10 +26,16 @@ defmodule Pleroma.Web.MastodonAPI.FollowRequestController do
defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.FollowRequestOperation defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.FollowRequestOperation
@doc "GET /api/v1/follow_requests" @doc "GET /api/v1/follow_requests"
def index(%{assigns: %{user: followed}} = conn, _params) do def index(%{assigns: %{user: followed}} = conn, params) do
follow_requests = User.get_follow_requests(followed) params = Map.put(params, :id_type, :integer)
follow_requests =
followed
|> User.get_follow_requests_query()
|> Pagination.fetch_paginated(params)
render(conn, "index.json", for: followed, users: follow_requests, as: :user) conn
|> add_link_headers(follow_requests)
|> render("index.json", for: followed, users: follow_requests, as: :user)
end end
@doc "POST /api/v1/follow_requests/:id/authorize" @doc "POST /api/v1/follow_requests/:id/authorize"

View file

@ -334,7 +334,8 @@ defp maybe_put_follow_requests_count(
%User{id: user_id} %User{id: user_id}
) do ) do
count = count =
User.get_follow_requests(user) user
|> User.get_follow_requests()
|> length() |> length()
data data

View file

@ -12,6 +12,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.BlockValidationTest do
describe "blocks" do describe "blocks" do
setup do setup do
clear_config([:activitypub, :outgoing_blocks], true)
user = insert(:user, local: false) user = insert(:user, local: false)
blocked = insert(:user) blocked = insert(:user)

View file

@ -71,6 +71,7 @@ test "it posts a poll" do
test "it blocks and federates", %{blocker: blocker, blocked: blocked} do test "it blocks and federates", %{blocker: blocker, blocked: blocked} do
clear_config([:instance, :federating], true) clear_config([:instance, :federating], true)
clear_config([:activitypub, :outgoing_blocks], true)
with_mock Pleroma.Web.Federator, with_mock Pleroma.Web.Federator,
publish: fn _ -> nil end do publish: fn _ -> nil end do