Files
Deep-Package-Inspection/backend/routes/dashboard/events.js
T

66 lines
2.2 KiB
JavaScript

const express = require('express');
const router = express.Router();
const { Event, DeviceStat, Flow } = require('../../models/Schemas');
const { getTimeFilter, getBaseFilter } = require('./helpers');
// GET /api/dashboard/events
router.get('/events', async (req, res) => {
try {
const limit = parseInt(req.query.limit ?? 0);
const timeFilter = getTimeFilter(req);
const base = getBaseFilter(req, timeFilter);
let query = Event.find(base).sort({ timestamp: -1 });
if (limit > 0) {
query = query.limit(limit);
}
const events = await query.lean();
// Collect all MAC addresses for events missing IP addresses
const missingIpMacs = [...new Set(events.filter(e => !e.ip_address && e.mac_address).map(e => e.mac_address))];
// Lookup DeviceStat for these MACs
let macToIpMap = {};
if (missingIpMacs.length > 0) {
const baseFilterNull = getBaseFilter(req, null);
const filterForDevices = {
mac_address: { $in: missingIpMacs },
...baseFilterNull
};
const devices = await DeviceStat.find(filterForDevices).lean();
for (const d of devices) {
macToIpMap[d.mac_address] = d.ip_address;
}
// Fallback: Query Flow collection for remaining unresolved MACs
const unresolvedMacs = missingIpMacs.filter(mac => !macToIpMap[mac]);
if (unresolvedMacs.length > 0) {
for (const mac of unresolvedMacs) {
const flow = await Flow.findOne({ src_mac: mac, ...baseFilterNull }).sort({ timestamp: -1 }).lean();
if (flow && flow.src_ip) {
macToIpMap[mac] = flow.src_ip;
}
}
}
}
const data = events.map(e => ({
id: e._id?.toString() || e.event_id,
event_type: e.event_type,
severity: e.severity,
message: e.description || 'System event triggered',
source_ip: e.ip_address || macToIpMap[e.mac_address] || null,
mac_address: e.mac_address || null,
timestamp: e.timestamp,
}));
res.json({ ok: true, data });
} catch (err) {
console.error('[/events]', err.message);
res.status(500).json({ ok: false, error: err.message });
}
});
module.exports = router;