98 lines
3.1 KiB
JavaScript
98 lines
3.1 KiB
JavaScript
import sqlite3 from 'sqlite3';
|
|
import { promisify } from 'util';
|
|
import bcrypt from 'bcrypt';
|
|
import path from 'path';
|
|
import { fileURLToPath } from 'url';
|
|
import pg from 'pg';
|
|
|
|
const __filename = fileURLToPath(import.meta.url);
|
|
const __dirname = path.dirname(__filename);
|
|
|
|
const PG_URL = process.env.PG_URL;
|
|
|
|
async function createAdmin() {
|
|
const username = process.env.ADMIN_USERNAME || 'admin';
|
|
const password = process.env.ADMIN_PASSWORD || 'admin123';
|
|
const passwordHash = await bcrypt.hash(password, 10);
|
|
|
|
if (PG_URL) {
|
|
const { Pool } = pg;
|
|
const pool = new Pool({ connectionString: PG_URL });
|
|
try {
|
|
await pool.query(`
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id SERIAL PRIMARY KEY,
|
|
username TEXT UNIQUE NOT NULL,
|
|
password_hash TEXT NOT NULL,
|
|
is_admin INTEGER NOT NULL DEFAULT 0,
|
|
address TEXT,
|
|
latitude DOUBLE PRECISION,
|
|
longitude DOUBLE PRECISION,
|
|
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
)
|
|
`);
|
|
|
|
const existing = await pool.query('SELECT id FROM users WHERE username = $1', [username]);
|
|
if (existing.rows.length > 0) {
|
|
console.log(`Admin user '${username}' already exists.`);
|
|
console.log('To reset, delete the user first and re-run.');
|
|
await pool.end();
|
|
return;
|
|
}
|
|
|
|
await pool.query(
|
|
'INSERT INTO users (username, password_hash, is_admin) VALUES ($1, $2, 1)',
|
|
[username, passwordHash]
|
|
);
|
|
console.log(`Admin user '${username}' created in PostgreSQL.`);
|
|
} finally {
|
|
await pool.end();
|
|
}
|
|
} else {
|
|
const dbPath = process.env.DATABASE_PATH || path.join(__dirname, 'database.sqlite');
|
|
const db = new sqlite3.Database(dbPath);
|
|
const dbRun = (sql, params = []) =>
|
|
new Promise((resolve, reject) =>
|
|
db.run(sql, params, function (err) { err ? reject(err) : resolve({ lastID: this.lastID }); })
|
|
);
|
|
const dbGet = promisify(db.get.bind(db));
|
|
|
|
try {
|
|
await dbRun(`
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
username TEXT UNIQUE NOT NULL,
|
|
password_hash TEXT NOT NULL,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
)
|
|
`);
|
|
try { await dbRun('ALTER TABLE users ADD COLUMN is_admin INTEGER NOT NULL DEFAULT 0'); } catch {}
|
|
|
|
const existing = await dbGet('SELECT id FROM users WHERE username = ?', [username]);
|
|
if (existing) {
|
|
console.log(`Admin user '${username}' already exists.`);
|
|
console.log('To reset, delete the user first and re-run.');
|
|
db.close();
|
|
return;
|
|
}
|
|
|
|
await dbRun(
|
|
'INSERT INTO users (username, password_hash, is_admin) VALUES (?, ?, 1)',
|
|
[username, passwordHash]
|
|
);
|
|
console.log(`Admin user '${username}' created in SQLite.`);
|
|
} finally {
|
|
db.close();
|
|
}
|
|
}
|
|
|
|
console.log(`Username: ${username}`);
|
|
console.log(`Password: ${password}`);
|
|
console.log('\nIMPORTANT: Change the default password after first login!');
|
|
}
|
|
|
|
createAdmin().catch((err) => {
|
|
console.error('Error creating admin user:', err);
|
|
process.exit(1);
|
|
});
|