"use client"; import { Activity, AlertTriangle, Bell, BellOff, CheckCircle, Download, Settings, Shield, } from "lucide-react"; import { useCallback, useEffect, useState } from "react"; import { SecurityConfigModal } from "@/components/security/SecurityConfigModal"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; interface SecurityMetrics { totalEvents: number; criticalEvents: number; activeAlerts: number; resolvedAlerts: number; securityScore: number; threatLevel: string; eventsByType: Record; alertsByType: Record; topThreats: Array<{ type: string; count: number }>; geoDistribution: Record; timeDistribution: Array<{ hour: number; count: number }>; userRiskScores: Array<{ userId: string; email: string; riskScore: number }>; } interface SecurityAlert { id: string; timestamp: string; severity: string; type: string; title: string; description: string; eventType: string; context: Record; metadata: Record; acknowledged: boolean; } /** * Custom hook for security monitoring state */ function useSecurityMonitoringState() { const [metrics, setMetrics] = useState(null); const [alerts, setAlerts] = useState([]); const [loading, setLoading] = useState(true); const [selectedTimeRange, setSelectedTimeRange] = useState("24h"); const [showConfig, setShowConfig] = useState(false); const [autoRefresh, setAutoRefresh] = useState(true); return { metrics, setMetrics, alerts, setAlerts, loading, setLoading, selectedTimeRange, setSelectedTimeRange, showConfig, setShowConfig, autoRefresh, setAutoRefresh, }; } /** * Custom hook for security data fetching */ function useSecurityData(selectedTimeRange: string, autoRefresh: boolean) { const [metrics, setMetrics] = useState(null); const [alerts, setAlerts] = useState([]); const [loading, setLoading] = useState(true); const loadSecurityData = useCallback(async () => { try { const startDate = getStartDateForRange(selectedTimeRange); const endDate = new Date().toISOString(); const response = await fetch( `/api/admin/security-monitoring?startDate=${startDate}&endDate=${endDate}` ); if (!response.ok) throw new Error("Failed to load security data"); const data = await response.json(); setMetrics(data.metrics); setAlerts(data.alerts); } catch (error) { console.error("Error loading security data:", error); } finally { setLoading(false); } }, [selectedTimeRange]); useEffect(() => { loadSecurityData(); if (autoRefresh) { const interval = setInterval(loadSecurityData, 30000); return () => clearInterval(interval); } }, [autoRefresh, loadSecurityData]); return { metrics, alerts, loading, loadSecurityData, setAlerts }; } /** * Helper function to get date range for filtering */ function getStartDateForRange(range: string): string { const now = new Date(); switch (range) { case "1h": return new Date(now.getTime() - 60 * 60 * 1000).toISOString(); case "24h": return new Date(now.getTime() - 24 * 60 * 60 * 1000).toISOString(); case "7d": return new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000).toISOString(); case "30d": return new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000).toISOString(); default: return new Date(now.getTime() - 24 * 60 * 60 * 1000).toISOString(); } } /** * Helper function to get threat level color */ function getThreatLevelColor(level: string) { switch (level?.toLowerCase()) { case "critical": return "bg-red-500"; case "high": return "bg-orange-500"; case "moderate": return "bg-yellow-500"; case "low": return "bg-green-500"; default: return "bg-gray-500"; } } /** * Helper function to get severity color */ function getSeverityColor(severity: string) { switch (severity?.toLowerCase()) { case "critical": return "destructive"; case "high": return "destructive"; case "medium": return "secondary"; case "low": return "outline"; default: return "outline"; } } /** * Helper function to render dashboard header */ function renderDashboardHeader( autoRefresh: boolean, setAutoRefresh: (refresh: boolean) => void, setShowConfig: (show: boolean) => void, exportData: (format: "json" | "csv", type: "alerts" | "metrics") => void ) { return (

Security Monitoring

Real-time security monitoring and threat detection

); } /** * Helper function to render time range selector */ function renderTimeRangeSelector( selectedTimeRange: string, setSelectedTimeRange: (range: string) => void ) { return (
{["1h", "24h", "7d", "30d"].map((range) => ( ))}
); } /** * Helper function to render security overview cards */ function renderSecurityOverview(metrics: SecurityMetrics | null) { return (
Security Score
{metrics?.securityScore || 0}/100
{metrics?.threatLevel || "Unknown"} Threat Level
Active Alerts
{metrics?.activeAlerts || 0}

{metrics?.resolvedAlerts || 0} resolved

Security Events
{metrics?.totalEvents || 0}

{metrics?.criticalEvents || 0} critical

Top Threat
{metrics?.topThreats?.[0]?.type?.replace(/_/g, " ") || "None"}

{metrics?.topThreats?.[0]?.count || 0} instances

); } export default function SecurityMonitoringPage() { const { selectedTimeRange, setSelectedTimeRange, showConfig, setShowConfig, autoRefresh, setAutoRefresh, } = useSecurityMonitoringState(); const { metrics, alerts, loading, setAlerts, loadSecurityData } = useSecurityData(selectedTimeRange, autoRefresh); const acknowledgeAlert = async (alertId: string) => { try { const response = await fetch("/api/admin/security-monitoring/alerts", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ alertId, action: "acknowledge" }), }); if (response.ok) { setAlerts( alerts.map((alert) => alert.id === alertId ? { ...alert, acknowledged: true } : alert ) ); } } catch (error) { console.error("Error acknowledging alert:", error); } }; const exportData = async ( format: "json" | "csv", type: "alerts" | "metrics" ) => { try { const startDate = getStartDateForRange(selectedTimeRange); const endDate = new Date().toISOString(); const response = await fetch( `/api/admin/security-monitoring/export?format=${format}&type=${type}&startDate=${startDate}&endDate=${endDate}` ); if (!response.ok) throw new Error("Export failed"); const blob = await response.blob(); const url = window.URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = `security-${type}-${new Date().toISOString().split("T")[0]}.${format}`; a.click(); window.URL.revokeObjectURL(url); } catch (error) { console.error("Error exporting data:", error); } }; if (loading) { return (
); } return (
{renderDashboardHeader( autoRefresh, setAutoRefresh, setShowConfig, exportData )} {renderTimeRangeSelector(selectedTimeRange, setSelectedTimeRange)} {renderSecurityOverview(metrics)} Active Alerts Security Metrics Threat Analysis Geographic View Active Security Alerts Real-time security alerts requiring attention {alerts.length === 0 ? (

No active alerts - system is secure

) : (
{alerts.map((alert) => (
{alert.severity} {alert.title}

{alert.description}

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

{!alert.acknowledged && ( )}
))}
)}
Event Distribution {metrics?.eventsByType && (
{Object.entries(metrics.eventsByType).map( ([type, count]) => (
{type.replace(/_/g, " ")} {count}
) )}
)}
High-Risk Users {metrics?.userRiskScores?.length ? (
{metrics.userRiskScores.slice(0, 5).map((user) => (
{user.email} 70 ? "destructive" : user.riskScore > 40 ? "secondary" : "outline" } > {user.riskScore}
))}
) : (

No high-risk users detected

)}
Threat Analysis Analysis of current security threats and recommendations {metrics?.topThreats?.length ? (
{metrics.topThreats.map((threat, index) => (
{threat.type.replace(/_/g, " ")}

{threat.count} occurrences

{index === 0 ? "Highest Priority" : "Monitor"}
))}
) : (

No significant threats detected

)}
Geographic Distribution Security events by geographic location {metrics?.geoDistribution && Object.keys(metrics.geoDistribution).length > 0 ? (
{Object.entries(metrics.geoDistribution) .sort(([, a], [, b]) => b - a) .slice(0, 12) .map(([country, count]) => (
{count}
{country}
))}
) : (

No geographic data available

)}
{showConfig && ( setShowConfig(false)} onSave={() => { setShowConfig(false); loadSecurityData(); }} /> )}
); }