diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 64c69b209..1dad30e87 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -609,6 +609,14 @@ def local_user_query() do ) end + def moderator_user_query() do + from( + u in User, + where: u.local == true, + where: fragment("?->'is_moderator' @> 'true'", u.info) + ) + end + def deactivate(%User{} = user) do new_info = Map.put(user.info, "deactivated", true) cs = User.info_changeset(user, %{info: new_info}) diff --git a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex index 9155e42cd..67cef004a 100644 --- a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex +++ b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex @@ -3,6 +3,7 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do alias Pleroma.Stats alias Pleroma.Web + alias Pleroma.{User, Repo} def schemas(conn, _params) do response = %{ @@ -26,6 +27,11 @@ def nodeinfo(conn, %{"version" => "2.0"}) do gopher = Application.get_env(:pleroma, :gopher) stats = Stats.get_stats() + staff_accounts = + User.moderator_user_query() + |> Repo.all() + |> Enum.map(fn u -> u.ap_id end) + response = %{ version: "2.0", software: %{ @@ -55,6 +61,7 @@ def nodeinfo(conn, %{"version" => "2.0"}) do timeout: Keyword.get(suggestions, :timeout, 5000), web: Keyword.get(suggestions, :web, "") }, + staffAccounts: staff_accounts, chat: Keyword.get(chat, :enabled), gopher: Keyword.get(gopher, :enabled) } diff --git a/priv/repo/migrations/20180903114437_users_add_is_moderator_index.exs b/priv/repo/migrations/20180903114437_users_add_is_moderator_index.exs new file mode 100644 index 000000000..ba6b90ea9 --- /dev/null +++ b/priv/repo/migrations/20180903114437_users_add_is_moderator_index.exs @@ -0,0 +1,7 @@ +defmodule Pleroma.Repo.Migrations.UsersAddIsModeratorIndex do + use Ecto.Migration + + def change do + create index(:users, ["(info->'is_moderator')"], name: :users_is_moderator_index, using: :gin) + end +end diff --git a/test/web/node_info_test.exs b/test/web/node_info_test.exs new file mode 100644 index 000000000..d48f40e47 --- /dev/null +++ b/test/web/node_info_test.exs @@ -0,0 +1,17 @@ +defmodule Pleroma.Web.NodeInfoTest do + use Pleroma.Web.ConnCase + + import Pleroma.Factory + + test "nodeinfo shows staff accounts", %{conn: conn} do + user = insert(:user, %{local: true, info: %{"is_moderator" => true}}) + + conn = + conn + |> get("/nodeinfo/2.0.json") + + assert result = json_response(conn, 200) + + assert user.ap_id in result["metadata"]["staffAccounts"] + end +end