// Load environment variables BEFORE importing PrismaClient import * as dotenv from 'dotenv'; import path from 'node:path'; import fs from 'node:fs'; const envPaths = [ path.resolve(process.cwd(), '.env.local'), path.resolve(process.cwd(), '.env'), path.resolve(__dirname, '..', '.env.local'), path.resolve(__dirname, '..', '.env'), ]; let envLoaded = false; for (const envPath of envPaths) { if (fs.existsSync(envPath)) { dotenv.config({ path: envPath }); envLoaded = true; console.log(`šŸ“ Loaded environment from: ${envPath}`); break; } } if (!envLoaded) { console.warn(`āš ļø No .env file found. Checked: ${envPaths.join(', ')}`); } // Verify DATABASE_URL is set if (!process.env.DATABASE_URL) { throw new Error( 'DATABASE_URL environment variable is required. Please set it in .env.local\n' + `Checked paths: ${envPaths.join(', ')}\n` + `Current working directory: ${process.cwd()}` ); } console.log(`šŸ”— Using database: ${process.env.DATABASE_URL.replace(/:[^:@]+@/, ':****@')}`); // Import PrismaClient AFTER environment is loaded import { PrismaClient } from '@prisma/client'; import { hash } from 'bcryptjs'; // Try to use PrismaPg adapter if available (same pattern as seed.ts) let prismaAdapter: any = undefined; try { const { PrismaPg } = require('@prisma/adapter-pg'); const { Pool } = require('pg'); const pool = new Pool({ connectionString: process.env.DATABASE_URL }); prismaAdapter = new PrismaPg(pool); console.log('āœ… Using PrismaPg adapter'); } catch (error) { console.log('āš ļø PrismaPg adapter not available, using default client'); } // Prisma 7.x: adapter is passed via connection string, not constructor const prisma = new PrismaClient({ log: process.env.NODE_ENV === 'development' ? ['query', 'error', 'warn'] : ['error'], }); async function main() { const username = process.argv[2] || 'admin'; const newPassword = process.argv[3] || process.env.ADMIN_PASSWORD || 'admin123'; if (!newPassword) { console.error('āŒ Error: Password is required'); console.log('\nUsage:'); console.log(' npm run admin:reset-password [username] [password]'); console.log(' Or set ADMIN_PASSWORD environment variable'); process.exit(1); } console.log(`\nšŸ” Resetting admin password for user: ${username}`); console.log(`šŸ“ Using password from ${process.argv[3] ? 'command line' : process.env.ADMIN_PASSWORD ? 'ADMIN_PASSWORD env var' : 'default (admin123)'}`); try { // Hash the new password const hashedPassword = await hash(newPassword, 10); // Check if admin exists const existingAdmin = await prisma.admin.findUnique({ where: { username }, }); if (existingAdmin) { // Update existing admin await prisma.admin.update({ where: { username }, data: { password: hashedPassword, }, }); console.log(`āœ… Updated password for admin user: ${username}`); } else { // Create new admin await prisma.admin.create({ data: { username, password: hashedPassword, email: 'admin@themoyos.co.za', }, }); console.log(`āœ… Created new admin user: ${username}`); } console.log('\nšŸ“‹ Login Credentials:'); console.log(` Username: ${username}`); console.log(` Password: ${newPassword}`); console.log('\nāš ļø Remember to change this password in production!'); } catch (error) { console.error('āŒ Error resetting admin password:', error); process.exit(1); } finally { await prisma.$disconnect(); } } main();