Spaces:
Running
Running
File size: 1,466 Bytes
e8c33fa | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | const bcrypt = require('bcrypt');
const AdminUser = require('../models/AdminUser');
const { env } = require('../configs/env');
const DEFAULT_ADMIN_USERNAME = 'admin';
const DEFAULT_ADMIN_NAME = 'Administrator';
const BCRYPT_SALT_ROUNDS = 12;
let initPromise = null;
const resolveBootstrapCredentials = () => {
const username = env.adminBootstrapUsername || DEFAULT_ADMIN_USERNAME;
const name = env.adminBootstrapName || DEFAULT_ADMIN_NAME;
const password = env.adminBootstrapPassword;
if (!password) {
throw new Error('ADMIN_BOOTSTRAP_PASSWORD is not configured. Set it in the environment before first admin login.');
}
if (password.length < env.adminPasswordMinLength) {
throw new Error(`Admin bootstrap password must be at least ${env.adminPasswordMinLength} characters`);
}
return {
username,
name,
password,
};
};
const ensureAdminInitialized = () => {
if (!initPromise) {
initPromise = (async () => {
const existing = await AdminUser.findOne({ role: 'admin' }).select('_id username').lean();
if (existing) return;
const bootstrap = resolveBootstrapCredentials();
const passwordHash = await bcrypt.hash(bootstrap.password, BCRYPT_SALT_ROUNDS);
await AdminUser.create({
username: bootstrap.username,
name: bootstrap.name,
passwordHash,
role: 'admin',
});
})();
}
return initPromise;
};
module.exports = {
ensureAdminInitialized,
};
|