feat(backend): add GET /api/mes-emprunts endpoint

This commit is contained in:
SaidSoighiri94
2026-06-19 11:38:40 +02:00
parent bee21b9fd8
commit 20490a05c5
6 changed files with 55 additions and 1 deletions
@@ -0,0 +1,13 @@
import { Request, Response } from 'express';
import { AppError } from '../errors/app-error';
import { listerMesEmpruntsEnCours } from '../services/emprunt.service';
export async function getMesEmprunts(req: Request, res: Response): Promise<void> {
const user = req.user;
if (!user) {
throw new AppError(401, 'Authentification requise');
}
const emprunts = await listerMesEmpruntsEnCours(user.id);
res.json({ data: emprunts });
}
@@ -0,0 +1,20 @@
import { Prisma } from '@prisma/client';
import { prisma } from '../db/prisma';
import { StatutEmprunt } from '../models/enums';
export type EmpruntAvecMateriel = Prisma.EmpruntGetPayload<{
include: { materiel: { include: { categorie: true } } };
}>;
const STATUTS_EN_COURS: StatutEmprunt[] = ['EN_COURS', 'EN_RETARD'];
export function findEnCoursParUtilisateur(utilisateurId: number): Promise<EmpruntAvecMateriel[]> {
return prisma.emprunt.findMany({
where: {
utilisateurId,
statut: { in: STATUTS_EN_COURS },
},
include: { materiel: { include: { categorie: true } } },
orderBy: { dateRetourPrevue: 'asc' },
});
}
+6
View File
@@ -0,0 +1,6 @@
import { Router } from 'express';
import { getMesEmprunts } from '../controllers/emprunt.controller';
export const empruntRoutes: Router = Router();
empruntRoutes.get('/', getMesEmprunts);
+2
View File
@@ -1,8 +1,10 @@
import { Router } from 'express';
import { currentUser } from '../middlewares/current-user';
import { materielRoutes } from './materiel.routes';
import { empruntRoutes } from './emprunt.routes';
export const apiRouter: Router = Router();
apiRouter.use(currentUser);
apiRouter.use('/materiels', materielRoutes);
apiRouter.use('/mes-emprunts', empruntRoutes);
@@ -0,0 +1,7 @@
import { findEnCoursParUtilisateur, EmpruntAvecMateriel } from '../repositories/emprunt.repository';
/* RG15 : un étudiant ne consulte que ses propres emprunts, et uniquement ceux
non encore restitués (en cours ou en retard). */
export function listerMesEmpruntsEnCours(utilisateurId: number): Promise<EmpruntAvecMateriel[]> {
return findEnCoursParUtilisateur(utilisateurId);
}
+7 -1
View File
@@ -125,6 +125,12 @@ En terminal interactif (VS Code), `migrate dev` fonctionne normalement (taper `y
- Format de réponse standardisé : `{ "data": ... }` (cohérent avec `{ "error": ... }`).
- Vérifié au runtime : 401 sans en-tête / utilisateur inconnu, 200 avec les disponibles du campus, filtres OK, 400 sur `categorieId` invalide.
### Étape 15 — Block 4 : endpoint "mes emprunts en cours"
- Endpoint `GET /api/mes-emprunts` : retourne les emprunts non restitués (`EN_COURS`, `EN_RETARD`) de l'utilisateur courant, triés par date de retour prévue, avec le matériel et sa catégorie inclus.
- RG15 : filtrage par `utilisateurId` (chacun ne voit que ses propres emprunts).
- Réutilise l'architecture en couches et l'auth simulée déjà en place.
- Vérifié au runtime : Marie 1 (`EN_COURS`, son `CLOTURE` exclu), Lucas 1 (`EN_RETARD`), Sofia 0 (son `RETOUR_NON_CONFORME` exclu), 401 sans en-tête.
---
## Dette technique en attente
@@ -139,4 +145,4 @@ En terminal interactif (VS Code), `migrate dev` fonctionne normalement (taper `y
---
*Dernière mise à jour : 2026-06-18 — 1er endpoint (catalogue matériel) et architecture en couches en place.*
*Dernière mise à jour : 2026-06-18 — Endpoint "mes emprunts en cours" en place.*