@@ -5,7 +5,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Admin do
|
||||
|
||||
import Mobilizon.Users.Guards
|
||||
|
||||
alias Mobilizon.{Actors, Admin, Config, Events, Instances}
|
||||
alias Mobilizon.{Actors, Admin, Config, Events, Instances, Users}
|
||||
alias Mobilizon.Actors.{Actor, Follower}
|
||||
alias Mobilizon.Admin.{ActionLog, Setting}
|
||||
alias Mobilizon.Cldr.Language
|
||||
@@ -281,6 +281,86 @@ defmodule Mobilizon.GraphQL.Resolvers.Admin do
|
||||
dgettext("errors", "You need to be logged-in and an administrator to save admin settings")}
|
||||
end
|
||||
|
||||
def update_user(_parent, %{id: id, notify: notify} = args, %{
|
||||
context: %{current_user: %User{role: role}}
|
||||
})
|
||||
when is_admin(role) do
|
||||
case Users.get_user(id) do
|
||||
nil ->
|
||||
{:error, :user_not_found}
|
||||
|
||||
%User{} = user ->
|
||||
case args |> Map.drop([:notify, :id]) |> Map.keys() do
|
||||
[] ->
|
||||
{:error, :invalid_argument}
|
||||
|
||||
[change, _] ->
|
||||
case change do
|
||||
:email -> change_email(user, Map.get(args, :email), notify)
|
||||
:role -> change_role(user, Map.get(args, :role), notify)
|
||||
:confirmed -> confirm_user(user, Map.get(args, :confirmed), notify)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def update_user(_parent, _args, _resolution) do
|
||||
{:error,
|
||||
dgettext("errors", "You need to be logged-in and an administrator to edit an user's details")}
|
||||
end
|
||||
|
||||
@spec change_email(User.t(), String.t(), boolean())
|
||||
defp change_email(%User{email: old_email} = user, new_email, notify) do
|
||||
if Authenticator.can_change_email?(user) do
|
||||
if new_email != old_email do
|
||||
if Email.Checker.valid?(new_email) do
|
||||
case Users.update_user_email(user, new_email) do
|
||||
{:ok, %User{} = user} ->
|
||||
user
|
||||
|> Email.User.send_email_reset_old_email()
|
||||
|> Email.Mailer.send_email_later()
|
||||
|
||||
user
|
||||
|> Email.User.send_email_reset_new_email()
|
||||
|> Email.Mailer.send_email_later()
|
||||
|
||||
{:ok, user}
|
||||
|
||||
{:error, %Ecto.Changeset{} = err} ->
|
||||
Logger.debug(inspect(err))
|
||||
{:error, dgettext("errors", "Failed to update user email")}
|
||||
end
|
||||
else
|
||||
{:error, dgettext("errors", "The new email doesn't seem to be valid")}
|
||||
end
|
||||
else
|
||||
{:error, dgettext("errors", "The new email must be different")}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
defp change_role(%User{role: old_role} = user, new_role, notify) do
|
||||
if old_role != new_role do
|
||||
Users.update_user(user, %{role: new_role})
|
||||
end
|
||||
end
|
||||
|
||||
defp confirm_user(%User{confirmed_at: old_confirmed_at} = user, confirmed, notify) do
|
||||
new_confirmed_at =
|
||||
cond do
|
||||
is_nil(old_confirmed_at) && confirmed ->
|
||||
DateTime.utc_now()
|
||||
|
||||
match?(%DateTime{}, old_confirmed_at) && !confirmed ->
|
||||
nil
|
||||
|
||||
true ->
|
||||
old_confirmed_at
|
||||
end
|
||||
|
||||
Users.update_user(user, %{confirmed_at: new_confirmed_at})
|
||||
end
|
||||
|
||||
@spec list_relay_followers(any(), map(), Absinthe.Resolution.t()) ::
|
||||
{:ok, Page.t(Follower.t())} | {:error, :unauthorized | :unauthenticated}
|
||||
def list_relay_followers(
|
||||
|
||||
@@ -409,5 +409,22 @@ defmodule Mobilizon.GraphQL.Schema.AdminType do
|
||||
|
||||
resolve(&Admin.save_settings/3)
|
||||
end
|
||||
|
||||
@desc """
|
||||
For an admin to update an user
|
||||
"""
|
||||
field :admin_update_user, type: :user do
|
||||
arg(:id, non_null(:id), description: "The user's ID")
|
||||
arg(:email, :string, description: "The user's new email")
|
||||
arg(:confirmed, :string, description: "Manually confirm the user's account")
|
||||
arg(:role, :user_role, description: "Set user's new role")
|
||||
|
||||
arg(:notify, :boolean,
|
||||
default_value: false,
|
||||
description: "Whether or not to notify the user of the change"
|
||||
)
|
||||
|
||||
resolve(&Admin.update_user/3)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user