2026-02-21 10:24:26 +00:00
|
|
|
defmodule BerrypodWeb.SetupController do
|
|
|
|
|
use BerrypodWeb, :controller
|
|
|
|
|
|
|
|
|
|
alias Berrypod.Accounts
|
|
|
|
|
alias BerrypodWeb.UserAuth
|
|
|
|
|
|
|
|
|
|
@doc """
|
|
|
|
|
Logs in a user via a setup login token.
|
|
|
|
|
|
|
|
|
|
The setup wizard generates a token after creating the admin account,
|
|
|
|
|
then redirects here to set the session cookie (LiveViews can't do that).
|
|
|
|
|
"""
|
|
|
|
|
def login(conn, %{"token" => token}) do
|
|
|
|
|
# Validate token first — login_user_by_magic_link crashes on invalid base64
|
|
|
|
|
if Accounts.get_user_by_magic_link_token(token) do
|
|
|
|
|
case Accounts.login_user_by_magic_link(token) do
|
|
|
|
|
{:ok, {user, tokens_to_disconnect}} ->
|
|
|
|
|
UserAuth.disconnect_sessions(tokens_to_disconnect)
|
|
|
|
|
|
|
|
|
|
conn
|
|
|
|
|
|> put_session(:user_return_to, ~p"/setup")
|
|
|
|
|
|> UserAuth.log_in_user(user)
|
|
|
|
|
|
|
|
|
|
_ ->
|
|
|
|
|
login_failed(conn)
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
login_failed(conn)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2026-02-21 21:40:53 +00:00
|
|
|
@doc """
|
|
|
|
|
Logs in after a successful password recovery.
|
|
|
|
|
|
|
|
|
|
Same flow as setup login — validates the token, sets the session cookie,
|
|
|
|
|
then redirects to admin.
|
|
|
|
|
"""
|
|
|
|
|
def recover_login(conn, %{"token" => token}) do
|
|
|
|
|
if Accounts.get_user_by_magic_link_token(token) do
|
|
|
|
|
case Accounts.login_user_by_magic_link(token) do
|
|
|
|
|
{:ok, {user, tokens_to_disconnect}} ->
|
|
|
|
|
UserAuth.disconnect_sessions(tokens_to_disconnect)
|
|
|
|
|
|
|
|
|
|
conn
|
|
|
|
|
|> put_session(:user_return_to, ~p"/admin")
|
|
|
|
|
|> UserAuth.log_in_user(user)
|
|
|
|
|
|
|
|
|
|
_ ->
|
|
|
|
|
recover_login_failed(conn)
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
recover_login_failed(conn)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2026-02-21 10:24:26 +00:00
|
|
|
defp login_failed(conn) do
|
|
|
|
|
conn
|
|
|
|
|
|> put_flash(:error, "Login failed — please try again.")
|
|
|
|
|
|> redirect(to: ~p"/setup")
|
|
|
|
|
end
|
2026-02-21 21:40:53 +00:00
|
|
|
|
|
|
|
|
defp recover_login_failed(conn) do
|
|
|
|
|
conn
|
|
|
|
|
|> put_flash(:error, "Recovery login failed — please try again.")
|
|
|
|
|
|> redirect(to: ~p"/recover")
|
|
|
|
|
end
|
2026-02-21 10:24:26 +00:00
|
|
|
end
|