Files
fintrack/services/auth.service.ts

92 lines
2.4 KiB
TypeScript

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<void> {
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<PasswordData> {
await ensurePasswordFile();
const content = await fs.readFile(PASSWORD_FILE, "utf-8");
return JSON.parse(content);
}
async function savePasswordData(data: PasswordData): Promise<void> {
await fs.writeFile(PASSWORD_FILE, JSON.stringify(data, null, 2), "utf-8");
}
export const authService = {
async verifyPassword(password: string): Promise<boolean> {
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<boolean> {
try {
await ensurePasswordFile();
return existsSync(PASSWORD_FILE);
} catch {
return false;
}
},
};