diff --git a/server/routes/alert.js b/server/routes/alert.js index e4a79cf..3334eac 100644 --- a/server/routes/alert.js +++ b/server/routes/alert.js @@ -1,7 +1,7 @@ const express = require('express'); const router = express.Router(); const Joi = require('joi'); -const { AlertRule, AlertLog, User, Device, Tenant, sequelize } = require('../models'); +const { AlertRule, AlertLog, User, Device, Tenant, DroneDetection, sequelize } = require('../models'); const { validateRequest } = require('../middleware/validation'); const { authenticateToken, requireRole } = require('../middleware/auth'); const MultiTenantAuth = require('../middleware/multi-tenant-auth'); @@ -299,6 +299,11 @@ router.get('/logs', authenticateToken, async (req, res) => { attributes: ['id', 'username'] }], attributes: ['id', 'name', 'priority'] + }, { + model: DroneDetection, + as: 'detection', + attributes: ['id', 'drone_id', 'device_id', 'drone_type', 'rssi', 'server_timestamp'], + required: false // Allow alerts without detection_id (like device offline alerts) }], limit: Math.min(parseInt(limit), 200), offset: parseInt(offset), diff --git a/server/services/alertService.js b/server/services/alertService.js index 23ee8ff..ea87fec 100644 --- a/server/services/alertService.js +++ b/server/services/alertService.js @@ -369,14 +369,16 @@ class AlertService { model: DroneDetection, as: 'detection', where: { - device_id: detection.device_id, - drone_id: detection.drone_id - } + device_id: detection.device_id + // Removed drone_id check - cooldown applies per device, not per device+drone combination + // This prevents alert spam when multiple drones are detected by the same device + }, + required: false // Allow alerts without detection_id (like device offline alerts) }] }); if (recentAlert) { - console.log(`❌ Rule "${rule.name}": Still in cooldown period`); + console.log(`❌ Rule "${rule.name}": Still in cooldown period (last alert: ${recentAlert.sent_at})`); return false; } }