114 lines
3.3 KiB
TypeScript
114 lines
3.3 KiB
TypeScript
#!/usr/bin/env tsx
|
|
/**
|
|
* Set admin password directly using Prisma
|
|
* Works even if DATABASE_URL is not in .env.local (uses runtime env)
|
|
*/
|
|
|
|
import * as dotenv from 'dotenv';
|
|
import path from 'node:path';
|
|
import fs from 'node:fs';
|
|
|
|
// Load environment variables
|
|
const envPaths = [
|
|
path.resolve(process.cwd(), '.env.local'),
|
|
path.resolve(process.cwd(), '.env'),
|
|
];
|
|
|
|
for (const envPath of envPaths) {
|
|
if (fs.existsSync(envPath)) {
|
|
dotenv.config({ path: envPath });
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Import PrismaClient AFTER environment is loaded
|
|
import { PrismaClient } from '@prisma/client';
|
|
import { hash } from 'bcryptjs';
|
|
|
|
// Use the same pattern as db.ts
|
|
let prismaAdapter: any = undefined;
|
|
const databaseUrl = process.env.RUNTIME_DATABASE_URL || process.env.DATABASE_URL;
|
|
|
|
if (!databaseUrl) {
|
|
console.error('❌ DATABASE_URL or RUNTIME_DATABASE_URL must be set');
|
|
console.error(' Checked .env.local and .env files');
|
|
console.error(' Current working directory:', process.cwd());
|
|
process.exit(1);
|
|
}
|
|
|
|
try {
|
|
const { PrismaPg } = require('@prisma/adapter-pg');
|
|
const { Pool } = require('pg');
|
|
const pool = new Pool({
|
|
connectionString: databaseUrl,
|
|
max: Number(process.env.PG_POOL_MAX || 10),
|
|
idleTimeoutMillis: Number(process.env.PG_POOL_IDLE_TIMEOUT || 30000),
|
|
connectionTimeoutMillis: Number(process.env.PG_POOL_CONN_TIMEOUT || 2000),
|
|
});
|
|
prismaAdapter = new PrismaPg(pool);
|
|
console.log('✅ Using PrismaPg adapter');
|
|
} catch (error) {
|
|
console.log('⚠️ PrismaPg adapter not available, using default client');
|
|
console.log(' Error:', error instanceof Error ? error.message : String(error));
|
|
}
|
|
|
|
// Prisma 7.x: adapter must be passed to constructor if available
|
|
const prisma = new PrismaClient({
|
|
log: process.env.NODE_ENV === 'development' ? ['query', 'error', 'warn'] : ['error'],
|
|
...(prismaAdapter && { adapter: prismaAdapter }),
|
|
});
|
|
|
|
async function main() {
|
|
const username = process.argv[2] || 'admin';
|
|
const newPassword = process.argv[3] || 'TSD107AS';
|
|
|
|
console.log(`\n🔐 Setting admin password for user: ${username}`);
|
|
console.log(`📝 Password: ${newPassword}\n`);
|
|
|
|
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✅ Password set successfully!\n');
|
|
} catch (error) {
|
|
console.error('❌ Error setting admin password:', error);
|
|
if (error instanceof Error) {
|
|
console.error(' Message:', error.message);
|
|
}
|
|
process.exit(1);
|
|
} finally {
|
|
await prisma.$disconnect();
|
|
}
|
|
}
|
|
|
|
main();
|