Current section
Files
Jump to
Current section
Files
templates/controllers/session.ex
defmodule <%= inspect @web_pascal_case %>.Session do
@moduledoc """
Manages user-authenticated sessions.
"""
alias <%= inspect @app_pascal_case %>.Identity
alias <%= inspect @app_pascal_case %>.Identity.User
use <%= inspect @web_pascal_case %>, :controller
def fetch_current_user(conn, _opts) do
with encoded_value when is_binary(encoded_value) <- get_session(conn, :user_token),
{:ok, decoded_value} <- Base.decode64(encoded_value, padding: false),
{:ok, %User{id: user_id}} <- Identity.get_by_token(decoded_value) do
conn
|> put_session(:user_id, user_id)
else
_error ->
conn
|> clear_session()
end
end
def create(conn, %{"value" => value}) do
decoded_value = Base.decode64!(value, padding: false)
case Identity.get_by_token(decoded_value, :session) do
{:ok, %User{id: user_id}} ->
conn
|> put_session(:user_token, value)
|> put_session(:user_id, user_id)
|> put_flash(:info, "Welcome back!")
|> redirect(to: ~p"/")
{:error, _} ->
conn
|> clear_session()
|> put_flash(:error, "Please sign in.")
|> redirect(to: ~p"/sign-in")
end
end
def delete(conn, _params) do
conn
|> get_session("user_id")
|> Identity.delete_all_user_sessions()
conn
|> clear_session()
|> put_flash(:info, "Successfully signed out.")
|> redirect(to: ~p"/")
end
end