feat: add logging and caching enhancements across core services

Integrate `Logger` for consistent logging in services like `reports`, `categories`, `users`, `contents`, and more. Introduce caching capabilities with `CacheInterceptor` and manual cache clearing logic for categories, users, and contents. Add request throttling to critical auth endpoints for enhanced rate limiting.
This commit is contained in:
Mathis HERRIOT
2026-01-10 16:31:06 +01:00
parent 9654553940
commit 5a22ad7480
12 changed files with 129 additions and 13 deletions

View File

@@ -6,7 +6,13 @@ import {
Param,
Patch,
Post,
UseGuards,
UseInterceptors,
} from "@nestjs/common";
import { CacheInterceptor, CacheKey, CacheTTL } from "@nestjs/cache-manager";
import { Roles } from "../auth/decorators/roles.decorator";
import { AuthGuard } from "../auth/guards/auth.guard";
import { RolesGuard } from "../auth/guards/roles.guard";
import { CategoriesService } from "./categories.service";
import { CreateCategoryDto } from "./dto/create-category.dto";
import { UpdateCategoryDto } from "./dto/update-category.dto";
@@ -16,6 +22,9 @@ export class CategoriesController {
constructor(private readonly categoriesService: CategoriesService) {}
@Get()
@UseInterceptors(CacheInterceptor)
@CacheKey("categories/all")
@CacheTTL(3600000) // 1 heure
findAll() {
return this.categoriesService.findAll();
}
@@ -25,18 +34,23 @@ export class CategoriesController {
return this.categoriesService.findOne(id);
}
// Ces routes devraient être protégées par un AdminGuard
@Post()
@UseGuards(AuthGuard, RolesGuard)
@Roles("admin")
create(@Body() createCategoryDto: CreateCategoryDto) {
return this.categoriesService.create(createCategoryDto);
}
@Patch(":id")
@UseGuards(AuthGuard, RolesGuard)
@Roles("admin")
update(@Param("id") id: string, @Body() updateCategoryDto: UpdateCategoryDto) {
return this.categoriesService.update(id, updateCategoryDto);
}
@Delete(":id")
@UseGuards(AuthGuard, RolesGuard)
@Roles("admin")
remove(@Param("id") id: string) {
return this.categoriesService.remove(id);
}

View File

@@ -1,4 +1,6 @@
import { Injectable } from "@nestjs/common";
import { Injectable, Logger, Inject } from "@nestjs/common";
import { CACHE_MANAGER } from "@nestjs/cache-manager";
import { Cache } from "cache-manager";
import { eq } from "drizzle-orm";
import { DatabaseService } from "../database/database.service";
import { categories } from "../database/schemas";
@@ -7,7 +9,17 @@ import { UpdateCategoryDto } from "./dto/update-category.dto";
@Injectable()
export class CategoriesService {
constructor(private readonly databaseService: DatabaseService) {}
private readonly logger = new Logger(CategoriesService.name);
constructor(
private readonly databaseService: DatabaseService,
@Inject(CACHE_MANAGER) private cacheManager: Cache,
) {}
private async clearCategoriesCache() {
this.logger.log("Clearing categories cache");
await this.cacheManager.del("categories/all");
}
async findAll() {
return await this.databaseService.db
@@ -27,17 +39,22 @@ export class CategoriesService {
}
async create(data: CreateCategoryDto) {
this.logger.log(`Creating category: ${data.name}`);
const slug = data.name
.toLowerCase()
.replace(/ /g, "-")
.replace(/[^\w-]/g, "");
return await this.databaseService.db
const result = await this.databaseService.db
.insert(categories)
.values({ ...data, slug })
.returning();
await this.clearCategoriesCache();
return result;
}
async update(id: string, data: UpdateCategoryDto) {
this.logger.log(`Updating category: ${id}`);
const updateData = {
...data,
updatedAt: new Date(),
@@ -48,17 +65,24 @@ export class CategoriesService {
.replace(/[^\w-]/g, "")
: undefined,
};
return await this.databaseService.db
const result = await this.databaseService.db
.update(categories)
.set(updateData)
.where(eq(categories.id, id))
.returning();
await this.clearCategoriesCache();
return result;
}
async remove(id: string) {
return await this.databaseService.db
this.logger.log(`Removing category: ${id}`);
const result = await this.databaseService.db
.delete(categories)
.where(eq(categories.id, id))
.returning();
await this.clearCategoriesCache();
return result;
}
}