99 lines
2.9 KiB
JavaScript
99 lines
2.9 KiB
JavaScript
const express = require('express');
|
|
const { protect } = require('../middleware/auth');
|
|
const database = require('../config/database');
|
|
const logger = require('../utils/logger');
|
|
|
|
const router = express.Router();
|
|
|
|
// Get dashboard overview
|
|
router.get('/dashboard', protect, async (req, res) => {
|
|
try {
|
|
// Get total devices
|
|
const [deviceCount] = await database.query('SELECT COUNT(*) as count FROM devices');
|
|
|
|
// Get online devices
|
|
const [onlineDevices] = await database.query("SELECT COUNT(*) as count FROM devices WHERE status = 'online'");
|
|
|
|
// Get total alerts in last 24h
|
|
const [alerts24h] = await database.query(
|
|
'SELECT COUNT(*) as count FROM alerts WHERE created_at >= DATE_SUB(NOW(), INTERVAL 24 HOUR)'
|
|
);
|
|
|
|
// Get critical alerts
|
|
const [criticalAlerts] = await database.query(
|
|
"SELECT COUNT(*) as count FROM alerts WHERE severity = 'critical' AND status = 'active'"
|
|
);
|
|
|
|
const overview = {
|
|
total_devices: deviceCount.count,
|
|
online_devices: onlineDevices.count,
|
|
offline_devices: deviceCount.count - onlineDevices.count,
|
|
alerts_24h: alerts24h.count,
|
|
critical_alerts: criticalAlerts.count,
|
|
uptime_percentage: deviceCount.count > 0 ? ((onlineDevices.count / deviceCount.count) * 100).toFixed(2) : 0
|
|
};
|
|
|
|
res.json({
|
|
success: true,
|
|
data: overview
|
|
});
|
|
} catch (error) {
|
|
logger.error('Get dashboard overview error:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: 'Failed to get dashboard overview'
|
|
});
|
|
}
|
|
});
|
|
|
|
// Get device performance metrics
|
|
router.get('/performance', protect, async (req, res) => {
|
|
try {
|
|
const { period = '24h' } = req.query;
|
|
|
|
let timeFilter;
|
|
switch (period) {
|
|
case '1h':
|
|
timeFilter = 'DATE_SUB(NOW(), INTERVAL 1 HOUR)';
|
|
break;
|
|
case '24h':
|
|
timeFilter = 'DATE_SUB(NOW(), INTERVAL 24 HOUR)';
|
|
break;
|
|
case '7d':
|
|
timeFilter = 'DATE_SUB(NOW(), INTERVAL 7 DAY)';
|
|
break;
|
|
default:
|
|
timeFilter = 'DATE_SUB(NOW(), INTERVAL 24 HOUR)';
|
|
}
|
|
|
|
// Get data points count
|
|
const [dataPoints] = await database.query(
|
|
`SELECT COUNT(*) as count FROM device_data WHERE created_at >= ${timeFilter}`
|
|
);
|
|
|
|
// Get average data size
|
|
const [avgDataSize] = await database.query(
|
|
`SELECT AVG(JSON_LENGTH(raw_data)) as avg_size FROM device_data WHERE created_at >= ${timeFilter}`
|
|
);
|
|
|
|
const performance = {
|
|
period,
|
|
data_points: dataPoints.count,
|
|
avg_data_size: avgDataSize.avg_size || 0,
|
|
data_rate_per_hour: period === '1h' ? dataPoints.count : Math.round(dataPoints.count / 24)
|
|
};
|
|
|
|
res.json({
|
|
success: true,
|
|
data: performance
|
|
});
|
|
} catch (error) {
|
|
logger.error('Get performance metrics error:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: 'Failed to get performance metrics'
|
|
});
|
|
}
|
|
});
|
|
|
|
module.exports = router;
|