feat: implement WebSocket server for real-time sensor data handling and add sensor status update routes
This commit is contained in:
@@ -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}` });
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -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;
|
||||
@@ -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}` });
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user