117 lines
3.5 KiB
TypeScript
117 lines
3.5 KiB
TypeScript
// 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();
|