wulf-pulse/app/api/veeam/ticket-analysis/status/route.ts
lorentz ea3471d38d feat: Veeam RPO analysis, comparison, ticket analysis + company teams table
- Add Veeam RPO analysis page (/veeam-analysis) and comparison page (/veeam-comparison)
- Add API routes: /api/veeam/rpo-analyze, rpo-comparison, rpo-offline-log, ticket-analysis
- Add veeam-rpo-service.ts enhancements (RPO logic, offline detection, comparison)
- Add veeam-analysis-state.ts and rmm-device-resolver.ts services
- Add migrations 065-068: company_teams, veeam_rpo_offline_log, rpo_comparison_tables, veeam_ticket_analysis
- Add backup-status page updates and nav links for new Veeam pages
- Add scripts: deactivate-cis-for-inactive-companies, workstation category updates
- Add docs: mimecast-api-guide, veeam-backup-alerting-recommendation, workstation-backup-overview, ticket-analyzer-prompt
- Minor: webhook-service, entity-sync, entity-mapper, sync-helpers, sync.ts, middleware.ts updates
2026-04-29 09:16:46 -04:00

32 lines
1.2 KiB
TypeScript

import { NextResponse } from 'next/server';
import postgresClient from '@/lib/services/postgres-client';
import { analysisState } from '@/lib/services/veeam-analysis-state';
export async function GET() {
const [analyzedRes, eligibleRes] = await Promise.all([
postgresClient.query(`
SELECT COUNT(*) AS total_analyzed, MAX(analyzed_at) AS last_analyzed_at
FROM veeam_ticket_analysis
WHERE ticket_created_at >= DATE_TRUNC('year', NOW())
`),
postgresClient.query(`
SELECT COUNT(DISTINCT t.id) AS total_eligible
FROM tickets t
INNER JOIN time_entries te ON te.ticket_id = t.id
WHERE t.title ILIKE 'Veeam:%'
AND t.title NOT ILIKE '[Veeam RPO]%'
AND t.create_date >= DATE_TRUNC('year', NOW())
`),
]);
return NextResponse.json({
is_running: analysisState.isRunning,
run_total: analysisState.total,
run_done: analysisState.done,
run_errors: analysisState.errors,
run_started_at: analysisState.startedAt,
total_analyzed: parseInt(analyzedRes.rows[0]?.total_analyzed ?? 0),
total_eligible: parseInt(eligibleRes.rows[0]?.total_eligible ?? 0),
last_analyzed_at: analyzedRes.rows[0]?.last_analyzed_at ?? null,
});
}