Initial SMM panel implementation
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
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());
|
||||
Reference in New Issue
Block a user