import { AppError } from '../errors/app-error'; import { countAnomaliesParStatut, countEmpruntsParStatut, countMaterielsParStatut, countNotificationsNonLues, findActiviteRecente, findEmpruntsResponsable, findMaterielsResponsable, StatutCount, ActiviteResponsable, EmpruntResponsable, MaterielResponsable, } from '../repositories/responsable.repository'; import { STATUT_EMPRUNT, STATUT_MATERIEL, StatutEmprunt, StatutMateriel } from '../models/enums'; export interface DashboardResponsableData { materiels: StatutCount[]; emprunts: StatutCount[]; anomalies: StatutCount[]; notificationsNonLues: number; activiteRecente: ActiviteResponsable[]; } export interface ListerEmpruntsResponsableFiltres { statut?: StatutEmprunt; } export interface ListerMaterielsResponsableFiltres { statut?: StatutMateriel; categorieId?: number; recherche?: string; } function verifierResponsable(roleCode: string): void { if (roleCode !== 'RESPONSABLE') { throw new AppError(403, 'Acces reserve au responsable materiel'); } } export async function getDashboardResponsable( utilisateurId: number, roleCode: string, campusId: number, ): Promise { verifierResponsable(roleCode); const [materiels, emprunts, anomalies, notificationsNonLues, activiteRecente] = await Promise.all([ countMaterielsParStatut(campusId), countEmpruntsParStatut(campusId), countAnomaliesParStatut(campusId), countNotificationsNonLues(utilisateurId), findActiviteRecente(campusId, 10), ]); return { materiels, emprunts, anomalies, notificationsNonLues, activiteRecente, }; } export function parseStatutEmprunt(value: unknown): StatutEmprunt | undefined { if (value === undefined) { return undefined; } if (typeof value !== 'string' || !(STATUT_EMPRUNT as readonly string[]).includes(value)) { throw new AppError(400, 'statut invalide'); } return value as StatutEmprunt; } export function parseStatutMateriel(value: unknown): StatutMateriel | undefined { if (value === undefined) { return undefined; } if (typeof value !== 'string' || !(STATUT_MATERIEL as readonly string[]).includes(value)) { throw new AppError(400, 'statut invalide'); } return value as StatutMateriel; } export function parseCategorieId(value: unknown): number | undefined { if (value === undefined) { return undefined; } const parsed = Number(value); if (!Number.isInteger(parsed) || parsed <= 0) { throw new AppError(400, 'categorieId invalide'); } return parsed; } export function listerEmpruntsResponsable( roleCode: string, campusId: number, filtres: ListerEmpruntsResponsableFiltres, ): Promise { verifierResponsable(roleCode); return findEmpruntsResponsable(campusId, filtres); } export function listerMaterielsResponsable( roleCode: string, campusId: number, filtres: ListerMaterielsResponsableFiltres, ): Promise { verifierResponsable(roleCode); return findMaterielsResponsable(campusId, filtres); }