feat(backend): add GET /api/mes-emprunts endpoint
This commit is contained in:
@@ -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' },
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
import { Router } from 'express';
|
||||||
|
import { getMesEmprunts } from '../controllers/emprunt.controller';
|
||||||
|
|
||||||
|
export const empruntRoutes: Router = Router();
|
||||||
|
|
||||||
|
empruntRoutes.get('/', getMesEmprunts);
|
||||||
@@ -1,8 +1,10 @@
|
|||||||
import { Router } from 'express';
|
import { Router } from 'express';
|
||||||
import { currentUser } from '../middlewares/current-user';
|
import { currentUser } from '../middlewares/current-user';
|
||||||
import { materielRoutes } from './materiel.routes';
|
import { materielRoutes } from './materiel.routes';
|
||||||
|
import { empruntRoutes } from './emprunt.routes';
|
||||||
|
|
||||||
export const apiRouter: Router = Router();
|
export const apiRouter: Router = Router();
|
||||||
|
|
||||||
apiRouter.use(currentUser);
|
apiRouter.use(currentUser);
|
||||||
apiRouter.use('/materiels', materielRoutes);
|
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);
|
||||||
|
}
|
||||||
@@ -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": ... }`).
|
- 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.
|
- 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
|
## 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.*
|
||||||
|
|||||||
Reference in New Issue
Block a user