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