78 lines
2.3 KiB
Elixir
78 lines
2.3 KiB
Elixir
defmodule BeetRoundServerWeb.AdminSettingsController do
|
|
use BeetRoundServerWeb, :controller
|
|
|
|
alias BeetRoundServer.Admins
|
|
alias BeetRoundServerWeb.AdminAuth
|
|
|
|
import BeetRoundServerWeb.AdminAuth, only: [require_sudo_mode: 2]
|
|
|
|
plug :require_sudo_mode
|
|
plug :assign_email_and_password_changesets
|
|
|
|
def edit(conn, _params) do
|
|
render(conn, :edit)
|
|
end
|
|
|
|
def update(conn, %{"action" => "update_email"} = params) do
|
|
%{"admin" => admin_params} = params
|
|
admin = conn.assigns.current_scope.admin
|
|
|
|
case Admins.change_admin_email(admin, admin_params) do
|
|
%{valid?: true} = changeset ->
|
|
Admins.deliver_admin_update_email_instructions(
|
|
Ecto.Changeset.apply_action!(changeset, :insert),
|
|
admin.email,
|
|
&url(~p"/admins/settings/confirm-email/#{&1}")
|
|
)
|
|
|
|
conn
|
|
|> put_flash(
|
|
:info,
|
|
"A link to confirm your email change has been sent to the new address."
|
|
)
|
|
|> redirect(to: ~p"/admins/settings")
|
|
|
|
changeset ->
|
|
render(conn, :edit, email_changeset: %{changeset | action: :insert})
|
|
end
|
|
end
|
|
|
|
def update(conn, %{"action" => "update_password"} = params) do
|
|
%{"admin" => admin_params} = params
|
|
admin = conn.assigns.current_scope.admin
|
|
|
|
case Admins.update_admin_password(admin, admin_params) do
|
|
{:ok, {admin, _}} ->
|
|
conn
|
|
|> put_flash(:info, "Password updated successfully.")
|
|
|> put_session(:admin_return_to, ~p"/admins/settings")
|
|
|> AdminAuth.log_in_admin(admin)
|
|
|
|
{:error, changeset} ->
|
|
render(conn, :edit, password_changeset: changeset)
|
|
end
|
|
end
|
|
|
|
def confirm_email(conn, %{"token" => token}) do
|
|
case Admins.update_admin_email(conn.assigns.current_scope.admin, token) do
|
|
{:ok, _admin} ->
|
|
conn
|
|
|> put_flash(:info, "Email changed successfully.")
|
|
|> redirect(to: ~p"/admins/settings")
|
|
|
|
{:error, _} ->
|
|
conn
|
|
|> put_flash(:error, "Email change link is invalid or it has expired.")
|
|
|> redirect(to: ~p"/admins/settings")
|
|
end
|
|
end
|
|
|
|
defp assign_email_and_password_changesets(conn, _opts) do
|
|
admin = conn.assigns.current_scope.admin
|
|
|
|
conn
|
|
|> assign(:email_changeset, Admins.change_admin_email(admin))
|
|
|> assign(:password_changeset, Admins.change_admin_password(admin))
|
|
end
|
|
end
|