Add admin option to pleroma.user new. Add user existence checking to toggle_activated
[akkoma] / lib / mix / tasks / pleroma / user.ex
index c20fecaa1a1a5a43803c4f1d4b5fdf8d5b94107e..40d9208660688521ef08679bd7a28aa715907a34 100644 (file)
@@ -15,6 +15,7 @@ defmodule Mix.Tasks.Pleroma.User do
   - `--bio BIO` - the user's bio
   - `--password PASSWORD` - the user's password
   - `--moderator`/`--no-moderator` - whether the user is a moderator
+  - `--admin`/`--no-admin` - whether the user is an admin
 
   ## Delete the user's account.
 
@@ -35,6 +36,7 @@ defmodule Mix.Tasks.Pleroma.User do
   Options:
   - `--locked`/`--no-locked` - whether the user's account is locked
   - `--moderator`/`--no-moderator` - whether the user is a moderator
+  - `--admin`/`--no-admin` - whether the user is an admin
   """
 
   def run(["new", nickname, email | rest]) do
@@ -45,7 +47,8 @@ defmodule Mix.Tasks.Pleroma.User do
           name: :string,
           bio: :string,
           password: :string,
-          moderator: :boolean
+          moderator: :boolean,
+          admin: :boolean
         ]
       )
 
@@ -62,6 +65,7 @@ defmodule Mix.Tasks.Pleroma.User do
       end
 
     moderator? = Keyword.get(options, :moderator, false)
+    admin? = Keyword.get(options, :admin, false)
 
     Mix.shell().info("""
     A user will be created with the following information:
@@ -73,6 +77,7 @@ defmodule Mix.Tasks.Pleroma.User do
       - name: #{name}
       - bio: #{bio}
       - moderator: #{if(moderator?, do: "true", else: "false")}
+      - admin: #{if(admin?, do: "true", else: "false")}
     """)
 
     proceed? = Mix.shell().yes?("Continue?")
@@ -100,9 +105,14 @@ defmodule Mix.Tasks.Pleroma.User do
         run(["set", nickname, "--moderator"])
       end
 
+      if admin? do
+        run(["set", nickname, "--admin"])
+      end
+
       if generated_password? do
         run(["reset_password", nickname])
       end
+
     else
       Mix.shell().info("User will not be created.")
     end
@@ -113,16 +123,22 @@ defmodule Mix.Tasks.Pleroma.User do
 
     with %User{local: true} = user <- User.get_by_nickname(nickname) do
       User.delete(user)
+      Mix.shell().info("User #{nickname} deleted.")
+    else
+      _ ->
+        Mix.shell().error("No local user #{nickname}")
     end
-
-    Mix.shell().info("User #{nickname} deleted.")
   end
 
   def run(["toggle_activated", nickname]) do
     Mix.Task.run("app.start")
 
-    with user <- User.get_by_nickname(nickname) do
-      User.deactivate(user)
+    with %User{local: true} = user <- User.get_by_nickname(nickname) do
+      User.deactivate(user, !user.info["deactivated"])
+      Mix.shell().info("Activation status of #{nickname}: #{user.info["deactivated"]}")
+    else
+      _ ->
+        Mix.shell().error("No local user #{nickname}")
     end
   end
 
@@ -154,6 +170,7 @@ defmodule Mix.Tasks.Pleroma.User do
         rest,
         strict: [
           moderator: :boolean,
+          admin: :boolean,
           locked: :boolean
         ]
       )
@@ -167,6 +184,11 @@ defmodule Mix.Tasks.Pleroma.User do
       nil -> nil
       value -> set_locked(nickname, value)
     end
+
+    case Keyword.get(options, :admin) do
+      nil -> nil
+      value -> set_admin(nickname, value)
+    end
   end
 
   defp set_moderator(nickname, value) do
@@ -187,6 +209,24 @@ defmodule Mix.Tasks.Pleroma.User do
     end
   end
 
+  defp set_admin(nickname, value) do
+    Application.ensure_all_started(:pleroma)
+
+    with %User{local: true} = user <- User.get_by_nickname(nickname) do
+      info =
+        user.info
+        |> Map.put("is_admin", value)
+
+      cng = User.info_changeset(user, %{info: info})
+      {:ok, user} = User.update_and_set_cache(cng)
+
+      Mix.shell().info("Admin status of #{nickname}: #{user.info["is_admin"]}")
+    else
+      _ ->
+        Mix.shell().error("No local user #{nickname}")
+    end
+  end
+
   defp set_locked(nickname, value) do
     Mix.Ecto.ensure_started(Repo, [])