const sqlite3 = require('sqlite3').verbose(); const path = require('path'); const bcrypt = require('bcryptjs'); const dbPath = process.env.DB_PATH || path.join(__dirname, '../data/database.sqlite'); const db = new sqlite3.Database(dbPath); console.log('Using database at', dbPath); db.serialize(() => { // Users: mit created_at fuer Client-Ablauf (30 Tage) db.run(`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 DEFAULT 'client', created_at DATETIME DEFAULT CURRENT_TIMESTAMP )`); // Migration: Spalten hinzufuegen falls Tabelle schon existiert (alte DB ohne role/created_at) db.run(`ALTER TABLE users ADD COLUMN role TEXT NOT NULL DEFAULT 'client'`, (err) => { // Ignoriere Fehler wenn Spalte schon existiert if (!err) { // Alte Admins (die einzigen User vor dem Update) als admin markieren db.run(`UPDATE users SET role = 'admin' WHERE id = 1`); console.log('Migration: role-Spalte hinzugefuegt, User ID 1 als admin gesetzt'); } }); db.run(`ALTER TABLE users ADD COLUMN created_at DATETIME DEFAULT CURRENT_TIMESTAMP`, (err) => { // Ignoriere Fehler wenn Spalte schon existiert }); // Ordner-Zuweisung (neu) db.run(`CREATE TABLE IF NOT EXISTS user_folders ( user_id INTEGER, folder_name TEXT, FOREIGN KEY(user_id) REFERENCES users(id), UNIQUE(user_id, folder_name) )`); // Alte Tabelle behalten fuer Kompatibilitaet, aber nicht mehr nutzen db.run(`CREATE TABLE IF NOT EXISTS user_images ( user_id INTEGER, image_name TEXT, FOREIGN KEY(user_id) REFERENCES users(id), UNIQUE(user_id, image_name) )`); // Initialen Admin nur mit expliziten Credentials aus der Umgebung anlegen. db.serialize(() => { const username = process.env.INITIAL_ADMIN_USERNAME; const password = process.env.INITIAL_ADMIN_PASSWORD; const passwordHash = process.env.INITIAL_ADMIN_PASSWORD_HASH || (password ? bcrypt.hashSync(password, 10) : null); if (!username || !passwordHash) { console.warn('Set INITIAL_ADMIN_USERNAME with INITIAL_ADMIN_PASSWORD or INITIAL_ADMIN_PASSWORD_HASH to bootstrap an admin.'); return; } db.get('SELECT id FROM users WHERE username = ?', [username], (err, row) => { if (err || row) return; db.run( 'INSERT INTO users (username, password_hash, role) VALUES (?, ?, ?)', [username, passwordHash, 'admin'], (insertErr) => { if (insertErr) { console.error('Failed to create initial admin:', insertErr.message); return; } console.log(`Initial admin created: ${username}`); } ); }); db.get('SELECT id, role FROM users WHERE username = ?', [username], (err, row) => { if (err || !row || row.role === 'admin') return; db.run('UPDATE users SET role = ? WHERE id = ?', ['admin', row.id], (updateErr) => { if (updateErr) { console.error('Failed to promote initial admin:', updateErr.message); return; } console.log(`Initial admin promoted: ${username}`); } ); }); }); }); module.exports = db;