init projet

This commit is contained in:
2026-05-20 10:43:18 +02:00
parent 51f27903bb
commit 9a402b0b34
57 changed files with 5622 additions and 0 deletions
+191
View File
@@ -0,0 +1,191 @@
/* Service centralisé pour tous les appels API vers le backend FastAPI */
/* Utilise la variable d'environnement Vite si définie, sinon localhost par défaut */
const BASE_URL = import.meta.env.VITE_API_URL ?? 'http://localhost:8000';
/* Fonction utilitaire pour les requêtes fetch avec gestion d'erreur */
async function fetchApi(path, params = {}) {
const url = new URL(`${BASE_URL}${path}`);
Object.entries(params).forEach(([key, value]) => {
if (value !== undefined && value !== null && value !== '') {
url.searchParams.append(key, value);
}
});
try {
const response = await fetch(url.toString());
if (!response.ok) {
const errorText = await response.text();
console.error(`Erreur API [${response.status}] ${path}: ${errorText}`);
throw new Error(`Erreur ${response.status}: ${errorText}`);
}
return await response.json();
} catch (error) {
console.error(`Erreur lors de l'appel API ${path}:`, error);
throw error;
}
}
/* Santé de l'API */
export async function getHealth() {
return fetchApi('/health');
}
/* Récupère la liste des catégories */
export async function getCategories() {
return fetchApi('/categories');
}
/* Récupère la liste des services */
export async function getServices() {
return fetchApi('/services');
}
/* Récupère les contacts, filtrable par service */
export async function getContacts(id_service) {
return fetchApi('/contacts', { id_service });
}
/* Récupère la nomenclature (monitorings), filtrable par service et catégorie */
export async function getMonitorings(id_service, id_categorie) {
const data = await fetchApi('/monitorings', { id_service, id_categorie });
return Array.isArray(data) ? data.map(m => ({
id: m.id_monito,
id_monito: m.id_monito,
nom: m.monito_intitule,
monito_intitule: m.monito_intitule,
...m
})) : data;
}
/* Récupère un monitoring par son identifiant */
export async function getMonitoringById(id) {
const data = await fetchApi(`/monitorings/${id}`);
return data ? {
id: data.id_monito,
id_monito: data.id_monito,
nom: data.monito_intitule,
monito_intitule: data.monito_intitule,
...data
} : data;
}
/* Récupère les lignes d'erreur d'un monitoring avec pagination et filtres */
export async function getMonitoringDetails(id, { search, limit = 500, offset = 0 } = {}) {
return fetchApi(`/monitorings/${id}/details`, { search, limit, offset });
}
/* Récupère le nombre d'erreurs d'un monitoring */
export async function getMonitoringCount(id) {
const data = await fetchApi(`/monitorings/${id}/count`);
return {
id_monito: data.id_monito,
count: data.nb_erreurs,
nb_erreurs: data.nb_erreurs,
...data
};
}
/* Récupère les colonnes dynamiques d'un monitoring */
export async function getMonitoringColumns(id) {
return fetchApi(`/monitorings/${id}/columns`);
}
/* Récupère les données du dashboard (VUE_CONSO), filtrable par service et catégorie */
export async function getDashboard(service, categorie) {
const data = await fetchApi('/dashboard', { service, categorie });
return Array.isArray(data) ? data.map(m => ({
id: m.id_monito,
id_monito: m.id_monito,
nom: m.nom_monito,
nb_erreurs: m.nb_erreurs,
...m
})) : data;
}
/* Récupère le résumé global KPI du dashboard */
export async function getDashboardSummary() {
const data = await fetchApi('/dashboard/summary');
return {
total: data.nb_monitorings ?? 0,
ok: data.monitorings_ok ?? 0,
warning: 0, // À calculer ou ajouter à l'API
critical: data.monitorings_en_erreur ?? 0,
nb_monitorings: data.nb_monitorings,
total_erreurs: data.total_erreurs,
max_erreurs: data.max_erreurs,
monitoring_critique: data.monitoring_critique,
...data
};
}
/* Récupère l'historique, filtrable par monitoring, dates et service */
export async function getHistorique(id_monito, date_debut, date_fin, service) {
const data = await fetchApi('/historique', { id_monito, date_debut, date_fin, service });
return Array.isArray(data) ? data.map(h => ({
date: h.date_sauvegarde,
date_sauvegarde: h.date_sauvegarde,
...h
})) : data;
}
/* Récupère les données d'évolution pour un graphique */
export async function getHistoriqueEvolution(id, date_debut, date_fin) {
const data = await fetchApi(`/historique/${id}/evolution`, { date_debut, date_fin });
if (data?.evolution) {
return data.evolution.map(point => ({
date: point.date,
erreurs: point.nb_erreurs,
nb_erreurs: point.nb_erreurs
}));
}
return [];
}
export async function getEvolutionGlobal(date_debut, date_fin) {
const data = await fetchApi('/evolution/global', { date_debut, date_fin });
if (data?.series) {
return data.series.map(point => ({
date: point.date,
erreurs: point.nb_erreurs,
nb_erreurs: point.nb_erreurs
}));
}
return [];
}
/* Export CSV utilitaire */
export function exportToCSV(data, filename = 'export.csv') {
if (!data || data.length === 0) {
console.warn('Aucune donnée à exporter');
return;
}
// Récupère les clés du premier objet
const headers = Object.keys(data[0]);
// Crée le CSV : en-têtes + lignes
const csvLines = [
headers.join(','),
...data.map(row =>
headers.map(header => {
const value = row[header];
// Échappe les valeurs qui contiennent des virgules ou des guillemets
if (value === null || value === undefined) return '';
const str = String(value);
if (str.includes(',') || str.includes('"') || str.includes('\n')) {
return `"${str.replace(/"/g, '""')}"`;
}
return str;
}).join(',')
)
].join('\n');
// Crée un blob et télécharge
const blob = new Blob([csvLines], { type: 'text/csv;charset=utf-8;' });
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = filename;
link.click();
URL.revokeObjectURL(link.href);
}