DELETE /api/pleroma/admin/users now accepts nicknames array
authorMaxim Filippov <colixer@gmail.com>
Tue, 15 Oct 2019 15:33:29 +0000 (17:33 +0200)
committerMaxim Filippov <colixer@gmail.com>
Tue, 15 Oct 2019 15:33:29 +0000 (17:33 +0200)
1  2 
CHANGELOG.md
docs/API/admin_api.md
lib/pleroma/moderation_log.ex
lib/pleroma/user.ex
lib/pleroma/web/admin_api/admin_api_controller.ex
test/moderation_log_test.exs
test/web/admin_api/admin_api_controller_test.exs

diff --cc CHANGELOG.md
index 30b765251cc7b0ede0bd723b836d0a858a8a7cdf,e3ccfa4ea696cf33512175bd9a3d84709b964eb4..24876d3f2b08fc2909c09bc03b8295b72acd0371
@@@ -17,8 -17,7 +17,9 @@@ The format is based on [Keep a Changelo
  - Authentication: Added rate limit for password-authorized actions / login existence checks
  - Metadata Link: Atom syndication Feed
  - Mix task to re-count statuses for all users (`mix pleroma.count_statuses`)
- - Admin API: `POST /api/pleroma/admin/users/:nickname/permission_group/:permission_group` / `DELETE /api/pleroma/admin/users/:nickname/permission_group/:permission_group` are deprecated in favor of: `POST /api/pleroma/admin/users/permission_group/:permission_group` / `DELETE /api/pleroma/admin/users/permission_group/:permission_group` (both accept `nicknames` array)
+ - Mastodon API: Add `exclude_visibilities` parameter to the timeline and notification endpoints
 +- Admin API: `/users/:nickname/toggle_activation` endpoint is now deprecated in favor of: `/users/activate`, `/users/deactivate`, both accept `nicknames` array
++- Admin API: `POST/DELETE /api/pleroma/admin/users/:nickname/permission_group/:permission_group` are deprecated in favor of: `POST/DELETE /api/pleroma/admin/users/permission_group/:permission_group` (both accept `nicknames` array), `DELETE /api/pleroma/admin/users` (`nickname` query param or `nickname` sent in JSON body) is deprecated in favor of: `DELETE /api/pleroma/admin/users` (`nicknames` query array param or `nicknames` sent in JSON body).
  
  ### Changed
  - **Breaking:** Elixir >=1.8 is now required (was >= 1.7)
index 2c8237b57f3bbf1c78964cd437d9171f45fc56b7,ee9e68cb1456c79c3231fa9a259e9dddbdfbbacb..60755e40a755053773683483289c1463588fd5b1
@@@ -47,7 -47,7 +47,7 @@@ Authentication is required and the use
  }
  ```
  
--## `/api/pleroma/admin/users`
++## DEPRECATED `DELETE /api/pleroma/admin/users`
  
  ### Remove a user
  
    - `nickname`
  - Response: User’s nickname
  
++## `DELETE /api/pleroma/admin/users`
++
++### Remove a user
++
++- Method `DELETE`
++- Params:
++  - `nicknames`
++- Response: Array of user nicknames
++
  ### Create a user
  
  - Method: `POST`
index 42649ff02b6a421646dbaf25a8deee15f309f211,352cad4335a40f9c1beea6ac5c2b258191527b72..e8884e6e81c01bf15a3e0247fb4320831647af1c
@@@ -352,10 -349,10 +352,10 @@@ defmodule Pleroma.ModerationLog d
          data: %{
            "actor" => %{"nickname" => actor_nickname},
            "action" => "delete",
--          "subject" => %{"nickname" => subject_nickname, "type" => "user"}
++          "subject" => subjects
          }
        }) do
--    "@#{actor_nickname} deleted user @#{subject_nickname}"
++    "@#{actor_nickname} deleted users: #{users_to_nicknames_string(subjects)}"
    end
  
    @spec get_log_entry_message(ModerationLog) :: String.t()
index a76a5ad702415717d88855deefcb2f1ed9a4aca4,2cfb13a8c0164b2b4f1989fae7bdc6a666202c0e..596584062dff3d5f52631726b5441f8b5186c1d2
@@@ -1080,6 -1072,6 +1080,10 @@@ defmodule Pleroma.User d
      update_info(user, &User.Info.update_notification_settings(&1, settings))
    end
  
++  def delete(users) when is_list(users) do
++    for user <- users, do: delete(user)
++  end
++
    def delete(%User{} = user) do
      BackgroundWorker.enqueue("delete_user", %{"user_id" => user.id})
    end
index 33e2180ec05e9ded842e3904d2cc5c8933596b9b,513bae80060bc5506a1708bee93b99f357bb6ce6..ab0d0fe0a4f976ea6f5bbe64b7e0d9fab6f45009
@@@ -100,7 -98,7 +100,7 @@@ defmodule Pleroma.Web.AdminAPI.AdminAPI
  
      ModerationLog.insert_log(%{
        actor: admin,
--      subject: user,
++      subject: [user],
        action: "delete"
      })
  
      |> json(nickname)
    end
  
++  def user_delete(%{assigns: %{user: admin}} = conn, %{"nicknames" => nicknames}) do
++    users = nicknames |> Enum.map(&User.get_cached_by_nickname/1)
++    User.delete(users)
++
++    ModerationLog.insert_log(%{
++      actor: admin,
++      subject: users,
++      action: "delete"
++    })
++
++    conn
++    |> json(nicknames)
++  end
++
    def user_follow(%{assigns: %{user: admin}} = conn, %{
          "follower" => follower_nick,
          "followed" => followed_nick
index ead97e94886d4c8dd0fe9feaae45fdf696526fa3,a39a00e0221ff2b3e8265540da28ab53980ec4a1..81c0fef12766f3d0ef8f55e1dd8fea0206261bd6
@@@ -24,13 -24,13 +24,13 @@@ defmodule Pleroma.ModerationLogTest d
        {:ok, _} =
          ModerationLog.insert_log(%{
            actor: moderator,
--          subject: subject1,
++          subject: [subject1],
            action: "delete"
          })
  
        log = Repo.one(ModerationLog)
  
--      assert log.data["message"] == "@#{moderator.nickname} deleted user @#{subject1.nickname}"
++      assert log.data["message"] == "@#{moderator.nickname} deleted users: @#{subject1.nickname}"
      end
  
      test "logging user creation by moderator", %{
index 81dc5d101d6216ab39a9ab143c399f683db1d42b,b5c355e66f3eb9c36f6ad41bf676306f8f518c26..645b79f5776a55be5b665e18c4ef5446f8cd32cc
@@@ -17,8 -17,8 +17,8 @@@ defmodule Pleroma.Web.AdminAPI.AdminAPI
    alias Pleroma.Web.MediaProxy
    import Pleroma.Factory
  
--  describe "/api/pleroma/admin/users" do
--    test "Delete" do
++  describe "DELETE /api/pleroma/admin/users" do
++    test "single user" do
        admin = insert(:user, info: %{is_admin: true})
        user = insert(:user)
  
  
        log_entry = Repo.one(ModerationLog)
  
--      assert log_entry.data["subject"]["nickname"] == user.nickname
--      assert log_entry.data["action"] == "delete"
--
        assert ModerationLog.get_log_entry_message(log_entry) ==
--               "@#{admin.nickname} deleted user @#{user.nickname}"
++               "@#{admin.nickname} deleted users: @#{user.nickname}"
  
        assert json_response(conn, 200) == user.nickname
      end
  
++    test "multiple users" do
++      admin = insert(:user, info: %{is_admin: true})
++      user_one = insert(:user)
++      user_two = insert(:user)
++
++      conn =
++        build_conn()
++        |> assign(:user, admin)
++        |> put_req_header("accept", "application/json")
++        |> delete("/api/pleroma/admin/users", %{
++          nicknames: [user_one.nickname, user_two.nickname]
++        })
++
++      log_entry = Repo.one(ModerationLog)
++
++      assert ModerationLog.get_log_entry_message(log_entry) ==
++               "@#{admin.nickname} deleted users: @#{user_one.nickname}, @#{user_two.nickname}"
++
++      response = json_response(conn, 200)
++      assert response -- [user_one.nickname, user_two.nickname] == []
++    end
++  end
++
++  describe "/api/pleroma/admin/users" do
      test "Create" do
        admin = insert(:user, info: %{is_admin: true})