From 39ccfdc08439401a01c84a4d45488d0145afa937 Mon Sep 17 00:00:00 2001 From: eal Date: Tue, 12 Dec 2017 18:35:23 +0200 Subject: [PATCH 1/3] Add follow import. --- lib/pleroma/web/router.ex | 5 +++++ .../controllers/util_controller.ex | 20 ++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 6806e8a75..6ec5e3097 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -51,6 +51,11 @@ def user_fetcher(username) do get "/emoji", UtilController, :emoji end + scope "/api/pleroma", Pleroma.Web.TwitterAPI do + pipe_through :authenticated_api + post "/follow_import", UtilController, :follow_import + end + scope "/oauth", Pleroma.Web.OAuth do get "/authorize", OAuthController, :authorize post "/authorize", OAuthController, :create_authorization diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index de2abd4d1..c76486392 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -2,7 +2,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do use Pleroma.Web, :controller alias Pleroma.Web alias Pleroma.Formatter - + alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.{Repo, PasswordResetToken, User} def show_password_reset(conn, %{"token" => token}) do @@ -73,4 +73,22 @@ def version(conn, _params) do def emoji(conn, _params) do json conn, Enum.into(Formatter.get_custom_emoji(), %{}) end + + def follow_import(%{assigns: %{user: user}} = conn, %{"list" => list}) do + errors = list + |> String.split() + |> Enum.map(fn nick -> + with %User{} = follower <- User.get_cached_by_ap_id(user.ap_id), + %User{} = followed <- User.get_or_fetch_by_nickname(nick), + {:ok, follower} <- User.follow(follower, followed), + {:ok, _activity} <- ActivityPub.follow(follower, followed) do + :ok + else + _e -> nick + end + end) + |> Enum.reject(fn x -> x == :ok end) + + json conn, %{"failed follows" => errors} + end end From d89193a8d77f67ad5f6ccc7897889c1ef2d030fa Mon Sep 17 00:00:00 2001 From: eal Date: Tue, 12 Dec 2017 21:03:28 +0200 Subject: [PATCH 2/3] Allow uploading a file for follow import. --- lib/pleroma/web/twitter_api/controllers/util_controller.ex | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index c76486392..8eeaa0064 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -74,6 +74,9 @@ def emoji(conn, _params) do json conn, Enum.into(Formatter.get_custom_emoji(), %{}) end + def follow_import(conn, %{"list" => %Plug.Upload{} = listfile}) do + follow_import(conn, %{"list" => File.read!(listfile.path)}) + end def follow_import(%{assigns: %{user: user}} = conn, %{"list" => list}) do errors = list |> String.split() From fdfb508259f45154313df0ae343ee6ca26802505 Mon Sep 17 00:00:00 2001 From: eal Date: Tue, 12 Dec 2017 21:04:41 +0200 Subject: [PATCH 3/3] Run follow import in the background. --- .../controllers/util_controller.ex | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index 8eeaa0064..9079d2f9b 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -1,5 +1,6 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do use Pleroma.Web, :controller + require Logger alias Pleroma.Web alias Pleroma.Formatter alias Pleroma.Web.ActivityPub.ActivityPub @@ -78,20 +79,19 @@ def follow_import(conn, %{"list" => %Plug.Upload{} = listfile}) do follow_import(conn, %{"list" => File.read!(listfile.path)}) end def follow_import(%{assigns: %{user: user}} = conn, %{"list" => list}) do - errors = list - |> String.split() + Task.start_link(fn -> + String.split(list) |> Enum.map(fn nick -> - with %User{} = follower <- User.get_cached_by_ap_id(user.ap_id), - %User{} = followed <- User.get_or_fetch_by_nickname(nick), - {:ok, follower} <- User.follow(follower, followed), - {:ok, _activity} <- ActivityPub.follow(follower, followed) do - :ok - else - _e -> nick - end + with %User{} = follower <- User.get_cached_by_ap_id(user.ap_id), + %User{} = followed <- User.get_or_fetch_by_nickname(nick), + {:ok, follower} <- User.follow(follower, followed) do + ActivityPub.follow(follower, followed) + else + _e -> Logger.debug "follow_import: following #{nick} failed" + end + end) end) - |> Enum.reject(fn x -> x == :ok end) - json conn, %{"failed follows" => errors} + json conn, "job started" end end