import { promises as fs } from "fs"; import path from "path"; import { existsSync } from "fs"; import bcrypt from "bcryptjs"; const PASSWORD_FILE = path.join(process.cwd(), "prisma", "password.json"); interface PasswordData { hash: string; createdAt: string; updatedAt: string; } async function ensurePasswordFile(): Promise { if (!existsSync(PASSWORD_FILE)) { // Create default password "admin" if file doesn't exist const defaultHash = await bcrypt.hash("admin", 10); const defaultData: PasswordData = { hash: defaultHash, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), }; await fs.writeFile(PASSWORD_FILE, JSON.stringify(defaultData, null, 2), "utf-8"); } } async function loadPasswordData(): Promise { await ensurePasswordFile(); const content = await fs.readFile(PASSWORD_FILE, "utf-8"); return JSON.parse(content); } async function savePasswordData(data: PasswordData): Promise { await fs.writeFile(PASSWORD_FILE, JSON.stringify(data, null, 2), "utf-8"); } export const authService = { async verifyPassword(password: string): Promise { try { const data = await loadPasswordData(); return await bcrypt.compare(password, data.hash); } catch (error) { console.error("Error verifying password:", error); return false; } }, async changePassword(oldPassword: string, newPassword: string): Promise<{ success: boolean; error?: string }> { try { // Verify old password const isValid = await this.verifyPassword(oldPassword); if (!isValid) { return { success: false, error: "Mot de passe actuel incorrect" }; } // Hash new password const newHash = await bcrypt.hash(newPassword, 10); const data = await loadPasswordData(); // Update password data.hash = newHash; data.updatedAt = new Date().toISOString(); await savePasswordData(data); return { success: true }; } catch (error) { console.error("Error changing password:", error); return { success: false, error: "Erreur lors du changement de mot de passe" }; } }, async hasPassword(): Promise { try { await ensurePasswordFile(); return existsSync(PASSWORD_FILE); } catch { return false; } }, };