#!/usr/bin/env tsx
import { config as dotenvConfig } from "dotenv";
import { connect } from "mongoose";
import { env } from "../config/env.js";
import { logger } from "../config/logger.js";
import { User } from "../models/User.model.js";
import { PasswordUtils } from "../utils/password.utils.js";
// Load environment variables
dotenvConfig();
/**
* Seed script to create a root admin user
*/
async function seedAdminUser() {
try {
logger.info("Starting admin user seeding...");
// Connect to MongoDB
await connect(env.MONGODB_URI);
logger.info("Connected to MongoDB");
// Check if admin user already exists
const existingAdmin = await User.findOne({
email: env.ADMIN_EMAIL.toLowerCase(),
});
if (existingAdmin) {
logger.warn(`Admin user with email ${env.ADMIN_EMAIL} already exists`);
logger.warn({
message: "Admin user details:",
user: {
id: existingAdmin._id,
email: existingAdmin.email,
name: existingAdmin.name,
role: existingAdmin.role,
createdAt: existingAdmin.createdAt,
},
});
return;
}
// Create admin user
logger.info("Creating root admin user...");
const adminUser = new User({
email: env.ADMIN_EMAIL.toLowerCase(),
name: "root admin",
passwordHash: await PasswordUtils.hashPassword(env.ADMIN_PASSWORD),
role: "admin",
});
await adminUser.save();
logger.info({
message: "Root admin user created successfully!",
user: {
id: adminUser._id,
email: adminUser.email,
name: adminUser.name,
role: adminUser.role,
createdAt: adminUser.createdAt,
},
});
logger.info({
message: "Email:",
email: env.ADMIN_EMAIL,
});
logger.info({
message: "Password:",
password: env.ADMIN_PASSWORD,
});
logger.warn("Please change the default password after first login!");
}
catch (error) {
logger.error({
message: "Failed to seed admin user:",
error,
});
process.exit(1);
}
finally {
// Close MongoDB connection
const mongoose = await import("mongoose");
await mongoose.default.connection.close();
process.exit(0);
}
}
// Run the seeder
if (import.meta.url === `file://${process.argv[1]}`) {
seedAdminUser().catch((error) => {
logger.error({
message: "Seeder failed:",
error,
});
process.exit(1);
});
}
export { seedAdminUser };
Source