Files
OLD-server-architecture/realtime/src/helper/authdb.js
2026-04-06 11:50:10 +02:00

106 lines
3.2 KiB
JavaScript

const { Pool } = require('pg');
const { hash, generateShortId } = require('./cryptoUtils');
const pool = new Pool({
user: process.env.DB_USER,
host: process.env.DB_HOST,
database: process.env.DB_NAME,
password: process.env.DB_PASSWORD,
port: process.env.DB_PORT,
});
async function checkDB() {
try {
await pool.query('SELECT NOW()');
return true;
} catch (error) {
console.error('Database connection failed:', error);
return false;
}
}
async function initDB() {
try {
await pool.query(`
CREATE TABLE IF NOT EXISTS sensors (
id VARCHAR(10) PRIMARY KEY,
name VARCHAR(100) NOT NULL,
code_hash TEXT NOT NULL UNIQUE,
is_active BOOLEAN DEFAULT TRUE,
last_seen TIMESTAMP DEFAULT NOW(),
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_sensors_code_hash ON sensors(code_hash);
`);
console.log('[DB] Database schema initialized (sensors table ensured)');
} catch (error) {
console.error('[DB] Schema initialization failed:', error);
}
}
/**
* Restituisce i dati del sensore in base al token ricevuto.
* Il token viene hashato prima della comparazione con il database.
* @param {string} token - il codice segreto del sensore (raw)
*/
async function getSensor(token) {
const hashed = hash(token);
const result = await pool.query('SELECT id, is_active, name, last_seen, created_at FROM sensors WHERE code_hash = $1', [hashed]);
return result.rows[0];
}
async function createSensor(name, code) {
const hashedCode = hash(code);
// Verifica se l'hash esiste già
const result = await pool.query('SELECT id FROM sensors WHERE code_hash = $1', [hashedCode]);
if (result.rows.length > 0) {
throw new Error('Sensor with this code already exists');
}
// Genera un ID casuale di 8 caratteri (ottimizzato per spazio, non solo alfanumerico)
const sensorId = generateShortId(8);
await pool.query('INSERT INTO sensors (id, name, code_hash, is_active, last_seen, created_at) VALUES ($1, $2, $3, $4, $5, $6)',
[sensorId, name, hashedCode, true, new Date(), new Date()]);
}
/**
* Aggiorna l'ultima attività del sensore.
* @param {*} id - l'id del sensore
* @returns {Promise<void>}
*/
async function updateLastSeen(id) {
await pool.query('UPDATE sensors SET last_seen = NOW() WHERE id = $1', [id]);
}
/**
* Modifica la disponibilità del sensore.
* @param {*} id - l'id del sensore
* @param {*} is_active - la disponibilità del sensore
* @returns {Promise<void>}
*/
async function setSensorActivity(id, is_active) {
await pool.query('UPDATE sensors SET is_active = $1 WHERE id = $2', [is_active, id]);
}
async function sensorsExists(id) {
const result = await pool.query('SELECT id FROM sensors WHERE id = $1', [id]);
return result.rows.length > 0;
}
async function getSensors() {
const resutls = await pool.query('SELECT id, is_active, name, last_seen, created_at FROM sensors');
return resutls.rows;
}
module.exports = {
checkDB,
initDB,
getSensor,
updateLastSeen,
setSensorActivity,
getSensors,
sensorsExists,
createSensor
}