iot-agent/routes/analytics.js
2025-08-03 23:07:33 +05:30

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;