'use strict'; /* create-admin.js — создать или повысить пользователя до администратора. * * Запуск (значения через переменные окружения, чтобы пароль не светился в argv): * ADMIN_EMAIL=a@b.c ADMIN_PASSWORD=secret12 ADMIN_NAME="Имя" node scripts/create-admin.js * Используется панелью управления (control-panel.ps1, пункт «Создать админа»). * * Если пользователь с таким email уже есть — обновляет пароль/имя, ставит role='admin' * и инкрементит token_version (старые токены становятся недействительны). Иначе создаёт. */ const path = require('path'); const bcrypt = require('bcryptjs'); const { DatabaseSync } = require('node:sqlite'); const email = String(process.env.ADMIN_EMAIL || '').trim().toLowerCase(); const password = String(process.env.ADMIN_PASSWORD || ''); const name = String(process.env.ADMIN_NAME || '').trim() || 'Администратор'; function fail(msg) { console.error('✗ ' + msg); process.exit(1); } if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) fail('Некорректный email (ADMIN_EMAIL).'); if (password.length < 8) fail('Пароль минимум 8 символов (ADMIN_PASSWORD).'); const DB = process.env.DB_PATH || path.join(__dirname, '..', 'data', 'learnspace.db'); const db = new DatabaseSync(DB); try { db.exec('PRAGMA busy_timeout=4000'); } catch (_) {} // подождать, если сервер пишет (async () => { const hash = await bcrypt.hash(password, 12); const existing = db.prepare('SELECT id, role FROM users WHERE email = ?').get(email); if (existing) { db.prepare(`UPDATE users SET password_hash = ?, name = ?, role = 'admin', token_version = COALESCE(token_version,0) + 1 WHERE id = ?`) .run(hash, name, existing.id); console.log(`✓ Пользователь ${email} обновлён: роль admin, новый пароль (id=${existing.id}).`); } else { const r = db.prepare(`INSERT INTO users (email, password_hash, name, role) VALUES (?,?,?, 'admin')`) .run(email, hash, name); console.log(`✓ Создан администратор ${email} (id=${r.lastInsertRowid}).`); } db.close(); })().catch(e => fail(e.message));