Add Rulesets page with HTML structure and CSS styles
- Created a new HTML file for the Rulesets page, including a header, toolbar, rules grid, and rule detail popup. - Implemented JavaScript functionality for loading, filtering, sorting, and managing rules. - Added CSS styles for the layout, components, and responsive design of the Rulesets page.
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
const router = require('express').Router();
|
||||
const { queryAll, query } = require('../store/redis');
|
||||
const { queryAll, query, hset } = require('../store/redis');
|
||||
const { connectedSensors } = require('../ws/handler');
|
||||
|
||||
/**
|
||||
* GET /sessions — Lista tutte le sessioni attive dei sensori.
|
||||
* Legge da Redis le chiavi sensors:* (scritte da handler.js alla connessione)
|
||||
* GET /sessions — Lista tutte le sessioni dei sensori con metadata e rules versions
|
||||
*/
|
||||
router.get('/', async (req, res) => {
|
||||
try {
|
||||
@@ -16,7 +16,13 @@ router.get('/', async (req, res) => {
|
||||
name,
|
||||
connectedAt: info.timestamp || null,
|
||||
session: info.session || null,
|
||||
sessionLabel: info.sessionLabel || info.session || null,
|
||||
status: info.status || 'unknown',
|
||||
rules: {
|
||||
weather: info.rules_weather || null,
|
||||
data: info.rules_data || null,
|
||||
logs: info.rules_logs || null,
|
||||
}
|
||||
};
|
||||
}
|
||||
res.json(sessions);
|
||||
@@ -27,8 +33,7 @@ router.get('/', async (req, res) => {
|
||||
});
|
||||
|
||||
/**
|
||||
* GET /sessions/pending — Lista token di connessione pendenti.
|
||||
* Legge da Redis le chiavi sensors_pending:* (create da createConnectionToken)
|
||||
* GET /sessions/pending — Lista token di connessione pendenti
|
||||
*/
|
||||
router.get('/pending', async (req, res) => {
|
||||
try {
|
||||
@@ -41,8 +46,7 @@ router.get('/pending', async (req, res) => {
|
||||
});
|
||||
|
||||
/**
|
||||
* GET /sessions/connected — Lista sensori attualmente connessi.
|
||||
* Legge da Redis le chiavi sensor:* (scritte da appendAsConnection in handler.js)
|
||||
* GET /sessions/connected — Lista sensori attualmente connessi
|
||||
*/
|
||||
router.get('/connected', async (req, res) => {
|
||||
try {
|
||||
@@ -63,7 +67,7 @@ router.get('/connected', async (req, res) => {
|
||||
});
|
||||
|
||||
/**
|
||||
* GET /sessions/connected/:id — Verifica se un sensore specifico è connesso.
|
||||
* GET /sessions/connected/:id — Verifica se un sensore specifico è connesso
|
||||
*/
|
||||
router.get('/connected/:id', async (req, res) => {
|
||||
const { id } = req.params;
|
||||
@@ -79,4 +83,38 @@ router.get('/connected/:id', async (req, res) => {
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* POST /sessions/:id/label — Cambia il label della sessione per un sensore connesso.
|
||||
* Non interrompe il flusso dati. I nuovi punti InfluxDB avranno il nuovo tag.
|
||||
*/
|
||||
router.post('/:id/label', async (req, res) => {
|
||||
const { id } = req.params;
|
||||
const { label } = req.body;
|
||||
|
||||
if (!label || typeof label !== 'string' || label.trim().length === 0) {
|
||||
return res.status(400).json({ error: 'label is required' });
|
||||
}
|
||||
|
||||
const trimmedLabel = label.trim();
|
||||
|
||||
// Trova il WS client connesso
|
||||
const ws = connectedSensors.get(id);
|
||||
if (!ws) {
|
||||
return res.status(404).json({ error: 'sensor not connected' });
|
||||
}
|
||||
|
||||
// Aggiorna in memoria (effetto immediato sui prossimi punti InfluxDB)
|
||||
ws.sessionLabel = trimmedLabel;
|
||||
|
||||
// Aggiorna in Redis per persistenza
|
||||
try {
|
||||
await hset(`sensors:${id}`, 'sessionLabel', trimmedLabel);
|
||||
} catch (err) {
|
||||
console.error('Error updating session label in Redis', err);
|
||||
}
|
||||
|
||||
console.log(`[${id}] Session label changed to: ${trimmedLabel}`);
|
||||
res.json({ status: 'ok', label: trimmedLabel });
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
|
||||
Reference in New Issue
Block a user