import { and, count, desc, gte, inArray, like } from "drizzle-orm"; import Link from "next/link"; import { AvatarImage } from "@/components/shared/avatar-image"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent } from "@/components/ui/card"; import { requireModPermission } from "@/lib/admin/guard"; import { getMinStaffRank } from "@/lib/admin/min-staff-rank"; import { AdminAuditLog, db, SupportTickets, User, WebsiteTicket, } from "@/lib/db"; import { PERMS } from "@/lib/permissions"; export default async function ModTeamLitePage() { await requireModPermission([PERMS.MOD_TEAM_VIEW, PERMS.MODERATION_VIEW]); const minStaffRank = await getMinStaffRank(); const staff = await db .select({ id: User.id, username: User.username, look: User.look, rank: User.rank, online: User.online, lastLogin: User.lastLogin, lastOnline: User.lastOnline, }) .from(User) .where(gte(User.rank, minStaffRank)) .orderBy(desc(User.online), desc(User.rank)); const staffIds = staff.map((s) => s.id); const [cfhCounts, webTicketCounts, modActionCounts] = staffIds.length === 0 ? [[], [], []] : await Promise.all([ db .select({ modId: SupportTickets.modId, total: count(), }) .from(SupportTickets) .where(inArray(SupportTickets.modId, staffIds)) .groupBy(SupportTickets.modId), db .select({ assigneeId: WebsiteTicket.assigneeId, total: count(), }) .from(WebsiteTicket) .where(inArray(WebsiteTicket.assigneeId, staffIds)) .groupBy(WebsiteTicket.assigneeId), db .select({ userId: AdminAuditLog.userId, total: count(), }) .from(AdminAuditLog) .where( and( inArray(AdminAuditLog.userId, staffIds), like(AdminAuditLog.action, "mod_%"), ), ) .groupBy(AdminAuditLog.userId), ]); const cfhMap = new Map(cfhCounts.map((c) => [c.modId, c.total])); const webMap = new Map(webTicketCounts.map((c) => [c.assigneeId, c.total])); const actionMap = new Map(modActionCounts.map((c) => [c.userId, c.total])); return (

{staff.filter((s) => s.online === "1").length}

Online Now

{staff.length}

Total Staff

{staff.filter((s) => s.rank > minStaffRank).length}

Above min rank

Name Rank CFH Tickets Actions Last Seen
{staff.map((member) => (

{member.username}

Rank {member.rank}

{cfhMap.get(member.id) ?? 0}

CFH

{webMap.get(member.id) ?? 0}

Web

{actionMap.get(member.id) ?? 0}

Mod

{member.online === "1" ? "Online" : member.lastOnline ? new Date(member.lastOnline * 1000).toLocaleDateString() : "—"} ))}
); }