1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.AdminAPI.AdminAPIController do
6 use Pleroma.Web, :controller
8 alias Pleroma.Web.ActivityPub.Relay
9 alias Pleroma.Web.AdminAPI.AccountView
10 alias Pleroma.Web.AdminAPI.Search
12 import Pleroma.Web.ControllerHelper, only: [json_response: 3]
18 action_fallback(:errors)
20 def user_delete(conn, %{"nickname" => nickname}) do
21 User.get_by_nickname(nickname)
28 def user_follow(conn, %{"follower" => follower_nick, "followed" => followed_nick}) do
29 with %User{} = follower <- User.get_by_nickname(follower_nick),
30 %User{} = followed <- User.get_by_nickname(followed_nick) do
31 User.follow(follower, followed)
38 def user_unfollow(conn, %{"follower" => follower_nick, "followed" => followed_nick}) do
39 with %User{} = follower <- User.get_by_nickname(follower_nick),
40 %User{} = followed <- User.get_by_nickname(followed_nick) do
41 User.unfollow(follower, followed)
50 %{"nickname" => nickname, "email" => email, "password" => password}
57 password_confirmation: password,
61 changeset = User.register_changeset(%User{}, user_data, confirmed: true)
62 {:ok, user} = User.register(changeset)
65 |> json(user.nickname)
68 def user_show(conn, %{"nickname" => nickname}) do
69 with %User{} = user <- User.get_by_nickname(nickname) do
71 |> json(AccountView.render("show.json", %{user: user}))
73 _ -> {:error, :not_found}
77 def user_toggle_activation(conn, %{"nickname" => nickname}) do
78 user = User.get_by_nickname(nickname)
80 {:ok, updated_user} = User.deactivate(user, !user.info.deactivated)
83 |> json(AccountView.render("show.json", %{user: updated_user}))
86 def tag_users(conn, %{"nicknames" => nicknames, "tags" => tags}) do
87 with {:ok, _} <- User.tag(nicknames, tags),
88 do: json_response(conn, :no_content, "")
91 def untag_users(conn, %{"nicknames" => nicknames, "tags" => tags}) do
92 with {:ok, _} <- User.untag(nicknames, tags),
93 do: json_response(conn, :no_content, "")
96 def list_users(conn, params) do
97 {page, page_size} = page_params(params)
98 filters = maybe_parse_filters(params["filters"])
101 query: params["query"],
106 with {:ok, users, count} <- Search.user(Map.merge(search_params, filters)),
110 AccountView.render("index.json",
118 @filters ~w(local external active deactivated)
120 defp maybe_parse_filters(filters) when is_nil(filters) or filters == "", do: %{}
122 @spec maybe_parse_filters(String.t()) :: %{required(String.t()) => true} | %{}
123 defp maybe_parse_filters(filters) do
126 |> Enum.filter(&Enum.member?(@filters, &1))
127 |> Enum.map(&String.to_atom(&1))
128 |> Enum.into(%{}, &{&1, true})
131 def right_add(conn, %{"permission_group" => permission_group, "nickname" => nickname})
132 when permission_group in ["moderator", "admin"] do
133 user = User.get_by_nickname(nickname)
137 |> Map.put("is_" <> permission_group, true)
139 info_cng = User.Info.admin_api_update(user.info, info)
143 |> Ecto.Changeset.change()
144 |> Ecto.Changeset.put_embed(:info, info_cng)
146 {:ok, _user} = User.update_and_set_cache(cng)
151 def right_add(conn, _) do
154 |> json(%{error: "No such permission_group"})
157 def right_get(conn, %{"nickname" => nickname}) do
158 user = User.get_by_nickname(nickname)
162 is_moderator: user.info.is_moderator,
163 is_admin: user.info.is_admin
168 %{assigns: %{user: %User{:nickname => admin_nickname}}} = conn,
170 "permission_group" => permission_group,
171 "nickname" => nickname
174 when permission_group in ["moderator", "admin"] do
175 if admin_nickname == nickname do
178 |> json(%{error: "You can't revoke your own admin status."})
180 user = User.get_by_nickname(nickname)
184 |> Map.put("is_" <> permission_group, false)
186 info_cng = User.Info.admin_api_update(user.info, info)
189 Ecto.Changeset.change(user)
190 |> Ecto.Changeset.put_embed(:info, info_cng)
192 {:ok, _user} = User.update_and_set_cache(cng)
198 def right_delete(conn, _) do
201 |> json(%{error: "No such permission_group"})
204 def set_activation_status(conn, %{"nickname" => nickname, "status" => status}) do
205 with {:ok, status} <- Ecto.Type.cast(:boolean, status),
206 %User{} = user <- User.get_by_nickname(nickname),
207 {:ok, _} <- User.deactivate(user, !status),
208 do: json_response(conn, :no_content, "")
211 def relay_follow(conn, %{"relay_url" => target}) do
212 with {:ok, _message} <- Relay.follow(target) do
222 def relay_unfollow(conn, %{"relay_url" => target}) do
223 with {:ok, _message} <- Relay.unfollow(target) do
233 @doc "Sends registration invite via email"
234 def email_invite(%{assigns: %{user: user}} = conn, %{"email" => email} = params) do
236 Pleroma.Config.get([:instance, :invites_enabled]) &&
237 !Pleroma.Config.get([:instance, :registrations_open]),
238 {:ok, invite_token} <- Pleroma.UserInviteToken.create_token(),
240 Pleroma.UserEmail.user_invitation_email(user, invite_token, email, params["name"]),
241 {:ok, _} <- Pleroma.Mailer.deliver(email) do
242 json_response(conn, :no_content, "")
246 @doc "Get a account registeration invite token (base64 string)"
247 def get_invite_token(conn, _params) do
248 {:ok, token} = Pleroma.UserInviteToken.create_token()
254 @doc "Get a password reset token (base64 string) for given nickname"
255 def get_password_reset(conn, %{"nickname" => nickname}) do
256 (%User{local: true} = user) = User.get_by_nickname(nickname)
257 {:ok, token} = Pleroma.PasswordResetToken.create_token(user)
263 def errors(conn, {:error, :not_found}) do
269 def errors(conn, {:param_cast, _}) do
272 |> json("Invalid parameters")
275 def errors(conn, _) do
278 |> json("Something went wrong")
281 defp page_params(params) do
282 {get_page(params["page"]), get_page_size(params["page_size"])}
285 defp get_page(page_string) when is_nil(page_string), do: 1
287 defp get_page(page_string) do
288 case Integer.parse(page_string) do
294 defp get_page_size(page_size_string) when is_nil(page_size_string), do: @users_page_size
296 defp get_page_size(page_size_string) do
297 case Integer.parse(page_size_string) do
298 {page_size, _} -> page_size
299 :error -> @users_page_size