64 lines
1.4 KiB
JavaScript
64 lines
1.4 KiB
JavaScript
require('dotenv').config();
|
|
|
|
const bcrypt = require('bcryptjs');
|
|
|
|
const { closeDbPool, getDb } = require('../config/db');
|
|
const { logger } = require('../utils/logger');
|
|
|
|
function requireEnv(name) {
|
|
const value = process.env[name];
|
|
|
|
if (!value) {
|
|
throw new Error(`${name} is required`);
|
|
}
|
|
|
|
return value;
|
|
}
|
|
|
|
async function main() {
|
|
const username = requireEnv('ADMIN_USERNAME');
|
|
const email = requireEnv('ADMIN_EMAIL').toLowerCase();
|
|
const password = requireEnv('ADMIN_PASSWORD');
|
|
|
|
if (password.length < 8) {
|
|
throw new Error('ADMIN_PASSWORD must be at least 8 characters');
|
|
}
|
|
|
|
const db = getDb();
|
|
const existing = await db('users').where({ email }).orWhere({ username }).first();
|
|
const passwordHash = await bcrypt.hash(password, 12);
|
|
|
|
if (existing) {
|
|
await db('users').where({ id: existing.id }).update({
|
|
username,
|
|
email,
|
|
password_hash: passwordHash,
|
|
role: 'admin',
|
|
status: 'active'
|
|
});
|
|
logger.info({ id: existing.id, email }, 'Admin user updated');
|
|
return;
|
|
}
|
|
|
|
const [id] = await db('users').insert({
|
|
username,
|
|
email,
|
|
password_hash: passwordHash,
|
|
balance: '0.0000',
|
|
role: 'admin',
|
|
status: 'active'
|
|
});
|
|
|
|
logger.info({ id, email }, 'Admin user created');
|
|
}
|
|
|
|
main()
|
|
.catch((error) => {
|
|
logger.error({
|
|
message: error.message,
|
|
stack: error.stack
|
|
}, 'Failed to create admin user');
|
|
process.exitCode = 1;
|
|
})
|
|
.finally(() => closeDbPool());
|