feat(site): implement dynamic site selection dropdown in sidebar and enable multi-site monitoring
This commit is contained in:
1 parent
be6bc14190
commit
4882108068
125 files changed
+5666
-4305
No files matched your search
@@ -1,14 +1,16 @@
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const { Event } = require('../../models/Schemas');
|
||||
const { Event, DeviceStat, Flow } = require('../../models/Schemas');
|
||||
const { getTimeFilter, getBaseFilter } = require('./helpers');
|
||||
|
||||
// GET /api/dashboard/events
|
||||
router.get('/events', async (req, res) => {
|
||||
try {
|
||||
console.log('[/events] Request received. Query:', req.query);
|
||||
const limit = parseInt(req.query.limit ?? 0);
|
||||
const timeFilter = getTimeFilter(req);
|
||||
const base = getBaseFilter(req, timeFilter);
|
||||
console.log('[/events] Event base filter:', base);
|
||||
|
||||
let query = Event.find(base).sort({ timestamp: -1 });
|
||||
if (limit > 0) {
|
||||
@@ -17,12 +19,43 @@ router.get('/events', async (req, res) => {
|
||||
|
||||
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);
|
||||
console.log('[/events] getBaseFilter(req, null) returned:', baseFilterNull);
|
||||
|
||||
const filterForDevices = {
|
||||
mac_address: { $in: missingIpMacs },
|
||||
...baseFilterNull
|
||||
};
|
||||
console.log('[/events] DEBUG filterForDevices:', filterForDevices);
|
||||
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 || null,
|
||||
source_ip: e.ip_address || macToIpMap[e.mac_address] || null,
|
||||
mac_address: e.mac_address || null,
|
||||
timestamp: e.timestamp,
|
||||
}));
|
||||
|
||||
Reference in new issue
Block a user