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)
30 %{"nickname" => nickname, "email" => email, "password" => password}
37 password_confirmation: password,
41 changeset = User.register_changeset(%User{}, user_data, confirmed: true)
42 {:ok, user} = User.register(changeset)
45 |> json(user.nickname)
48 def user_show(conn, %{"nickname" => nickname}) do
49 with %User{} = user <- User.get_by_nickname(nickname) do
51 |> json(AccountView.render("show.json", %{user: user}))
53 _ -> {:error, :not_found}
57 def user_toggle_activation(conn, %{"nickname" => nickname}) do
58 user = User.get_by_nickname(nickname)
60 {:ok, updated_user} = User.deactivate(user, !user.info.deactivated)
63 |> json(AccountView.render("show.json", %{user: updated_user}))
66 def tag_users(conn, %{"nicknames" => nicknames, "tags" => tags}) do
67 with {:ok, _} <- User.tag(nicknames, tags),
68 do: json_response(conn, :no_content, "")
71 def untag_users(conn, %{"nicknames" => nicknames, "tags" => tags}) do
72 with {:ok, _} <- User.untag(nicknames, tags),
73 do: json_response(conn, :no_content, "")
76 def list_users(conn, params) do
77 {page, page_size} = page_params(params)
78 filters = maybe_parse_filters(params["filters"])
81 query: params["query"],
86 with {:ok, users, count} <- Search.user(Map.merge(search_params, filters)),
90 AccountView.render("index.json",
98 @filters ~w(local external active deactivated)
100 defp maybe_parse_filters(filters) when is_nil(filters) or filters == "", do: %{}
102 @spec maybe_parse_filters(String.t()) :: %{required(String.t()) => true} | %{}
103 defp maybe_parse_filters(filters) do
106 |> Enum.filter(&Enum.member?(@filters, &1))
107 |> Enum.map(&String.to_atom(&1))
108 |> Enum.into(%{}, &{&1, true})
111 def right_add(conn, %{"permission_group" => permission_group, "nickname" => nickname})
112 when permission_group in ["moderator", "admin"] do
113 user = User.get_by_nickname(nickname)
117 |> Map.put("is_" <> permission_group, true)
119 info_cng = User.Info.admin_api_update(user.info, info)
123 |> Ecto.Changeset.change()
124 |> Ecto.Changeset.put_embed(:info, info_cng)
126 {:ok, _user} = User.update_and_set_cache(cng)
131 def right_add(conn, _) do
134 |> json(%{error: "No such permission_group"})
137 def right_get(conn, %{"nickname" => nickname}) do
138 user = User.get_by_nickname(nickname)
142 is_moderator: user.info.is_moderator,
143 is_admin: user.info.is_admin
148 %{assigns: %{user: %User{:nickname => admin_nickname}}} = conn,
150 "permission_group" => permission_group,
151 "nickname" => nickname
154 when permission_group in ["moderator", "admin"] do
155 if admin_nickname == nickname do
158 |> json(%{error: "You can't revoke your own admin status."})
160 user = User.get_by_nickname(nickname)
164 |> Map.put("is_" <> permission_group, false)
166 info_cng = User.Info.admin_api_update(user.info, info)
169 Ecto.Changeset.change(user)
170 |> Ecto.Changeset.put_embed(:info, info_cng)
172 {:ok, _user} = User.update_and_set_cache(cng)
178 def right_delete(conn, _) do
181 |> json(%{error: "No such permission_group"})
184 def set_activation_status(conn, %{"nickname" => nickname, "status" => status}) do
185 with {:ok, status} <- Ecto.Type.cast(:boolean, status),
186 %User{} = user <- User.get_by_nickname(nickname),
187 {:ok, _} <- User.deactivate(user, !status),
188 do: json_response(conn, :no_content, "")
191 def relay_follow(conn, %{"relay_url" => target}) do
192 with {:ok, _message} <- Relay.follow(target) do
202 def relay_unfollow(conn, %{"relay_url" => target}) do
203 with {:ok, _message} <- Relay.unfollow(target) do
213 @doc "Sends registration invite via email"
214 def email_invite(%{assigns: %{user: user}} = conn, %{"email" => email} = params) do
216 Pleroma.Config.get([:instance, :invites_enabled]) &&
217 !Pleroma.Config.get([:instance, :registrations_open]),
218 {:ok, invite_token} <- Pleroma.UserInviteToken.create_token(),
220 Pleroma.UserEmail.user_invitation_email(user, invite_token, email, params["name"]),
221 {:ok, _} <- Pleroma.Mailer.deliver(email) do
222 json_response(conn, :no_content, "")
226 @doc "Get a account registeration invite token (base64 string)"
227 def get_invite_token(conn, _params) do
228 {:ok, token} = Pleroma.UserInviteToken.create_token()
234 @doc "Get a password reset token (base64 string) for given nickname"
235 def get_password_reset(conn, %{"nickname" => nickname}) do
236 (%User{local: true} = user) = User.get_by_nickname(nickname)
237 {:ok, token} = Pleroma.PasswordResetToken.create_token(user)
243 def errors(conn, {:error, :not_found}) do
249 def errors(conn, {:param_cast, _}) do
252 |> json("Invalid parameters")
255 def errors(conn, _) do
258 |> json("Something went wrong")
261 defp page_params(params) do
262 {get_page(params["page"]), get_page_size(params["page_size"])}
265 defp get_page(page_string) when is_nil(page_string), do: 1
267 defp get_page(page_string) do
268 case Integer.parse(page_string) do
274 defp get_page_size(page_size_string) when is_nil(page_size_string), do: @users_page_size
276 defp get_page_size(page_size_string) do
277 case Integer.parse(page_size_string) do
278 {page_size, _} -> page_size
279 :error -> @users_page_size