Files
moyosapp_beta.0.0.3.3_beta1/scripts/set-admin-password.ts
2026-01-16 19:04:48 +02:00

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