refactor(backend): rename output DTOs to Response naming convention

This commit is contained in:
SaidSoighiri94
2026-06-22 11:01:05 +02:00
parent 101e52236f
commit ab1bf29b7f
7 changed files with 24 additions and 23 deletions
@@ -1,7 +1,7 @@
import { Request, Response } from 'express'; import { Request, Response } from 'express';
import { AppError } from '../errors/app-error'; import { AppError } from '../errors/app-error';
import { getProfil, identifierParCarte } from '../services/utilisateur.service'; 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<void> { export async function getMe(req: Request, res: Response): Promise<void> {
const user = req.user; const user = req.user;
@@ -10,7 +10,7 @@ export async function getMe(req: Request, res: Response): Promise<void> {
} }
const profil = await getProfil(user.id); 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<void> { export async function identifier(req: Request, res: Response): Promise<void> {
@@ -20,5 +20,5 @@ export async function identifier(req: Request, res: Response): Promise<void> {
} }
const profil = await identifierParCarte(qr); const profil = await identifierParCarte(qr);
res.json({ data: toUtilisateurDto(profil) }); res.json({ data: toUtilisateurResponse(profil) });
} }
@@ -1,7 +1,7 @@
import { Request, Response } from 'express'; import { Request, Response } from 'express';
import { AppError } from '../errors/app-error'; import { AppError } from '../errors/app-error';
import { listerMesEmpruntsEnCours } from '../services/emprunt.service'; 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<void> { export async function getMesEmprunts(req: Request, res: Response): Promise<void> {
const user = req.user; const user = req.user;
@@ -10,5 +10,5 @@ export async function getMesEmprunts(req: Request, res: Response): Promise<void>
} }
const emprunts = await listerMesEmpruntsEnCours(user.id); const emprunts = await listerMesEmpruntsEnCours(user.id);
res.json({ data: emprunts.map(toEmpruntDto) }); res.json({ data: emprunts.map(toEmpruntResponse) });
} }
@@ -1,7 +1,7 @@
import { Request, Response } from 'express'; import { Request, Response } from 'express';
import { AppError } from '../errors/app-error'; import { AppError } from '../errors/app-error';
import { listerCatalogue } from '../services/materiel.service'; import { listerCatalogue } from '../services/materiel.service';
import { toMaterielDto } from '../dtos/materiel.dto'; import { toMaterielResponse } from '../dtos/materiel.dto';
function parseCategorieId(value: unknown): number | undefined { function parseCategorieId(value: unknown): number | undefined {
if (value === undefined) { if (value === undefined) {
@@ -26,5 +26,5 @@ export async function getCatalogue(req: Request, res: Response): Promise<void> {
const categorieId = parseCategorieId(req.query.categorieId); const categorieId = parseCategorieId(req.query.categorieId);
const materiels = await listerCatalogue(user.campusId, { categorieId, recherche }); const materiels = await listerCatalogue(user.campusId, { categorieId, recherche });
res.json({ data: materiels.map(toMaterielDto) }); res.json({ data: materiels.map(toMaterielResponse) });
} }
+5 -5
View File
@@ -1,22 +1,22 @@
import { EmpruntAvecMateriel } from '../repositories/emprunt.repository'; 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; id: number;
dateEmprunt: Date; dateEmprunt: Date;
dateRetourPrevue: Date; dateRetourPrevue: Date;
dateRetourReelle: Date | null; dateRetourReelle: Date | null;
statut: string; statut: string;
materiel: MaterielDto; materiel: MaterielResponse;
} }
export function toEmpruntDto(emprunt: EmpruntAvecMateriel): EmpruntDto { export function toEmpruntResponse(emprunt: EmpruntAvecMateriel): EmpruntResponse {
return { return {
id: emprunt.id, id: emprunt.id,
dateEmprunt: emprunt.dateEmprunt, dateEmprunt: emprunt.dateEmprunt,
dateRetourPrevue: emprunt.dateRetourPrevue, dateRetourPrevue: emprunt.dateRetourPrevue,
dateRetourReelle: emprunt.dateRetourReelle, dateRetourReelle: emprunt.dateRetourReelle,
statut: emprunt.statut, statut: emprunt.statut,
materiel: toMaterielDto(emprunt.materiel), materiel: toMaterielResponse(emprunt.materiel),
}; };
} }
+4 -4
View File
@@ -1,11 +1,11 @@
import { MaterielAvecCategorie } from '../repositories/materiel.repository'; import { MaterielAvecCategorie } from '../repositories/materiel.repository';
export interface CategorieDto { export interface CategorieResponse {
id: number; id: number;
nom: string; nom: string;
} }
export interface MaterielDto { export interface MaterielResponse {
id: number; id: number;
nom: string; nom: string;
marque: string; marque: string;
@@ -13,10 +13,10 @@ export interface MaterielDto {
reference: string; reference: string;
statut: string; statut: string;
etatGeneral: string; etatGeneral: string;
categorie: CategorieDto; categorie: CategorieResponse;
} }
export function toMaterielDto(materiel: MaterielAvecCategorie): MaterielDto { export function toMaterielResponse(materiel: MaterielAvecCategorie): MaterielResponse {
return { return {
id: materiel.id, id: materiel.id,
nom: materiel.nom, nom: materiel.nom,
+6 -6
View File
@@ -1,27 +1,27 @@
import { UtilisateurProfil } from '../repositories/utilisateur.repository'; import { UtilisateurProfil } from '../repositories/utilisateur.repository';
export interface RoleDto { export interface RoleResponse {
code: string; code: string;
libelle: string; libelle: string;
} }
export interface CampusDto { export interface CampusResponse {
id: number; id: number;
nom: string; nom: string;
ville: string; ville: string;
} }
export interface UtilisateurDto { export interface UtilisateurResponse {
id: number; id: number;
nom: string; nom: string;
prenom: string; prenom: string;
email: string; email: string;
classe: string | null; classe: string | null;
role: RoleDto; role: RoleResponse;
campus: CampusDto; campus: CampusResponse;
} }
export function toUtilisateurDto(utilisateur: UtilisateurProfil): UtilisateurDto { export function toUtilisateurResponse(utilisateur: UtilisateurProfil): UtilisateurResponse {
return { return {
id: utilisateur.id, id: utilisateur.id,
nom: utilisateur.nom, nom: utilisateur.nom,
+2 -1
View File
@@ -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.). | | 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). | | 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. | | 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 ### 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. - 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 ### É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). - 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`. - Champs internes désormais masqués : `microsoftId`, timestamps, FK brutes, `numeroInventaire`/`numeroSerie`.
- Vérifié au runtime sur `/me`, `/materiels`, `/mes-emprunts`. - Vérifié au runtime sur `/me`, `/materiels`, `/mes-emprunts`.