import { PersonIcon } from "@radix-ui/react-icons"; import { Log, prisma } from "@repo/db"; import { AdminForm, ConnectionHistory, ProfileForm, UserPenalties, UserReports, } from "./_components/forms"; import { Error } from "../../../../_components/Error"; import { getUserPenaltys } from "@repo/shared-components"; import { PaginatedTable } from "_components/PaginatedTable"; import { ColumnDef } from "@tanstack/react-table"; export default async function Page({ params }: { params: Promise<{ id: string }> }) { const { id } = await params; let user = await prisma.user.findUnique({ where: { id: id, }, include: { DiscordAccount: true, CanonicalUser: true, Duplicates: true, }, }); if (!user) { user = await prisma.user.findFirst({ where: { publicId: id, }, include: { DiscordAccount: true, CanonicalUser: true, Duplicates: true, }, }); } const userLog = await prisma.log.findMany({ where: { userId: user?.id, }, }); const sameIpLogs = await prisma.log.findMany({ where: { ip: { in: userLog.map((log) => log.ip).filter((ip): ip is string => ip !== null), }, userId: { not: user?.id, }, }, include: { User: true, }, }); const formerDiscordAccounts = await prisma.formerDiscordAccount.findMany({ where: { userId: user?.id, }, include: { DiscordAccount: true, }, }); if (!user) return ; const dispoSessions = await prisma.connectedDispatcher.findMany({ where: { userId: user?.id, logoutTime: { not: null, }, }, select: { loginTime: true, logoutTime: true, }, }); const totalDispoTime = dispoSessions.reduce((acc, session) => { const logoffTime = new Date(session.logoutTime!).getTime(); const logonTime = new Date(session.loginTime).getTime(); return acc + (logoffTime - logonTime); }, 0); const dispoTime = { hours: Math.floor(totalDispoTime / (1000 * 60 * 60)), minutes: Math.floor((totalDispoTime % (1000 * 60 * 60)) / (1000 * 60)), lastLogin: dispoSessions[dispoSessions.length - 1]?.loginTime, }; const pilotSessions = await prisma.connectedAircraft.findMany({ where: { userId: user?.id, logoutTime: { not: null, }, }, select: { loginTime: true, logoutTime: true, Station: true, }, }); const totalPilotTime = pilotSessions.reduce((acc, session) => { const logoffTime = new Date(session.logoutTime!).getTime(); const logonTime = new Date(session.loginTime).getTime(); return acc + (logoffTime - logonTime); }, 0); const pilotTime = { hours: Math.floor(totalPilotTime / (1000 * 60 * 60)), minutes: Math.floor((totalPilotTime % (1000 * 60 * 60)) / (1000 * 60)), lastLogin: pilotSessions[pilotSessions.length - 1]?.loginTime, }; const totalReportsReports = await prisma.report.count({ where: { reportedUserId: user?.id, }, }); const totalReports60Days = await prisma.report.count({ where: { reportedUserId: user?.id, timestamp: { gte: new Date(Date.now() - 60 * 24 * 60 * 60 * 1000), }, }, }); const totalReportsOpen = await prisma.report.count({ where: { reportedUserId: user?.id, reviewed: false, }, }); const reports = { total: totalReportsReports, open: totalReportsOpen, total60Days: totalReports60Days, }; const { openBans, openTimeban } = await getUserPenaltys(user?.id); return (

{user?.firstname} {user?.lastname} #{user?.publicId}

{new Date(user.createdAt).toLocaleString("de-DE")}

new Date(info.getValue()).toLocaleString("de-DE"), }, { header: "Aktion", accessorKey: "action", cell: ({ row }) => { const action = row.original.type; if (action !== "PROFILE_CHANGE") { return action; } else { return `${row.original.field} von "${row.original.oldValue}" zu "${row.original.newValue}"`; } }, }, { header: "IP-Adresse", accessorKey: "ip", }, { header: "Gerät", accessorKey: "browser", }, ] as ColumnDef[] } />
); }