66 lines
2.2 KiB
JavaScript
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;
|