feat: implement WebSocket server for real-time sensor data handling and add sensor status update routes

This commit is contained in:
Giuseppe Raffa
2026-04-14 19:05:37 +02:00
parent a34048ae6b
commit 137c6131c3
7 changed files with 382 additions and 13 deletions

View File

@@ -1,6 +1,6 @@
const router = require('express').Router();
const db = require('../store/db');
const { appendAsConnection, createConnectionToken } = require('../store/redis');
const { createConnectionToken } = require('../store/redis');
const crypto = require('crypto');
/**
@@ -32,7 +32,7 @@ router.post('/new', async (req, res) => {
return res.status(409).json({ error: 'name already exists' });
}
console.error('Error creating sensor', err);
res.status(500).json({ error: 'internal server error' });
res.status(500).json({ error: `internal server error, ${err}` });
}
});
@@ -59,14 +59,12 @@ router.post('/', async (req, res) => {
if (hash !== storedHash) {
return res.status(401).json({ error: 'invalid name or code' });
}
await appendAsConnection(name, 'pending', new Date().toISOString());
const token = await createConnectionToken(name);
res.status(200).json({ s: 'ok', t: token });
} catch (err) {
console.error('Error verifying connection', err);
res.status(500).json({ error: 'internal server error' });
res.status(500).json({ error: `internal server error, ${err}` });
}
});

View File

@@ -7,7 +7,7 @@ router.get('/', async (req, res) => {
res.json(result.rows);
} catch (err) {
console.error('Error fetching sensors', err);
res.status(500).json({ error: 'internal server error' });
res.status(500).json({ error: `internal server error, ${err}` });
}
});
@@ -21,10 +21,40 @@ router.get('/:id', async (req, res) => {
res.json(result.rows[0]);
} catch (err) {
console.error('Error fetching sensor', err);
res.status(500).json({ error: 'internal server error' });
res.status(500).json({ error: `internal server error, ${err}` });
}
});
//Toggle availability
router.post('/:id/inactive', async (req, res) => {
const { id } = req.params;
try {
const result = await db.query('sensors', 'SELECT id, name FROM sensors WHERE id = $1', [id]);
if (result.rows.length === 0) {
return res.status(404).json({ error: 'sensor not found' });
}
await db.query('sensors', 'UPDATE sensors SET active = false WHERE id = $1', [id]);
res.json({ status: 'ok' });
} catch (err) {
console.error('Error updating sensor status', err);
res.status(500).json({ error: `internal server error, ${err}` });
}
});
router.post('/:id/active', async (req, res) => {
const { id } = req.params;
try {
const result = await db.query('sensors', 'SELECT id, name FROM sensors WHERE id = $1', [id]);
if (result.rows.length === 0) {
return res.status(404).json({ error: 'sensor not found' });
}
await db.query('sensors', 'UPDATE sensors SET active = true WHERE id = $1', [id]);
res.json({ status: 'ok' });
} catch (err) {
console.error('Error updating sensor status', err);
res.status(500).json({ error: `internal server error, ${err}` });
}
});
module.exports = router;

View File

@@ -1,14 +1,59 @@
const router = require('express').Router();
const db = require('../store/db');
const { query } = require('../store/redis');
const { queryAll, query } = require('../store/redis');
router.get('/pendingtokens', (req, res) => {
router.get('/', async (req, res) => {
try {
const keys = await queryAll('sensors');
const sessions = {};
for (const key of keys) {
const name = key.replace('sensors:', '');
const info = await query(name, 'sensors');
sessions[name] = {
name,
connectedAt: info.timestamp || null,
session: info.session || null,
status: info.status || 'unknown',
};
}
res.json(sessions);
} catch (err) {
console.error('Error fetching sessions', err);
res.status(500).json({ error: 'internal server error' });
}
});
router.get('/pending', (req, res) => {
try {
const pendingTokens = queryAll('snsr_pending_token');
res.json(pendingTokens);
} catch (err) {
console.error('Error fetching pending tokens', err);
res.status(500).json({ error: 'internal server error' });
res.status(500).json({ error: `Error fetching pending tokens, ${err}` });
}
});
router.get('/connected', (req, res) => {
try {
const connectedSensors = queryAll('snsr_connected');
res.json(connectedSensors);
} catch (err) {
console.error('Error fetching connected sensors', err);
res.status(500).json({ error: `Error fetching connected sensors, ${err}` });
}
});
router.get('/connected/:id', async (req, res) => {
const { id } = req.params;
try {
const sensor = await query(`snsr_connected:${id}`);
if (!sensor) {
return res.status(404).json({ error: 'sensor not connected' });
}
res.json({ id, name: sensor });
} catch (err) {
console.error('Error fetching sensor connection status', err);
res.status(500).json({ error: `Error fetching sensor connection status, ${err}` });
}
});