feat: add modular services and repositories for improved code organization

Introduce repository pattern across multiple services, including `favorites`, `tags`, `sessions`, `reports`, `auth`, and more. Decouple crypto functionalities into modular services like `HashingService`, `JwtService`, and `EncryptionService`. Improve testability and maintainability by simplifying dependencies and consolidating utility logic.
This commit is contained in:
Mathis HERRIOT
2026-01-14 12:11:39 +01:00
parent 9c45bf11e4
commit 514bd354bf
64 changed files with 1801 additions and 1295 deletions

View File

@@ -7,7 +7,8 @@ import {
import { ConfigService } from "@nestjs/config";
import { authenticator } from "otplib";
import { toDataURL } from "qrcode";
import { CryptoService } from "../crypto/crypto.service";
import { HashingService } from "../crypto/services/hashing.service";
import { JwtService } from "../crypto/services/jwt.service";
import { SessionsService } from "../sessions/sessions.service";
import { UsersService } from "../users/users.service";
import { LoginDto } from "./dto/login.dto";
@@ -19,7 +20,8 @@ export class AuthService {
constructor(
private readonly usersService: UsersService,
private readonly cryptoService: CryptoService,
private readonly hashingService: HashingService,
private readonly jwtService: JwtService,
private readonly sessionsService: SessionsService,
private readonly configService: ConfigService,
) {}
@@ -81,8 +83,8 @@ export class AuthService {
this.logger.log(`Registering new user: ${dto.username}`);
const { username, email, password } = dto;
const passwordHash = await this.cryptoService.hashPassword(password);
const emailHash = await this.cryptoService.hashEmail(email);
const passwordHash = await this.hashingService.hashPassword(password);
const emailHash = await this.hashingService.hashEmail(email);
const user = await this.usersService.create({
username,
@@ -101,14 +103,14 @@ export class AuthService {
this.logger.log(`Login attempt for email: ${dto.email}`);
const { email, password } = dto;
const emailHash = await this.cryptoService.hashEmail(email);
const emailHash = await this.hashingService.hashEmail(email);
const user = await this.usersService.findByEmailHash(emailHash);
if (!user) {
throw new UnauthorizedException("Invalid credentials");
}
const isPasswordValid = await this.cryptoService.verifyPassword(
const isPasswordValid = await this.hashingService.verifyPassword(
password,
user.passwordHash,
);
@@ -125,7 +127,7 @@ export class AuthService {
};
}
const accessToken = await this.cryptoService.generateJwt({
const accessToken = await this.jwtService.generateJwt({
sub: user.uuid,
username: user.username,
});
@@ -163,7 +165,7 @@ export class AuthService {
throw new UnauthorizedException("Invalid 2FA token");
}
const accessToken = await this.cryptoService.generateJwt({
const accessToken = await this.jwtService.generateJwt({
sub: user.uuid,
username: user.username,
});
@@ -189,7 +191,7 @@ export class AuthService {
throw new UnauthorizedException("User not found");
}
const accessToken = await this.cryptoService.generateJwt({
const accessToken = await this.jwtService.generateJwt({
sub: user.uuid,
username: user.username,
});