cover/Elixir.DaProductAppWeb.BaseLive.html

1 defmodule DaProductAppWeb.BaseLive do
2 @moduledoc """
3 Base LiveView module with common functionality for all LiveViews.
4 Handles authentication, role checking, and common assigns.
5 """
6
7 defmacro __using__(_opts) do
8 quote do
9 use DaProductAppWeb, :live_view
10
11 alias DaProductApp.Accounts
12 alias DaProductAppWeb.MenuManager
13
14 @impl true
15 def mount(_params, session, socket) do
16 case get_current_user(session) do
17 nil ->
18 {:ok, redirect(socket, to: ~p"/login")}
19
20 user ->
21 if has_access?(user) do
22 socket =
23 socket
24 |> assign(:current_user, user)
25 |> assign(:menu_items, MenuManager.get_menu_items(user))
26 |> assign(:page_title, get_page_title())
27
28 {:ok, mount_with_user(socket, user)}
29 else
30 {:ok,
31 socket
32 |> put_flash(:error, "Access denied")
33 |> redirect(to: ~p"/dashboard")}
34 end
35 end
36 end
37
38 # Override this in individual LiveViews
39 def mount_with_user(socket, _user), do: socket
40 def has_access?(_user), do: true
41 def get_page_title(), do: "Dashboard"
42
43 defoverridable mount_with_user: 2, has_access?: 1, get_page_title: 0
44
45 defp get_current_user(session) do
46 case session do
47 %{"user_id" => user_id} when is_binary(user_id) or is_integer(user_id) ->
48 Accounts.get_user!(user_id)
49 _ ->
50 nil
51 end
52 rescue
53 _ -> nil
54 end
55 end
56 end
57 end
Line Hits Source