prop/lib/microwaveprop_web/controllers/user_settings_controller.ex
Graham McIntire fb49eb016d
feat(monitors): schema migration + remove user self-service creation
- Add hardware/config fields migration to beacon_monitors table
- Update BeaconMonitor schema with provision/config changesets
- Add context functions: create_hardware, update_config, list_all_monitors
- Remove user-facing monitor creation (browser POST + API POST)
- Update settings page: show assigned monitors table with hardware info
- Update profile page: show assigned monitors, remove register links
- Fix all tests to match new API
2026-07-21 18:28:51 -05:00

115 lines
3.5 KiB
Elixir

defmodule MicrowavepropWeb.UserSettingsController do
use MicrowavepropWeb, :controller
import MicrowavepropWeb.UserAuth, only: [require_sudo_mode: 2]
alias Microwaveprop.Accounts
alias Microwaveprop.BeaconMonitors
alias MicrowavepropWeb.UserAuth
plug :require_sudo_mode
plug :assign_email_and_password_changesets
plug :assign_home_qth_changeset
plug :assign_beacon_monitors
plug :assign_api_tokens
@spec edit(Plug.Conn.t(), map()) :: Plug.Conn.t()
def edit(conn, _params) do
render(conn, :edit)
end
@spec update(Plug.Conn.t(), map()) :: Plug.Conn.t()
def update(conn, %{"action" => "update_email"} = params) do
%{"user" => user_params} = params
user = conn.assigns.current_scope.user
case Accounts.change_user_email(user, user_params) do
%{valid?: true} = changeset ->
_ =
Accounts.deliver_user_update_email_instructions(
Ecto.Changeset.apply_action!(changeset, :insert),
user.email,
&url(~p"/users/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"/users/settings")
changeset ->
render(conn, :edit, email_changeset: %{changeset | action: :insert})
end
end
def update(conn, %{"action" => "update_home_qth"} = params) do
%{"user" => user_params} = params
user = conn.assigns.current_scope.user
case Accounts.update_user_home_qth(user, user_params) do
{:ok, _user} ->
conn
|> put_flash(:info, "Home QTH updated.")
|> redirect(to: ~p"/users/settings")
{:error, changeset} ->
render(conn, :edit, home_qth_changeset: changeset)
end
end
def update(conn, %{"action" => "update_password"} = params) do
%{"user" => user_params} = params
user = conn.assigns.current_scope.user
case Accounts.update_user_password(user, user_params) do
{:ok, {user, _}} ->
conn
|> put_flash(:info, "Password updated successfully.")
|> put_session(:user_return_to, ~p"/users/settings")
|> UserAuth.log_in_user(user)
{:error, changeset} ->
render(conn, :edit, password_changeset: changeset)
end
end
@spec confirm_email(Plug.Conn.t(), map()) :: Plug.Conn.t()
def confirm_email(conn, %{"token" => token}) do
case Accounts.update_user_email(conn.assigns.current_scope.user, token) do
{:ok, _user} ->
conn
|> put_flash(:info, "Email changed successfully.")
|> redirect(to: ~p"/users/settings")
{:error, _} ->
conn
|> put_flash(:error, "Email change link is invalid or it has expired.")
|> redirect(to: ~p"/users/settings")
end
end
defp assign_email_and_password_changesets(conn, _opts) do
user = conn.assigns.current_scope.user
conn
|> assign(:email_changeset, Accounts.change_user_email(user))
|> assign(:password_changeset, Accounts.change_user_password(user))
end
defp assign_home_qth_changeset(conn, _opts) do
user = conn.assigns.current_scope.user
assign(conn, :home_qth_changeset, Accounts.change_user_home_qth(user))
end
defp assign_beacon_monitors(conn, _opts) do
user = conn.assigns.current_scope.user
assign(conn, :beacon_monitors, BeaconMonitors.list_monitors_for_user(user))
end
defp assign_api_tokens(conn, _opts) do
user = conn.assigns.current_scope.user
assign(conn, :api_tokens, Accounts.list_api_tokens(user))
end
end