import type { Route } from "./+types/users"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Badge } from "@/components/ui/badge"; import { ArrowLeft, Plus, Trash2, Edit, Shield, ShieldOff, UserPlus } from "lucide-react"; import { Link, Form } from "react-router"; import { db } from "@lib/db"; import { users } from "@lib/db/schema"; import { getCurrentUser } from "@lib/auth-utils"; import Layout from "@/components/layout"; import { eq } from "drizzle-orm"; import { hashPassword } from "@lib/auth"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; import { generate as generateId } from "@alikia/random-key"; import { Checkbox } from "@/components/ui/checkbox"; export function meta({}: Route.MetaArgs) { return [ { title: "User Management - Admin" }, { name: "description", content: "Manage users and permissions" } ]; } export async function loader({ request }: Route.LoaderArgs) { const user = await getCurrentUser(request); if (!user || !user.isAdmin) { throw new Response("You do not have permission to view this page", { status: 403 }); } // Fetch all users const allUsers = await db.select().from(users).orderBy(users.createdAt); return { users: allUsers, currentUser: user }; } export async function action({ request }: Route.ActionArgs) { const user = await getCurrentUser(request); if (!user || !user.isAdmin) { throw new Response("You do not have permission to view this page", { status: 403 }); } const formData = await request.formData(); const intent = formData.get("intent"); const userId = formData.get("userId") as string; if (intent === "toggleAdmin") { const targetUser = await db.select().from(users).where(eq(users.id, userId)).get(); if (!targetUser) { return { error: "User not found" }; } // Prevent self-demotion if (targetUser.id === user.id) { return { error: "Cannot change your own admin status" }; } await db .update(users) .set({ isAdmin: !targetUser.isAdmin }) .where(eq(users.id, userId)); return { success: true }; } if (intent === "deleteUser") { const targetUser = await db.select().from(users).where(eq(users.id, userId)).get(); if (!targetUser) { return { error: "User not found" }; } // Prevent self-deletion if (targetUser.id === user.id) { return { error: "Cannot delete your own account" }; } // Prevent deleting admin users if (targetUser.isAdmin) { return { error: "Cannot delete admin users" }; } await db.delete(users).where(eq(users.id, userId)); return { success: true }; } if (intent === "createUser") { const username = formData.get("username") as string; const password = formData.get("password") as string; const isAdmin = formData.get("isAdmin") === "on"; if (!username || !password) { return { error: "Username and password are required" }; } // Check if username already exists const existingUser = await db.select().from(users).where(eq(users.username, username)).get(); if (existingUser) { return { error: "Username already exists" }; } const hashedPassword = await hashPassword(password); await db.insert(users).values({ id: await generateId(6), username, password: hashedPassword, isAdmin, createdAt: new Date(), updatedAt: new Date() }); return { success: true }; } if (intent === "updateUser") { const username = formData.get("username") as string; const password = formData.get("password") as string; const isAdmin = formData.get("isAdmin") === "on"; if (!username) { return { error: "Username is required" }; } const targetUser = await db.select().from(users).where(eq(users.id, userId)).get(); if (!targetUser) { return { error: "User not found" }; } // Check if username already exists (excluding current user) const existingUser = await db.select().from(users).where(eq(users.username, username)).get(); if (existingUser && existingUser.id !== userId) { return { error: "Username already exists" }; } const updateData: any = { username, isAdmin, }; // Only update password if provided if (password) { updateData.password = await hashPassword(password); } await db .update(users) .set(updateData) .where(eq(users.id, userId)); return { success: true }; } return { error: "Unknown action" }; } export default function UserManagement({ loaderData }: Route.ComponentProps) { const { users, currentUser } = loaderData; return ( {/* Header */}

User Management

Manage users and their permissions

Add New User Create a new user account with username and password.
{/* Users Table */} Users Manage user accounts and permissions Username Admin Created Actions {users.map((user) => ( {user.username} {user.isAdmin ? ( Admin ) : ( User )} {new Date(user.createdAt).toLocaleDateString()}
Edit User Update user information and permissions.
{user.id === currentUser.id && ( (Cannot change your own admin status) )}
))}
); }