diff --git a/eme-backend/src/middlewares/current-user.ts b/eme-backend/src/middlewares/current-user.ts new file mode 100644 index 0000000..89f90dd --- /dev/null +++ b/eme-backend/src/middlewares/current-user.ts @@ -0,0 +1,28 @@ +import { Request, Response, NextFunction } from 'express'; +import { AppError } from '../errors/app-error'; +import { findByEmail } from '../repositories/utilisateur.repository'; +import { AuthenticatedUser } from '../types/authenticated-user'; + +/* Auth simulée (temporaire) : en attendant Azure AD, l'utilisateur courant est + résolu depuis l'en-tête `x-user-email`. À remplacer par la validation du JWT. */ +export async function currentUser(req: Request, _res: Response, next: NextFunction): Promise { + const email = req.header('x-user-email'); + if (!email) { + throw new AppError(401, 'En-tete x-user-email requis (auth simulee)'); + } + + const utilisateur = await findByEmail(email); + if (!utilisateur || !utilisateur.actif) { + throw new AppError(401, 'Utilisateur non reconnu'); + } + + const authenticated: AuthenticatedUser = { + id: utilisateur.id, + email: utilisateur.email, + roleCode: utilisateur.role.code, + campusId: utilisateur.campusId, + }; + + req.user = authenticated; + next(); +} diff --git a/eme-backend/src/repositories/utilisateur.repository.ts b/eme-backend/src/repositories/utilisateur.repository.ts new file mode 100644 index 0000000..c367538 --- /dev/null +++ b/eme-backend/src/repositories/utilisateur.repository.ts @@ -0,0 +1,11 @@ +import { Prisma } from '@prisma/client'; +import { prisma } from '../db/prisma'; + +export type UtilisateurAvecRole = Prisma.UtilisateurGetPayload<{ include: { role: true } }>; + +export function findByEmail(email: string): Promise { + return prisma.utilisateur.findUnique({ + where: { email }, + include: { role: true }, + }); +} diff --git a/eme-backend/src/types/authenticated-user.ts b/eme-backend/src/types/authenticated-user.ts new file mode 100644 index 0000000..a98290b --- /dev/null +++ b/eme-backend/src/types/authenticated-user.ts @@ -0,0 +1,6 @@ +export interface AuthenticatedUser { + id: number; + email: string; + roleCode: string; + campusId: number; +} diff --git a/eme-backend/src/types/express.d.ts b/eme-backend/src/types/express.d.ts new file mode 100644 index 0000000..c78bac4 --- /dev/null +++ b/eme-backend/src/types/express.d.ts @@ -0,0 +1,9 @@ +import { AuthenticatedUser } from './authenticated-user'; + +declare global { + namespace Express { + interface Request { + user?: AuthenticatedUser; + } + } +}