From ab1bf29b7f3d16c46e9f3aced301cd7a6153a18b Mon Sep 17 00:00:00 2001 From: SaidSoighiri94 Date: Mon, 22 Jun 2026 11:01:05 +0200 Subject: [PATCH] refactor(backend): rename output DTOs to Response naming convention --- eme-backend/src/controllers/auth.controller.ts | 6 +++--- eme-backend/src/controllers/emprunt.controller.ts | 4 ++-- eme-backend/src/controllers/materiel.controller.ts | 4 ++-- eme-backend/src/dtos/emprunt.dto.ts | 10 +++++----- eme-backend/src/dtos/materiel.dto.ts | 8 ++++---- eme-backend/src/dtos/utilisateur.dto.ts | 12 ++++++------ review.md | 3 ++- 7 files changed, 24 insertions(+), 23 deletions(-) diff --git a/eme-backend/src/controllers/auth.controller.ts b/eme-backend/src/controllers/auth.controller.ts index 7242a08..0ba5e98 100644 --- a/eme-backend/src/controllers/auth.controller.ts +++ b/eme-backend/src/controllers/auth.controller.ts @@ -1,7 +1,7 @@ import { Request, Response } from 'express'; import { AppError } from '../errors/app-error'; import { getProfil, identifierParCarte } from '../services/utilisateur.service'; -import { toUtilisateurDto } from '../dtos/utilisateur.dto'; +import { toUtilisateurResponse } from '../dtos/utilisateur.dto'; export async function getMe(req: Request, res: Response): Promise { const user = req.user; @@ -10,7 +10,7 @@ export async function getMe(req: Request, res: Response): Promise { } const profil = await getProfil(user.id); - res.json({ data: toUtilisateurDto(profil) }); + res.json({ data: toUtilisateurResponse(profil) }); } export async function identifier(req: Request, res: Response): Promise { @@ -20,5 +20,5 @@ export async function identifier(req: Request, res: Response): Promise { } const profil = await identifierParCarte(qr); - res.json({ data: toUtilisateurDto(profil) }); + res.json({ data: toUtilisateurResponse(profil) }); } diff --git a/eme-backend/src/controllers/emprunt.controller.ts b/eme-backend/src/controllers/emprunt.controller.ts index 33d4fe5..8845029 100644 --- a/eme-backend/src/controllers/emprunt.controller.ts +++ b/eme-backend/src/controllers/emprunt.controller.ts @@ -1,7 +1,7 @@ import { Request, Response } from 'express'; import { AppError } from '../errors/app-error'; import { listerMesEmpruntsEnCours } from '../services/emprunt.service'; -import { toEmpruntDto } from '../dtos/emprunt.dto'; +import { toEmpruntResponse } from '../dtos/emprunt.dto'; export async function getMesEmprunts(req: Request, res: Response): Promise { const user = req.user; @@ -10,5 +10,5 @@ export async function getMesEmprunts(req: Request, res: Response): Promise } const emprunts = await listerMesEmpruntsEnCours(user.id); - res.json({ data: emprunts.map(toEmpruntDto) }); + res.json({ data: emprunts.map(toEmpruntResponse) }); } diff --git a/eme-backend/src/controllers/materiel.controller.ts b/eme-backend/src/controllers/materiel.controller.ts index d8b6d3e..efea8fd 100644 --- a/eme-backend/src/controllers/materiel.controller.ts +++ b/eme-backend/src/controllers/materiel.controller.ts @@ -1,7 +1,7 @@ import { Request, Response } from 'express'; import { AppError } from '../errors/app-error'; import { listerCatalogue } from '../services/materiel.service'; -import { toMaterielDto } from '../dtos/materiel.dto'; +import { toMaterielResponse } from '../dtos/materiel.dto'; function parseCategorieId(value: unknown): number | undefined { if (value === undefined) { @@ -26,5 +26,5 @@ export async function getCatalogue(req: Request, res: Response): Promise { const categorieId = parseCategorieId(req.query.categorieId); const materiels = await listerCatalogue(user.campusId, { categorieId, recherche }); - res.json({ data: materiels.map(toMaterielDto) }); + res.json({ data: materiels.map(toMaterielResponse) }); } diff --git a/eme-backend/src/dtos/emprunt.dto.ts b/eme-backend/src/dtos/emprunt.dto.ts index 139c9f2..f690d32 100644 --- a/eme-backend/src/dtos/emprunt.dto.ts +++ b/eme-backend/src/dtos/emprunt.dto.ts @@ -1,22 +1,22 @@ import { EmpruntAvecMateriel } from '../repositories/emprunt.repository'; -import { MaterielDto, toMaterielDto } from './materiel.dto'; +import { MaterielResponse, toMaterielResponse } from './materiel.dto'; -export interface EmpruntDto { +export interface EmpruntResponse { id: number; dateEmprunt: Date; dateRetourPrevue: Date; dateRetourReelle: Date | null; statut: string; - materiel: MaterielDto; + materiel: MaterielResponse; } -export function toEmpruntDto(emprunt: EmpruntAvecMateriel): EmpruntDto { +export function toEmpruntResponse(emprunt: EmpruntAvecMateriel): EmpruntResponse { return { id: emprunt.id, dateEmprunt: emprunt.dateEmprunt, dateRetourPrevue: emprunt.dateRetourPrevue, dateRetourReelle: emprunt.dateRetourReelle, statut: emprunt.statut, - materiel: toMaterielDto(emprunt.materiel), + materiel: toMaterielResponse(emprunt.materiel), }; } diff --git a/eme-backend/src/dtos/materiel.dto.ts b/eme-backend/src/dtos/materiel.dto.ts index b0b74e6..ea2ed50 100644 --- a/eme-backend/src/dtos/materiel.dto.ts +++ b/eme-backend/src/dtos/materiel.dto.ts @@ -1,11 +1,11 @@ import { MaterielAvecCategorie } from '../repositories/materiel.repository'; -export interface CategorieDto { +export interface CategorieResponse { id: number; nom: string; } -export interface MaterielDto { +export interface MaterielResponse { id: number; nom: string; marque: string; @@ -13,10 +13,10 @@ export interface MaterielDto { reference: string; statut: string; etatGeneral: string; - categorie: CategorieDto; + categorie: CategorieResponse; } -export function toMaterielDto(materiel: MaterielAvecCategorie): MaterielDto { +export function toMaterielResponse(materiel: MaterielAvecCategorie): MaterielResponse { return { id: materiel.id, nom: materiel.nom, diff --git a/eme-backend/src/dtos/utilisateur.dto.ts b/eme-backend/src/dtos/utilisateur.dto.ts index 586df9a..c0c33e1 100644 --- a/eme-backend/src/dtos/utilisateur.dto.ts +++ b/eme-backend/src/dtos/utilisateur.dto.ts @@ -1,27 +1,27 @@ import { UtilisateurProfil } from '../repositories/utilisateur.repository'; -export interface RoleDto { +export interface RoleResponse { code: string; libelle: string; } -export interface CampusDto { +export interface CampusResponse { id: number; nom: string; ville: string; } -export interface UtilisateurDto { +export interface UtilisateurResponse { id: number; nom: string; prenom: string; email: string; classe: string | null; - role: RoleDto; - campus: CampusDto; + role: RoleResponse; + campus: CampusResponse; } -export function toUtilisateurDto(utilisateur: UtilisateurProfil): UtilisateurDto { +export function toUtilisateurResponse(utilisateur: UtilisateurProfil): UtilisateurResponse { return { id: utilisateur.id, nom: utilisateur.nom, diff --git a/review.md b/review.md index e7c0792..8e41f9d 100644 --- a/review.md +++ b/review.md @@ -22,6 +22,7 @@ Ces décisions s'appliquent à tout le projet, sauf mention contraire. | ERD tenu à jour en miroir du schéma (`docs/conceptions/uml/ERD.md`) | La source de vérité doit refléter le code réel (nullable, `UK`, etc.). | | Workflow Git : commits sur `develop` uniquement | `master` est figé ; `develop` reste toujours à jour de `master` (aucune divergence puisque master ne bouge plus). | | Process avant chaque migration : `prisma format` -> `prisma validate` -> `npm run build` -> migration | Détecter toute erreur de schéma/typage avant de toucher la base. | +| DTO nommés `XxxResponse` (sortie) et `XxxRequest` (entrée) | Le sens est explicite dans le nom. Sortie = mapping (`toXxxResponse`), entrée = validation. | ### Note outillage — migrations en environnement non-interactif @@ -138,7 +139,7 @@ En terminal interactif (VS Code), `migrate dev` fonctionne normalement (taper `y - Vérifié au runtime : `/me` 200 (profil Marie) et 401 sans en-tête ; `/carte` QR valide 200 sans en-tête (route publique), QR inconnu 404. ### Étape 17 — DTO de sortie sur les endpoints existants -- Dossier `src/dtos/` : une interface DTO + un mapper pur `toXxxDto` par ressource (utilisateur, matériel, emprunt). +- Dossier `src/dtos/` : par ressource, une interface `XxxResponse` + un mapper pur `toXxxResponse` (utilisateur, matériel, emprunt). - Mapping effectué dans le controller (couche présentation) ; les services continuent de renvoyer les entités (réutilisables). - Champs internes désormais masqués : `microsoftId`, timestamps, FK brutes, `numeroInventaire`/`numeroSerie`. - Vérifié au runtime sur `/me`, `/materiels`, `/mes-emprunts`.