← back to Wine Finder Next

app/api/security/dashboard/route.ts

134 lines

import { NextRequest, NextResponse } from 'next/server';
import { getSecurityDashboard } from '@/lib/securityMonitoring';
import { getAdvancedSecurityStats } from '@/lib/advancedSecurity';
import { verifyJWT } from '@/lib/jwtAuth';

export async function GET(request: NextRequest) {
  try {
    // Require authentication for security dashboard
    const authHeader = request.headers.get('authorization');
    if (!authHeader) {
      return NextResponse.json({
        success: false,
        error: 'Authentication required'
      }, { status: 401 });
    }

    const token = authHeader.replace('Bearer ', '');
    const verification = verifyJWT(token);

    if (!verification.valid || verification.payload?.role !== 'admin') {
      return NextResponse.json({
        success: false,
        error: 'Admin access required'
      }, { status: 403 });
    }

    // Get comprehensive security data
    const basicSecurity = getSecurityDashboard();
    const advancedSecurity = getAdvancedSecurityStats();

    const dashboard = {
      timestamp: new Date().toISOString(),

      // Basic security metrics
      recentEvents: basicSecurity.recentEvents.slice(-20), // Last 20 events
      suspiciousIPs: basicSecurity.suspiciousIPs,
      blockedIPs: basicSecurity.blockedIPs,

      // Stats
      stats: {
        ...basicSecurity.stats,

        // Advanced stats
        totalFingerprints: advancedSecurity.totalFingerprints,
        activeBots: advancedSecurity.activeBots,
        highRiskRequests: advancedSecurity.highRiskRequests,
        ddosAttempts: advancedSecurity.ddosAttempts,
        averageRiskScore: advancedSecurity.averageRiskScore
      },

      // Security alerts (critical events from last hour)
      alerts: basicSecurity.recentEvents
        .filter(e => e.severity === 'critical' || e.severity === 'high')
        .slice(-10)
        .map(e => ({
          type: e.type,
          severity: e.severity,
          ipAddress: e.ipAddress,
          timestamp: e.timestamp,
          details: e.details
        })),

      // Top threat IPs
      topThreats: basicSecurity.suspiciousIPs
        .sort((a, b) => b.score - a.score)
        .slice(0, 10)
        .map(ip => ({
          ip: ip.ip,
          score: ip.score,
          lastSeen: ip.lastSeen,
          blocked: basicSecurity.blockedIPs.includes(ip.ip)
        })),

      // Security health score
      healthScore: calculateSecurityHealth(basicSecurity, advancedSecurity)
    };

    return NextResponse.json({
      success: true,
      data: dashboard
    });
  } catch (error) {
    console.error('[SECURITY DASHBOARD ERROR]', error);
    return NextResponse.json({
      success: false,
      error: 'Failed to generate security dashboard'
    }, { status: 500 });
  }
}

function calculateSecurityHealth(basicSecurity: any, advancedSecurity: any): {
  score: number;
  status: string;
  issues: string[];
} {
  let score = 100;
  const issues: string[] = [];

  // Deduct points for threats
  if (basicSecurity.blockedIPs.length > 10) {
    score -= 20;
    issues.push(`${basicSecurity.blockedIPs.length} IPs blocked`);
  }

  if (basicSecurity.stats.last24h > 100) {
    score -= 15;
    issues.push(`${basicSecurity.stats.last24h} security events in 24h`);
  }

  if (advancedSecurity.activeBots > 5) {
    score -= 25;
    issues.push(`${advancedSecurity.activeBots} active bots detected`);
  }

  if (advancedSecurity.highRiskRequests > 50) {
    score -= 20;
    issues.push(`${advancedSecurity.highRiskRequests} high-risk requests`);
  }

  if (advancedSecurity.averageRiskScore > 40) {
    score -= 10;
    issues.push(`Average risk score: ${advancedSecurity.averageRiskScore.toFixed(1)}`);
  }

  // Determine status
  let status: string;
  if (score >= 90) status = 'EXCELLENT';
  else if (score >= 75) status = 'GOOD';
  else if (score >= 50) status = 'WARNING';
  else status = 'CRITICAL';

  return { score: Math.max(0, score), status, issues };
}