Merge branch 'followers-export' into 'develop'

Add API endpoint for exporting followers

See merge request pleroma/pleroma!3785
This commit is contained in:
feld 2024-04-19 17:06:59 +00:00
commit 844850e17f
4 changed files with 69 additions and 0 deletions

View file

@ -1404,6 +1404,13 @@ defmodule Pleroma.User do
|> Repo.all()
end
def get_friends_nicknames(%User{} = user, page \\ nil) do
user
|> get_friends_query(page)
|> Repo.all()
|> Enum.into([], fn x -> full_nickname(x) end)
end
def increase_note_count(%User{} = user) do
User
|> where(id: ^user.id)

View file

@ -0,0 +1,41 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Web.PleromaAPI.UserExportController do
use Pleroma.Web, :controller
require Logger
alias Pleroma.User
alias Pleroma.Web.Plugs.OAuthScopesPlug
plug(OAuthScopesPlug, %{scopes: ["follow", "read:follows"]} when action == :following)
@following_accounts_header "Account address,Show boosts,Notify on new posts,Languages\n"
def following(%{assigns: %{user: follower}} = conn, _) do
data =
follower
|> User.get_friends_nicknames()
|> Enum.map(fn follow ->
[
follow,
!User.muting_reblogs?(follower, follow),
!User.subscribed_to?(follower, follow),
nil
]
|> Enum.map(&Kernel.to_string(&1))
|> Enum.join(",")
end)
|> Enum.join("\n")
csv_data = @following_accounts_header <> data
conn
|> put_resp_content_type("text/csv")
|> put_resp_header("content-disposition", "attachment; filename=\"following_accounts.csv\"")
|> put_root_layout(false)
|> send_resp(200, csv_data)
end
end

View file

@ -497,6 +497,8 @@ defmodule Pleroma.Web.Router do
post("/blocks_import", UserImportController, :blocks)
post("/follow_import", UserImportController, :follow)
get("/follow_export", UserExportController, :following)
get("/accounts/mfa", TwoFactorAuthenticationController, :settings)
get("/accounts/mfa/backup_codes", TwoFactorAuthenticationController, :backup_codes)
get("/accounts/mfa/setup/:method", TwoFactorAuthenticationController, :setup)

View file

@ -1196,6 +1196,25 @@ defmodule Pleroma.UserTest do
assert Enum.member?(res, followed_two)
refute Enum.member?(res, not_followed)
end
test "gets all friends (followed users) for a given user in nickname format" do
user = insert(:user)
followed_one = insert(:user)
followed_two = insert(:user)
not_followed = insert(:user)
{:ok, user, followed_one} = User.follow(user, followed_one)
{:ok, user, followed_two} = User.follow(user, followed_two)
res = User.get_friends_nicknames(user)
followed_one = User.get_cached_by_ap_id(followed_one.ap_id) |> User.full_nickname()
followed_two = User.get_cached_by_ap_id(followed_two.ap_id) |> User.full_nickname()
not_followed = User.get_cached_by_ap_id(not_followed.ap_id) |> User.full_nickname()
assert Enum.member?(res, followed_one)
assert Enum.member?(res, followed_two)
refute Enum.member?(res, not_followed)
end
end
describe "updating note and follower count" do