const { PrismaClient } = require("@prisma/client"); const bcrypt = require("bcryptjs"); const readline = require("node:readline"); const prisma = new PrismaClient(); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); const question = (query) => new Promise((resolve) => rl.question(query, resolve)); async function setupAdminUser() { try { console.log("šŸ” Setting up PatchMon Admin User"); console.log("=====================================\n"); // Check if any users exist const existingUsers = await prisma.users.count(); if (existingUsers > 0) { console.log("āš ļø Users already exist in the database."); const overwrite = await question( "Do you want to create another admin user? (y/N): ", ); if ( overwrite.toLowerCase() !== "y" && overwrite.toLowerCase() !== "yes" ) { console.log("āŒ Setup cancelled."); return; } } // Get user input const username = await question("Enter admin username: "); if (!username.trim()) { console.log("āŒ Username is required."); return; } const email = await question("Enter admin email: "); if (!email.trim()) { console.log("āŒ Email is required."); return; } const password = await question( "Enter admin password (min 6 characters): ", ); if (password.length < 6) { console.log("āŒ Password must be at least 6 characters."); return; } // Check if username or email already exists const existingUser = await prisma.users.findFirst({ where: { OR: [{ username: username.trim() }, { email: email.trim() }], }, }); if (existingUser) { console.log("āŒ Username or email already exists."); return; } // Hash password console.log("\nšŸ”„ Creating admin user..."); const passwordHash = await bcrypt.hash(password, 12); // Create admin user const user = await prisma.users.create({ data: { id: require("node:crypto").randomUUID(), username: username.trim(), email: email.trim(), password_hash: passwordHash, role: "admin", is_active: true, created_at: new Date(), updated_at: new Date(), }, select: { id: true, username: true, email: true, role: true, created_at: true, }, }); console.log("āœ… Admin user created successfully!"); console.log("\nšŸ“‹ User Details:"); console.log(` Username: ${user.username}`); console.log(` Email: ${user.email}`); console.log(` Role: ${user.role}`); console.log(` Created: ${user.created_at.toISOString()}`); console.log("\nšŸŽ‰ Setup complete!"); console.log("\nNext steps:"); console.log( "1. The backend server is already running as a systemd service", ); console.log("2. The frontend is already built and served by Nginx"); console.log( "3. Visit https://" + process.env.FQDN + " and login with your credentials", ); console.log( "4. Use the management script: ./manage.sh {status|restart|logs|update|backup|credentials|reset-admin}", ); } catch (error) { console.error("āŒ Error setting up admin user:", error); } finally { rl.close(); await prisma.$disconnect(); } } // Run the setup setupAdminUser();