From 7877902698693e9a274885c7d059bc07dc874c60 Mon Sep 17 00:00:00 2001 From: Alexander Borg Date: Wed, 10 Sep 2025 06:13:47 +0200 Subject: [PATCH] Fix jwt-token --- .env | 1 + README.md | 21 +++++++ server/models/DroneDetection.js | 5 ++ server/models/Heartbeat.js | 5 ++ server/routes/debug.js | 107 ++++++++++++++++++++++++++++++++ server/routes/detectors.js | 31 +++++++-- 6 files changed, 165 insertions(+), 5 deletions(-) diff --git a/.env b/.env index 7be1d1b..235bb06 100644 --- a/.env +++ b/.env @@ -34,6 +34,7 @@ STORE_HEARTBEATS=true STORE_DRONE_TYPE0=true LOG_ALL_DETECTIONS=true API_DEBUG=true +STORE_RAW_PAYLOAD=true # Health Probe Simulator Configuration PROBE_FAILRATE=30 diff --git a/README.md b/README.md index 120169e..d637948 100644 --- a/README.md +++ b/README.md @@ -230,6 +230,13 @@ TWILIO_PHONE_NUMBER=your_twilio_phone PORT=3001 NODE_ENV=development CORS_ORIGIN=http://localhost:3000 + +# Debug Configuration +STORE_HEARTBEATS=true # Store heartbeat data for debugging +STORE_DRONE_TYPE0=true # Store drone_type 0 detections for debugging +LOG_ALL_DETECTIONS=true # Log all detection data to console +API_DEBUG=true # Enable API debug logging +STORE_RAW_PAYLOAD=true # Store complete raw payload from detectors ``` ## API Documentation @@ -281,6 +288,20 @@ Content-Type: application/json - `POST /api/alerts/rules` - Create new alert rule - `GET /api/alerts/logs` - Get alert history +### Debug Endpoints (Authentication Required) +- `GET /api/debug/config` - Get debug configuration status +- `GET /api/debug/detection-payloads` - Get recent detection payloads with raw data +- `GET /api/debug/heartbeat-payloads` - Get recent heartbeat payloads with raw data +- `GET /api/debug/debug-test` - Test debug endpoint + +#### Debug Query Parameters +```http +GET /api/debug/detection-payloads?limit=50&offset=0&device_id=1941875381 +GET /api/debug/heartbeat-payloads?limit=50&offset=0&device_id=1941875381 +``` + +The debug endpoints return the complete raw payload received from detectors when `STORE_RAW_PAYLOAD=true` is enabled. This is useful for troubleshooting detector communication issues and understanding the exact data format being sent. + ## Hardware Integration ### Expected Data Format diff --git a/server/models/DroneDetection.js b/server/models/DroneDetection.js index 1bc1ea2..d139cad 100644 --- a/server/models/DroneDetection.js +++ b/server/models/DroneDetection.js @@ -91,6 +91,11 @@ module.exports = (sequelize) => { defaultValue: false, comment: 'Whether this detection requires immediate security action' }, + raw_payload: { + type: DataTypes.JSON, + allowNull: true, + comment: 'Complete raw payload received from detector (for debugging)' + }, created_at: { type: DataTypes.DATE, defaultValue: DataTypes.NOW diff --git a/server/models/Heartbeat.js b/server/models/Heartbeat.js index aa8b5eb..17530bd 100644 --- a/server/models/Heartbeat.js +++ b/server/models/Heartbeat.js @@ -56,6 +56,11 @@ module.exports = (sequelize) => { defaultValue: DataTypes.NOW, comment: 'When heartbeat was received by server' }, + raw_payload: { + type: DataTypes.JSON, + allowNull: true, + comment: 'Complete raw payload received from detector (for debugging)' + }, created_at: { type: DataTypes.DATE, defaultValue: DataTypes.NOW diff --git a/server/routes/debug.js b/server/routes/debug.js index 3ed2b6d..7fd0ba9 100644 --- a/server/routes/debug.js +++ b/server/routes/debug.js @@ -1,5 +1,8 @@ const express = require('express'); const { ApiDebugLogger } = require('../utils/apiDebugLogger'); +const { DroneDetection, Heartbeat } = require('../models'); +const { Op } = require('sequelize'); +const { authenticateToken } = require('../middleware/auth'); const router = express.Router(); const logger = new ApiDebugLogger(); @@ -21,4 +24,108 @@ router.get('/debug-test', (req, res) => { res.json(response); }); +// Get recent detection payloads with raw data +router.get('/detection-payloads', authenticateToken, async (req, res) => { + try { + const { limit = 50, offset = 0, device_id } = req.query; + + const whereClause = { + raw_payload: { [Op.ne]: null } + }; + + if (device_id) { + whereClause.device_id = device_id; + } + + const detections = await DroneDetection.findAll({ + where: whereClause, + order: [['server_timestamp', 'DESC']], + limit: parseInt(limit), + offset: parseInt(offset), + attributes: [ + 'id', 'device_id', 'drone_id', 'drone_type', 'rssi', 'freq', + 'server_timestamp', 'device_timestamp', 'raw_payload' + ] + }); + + console.log(`🔍 Retrieved ${detections.length} detection payloads for debugging`); + + res.json({ + success: true, + data: detections, + total: detections.length, + filters: { device_id, limit, offset } + }); + + } catch (error) { + console.error('Error fetching detection payloads:', error); + res.status(500).json({ + success: false, + error: 'Failed to fetch detection payloads' + }); + } +}); + +// Get recent heartbeat payloads with raw data +router.get('/heartbeat-payloads', authenticateToken, async (req, res) => { + try { + const { limit = 50, offset = 0, device_id } = req.query; + + const whereClause = { + raw_payload: { [Op.ne]: null } + }; + + if (device_id) { + whereClause.device_id = device_id; + } + + const heartbeats = await Heartbeat.findAll({ + where: whereClause, + order: [['received_at', 'DESC']], + limit: parseInt(limit), + offset: parseInt(offset), + attributes: [ + 'id', 'device_id', 'device_key', 'signal_strength', 'battery_level', + 'temperature', 'received_at', 'raw_payload' + ] + }); + + console.log(`🔍 Retrieved ${heartbeats.length} heartbeat payloads for debugging`); + + res.json({ + success: true, + data: heartbeats, + total: heartbeats.length, + filters: { device_id, limit, offset } + }); + + } catch (error) { + console.error('Error fetching heartbeat payloads:', error); + res.status(500).json({ + success: false, + error: 'Failed to fetch heartbeat payloads' + }); + } +}); + +// Get debug configuration status +router.get('/config', authenticateToken, (req, res) => { + const config = { + STORE_HEARTBEATS: process.env.STORE_HEARTBEATS === 'true', + STORE_DRONE_TYPE0: process.env.STORE_DRONE_TYPE0 === 'true', + LOG_ALL_DETECTIONS: process.env.LOG_ALL_DETECTIONS === 'true', + API_DEBUG: process.env.API_DEBUG === 'true', + STORE_RAW_PAYLOAD: process.env.STORE_RAW_PAYLOAD === 'true', + NODE_ENV: process.env.NODE_ENV + }; + + console.log('🔍 Debug configuration requested'); + + res.json({ + success: true, + config, + timestamp: new Date().toISOString() + }); +}); + module.exports = router; diff --git a/server/routes/detectors.js b/server/routes/detectors.js index 2c3b87d..3a72f41 100644 --- a/server/routes/detectors.js +++ b/server/routes/detectors.js @@ -11,7 +11,8 @@ const { getDroneTypeInfo, getDroneTypeName } = require('../utils/droneTypes'); const DEBUG_CONFIG = { storeHeartbeats: process.env.STORE_HEARTBEATS === 'true', // Store heartbeat data for debugging storeNoneDetections: process.env.STORE_DRONE_TYPE0 === 'true', // Store drone_type 0 for debugging - logAllDetections: process.env.LOG_ALL_DETECTIONS === 'true' // Log all detection data + logAllDetections: process.env.LOG_ALL_DETECTIONS === 'true', // Log all detection data + storeRawPayload: process.env.STORE_RAW_PAYLOAD === 'true' // Store complete raw payload for debugging }; // Initialize services @@ -192,12 +193,22 @@ async function handleHeartbeat(req, res) { await device.update({ last_heartbeat: new Date() }); // Create heartbeat record with all optional fields - const heartbeat = await Heartbeat.create({ + const heartbeatRecord = { device_id: deviceId, device_key: key, ...heartbeatData, received_at: new Date() - }); + }; + + // Add raw payload if debugging is enabled + if (DEBUG_CONFIG.storeRawPayload) { + heartbeatRecord.raw_payload = req.body; + if (DEBUG_CONFIG.logAllDetections) { + console.log(`🔍 Storing heartbeat raw payload for debugging: ${JSON.stringify(req.body)}`); + } + } + + const heartbeat = await Heartbeat.create(heartbeatRecord); // Emit real-time update via Socket.IO (from original heartbeat route) req.io.emit('device_heartbeat', { @@ -290,10 +301,20 @@ async function handleDetection(req, res) { } // Create detection record - const detection = await DroneDetection.create({ + const detectionRecord = { ...detectionData, server_timestamp: new Date() - }); + }; + + // Add raw payload if debugging is enabled + if (DEBUG_CONFIG.storeRawPayload) { + detectionRecord.raw_payload = req.body; + if (DEBUG_CONFIG.logAllDetections) { + console.log(`🔍 Storing raw payload for debugging: ${JSON.stringify(req.body)}`); + } + } + + const detection = await DroneDetection.create(detectionRecord); // Process detection through tracking service for movement analysis (from original) const movementAnalysis = droneTracker.processDetection({