/** * Hetzner Cloud API Routes * @author Descomplicar® | @link descomplicar.pt | @copyright 2026 */ import { Router, Request, Response } from 'express' import { syncServers, collectAllMetrics, collectMetrics, getHetznerDashboard, getMetricsHistory, cleanupOldMetrics } from '../services/hetzner.js' const router = Router() // GET /api/hetzner - Dashboard data (servidores + últimas métricas) router.get('/', async (_req: Request, res: Response) => { try { const data = await getHetznerDashboard() res.json({ success: true, data }) } catch (error) { console.error('Error fetching Hetzner dashboard:', error) res.status(500).json({ success: false, error: 'Failed to fetch Hetzner data' }) } }) // POST /api/hetzner/sync - Sincronizar lista de servidores router.post('/sync', async (_req: Request, res: Response) => { try { const synced = await syncServers() res.json({ success: true, message: `Sincronizados ${synced} servidores`, synced }) } catch (error) { console.error('Error syncing servers:', error) res.status(500).json({ success: false, error: 'Failed to sync servers' }) } }) // POST /api/hetzner/collect - Recolher métricas de todos os servidores router.post('/collect', async (_req: Request, res: Response) => { try { const result = await collectAllMetrics() res.json({ success: true, message: `Recolhidas métricas: ${result.success} OK, ${result.failed} falharam`, ...result }) } catch (error) { console.error('Error collecting metrics:', error) res.status(500).json({ success: false, error: 'Failed to collect metrics' }) } }) // POST /api/hetzner/collect/:hetzner_id - Recolher métricas de um servidor específico router.post('/collect/:hetzner_id', async (req: Request, res: Response) => { try { const hetzner_id = parseInt(req.params.hetzner_id) if (isNaN(hetzner_id)) { return res.status(400).json({ success: false, error: 'Invalid server ID' }) } const success = await collectMetrics(hetzner_id) res.json({ success, message: success ? 'Métricas recolhidas' : 'Falha ao recolher métricas' }) } catch (error) { console.error('Error collecting metrics:', error) res.status(500).json({ success: false, error: 'Failed to collect metrics' }) } }) // GET /api/hetzner/history/:server_id - Histórico de métricas para gráficos router.get('/history/:server_id', async (req: Request, res: Response) => { try { const server_id = parseInt(req.params.server_id) const hours = parseInt(req.query.hours as string) || 24 if (isNaN(server_id)) { return res.status(400).json({ success: false, error: 'Invalid server ID' }) } const metrics = await getMetricsHistory(server_id, hours) res.json({ success: true, data: metrics }) } catch (error) { console.error('Error fetching metrics history:', error) res.status(500).json({ success: false, error: 'Failed to fetch metrics history' }) } }) // POST /api/hetzner/cleanup - Limpar métricas antigas router.post('/cleanup', async (req: Request, res: Response) => { try { const days = parseInt(req.query.days as string) || 7 const deleted = await cleanupOldMetrics(days) res.json({ success: true, message: `Eliminadas ${deleted} entradas com mais de ${days} dias`, deleted }) } catch (error) { console.error('Error cleaning up metrics:', error) res.status(500).json({ success: false, error: 'Failed to cleanup metrics' }) } }) export default router