defmodule DaProductAppWeb.UserManagementLive do use DaProductAppWeb, :live_view alias DaProductApp.Users alias DaProductApp.Users.User @impl true def mount(_params, _session, socket) do # Check if user has permission to manage users if authorized?(socket.assigns.current_user) do socket = socket |> assign(:users, list_users()) |> assign(:modules, Users.list_modules()) |> assign(:permissions, Users.list_permissions()) {:ok, socket} else {:ok, socket |> put_flash(:error, "You don't have permission to access this page.")} end end @impl true def handle_event("delete_user", %{"id" => id}, socket) do if authorized?(socket.assigns.current_user) do user = Users.get_user!(id) {:ok, _} = Users.delete_user(user) socket = socket |> assign(:users, list_users()) |> put_flash(:info, "User deleted successfully") {:noreply, socket} else {:noreply, socket |> put_flash(:error, "You don't have permission to perform this action.")} end end @impl true def handle_event("toggle_user_role", %{"id" => id, "role" => role}, socket) do if authorized?(socket.assigns.current_user) do user = Users.get_user!(id) allowed_roles = ["user", "admin", "superuser"] if role in allowed_roles do new_role = String.to_atom(role) case Users.update_user(user, %{role: new_role}) do {:ok, _user} -> socket = socket |> assign(:users, list_users()) |> put_flash(:info, "User role updated successfully") {:noreply, socket} {:error, _changeset} -> {:noreply, socket |> put_flash(:error, "Failed to update user role")} end else {:noreply, socket |> put_flash(:error, "Invalid role provided.")} end else {:noreply, socket |> put_flash(:error, "You don't have permission to perform this action.")} end end @impl true def render(assigns) do ~H"""
<.header class="text-center"> User Management <:subtitle> Manage users, roles, and permissions

All Users

List of all registered users and their roles

Name Email Role Status Actions
<%= user.name || "#{user.first_name} #{user.last_name}" %>
<%= user.email %>
if user.confirmed_at, do: "bg-green-100 text-green-800", else: "bg-yellow-100 text-yellow-800"}> <%= if user.confirmed_at, do: "Confirmed", else: "Pending" %> <.button phx-click="delete_user" phx-value-id={user.id} data-confirm="Are you sure you want to delete this user?" class="text-red-600 hover:text-red-900 text-sm" > Delete

System Modules

Available system modules and their permissions

<%= module.name %>
<%= module.description %>
""" end defp authorized?(user) do Users.user_has_permission?(user, "manage_users") || user.role in [:admin, :superuser] end defp list_users do Users.list_users() end end