Files

101 lines
2.4 KiB
Elixir

defmodule DexiWeb.UserAuth do
@moduledoc false
use DexiWeb, :verified_routes
import Plug.Conn
import Phoenix.Controller
alias Dexi.Accounts
alias Dexi.Accounts.Scope
def fetch_current_scope(conn, _opts) do
user = conn |> get_session(:user_pubkey) |> Accounts.get_user_by_pubkey()
assign(conn, :current_scope, Scope.for_user(user))
end
def log_in_user(conn, user) do
delete_csrf_token()
conn
|> configure_session(renew: true)
|> clear_session()
|> put_session(:user_pubkey, user.pubkey)
end
def log_out_user(conn) do
if live_socket_id = get_session(conn, :live_socket_id) do
DexiWeb.Endpoint.broadcast(live_socket_id, "disconnect", %{})
end
delete_csrf_token()
conn
|> configure_session(renew: true)
|> clear_session()
end
def require_authenticated_user(conn, _opts) do
if conn.assigns.current_scope.user do
conn
else
conn
|> put_flash(:error, "Log in to continue.")
|> redirect(to: ~p"/login")
|> halt()
end
end
def require_admin(conn, _opts) do
case conn.assigns.current_scope.user do
%{role: :admin} ->
conn
_not_admin ->
conn
|> put_flash(:error, "You do not have access to that page.")
|> redirect(to: ~p"/")
|> halt()
end
end
def on_mount(:mount_current_scope, _params, session, socket) do
{:cont, mount_current_scope(socket, session)}
end
def on_mount(:require_authenticated, _params, session, socket) do
socket = mount_current_scope(socket, session)
if socket.assigns.current_scope.user do
{:cont, socket}
else
{:halt,
socket
|> Phoenix.LiveView.put_flash(:error, "Log in to continue.")
|> Phoenix.LiveView.redirect(to: ~p"/login")}
end
end
def on_mount(:require_admin, _params, session, socket) do
socket = mount_current_scope(socket, session)
case socket.assigns.current_scope.user do
%{role: :admin} ->
{:cont, socket}
_not_admin ->
{:halt,
socket
|> Phoenix.LiveView.put_flash(:error, "You do not have access to that page.")
|> Phoenix.LiveView.redirect(to: ~p"/")}
end
end
defp mount_current_scope(socket, session) do
Phoenix.Component.assign_new(socket, :current_scope, fn ->
user = session |> Map.get("user_pubkey") |> Accounts.get_user_by_pubkey()
Scope.for_user(user)
end)
end
end