Ajout de la gestion des erreurs HTTP, implémentation de la validation des comptes, et mise à jour des dépendances. Création de tests pour les entités et services de compte, ainsi que l'ajout d'un système de limitation de taux.

This commit is contained in:
2025-08-12 18:29:05 +00:00
parent 14e69e1f61
commit 3fe9fc7142
18 changed files with 1774 additions and 64 deletions

View File

@@ -1,3 +1,13 @@
import bcrypt from "bcrypt";
import {
InvalidEmailFormatError,
WeakPasswordError,
} from "../errors/AccountErrors";
import {
EMAIL_REGEX,
MIN_PASSWORD_LENGTH,
} from "../validation/AccountValidation";
export class AccountEntity {
constructor(
public readonly id: string,
@@ -8,34 +18,36 @@ export class AccountEntity {
public readonly updatedAt: Date,
) {
this.validateEmail(email);
this.validatePassword(password);
}
// Logique métier : validation de l'email
private validateEmail(email: string): void {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRegex.test(email)) {
throw new Error("Format d'email invalide");
if (!EMAIL_REGEX.test(email)) {
throw new InvalidEmailFormatError(email);
}
}
private validatePassword(password: string): void {
if (password.length < 8) {
throw new Error("Mot de passe trop court");
private static validatePassword(password: string): void {
if (password.length < MIN_PASSWORD_LENGTH) {
throw new WeakPasswordError();
}
}
// Logique métier : vérification du mot de passe
public verifyPassword(plainPassword: string): boolean {
// Dans un vrai projet, on utiliserait bcrypt
return this.password === plainPassword;
return bcrypt.compareSync(plainPassword, this.password);
}
public get hashedPassword(): string {
return this.password;
}
// Factory method pour créer un nouveau compte
static create(email: string, password: string): AccountEntity {
AccountEntity.validatePassword(password);
const now = new Date();
const id = crypto.randomUUID();
return new AccountEntity(id, email, password, 1, now, now);
const hashedPassword = bcrypt.hashSync(password, 10);
return new AccountEntity(id, email, hashedPassword, 1, now, now);
}
}