defmodule Mix.Tasks.Pleroma.User do
use Mix.Task
+ import Ecto.Changeset
alias Pleroma.{Repo, User}
+ alias Mix.Tasks.Pleroma.Common
@shortdoc "Manages Pleroma users"
@moduledoc """
## Generate an invite link.
- mix pleroma.user invite
+ mix pleroma.user invite
## Delete the user's account.
mix pleroma.user toggle_activated NICKNAME
+ ## Unsubscribe local users from user's account and deactivate it
+
+ mix pleroma.user unsubscribe NICKNAME
+
## Create a password reset link.
mix pleroma.user reset_password NICKNAME
- `--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
{options, [], []} =
OptionParser.parse(
proceed? = Mix.shell().yes?("Continue?")
unless not proceed? do
- Mix.Task.run("app.start")
+ Common.start_pleroma()
params =
%{
end
def run(["rm", nickname]) do
- Mix.Task.run("app.start")
+ Common.start_pleroma()
with %User{local: true} = user <- User.get_by_nickname(nickname) do
User.delete(user)
end
def run(["toggle_activated", nickname]) do
- Mix.Task.run("app.start")
+ Common.start_pleroma()
with %User{} = user <- User.get_by_nickname(nickname) do
User.deactivate(user, !user.info["deactivated"])
end
def run(["reset_password", nickname]) do
- Mix.Task.run("app.start")
+ Common.start_pleroma()
with %User{local: true} = user <- User.get_by_nickname(nickname),
{:ok, token} <- Pleroma.PasswordResetToken.create_token(user) do
end
def run(["unsubscribe", nickname]) do
- Mix.Task.run("app.start")
+ Common.start_pleroma()
with %User{} = user <- User.get_by_nickname(nickname) do
Mix.shell().info("Deactivating #{user.nickname}")
end
def run(["set", nickname | rest]) do
+ Common.start_pleroma()
+
{options, [], []} =
OptionParser.parse(
rest,
]
)
- case Keyword.get(options, :moderator) do
- nil -> nil
- value -> set_moderator(nickname, value)
- end
+ with %User{local: true} = user <- User.get_by_nickname(nickname) do
+ case Keyword.get(options, :moderator) do
+ nil -> nil
+ value -> set_moderator(user, value)
+ end
- case Keyword.get(options, :locked) do
- nil -> nil
- value -> set_locked(nickname, value)
- end
+ case Keyword.get(options, :locked) do
+ nil -> nil
+ value -> set_locked(user, value)
+ end
- case Keyword.get(options, :admin) do
- nil -> nil
- value -> set_admin(nickname, value)
+ case Keyword.get(options, :admin) do
+ nil -> nil
+ value -> set_admin(user, value)
+ end
+ else
+ _ ->
+ Mix.shell().error("No local user #{nickname}")
end
end
- defp set_moderator(nickname, value) do
- Application.ensure_all_started(:pleroma)
+ defp set_moderator(user, value) do
+ info_cng = User.Info.admin_api_update(user.info, %{is_moderator: value})
- with %User{local: true} = user <- User.get_by_nickname(nickname) do
- info =
- user.info
- |> Map.put("is_moderator", value)
+ user_cng =
+ Ecto.Changeset.change(user)
+ |> put_embed(:info, info_cng)
- cng = User.info_changeset(user, %{info: info})
- {:ok, user} = User.update_and_set_cache(cng)
+ {:ok, user} = User.update_and_set_cache(user_cng)
- Mix.shell().info("Moderator status of #{nickname}: #{user.info["is_moderator"]}")
- else
- _ ->
- Mix.shell().error("No local user #{nickname}")
- end
+ Mix.shell().info("Moderator status of #{user.nickname}: #{user.info.is_moderator}")
end
- defp set_admin(nickname, value) do
- Application.ensure_all_started(:pleroma)
+ defp set_admin(user, value) do
+ info_cng = User.Info.admin_api_update(user.info, %{is_admin: value})
- with %User{local: true} = user <- User.get_by_nickname(nickname) do
- info =
- user.info
- |> Map.put("is_admin", value)
+ user_cng =
+ Ecto.Changeset.change(user)
+ |> put_embed(:info, info_cng)
- cng = User.info_changeset(user, %{info: info})
- {:ok, user} = User.update_and_set_cache(cng)
+ {:ok, user} = User.update_and_set_cache(user_cng)
- Mix.shell().info("Admin status of #{nickname}: #{user.info["is_admin"]}")
- else
- _ ->
- Mix.shell().error("No local user #{nickname}")
- end
+ Mix.shell().info("Admin status of #{user.nickname}: #{user.info.is_moderator}")
+ end
+
+ defp set_locked(user, value) do
+ info_cng = User.Info.user_upgrade(user.info, %{locked: value})
+
+ user_cng =
+ Ecto.Changeset.change(user)
+ |> put_embed(:info, info_cng)
+
+ {:ok, user} = User.update_and_set_cache(user_cng)
+
+ Mix.shell().info("Locked status of #{user.nickname}: #{user.info.locked}")
end
def run(["invite"]) do
- Mix.Task.run("app.start")
+ Common.start_pleroma()
with {:ok, token} <- Pleroma.UserInviteToken.create_token() do
Mix.shell().info("Generated user invite token")
Mix.shell().error("Could not create invite token.")
end
end
-
- defp set_locked(nickname, value) do
- Mix.Ecto.ensure_started(Repo, [])
-
- with %User{local: true} = user <- User.get_by_nickname(nickname) do
- info =
- user.info
- |> Map.put("locked", value)
-
- cng = User.info_changeset(user, %{info: info})
- user = Repo.update!(cng)
-
- IO.puts("Locked status of #{nickname}: #{user.info["locked"]}")
- else
- _ ->
- IO.puts("No local user #{nickname}")
- end
- end
end