All files / src/app/api/admin/monitoring/errors/stats route.ts

0% Statements 0/62
100% Branches 0/0
0% Functions 0/1
0% Lines 0/62

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63                                                                                                                             
export const dynamic = 'force-dynamic';

import { NextResponse } from 'next/server';
import { prisma } from '@/lib/prisma';
import { withAdmin, withErrorHandling } from '@/lib/api';

/**
 * GET /api/admin/monitoring/errors/stats
 *
 * Returns error monitoring statistics for dashboard refresh
 */
export const GET = withErrorHandling(
  withAdmin(async () => {
    const [
      totalErrors,
      errorsToday,
      openErrors,
      errorsByCategory,
      topErrors,
    ] = await Promise.all([
      prisma.errorLog.count(),
      prisma.errorLog.count({
        where: {
          createdAt: {
            gte: new Date(new Date().setHours(0, 0, 0, 0)),
          },
        },
      }),
      prisma.errorStatistic.count({
        where: { status: 'open' },
      }),
      prisma.errorLog.groupBy({
        by: ['category'],
        _count: true,
        where: {
          createdAt: {
            gte: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000), // Last 7 days
          },
        },
      }),
      prisma.errorStatistic.findMany({
        take: 10,
        where: { status: 'open' },
        orderBy: { count: 'desc' },
      }),
    ]);

    return NextResponse.json({
      success: true,
      data: {
        totalErrors,
        errorsToday,
        openErrors,
        errorsByCategory,
        topErrors: topErrors.map(e => ({
          ...e,
          lastSeen: e.lastSeen.toISOString(),
        })),
      },
    });
  })
);