refactor(backend): add output DTOs for existing endpoints
This commit is contained in:
@@ -1,6 +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';
|
||||
|
||||
export async function getMe(req: Request, res: Response): Promise<void> {
|
||||
const user = req.user;
|
||||
@@ -9,7 +10,7 @@ export async function getMe(req: Request, res: Response): Promise<void> {
|
||||
}
|
||||
|
||||
const profil = await getProfil(user.id);
|
||||
res.json({ data: profil });
|
||||
res.json({ data: toUtilisateurDto(profil) });
|
||||
}
|
||||
|
||||
export async function identifier(req: Request, res: Response): Promise<void> {
|
||||
@@ -19,5 +20,5 @@ export async function identifier(req: Request, res: Response): Promise<void> {
|
||||
}
|
||||
|
||||
const profil = await identifierParCarte(qr);
|
||||
res.json({ data: profil });
|
||||
res.json({ data: toUtilisateurDto(profil) });
|
||||
}
|
||||
|
||||
@@ -1,6 +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';
|
||||
|
||||
export async function getMesEmprunts(req: Request, res: Response): Promise<void> {
|
||||
const user = req.user;
|
||||
@@ -9,5 +10,5 @@ export async function getMesEmprunts(req: Request, res: Response): Promise<void>
|
||||
}
|
||||
|
||||
const emprunts = await listerMesEmpruntsEnCours(user.id);
|
||||
res.json({ data: emprunts });
|
||||
res.json({ data: emprunts.map(toEmpruntDto) });
|
||||
}
|
||||
|
||||
@@ -1,6 +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';
|
||||
|
||||
function parseCategorieId(value: unknown): number | undefined {
|
||||
if (value === undefined) {
|
||||
@@ -25,5 +26,5 @@ export async function getCatalogue(req: Request, res: Response): Promise<void> {
|
||||
const categorieId = parseCategorieId(req.query.categorieId);
|
||||
|
||||
const materiels = await listerCatalogue(user.campusId, { categorieId, recherche });
|
||||
res.json({ data: materiels });
|
||||
res.json({ data: materiels.map(toMaterielDto) });
|
||||
}
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
import { EmpruntAvecMateriel } from '../repositories/emprunt.repository';
|
||||
import { MaterielDto, toMaterielDto } from './materiel.dto';
|
||||
|
||||
export interface EmpruntDto {
|
||||
id: number;
|
||||
dateEmprunt: Date;
|
||||
dateRetourPrevue: Date;
|
||||
dateRetourReelle: Date | null;
|
||||
statut: string;
|
||||
materiel: MaterielDto;
|
||||
}
|
||||
|
||||
export function toEmpruntDto(emprunt: EmpruntAvecMateriel): EmpruntDto {
|
||||
return {
|
||||
id: emprunt.id,
|
||||
dateEmprunt: emprunt.dateEmprunt,
|
||||
dateRetourPrevue: emprunt.dateRetourPrevue,
|
||||
dateRetourReelle: emprunt.dateRetourReelle,
|
||||
statut: emprunt.statut,
|
||||
materiel: toMaterielDto(emprunt.materiel),
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
import { MaterielAvecCategorie } from '../repositories/materiel.repository';
|
||||
|
||||
export interface CategorieDto {
|
||||
id: number;
|
||||
nom: string;
|
||||
}
|
||||
|
||||
export interface MaterielDto {
|
||||
id: number;
|
||||
nom: string;
|
||||
marque: string;
|
||||
modele: string;
|
||||
reference: string;
|
||||
statut: string;
|
||||
etatGeneral: string;
|
||||
categorie: CategorieDto;
|
||||
}
|
||||
|
||||
export function toMaterielDto(materiel: MaterielAvecCategorie): MaterielDto {
|
||||
return {
|
||||
id: materiel.id,
|
||||
nom: materiel.nom,
|
||||
marque: materiel.marque,
|
||||
modele: materiel.modele,
|
||||
reference: materiel.reference,
|
||||
statut: materiel.statut,
|
||||
etatGeneral: materiel.etatGeneral,
|
||||
categorie: {
|
||||
id: materiel.categorie.id,
|
||||
nom: materiel.categorie.nom,
|
||||
},
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
import { UtilisateurProfil } from '../repositories/utilisateur.repository';
|
||||
|
||||
export interface RoleDto {
|
||||
code: string;
|
||||
libelle: string;
|
||||
}
|
||||
|
||||
export interface CampusDto {
|
||||
id: number;
|
||||
nom: string;
|
||||
ville: string;
|
||||
}
|
||||
|
||||
export interface UtilisateurDto {
|
||||
id: number;
|
||||
nom: string;
|
||||
prenom: string;
|
||||
email: string;
|
||||
classe: string | null;
|
||||
role: RoleDto;
|
||||
campus: CampusDto;
|
||||
}
|
||||
|
||||
export function toUtilisateurDto(utilisateur: UtilisateurProfil): UtilisateurDto {
|
||||
return {
|
||||
id: utilisateur.id,
|
||||
nom: utilisateur.nom,
|
||||
prenom: utilisateur.prenom,
|
||||
email: utilisateur.email,
|
||||
classe: utilisateur.classe,
|
||||
role: {
|
||||
code: utilisateur.role.code,
|
||||
libelle: utilisateur.role.libelle,
|
||||
},
|
||||
campus: {
|
||||
id: utilisateur.campus.id,
|
||||
nom: utilisateur.campus.nom,
|
||||
ville: utilisateur.campus.ville,
|
||||
},
|
||||
};
|
||||
}
|
||||
@@ -137,6 +137,12 @@ En terminal interactif (VS Code), `migrate dev` fonctionne normalement (taper `y
|
||||
- Refactor du routage : `currentUser` appliqué par sous-routeur (au lieu d'un middleware global) pour laisser la route d'identification publique.
|
||||
- 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).
|
||||
- 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`.
|
||||
|
||||
---
|
||||
|
||||
## Dette technique en attente
|
||||
@@ -149,8 +155,7 @@ En terminal interactif (VS Code), `migrate dev` fonctionne normalement (taper `y
|
||||
4. Tailles de colonnes `@db.NVarChar(n)` (actuellement `NVARCHAR(1000)` partout)
|
||||
5. Swagger/OpenAPI (Block 1, reporté après les endpoints)
|
||||
6. Auth réelle Azure AD (Block 3) — remplacera l'auth simulée par en-tête
|
||||
7. DTO de sortie : les endpoints renvoient l'entité Prisma brute (`microsoftId`, timestamps exposés) — à filtrer avant la prod
|
||||
|
||||
---
|
||||
|
||||
*Dernière mise à jour : 2026-06-22 — Profil et identification par QR en place (3/6 du Block 4).*
|
||||
*Dernière mise à jour : 2026-06-22 — DTO de sortie en place sur les 3 endpoints de lecture.*
|
||||
|
||||
Reference in New Issue
Block a user