"use client"; import { formatDistanceToNow } from "date-fns"; import { useSession } from "next-auth/react"; import { useCallback, useEffect, useId, useState } from "react"; import { Alert, AlertDescription } from "../../../components/ui/alert"; import { Badge } from "../../../components/ui/badge"; import { Button } from "../../../components/ui/button"; import { Card, CardContent, CardHeader, CardTitle, } from "../../../components/ui/card"; import { Input } from "../../../components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "../../../components/ui/select"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "../../../components/ui/table"; interface AuditLog { id: string; eventType: string; action: string; outcome: string; severity: string; userId?: string; platformUserId?: string; ipAddress?: string; userAgent?: string; country?: string; metadata?: Record; errorMessage?: string; sessionId?: string; requestId?: string; timestamp: string; user?: { id: string; email: string; name?: string; role: string; }; platformUser?: { id: string; email: string; name?: string; role: string; }; } interface AuditLogsResponse { success: boolean; data?: { auditLogs: AuditLog[]; pagination: { page: number; limit: number; totalCount: number; totalPages: number; hasNext: boolean; hasPrev: boolean; }; }; error?: string; } const eventTypeLabels: Record = { AUTHENTICATION: "Authentication", AUTHORIZATION: "Authorization", USER_MANAGEMENT: "User Management", COMPANY_MANAGEMENT: "Company Management", RATE_LIMITING: "Rate Limiting", CSRF_PROTECTION: "CSRF Protection", SECURITY_HEADERS: "Security Headers", PASSWORD_RESET: "Password Reset", PLATFORM_ADMIN: "Platform Admin", DATA_PRIVACY: "Data Privacy", SYSTEM_CONFIG: "System Config", API_SECURITY: "API Security", }; const outcomeColors: Record = { SUCCESS: "bg-green-100 text-green-800", FAILURE: "bg-red-100 text-red-800", BLOCKED: "bg-orange-100 text-orange-800", RATE_LIMITED: "bg-yellow-100 text-yellow-800", SUSPICIOUS: "bg-purple-100 text-purple-800", }; const severityColors: Record = { INFO: "bg-blue-100 text-blue-800", LOW: "bg-gray-100 text-gray-800", MEDIUM: "bg-yellow-100 text-yellow-800", HIGH: "bg-orange-100 text-orange-800", CRITICAL: "bg-red-100 text-red-800", }; export default function AuditLogsPage() { const { data: session } = useSession(); const eventTypeId = useId(); const outcomeId = useId(); const severityId = useId(); const startDateId = useId(); const endDateId = useId(); const [auditLogs, setAuditLogs] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [pagination, setPagination] = useState({ page: 1, limit: 50, totalCount: 0, totalPages: 0, hasNext: false, hasPrev: false, }); // Filter states const [filters, setFilters] = useState({ eventType: "", outcome: "", severity: "", userId: "", startDate: "", endDate: "", }); const [selectedLog, setSelectedLog] = useState(null); const [hasFetched, setHasFetched] = useState(false); const fetchAuditLogs = useCallback(async () => { if (hasFetched) return; try { setLoading(true); const params = new URLSearchParams({ page: pagination.page.toString(), limit: pagination.limit.toString(), ...filters, }); Object.keys(filters).forEach((key) => { if (!filters[key as keyof typeof filters]) { params.delete(key); } }); const response = await fetch( `/api/admin/audit-logs?${params.toString()}` ); const data: AuditLogsResponse = await response.json(); if (data.success && data.data) { setAuditLogs(data.data.auditLogs); setPagination(data.data.pagination); setError(null); setHasFetched(true); } else { setError(data.error || "Failed to fetch audit logs"); } } catch (err) { setError("An error occurred while fetching audit logs"); console.error("Audit logs fetch error:", err); } finally { setLoading(false); } }, [pagination.page, pagination.limit, filters, hasFetched]); useEffect(() => { if (session?.user?.role === "ADMIN" && !hasFetched) { fetchAuditLogs(); } }, [session?.user?.role, hasFetched, fetchAuditLogs]); // Function to refresh audit logs (for filter changes) const refreshAuditLogs = useCallback(() => { setHasFetched(false); }, []); const handleFilterChange = (key: keyof typeof filters, value: string) => { setFilters((prev) => ({ ...prev, [key]: value })); setPagination((prev) => ({ ...prev, page: 1 })); // Reset to first page refreshAuditLogs(); // Trigger fresh fetch with new filters }; const clearFilters = () => { setFilters({ eventType: "", outcome: "", severity: "", userId: "", startDate: "", endDate: "", }); refreshAuditLogs(); // Trigger fresh fetch with cleared filters }; if (session?.user?.role !== "ADMIN") { return (
You don't have permission to view audit logs. Only administrators can access this page.
); } return (

Security Audit Logs

{/* Filters */} Filters
handleFilterChange("startDate", e.target.value) } />
handleFilterChange("endDate", e.target.value)} />
{error && ( {error} )} {/* Audit Logs Table */} Audit Logs ({pagination.totalCount} total)
Timestamp Event Type Action Outcome Severity User IP Address Details {auditLogs.map((log) => ( setSelectedLog(log)} > {formatDistanceToNow(new Date(log.timestamp), { addSuffix: true, })} {eventTypeLabels[log.eventType] || log.eventType} {log.action} {log.outcome} {log.severity} {log.user?.email || log.platformUser?.email || "System"} {log.ipAddress || "N/A"} ))}
{/* Pagination */}
Showing {(pagination.page - 1) * pagination.limit + 1} to{" "} {Math.min( pagination.page * pagination.limit, pagination.totalCount )}{" "} of {pagination.totalCount} results
{/* Log Detail Modal */} {selectedLog && (

Audit Log Details

Timestamp:

{new Date(selectedLog.timestamp).toLocaleString()}

Event Type:

{eventTypeLabels[selectedLog.eventType] || selectedLog.eventType}

Action:

{selectedLog.action}

Outcome: {selectedLog.outcome}
Severity: {selectedLog.severity}
IP Address:

{selectedLog.ipAddress || "N/A"}

{selectedLog.user && (
User:

{selectedLog.user.email} ({selectedLog.user.role})

)} {selectedLog.platformUser && (
Platform User:

{selectedLog.platformUser.email} ( {selectedLog.platformUser.role})

)} {selectedLog.country && (
Country:

{selectedLog.country}

)} {selectedLog.sessionId && (
Session ID:

{selectedLog.sessionId}

)} {selectedLog.requestId && (
Request ID:

{selectedLog.requestId}

)}
{selectedLog.errorMessage && (
Error Message:

{selectedLog.errorMessage}

)} {selectedLog.userAgent && (
User Agent:

{selectedLog.userAgent}

)} {selectedLog.metadata && (
Metadata:
                    {JSON.stringify(selectedLog.metadata, null, 2)}
                  
)}
)}
); }