refactor(backend): rename output DTOs to Response naming convention
This commit is contained in:
@@ -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) });
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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`.
|
||||||
|
|||||||
Reference in New Issue
Block a user