wulf-pulse/app/api/veeam/agents/route.ts

51 lines
1.9 KiB
TypeScript

import { NextResponse } from 'next/server';
import postgresClient from '@/lib/services/postgres-client';
export async function GET() {
try {
const [agents, summary] = await Promise.all([
postgresClient.query(`
SELECT a.instance_uid, a.name, a.agent_platform, a.status, a.management_agent_status,
a.operation_mode, a.platform, a.version, a.version_status, a.management_mode,
a.total_jobs_count, a.running_jobs_count, a.success_jobs_count,
a.activation_time, a.synced_at,
o.name as organization_name
FROM veeam_backup_agents a
LEFT JOIN veeam_organizations o ON o.instance_uid = a.organization_uid
ORDER BY a.name ASC
`),
postgresClient.query(`
SELECT
COUNT(*) as total,
COUNT(*) FILTER (WHERE status = 'Active') as active,
COUNT(*) FILTER (WHERE status != 'Active') as inactive,
COUNT(*) FILTER (WHERE management_agent_status = 'Inaccessible') as inaccessible,
COUNT(*) FILTER (WHERE version_status = 'Outdated') as outdated,
COUNT(*) FILTER (WHERE agent_platform = 'Windows') as windows,
COUNT(*) FILTER (WHERE agent_platform = 'Linux') as linux,
COUNT(*) FILTER (WHERE agent_platform = 'Mac') as mac,
MAX(synced_at) as last_sync
FROM veeam_backup_agents
`),
]);
const s = summary.rows[0];
return NextResponse.json({
agents: agents.rows,
summary: {
total: parseInt(s.total),
active: parseInt(s.active),
inactive: parseInt(s.inactive),
inaccessible: parseInt(s.inaccessible),
outdated: parseInt(s.outdated),
windows: parseInt(s.windows),
linux: parseInt(s.linux),
mac: parseInt(s.mac),
lastSync: s.last_sync,
},
});
} catch (error) {
console.error('[VEEAM-AGENTS-API]', error);
return NextResponse.json({ error: 'Failed to fetch agents' }, { status: 500 });
}
}