This commit is contained in:
sebseb7
2025-12-25 00:08:05 +01:00
parent 1f3292bc17
commit 077e76735e
15 changed files with 9311 additions and 0 deletions

View File

@@ -0,0 +1,84 @@
const Database = require('better-sqlite3');
const bcrypt = require('bcryptjs');
const path = require('path');
const { config } = require('dotenv');
// Load env from root to get DB_PATH if set
config({ path: path.resolve(__dirname, '../../.env') });
const dbPath = process.env.DB_PATH || path.resolve(__dirname, '../../server/data/sensors.db');
function printUsage() {
console.log('Usage:');
console.log(' node manage-users.js add <username> <password> <role>');
console.log(' node manage-users.js list');
console.log(' node manage-users.js delete <username>');
console.log('\nRoles: admin, normal');
}
const args = process.argv.slice(2);
const command = args[0];
if (!command) {
printUsage();
process.exit(1);
}
const db = new Database(dbPath);
try {
if (command === 'add') {
const [_, username, password, role] = args;
if (!username || !password || !role) {
console.error('Error: username, password, and role are required.');
printUsage();
process.exit(1);
}
if (!['admin', 'normal'].includes(role)) {
console.error('Error: role must be either "admin" or "normal"');
process.exit(1);
}
const hash = bcrypt.hashSync(password, 10);
try {
const stmt = db.prepare('INSERT INTO users (username, password_hash, role) VALUES (?, ?, ?)');
const info = stmt.run(username, hash, role);
console.log(`User '${username}' created successfully (ID: ${info.lastInsertRowid}).`);
} catch (err) {
if (err.code === 'SQLITE_CONSTRAINT_UNIQUE') {
console.error(`Error: User '${username}' already exists.`);
} else {
throw err;
}
}
} else if (command === 'list') {
const stmt = db.prepare('SELECT id, username, role, created_at FROM users');
const users = stmt.all();
console.table(users);
} else if (command === 'delete') {
const [_, username] = args;
if (!username) {
console.error('Error: username required');
process.exit(1);
}
const stmt = db.prepare('DELETE FROM users WHERE username = ?');
const info = stmt.run(username);
if (info.changes > 0) {
console.log(`User '${username}' deleted.`);
} else {
console.log(`User '${username}' not found.`);
}
} else {
console.error(`Unknown command: ${command}`);
printUsage();
}
} catch (err) {
console.error('Error:', err.message);
} finally {
db.close();
}

View File

@@ -0,0 +1,38 @@
const Database = require('better-sqlite3');
const path = require('path');
const { config } = require('dotenv');
// Load env from root
config({ path: path.resolve(__dirname, '../../.env') });
const dbPath = process.env.DB_PATH || path.resolve(__dirname, '../../server/data/sensors.db');
const db = new Database(dbPath);
console.log(`[Migrate] Connected to ${dbPath}`);
console.log('[Migrate] Applying schema migrations...');
try {
db.exec(`
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
password_hash TEXT NOT NULL,
role TEXT NOT NULL CHECK(role IN ('admin', 'normal')),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS views (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT UNIQUE NOT NULL,
config TEXT NOT NULL,
created_by INTEGER,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY(created_by) REFERENCES users(id)
);
`);
console.log('[Migrate] Schema applied successfully.');
} catch (err) {
console.error('[Migrate] Error applying schema:', err.message);
} finally {
db.close();
}