Source

scripts/seed-admin.js

#!/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 };