Files
moyosapp_beta.0.0.3/scripts/reset-admin-password.ts
2026-01-15 16:19:14 +02:00

117 lines
3.5 KiB
TypeScript
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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();