--- import AdminLayout from "@/layouts/AdminLayout.astro"; import { getDatabase, schema } from "@/db"; import { desc, eq, like, or, sql } from "drizzle-orm"; import type { NodePgDatabase } from "drizzle-orm/node-postgres"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Users as UsersIcon, Shield, Ban, CheckCircle, Search, ChevronLeft, ChevronRight, } from "lucide-react"; const user = Astro.locals.user; // Only admins can access if (!user?.isAdmin) { return Astro.redirect("/"); } const db = getDatabase() as NodePgDatabase; const searchQuery = Astro.url.searchParams.get("q") || ""; const page = parseInt(Astro.url.searchParams.get("page") || "1"); const limit = 20; const offset = (page - 1) * limit; // Build query conditions let whereCondition = undefined; if (searchQuery) { whereCondition = or( like(schema.users.username, `%${searchQuery}%`), like(schema.users.email, `%${searchQuery}%`), like(schema.users.displayName, `%${searchQuery}%`), ); } // Fetch users const [users, totalResult] = await Promise.all([ db.query.users.findMany({ where: whereCondition, orderBy: [desc(schema.users.createdAt)], limit, offset, }), db .select({ count: sql`count(*)` }) .from(schema.users) .where(whereCondition) .limit(1), ]); const total = Number(totalResult[0]?.count) || 0; const totalPages = Math.ceil(total / limit); // Stats const [totalUsersResult, activeUsersResult, adminUsersResult] = await Promise.all([ db .select({ count: sql`count(*)` }) .from(schema.users) .limit(1), db .select({ count: sql`count(*)` }) .from(schema.users) .where(eq(schema.users.isActive, true)) .limit(1), db .select({ count: sql`count(*)` }) .from(schema.users) .where(eq(schema.users.isAdmin, true)) .limit(1), ]); const totalUsers = Number(totalUsersResult[0]?.count) || 0; const activeUsers = Number(activeUsersResult[0]?.count) || 0; const adminUsers = Number(adminUsersResult[0]?.count) || 0; ---

User Management

Manage all registered users

← Back to Dashboard

Total Users

{totalUsers}

Active

{activeUsers}

Admins

{adminUsers}

Users ({total})
{ users.map((u: typeof users[number]) => ( )) }
User Email Status Role Joined Actions
{u.avatarUrl ? ( {u.username} ) : (
{u.username.charAt(0).toUpperCase()}
)}
{u.email} {u.isActive ? ( Active ) : ( Banned )} {u.isAdmin ? ( Admin ) : ( User )} {new Date(u.createdAt).toLocaleDateString()}
{u.id !== user.id && ( <> )}
{/* Pagination */} { totalPages > 1 && (
Showing {offset + 1} - {Math.min(offset + limit, total)} of{" "} {total}
{page > 1 && ( )} Page {page} of {totalPages} {page < totalPages && ( )}
) }