@@ -246,6 +246,24 @@ Note: Available `:permission_group` is currently moderator and admin. 404 is ret | |||||
} | } | ||||
``` | ``` | ||||
## `PATCH /api/pleroma/admin/users/approve` | |||||
### Approve user | |||||
- Params: | |||||
- `nicknames`: nicknames array | |||||
- Response: | |||||
```json | |||||
{ | |||||
users: [ | |||||
{ | |||||
// user object | |||||
} | |||||
] | |||||
} | |||||
``` | |||||
## `GET /api/pleroma/admin/users/:nickname_or_id` | ## `GET /api/pleroma/admin/users/:nickname_or_id` | ||||
### Retrive the details of a user | ### Retrive the details of a user | ||||
@@ -413,6 +413,17 @@ defmodule Pleroma.ModerationLog do | |||||
def get_log_entry_message(%ModerationLog{ | def get_log_entry_message(%ModerationLog{ | ||||
data: %{ | data: %{ | ||||
"actor" => %{"nickname" => actor_nickname}, | "actor" => %{"nickname" => actor_nickname}, | ||||
"action" => "approve", | |||||
"subject" => users | |||||
} | |||||
}) do | |||||
"@#{actor_nickname} approved users: #{users_to_nicknames_string(users)}" | |||||
end | |||||
@spec get_log_entry_message(ModerationLog) :: String.t() | |||||
def get_log_entry_message(%ModerationLog{ | |||||
data: %{ | |||||
"actor" => %{"nickname" => actor_nickname}, | |||||
"nicknames" => nicknames, | "nicknames" => nicknames, | ||||
"tags" => tags, | "tags" => tags, | ||||
"action" => "tag" | "action" => "tag" | ||||
@@ -1471,6 +1471,19 @@ defmodule Pleroma.User do | |||||
end | end | ||||
end | end | ||||
def approve(users) when is_list(users) do | |||||
Repo.transaction(fn -> | |||||
Enum.map(users, fn user -> | |||||
with {:ok, user} <- approve(user), do: user | |||||
end) | |||||
end) | |||||
end | |||||
def approve(%User{} = user) do | |||||
change(user, approval_pending: false) | |||||
|> update_and_set_cache() | |||||
end | |||||
def update_notification_settings(%User{} = user, settings) do | def update_notification_settings(%User{} = user, settings) do | ||||
user | user | ||||
|> cast(%{notification_settings: settings}, []) | |> cast(%{notification_settings: settings}, []) | ||||
@@ -44,6 +44,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do | |||||
:user_toggle_activation, | :user_toggle_activation, | ||||
:user_activate, | :user_activate, | ||||
:user_deactivate, | :user_deactivate, | ||||
:user_approve, | |||||
:tag_users, | :tag_users, | ||||
:untag_users, | :untag_users, | ||||
:right_add, | :right_add, | ||||
@@ -303,6 +304,21 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do | |||||
|> render("index.json", %{users: Keyword.values(updated_users)}) | |> render("index.json", %{users: Keyword.values(updated_users)}) | ||||
end | end | ||||
def user_approve(%{assigns: %{user: admin}} = conn, %{"nicknames" => nicknames}) do | |||||
users = Enum.map(nicknames, &User.get_cached_by_nickname/1) | |||||
{:ok, updated_users} = User.approve(users) | |||||
ModerationLog.insert_log(%{ | |||||
actor: admin, | |||||
subject: users, | |||||
action: "approve" | |||||
}) | |||||
conn | |||||
|> put_view(AccountView) | |||||
|> render("index.json", %{users: updated_users}) | |||||
end | |||||
def tag_users(%{assigns: %{user: admin}} = conn, %{"nicknames" => nicknames, "tags" => tags}) do | def tag_users(%{assigns: %{user: admin}} = conn, %{"nicknames" => nicknames, "tags" => tags}) do | ||||
with {:ok, _} <- User.tag(nicknames, tags) do | with {:ok, _} <- User.tag(nicknames, tags) do | ||||
ModerationLog.insert_log(%{ | ModerationLog.insert_log(%{ | ||||
@@ -138,6 +138,7 @@ defmodule Pleroma.Web.Router do | |||||
patch("/users/:nickname/toggle_activation", AdminAPIController, :user_toggle_activation) | patch("/users/:nickname/toggle_activation", AdminAPIController, :user_toggle_activation) | ||||
patch("/users/activate", AdminAPIController, :user_activate) | patch("/users/activate", AdminAPIController, :user_activate) | ||||
patch("/users/deactivate", AdminAPIController, :user_deactivate) | patch("/users/deactivate", AdminAPIController, :user_deactivate) | ||||
patch("/users/approve", AdminAPIController, :user_approve) | |||||
put("/users/tag", AdminAPIController, :tag_users) | put("/users/tag", AdminAPIController, :tag_users) | ||||
delete("/users/tag", AdminAPIController, :untag_users) | delete("/users/tag", AdminAPIController, :untag_users) | ||||
@@ -1202,6 +1202,31 @@ defmodule Pleroma.UserTest do | |||||
end | end | ||||
end | end | ||||
describe "approve" do | |||||
test "approves a user" do | |||||
user = insert(:user, approval_pending: true) | |||||
assert true == user.approval_pending | |||||
{:ok, user} = User.approve(user) | |||||
assert false == user.approval_pending | |||||
end | |||||
test "approves a list of users" do | |||||
unapproved_users = [ | |||||
insert(:user, approval_pending: true), | |||||
insert(:user, approval_pending: true), | |||||
insert(:user, approval_pending: true) | |||||
] | |||||
{:ok, users} = User.approve(unapproved_users) | |||||
assert Enum.count(users) == 3 | |||||
Enum.each(users, fn user -> | |||||
assert false == user.approval_pending | |||||
end) | |||||
end | |||||
end | |||||
describe "delete" do | describe "delete" do | ||||
setup do | setup do | ||||
{:ok, user} = insert(:user) |> User.set_cache() | {:ok, user} = insert(:user) |> User.set_cache() | ||||
@@ -1257,6 +1257,26 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||||
"@#{admin.nickname} deactivated users: @#{user_one.nickname}, @#{user_two.nickname}" | "@#{admin.nickname} deactivated users: @#{user_one.nickname}, @#{user_two.nickname}" | ||||
end | end | ||||
test "PATCH /api/pleroma/admin/users/approve", %{admin: admin, conn: conn} do | |||||
user_one = insert(:user, approval_pending: true) | |||||
user_two = insert(:user, approval_pending: true) | |||||
conn = | |||||
patch( | |||||
conn, | |||||
"/api/pleroma/admin/users/approve", | |||||
%{nicknames: [user_one.nickname, user_two.nickname]} | |||||
) | |||||
response = json_response(conn, 200) | |||||
assert Enum.map(response["users"], & &1["approval_pending"]) == [false, false] | |||||
log_entry = Repo.one(ModerationLog) | |||||
assert ModerationLog.get_log_entry_message(log_entry) == | |||||
"@#{admin.nickname} approved users: @#{user_one.nickname}, @#{user_two.nickname}" | |||||
end | |||||
test "PATCH /api/pleroma/admin/users/:nickname/toggle_activation", %{admin: admin, conn: conn} do | test "PATCH /api/pleroma/admin/users/:nickname/toggle_activation", %{admin: admin, conn: conn} do | ||||
user = insert(:user) | user = insert(:user) | ||||