116 lines
3.0 KiB
TypeScript
116 lines
3.0 KiB
TypeScript
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<DashboardResponsableData> {
|
|
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<EmpruntResponsable[]> {
|
|
verifierResponsable(roleCode);
|
|
return findEmpruntsResponsable(campusId, filtres);
|
|
}
|
|
|
|
export function listerMaterielsResponsable(
|
|
roleCode: string,
|
|
campusId: number,
|
|
filtres: ListerMaterielsResponsableFiltres,
|
|
): Promise<MaterielResponsable[]> {
|
|
verifierResponsable(roleCode);
|
|
return findMaterielsResponsable(campusId, filtres);
|
|
}
|