mirror of
https://git.pleroma.social/pleroma/pleroma.git
synced 2025-04-12 14:04:08 +00:00
Merge branch 'outgoing_follow_requests' into 'develop'
Add /api/v1/pleroma/outgoing_follow_requests See merge request pleroma/pleroma!4310
This commit is contained in:
commit
79b7539e85
8 changed files with 107 additions and 0 deletions
changelog.d
lib/pleroma
test/pleroma/web/pleroma_api/controllers
1
changelog.d/outgoing-follow-requests.add
Normal file
1
changelog.d/outgoing-follow-requests.add
Normal file
|
@ -0,0 +1 @@
|
|||
Add /api/v1/pleroma/outgoing_follow_requests
|
|
@ -157,6 +157,16 @@ defmodule Pleroma.FollowingRelationship do
|
|||
|> Repo.all()
|
||||
end
|
||||
|
||||
def get_outgoing_follow_requests(%User{id: id}) do
|
||||
__MODULE__
|
||||
|> join(:inner, [r], f in assoc(r, :following))
|
||||
|> where([r], r.state == ^:follow_pending)
|
||||
|> where([r], r.follower_id == ^id)
|
||||
|> where([r, f], f.is_active == true)
|
||||
|> select([r, f], f)
|
||||
|> Repo.all()
|
||||
end
|
||||
|
||||
def following?(%User{id: follower_id}, %User{id: followed_id}) do
|
||||
__MODULE__
|
||||
|> where(follower_id: ^follower_id, following_id: ^followed_id, state: ^:follow_accept)
|
||||
|
|
|
@ -288,6 +288,7 @@ defmodule Pleroma.User do
|
|||
defdelegate following?(follower, followed), to: FollowingRelationship
|
||||
defdelegate following_ap_ids(user), to: FollowingRelationship
|
||||
defdelegate get_follow_requests(user), to: FollowingRelationship
|
||||
defdelegate get_outgoing_follow_requests(user), to: FollowingRelationship
|
||||
defdelegate search(query, opts \\ []), to: User.Search
|
||||
|
||||
@doc """
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
# Pleroma: A lightweight social networking server
|
||||
# Copyright © 2017-2024 Pleroma Authors <https://pleroma.social/>
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
defmodule Pleroma.Web.ApiSpec.PleromaFollowRequestOperation do
|
||||
alias OpenApiSpex.Operation
|
||||
alias OpenApiSpex.Schema
|
||||
alias Pleroma.Web.ApiSpec.Schemas.Account
|
||||
|
||||
def open_api_operation(action) do
|
||||
operation = String.to_existing_atom("#{action}_operation")
|
||||
apply(__MODULE__, operation, [])
|
||||
end
|
||||
|
||||
def index_operation do
|
||||
%Operation{
|
||||
tags: ["Follow requests"],
|
||||
summary: "Retrieve outgoing follow requests",
|
||||
security: [%{"oAuth" => ["read:follows", "follow"]}],
|
||||
operationId: "PleromaFollowRequestController.index",
|
||||
responses: %{
|
||||
200 =>
|
||||
Operation.response("Array of Account", "application/json", %Schema{
|
||||
type: :array,
|
||||
items: Account,
|
||||
example: [Account.schema().example]
|
||||
})
|
||||
}
|
||||
}
|
||||
end
|
||||
end
|
|
@ -0,0 +1,25 @@
|
|||
# Pleroma: A lightweight social networking server
|
||||
# Copyright © 2017-2024 Pleroma Authors <https://pleroma.social/>
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
defmodule Pleroma.Web.PleromaAPI.FollowRequestController do
|
||||
use Pleroma.Web, :controller
|
||||
|
||||
alias Pleroma.User
|
||||
alias Pleroma.Web.Plugs.OAuthScopesPlug
|
||||
|
||||
plug(Pleroma.Web.ApiSpec.CastAndValidate, replace_params: false)
|
||||
|
||||
action_fallback(Pleroma.Web.MastodonAPI.FallbackController)
|
||||
|
||||
plug(OAuthScopesPlug, %{scopes: ["follow", "read:follows"]})
|
||||
|
||||
defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaFollowRequestOperation
|
||||
|
||||
@doc "GET /api/v1/pleroma/outgoing_follow_requests"
|
||||
def index(%{assigns: %{user: follower}} = conn, _params) do
|
||||
follow_requests = User.get_outgoing_follow_requests(follower)
|
||||
|
||||
render(conn, "index.json", for: follower, users: follow_requests, as: :user)
|
||||
end
|
||||
end
|
10
lib/pleroma/web/pleroma_api/views/follow_request_view.ex
Normal file
10
lib/pleroma/web/pleroma_api/views/follow_request_view.ex
Normal file
|
@ -0,0 +1,10 @@
|
|||
# Pleroma: A lightweight social networking server
|
||||
# Copyright © 2017-2024 Pleroma Authors <https://pleroma.social/>
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
defmodule Pleroma.Web.PleromaAPI.FollowRequestView do
|
||||
use Pleroma.Web, :view
|
||||
alias Pleroma.Web.MastodonAPI
|
||||
|
||||
def render(view, opts), do: MastodonAPI.AccountView.render(view, opts)
|
||||
end
|
|
@ -602,6 +602,8 @@ defmodule Pleroma.Web.Router do
|
|||
post("/bookmark_folders", BookmarkFolderController, :create)
|
||||
patch("/bookmark_folders/:id", BookmarkFolderController, :update)
|
||||
delete("/bookmark_folders/:id", BookmarkFolderController, :delete)
|
||||
|
||||
get("/outgoing_follow_requests", FollowRequestController, :index)
|
||||
end
|
||||
|
||||
scope [] do
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
# Pleroma: A lightweight social networking server
|
||||
# Copyright © 2017-2024 Pleroma Authors <https://pleroma.social/>
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
defmodule Pleroma.Web.PleromaAPI.FollowRequestControllerTest do
|
||||
use Pleroma.Web.ConnCase, async: true
|
||||
|
||||
alias Pleroma.Web.CommonAPI
|
||||
|
||||
import Pleroma.Factory
|
||||
|
||||
test "/api/v1/pleroma/outgoing_follow_requests works" do
|
||||
%{conn: conn, user: user} = oauth_access(["read:follows"])
|
||||
|
||||
other_user1 = insert(:user)
|
||||
other_user2 = insert(:user, is_locked: true)
|
||||
_other_user3 = insert(:user)
|
||||
|
||||
{:ok, _, _, _} = CommonAPI.follow(other_user1, user)
|
||||
{:ok, _, _, _} = CommonAPI.follow(other_user2, user)
|
||||
|
||||
conn = get(conn, "/api/v1/pleroma/outgoing_follow_requests")
|
||||
|
||||
assert [relationship] = json_response_and_validate_schema(conn, 200)
|
||||
assert to_string(other_user2.id) == relationship["id"]
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue