Refactoring

This commit is contained in:
dahoud
2026-03-01 22:00:28 +00:00
parent c0e2c4da45
commit 6b28cf751e
469 changed files with 26866 additions and 14768 deletions

View File

@@ -1,16 +1,18 @@
package dev.lions.unionflow.client.view;
import dev.lions.unionflow.client.dto.AuditLogDTO;
import dev.lions.unionflow.server.api.dto.admin.response.AuditLogResponse;
import dev.lions.unionflow.client.service.AuditService;
import dev.lions.unionflow.client.service.NotificationClientService;
import jakarta.annotation.PostConstruct;
import jakarta.enterprise.context.SessionScoped;
import jakarta.faces.application.FacesMessage;
import jakarta.faces.context.ExternalContext;
import jakarta.faces.context.FacesContext;
import jakarta.inject.Inject;
import jakarta.inject.Named;
import org.eclipse.microprofile.rest.client.inject.RestClient;
import org.jboss.logging.Logger;
import dev.lions.unionflow.client.service.ErrorHandlerService;
import dev.lions.unionflow.client.service.RetryService;
import java.io.OutputStream;
import java.io.Serializable;
import java.nio.charset.StandardCharsets;
@@ -18,12 +20,11 @@ import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.logging.Logger;
import java.util.stream.Collectors;
/**
* Bean JSF pour la gestion des logs d'audit
* Refactorisé pour utiliser directement AuditLogDTO et se connecter au backend
* Refactorisé pour utiliser directement AuditLogResponse et se connecter au backend
*
* @author UnionFlow Team
* @version 2.0
@@ -33,7 +34,7 @@ import java.util.stream.Collectors;
public class AuditBean implements Serializable {
private static final long serialVersionUID = 1L;
private static final Logger LOGGER = Logger.getLogger(AuditBean.class.getName());
private static final Logger LOG = Logger.getLogger(AuditBean.class);
@Inject
@RestClient
@@ -46,6 +47,12 @@ public class AuditBean implements Serializable {
@Inject
private UserSession userSession;
@Inject
ErrorHandlerService errorHandler;
@Inject
RetryService retryService;
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss");
// Filtres
@@ -57,10 +64,10 @@ public class AuditBean implements Serializable {
private String module = "";
private String ipAddress = "";
// Données - Utilisation directe de AuditLogDTO
private List<AuditLogDTO> tousLesLogs;
private List<AuditLogDTO> logsFiltres;
private AuditLogDTO logSelectionne;
// Données - Utilisation directe de AuditLogResponse
private List<AuditLogResponse> tousLesLogs;
private List<AuditLogResponse> logsFiltres;
private AuditLogResponse logSelectionne;
// Statistiques
private Map<String, Object> statistiques;
@@ -71,7 +78,7 @@ public class AuditBean implements Serializable {
@PostConstruct
public void init() {
LOGGER.info("Initialisation de AuditBean");
LOG.info("Initialisation de AuditBean");
// Initialiser les dates à aujourd'hui - 7 jours
Calendar cal = Calendar.getInstance();
dateFin = cal.getTime();
@@ -87,8 +94,11 @@ public class AuditBean implements Serializable {
*/
public void chargerLogs() {
try {
LOGGER.info("Chargement des logs d'audit depuis le backend");
Map<String, Object> response = auditService.listerTous(0, 1000, "dateHeure", "desc");
LOG.info("Chargement des logs d'audit depuis le backend");
Map<String, Object> response = retryService.executeWithRetrySupplier(
() -> auditService.listerTous(0, 1000, "dateHeure", "desc"),
"chargement des logs d'audit"
);
tousLesLogs = new ArrayList<>();
@@ -98,11 +108,11 @@ public class AuditBean implements Serializable {
if (data != null) {
for (Object item : data) {
if (item instanceof AuditLogDTO) {
tousLesLogs.add((AuditLogDTO) item);
if (item instanceof AuditLogResponse) {
tousLesLogs.add((AuditLogResponse) item);
} else if (item instanceof Map) {
@SuppressWarnings("unchecked")
AuditLogDTO dto = convertMapToDTO((Map<String, Object>) item);
AuditLogResponse dto = convertMapToDTO((Map<String, Object>) item);
tousLesLogs.add(dto);
}
}
@@ -110,14 +120,12 @@ public class AuditBean implements Serializable {
}
appliquerFiltres();
LOGGER.info("Logs chargés: " + tousLesLogs.size());
LOG.infof("Logs chargés: %d", tousLesLogs.size());
} catch (Exception e) {
LOGGER.severe("Erreur lors du chargement des logs: " + e.getMessage());
LOGGER.log(java.util.logging.Level.SEVERE, "Détails de l'erreur de chargement des logs d'audit", e);
LOG.errorf(e, "Erreur lors du chargement des logs");
tousLesLogs = new ArrayList<>();
ajouterMessage(FacesMessage.SEVERITY_ERROR, "Erreur",
"Erreur lors du chargement des logs: " + e.getMessage());
errorHandler.handleException(e, "lors du chargement des logs d'audit", null);
}
}
@@ -126,10 +134,13 @@ public class AuditBean implements Serializable {
*/
public void chargerStatistiques() {
try {
LOGGER.info("Chargement des statistiques d'audit");
statistiques = auditService.getStatistiques();
LOG.info("Chargement des statistiques d'audit");
statistiques = retryService.executeWithRetrySupplier(
() -> auditService.getStatistiques(),
"chargement des statistiques d'audit"
);
} catch (Exception e) {
LOGGER.severe("Erreur lors du chargement des statistiques: " + e.getMessage());
LOG.errorf(e, "Erreur lors du chargement des statistiques");
statistiques = new HashMap<>();
statistiques.put("total", 0L);
statistiques.put("success", 0L);
@@ -139,10 +150,10 @@ public class AuditBean implements Serializable {
}
/**
* Convertit une Map en AuditLogDTO
* Convertit une Map en AuditLogResponse
*/
private AuditLogDTO convertMapToDTO(Map<String, Object> map) {
AuditLogDTO dto = new AuditLogDTO();
private AuditLogResponse convertMapToDTO(Map<String, Object> map) {
AuditLogResponse dto = new AuditLogResponse();
try {
if (map.get("id") != null) {
@@ -179,7 +190,7 @@ public class AuditBean implements Serializable {
}
} catch (Exception e) {
LOGGER.warning("Erreur lors de la conversion Map vers DTO: " + e.getMessage());
LOG.warnf(e, "Erreur lors de la conversion Map vers DTO");
}
return dto;
@@ -199,7 +210,7 @@ public class AuditBean implements Serializable {
.collect(Collectors.toList());
}
private boolean correspondAuxFiltres(AuditLogDTO log) {
private boolean correspondAuxFiltres(AuditLogResponse log) {
if (log.getDateHeure() == null) return false;
// Filtre par dates
@@ -250,21 +261,24 @@ public class AuditBean implements Serializable {
*/
public void rechercher() {
try {
LOGGER.info("Recherche de logs avec filtres");
LOG.info("Recherche de logs avec filtres");
String dateDebutStr = dateDebut != null ?
LocalDateTime.ofInstant(dateDebut.toInstant(), ZoneId.systemDefault()).toString() : null;
String dateFinStr = dateFin != null ?
LocalDateTime.ofInstant(dateFin.toInstant(), ZoneId.systemDefault()).toString() : null;
Map<String, Object> response = auditService.rechercher(
dateDebutStr, dateFinStr,
typeAction.isEmpty() ? null : typeAction,
severite.isEmpty() ? null : severite,
utilisateur.isEmpty() ? null : utilisateur,
module.isEmpty() ? null : module,
ipAddress.isEmpty() ? null : ipAddress,
0, 1000);
Map<String, Object> response = retryService.executeWithRetrySupplier(
() -> auditService.rechercher(
dateDebutStr, dateFinStr,
typeAction.isEmpty() ? null : typeAction,
severite.isEmpty() ? null : severite,
utilisateur.isEmpty() ? null : utilisateur,
module.isEmpty() ? null : module,
ipAddress.isEmpty() ? null : ipAddress,
0, 1000),
"recherche de logs d'audit"
);
logsFiltres = new ArrayList<>();
@@ -274,24 +288,22 @@ public class AuditBean implements Serializable {
if (data != null) {
for (Object item : data) {
if (item instanceof AuditLogDTO) {
logsFiltres.add((AuditLogDTO) item);
if (item instanceof AuditLogResponse) {
logsFiltres.add((AuditLogResponse) item);
} else if (item instanceof Map) {
@SuppressWarnings("unchecked")
AuditLogDTO dto = convertMapToDTO((Map<String, Object>) item);
AuditLogResponse dto = convertMapToDTO((Map<String, Object>) item);
logsFiltres.add(dto);
}
}
}
}
ajouterMessage(FacesMessage.SEVERITY_INFO, "Recherche",
logsFiltres.size() + " log(s) trouvé(s)");
errorHandler.showSuccess("Recherche", logsFiltres.size() + " log(s) trouvé(s)");
} catch (Exception e) {
LOGGER.severe("Erreur lors de la recherche: " + e.getMessage());
ajouterMessage(FacesMessage.SEVERITY_ERROR, "Erreur",
"Erreur lors de la recherche: " + e.getMessage());
LOG.errorf(e, "Erreur lors de la recherche");
errorHandler.handleException(e, "lors de la recherche de logs d'audit", null);
}
}
@@ -324,29 +336,28 @@ public class AuditBean implements Serializable {
/**
* Sélectionne un log pour voir les détails
*/
public void selectionnerLog(AuditLogDTO log) {
public void selectionnerLog(AuditLogResponse log) {
this.logSelectionne = log;
}
/**
* Méthode pour compatibilité avec l'ancienne page
*/
public void voirDetails(AuditLogDTO log) {
public void voirDetails(AuditLogResponse log) {
selectionnerLog(log);
}
/**
* Signale un événement d'audit suspect
*/
public void signalerEvenement(AuditLogDTO log) {
public void signalerEvenement(AuditLogResponse log) {
if (log == null) {
ajouterMessage(FacesMessage.SEVERITY_WARN, "Attention",
"Aucun log sélectionné");
errorHandler.showWarning("Attention", "Aucun log sélection");
return;
}
try {
LOGGER.info("Signalement de l'événement: " + log.getId());
LOG.infof("Signalement de l'événement: %s", log.getId());
// Envoyer une notification aux administrateurs
String message = String.format(
@@ -362,19 +373,23 @@ public class AuditBean implements Serializable {
? userSession.getCurrentUser().getId().toString()
: "anonyme";
notificationService.envoyerNotificationGroupe(
"SYSTEME",
"Signalement d'un événement d'audit",
message,
List.of(signaleurId) // Envoyer aux admins (à adapter selon votre logique)
retryService.executeWithRetrySupplier(
() -> {
notificationService.envoyerNotificationGroupe(
"SYSTEME",
"Signalement d'un événement d'audit",
message,
List.of(signaleurId) // Envoyer aux admins (à adapter selon votre logique)
);
return null;
},
"envoi d'une notification de signalement"
);
ajouterMessage(FacesMessage.SEVERITY_INFO, "Signalement",
"L'événement a été signalé aux administrateurs");
errorHandler.showSuccess("Signalement", "L'événement a été signalé aux administrateurs");
} catch (Exception e) {
LOGGER.severe("Erreur lors du signalement: " + e.getMessage());
ajouterMessage(FacesMessage.SEVERITY_ERROR, "Erreur",
"Impossible de signaler l'événement: " + e.getMessage());
LOG.errorf(e, "Erreur lors du signalement");
errorHandler.handleException(e, "lors du signalement d'un événement d'audit", null);
}
}
@@ -383,15 +398,14 @@ public class AuditBean implements Serializable {
*/
public void exporter() {
try {
LOGGER.info("Export de " + (logsFiltres != null ? logsFiltres.size() : 0) + " logs d'audit");
LOG.infof("Export de %d logs d'audit", logsFiltres != null ? logsFiltres.size() : 0);
List<AuditLogDTO> logsAExporter = logsFiltres != null && !logsFiltres.isEmpty()
List<AuditLogResponse> logsAExporter = logsFiltres != null && !logsFiltres.isEmpty()
? logsFiltres
: tousLesLogs;
if (logsAExporter == null || logsAExporter.isEmpty()) {
ajouterMessage(FacesMessage.SEVERITY_WARN, "Attention",
"Aucun log à exporter");
errorHandler.showWarning("Attention", "Aucun log à exporter");
return;
}
@@ -399,7 +413,7 @@ public class AuditBean implements Serializable {
StringBuilder csv = new StringBuilder();
csv.append("Date/Heure;Type Action;Utilisateur;Module;IP;Sévérité;Détails\n");
for (AuditLogDTO log : logsAExporter) {
for (AuditLogResponse log : logsAExporter) {
csv.append(String.format("%s;%s;%s;%s;%s;%s;%s\n",
log.getDateHeure() != null ? log.getDateHeure().format(DATE_FORMATTER) : "",
log.getTypeAction() != null ? log.getTypeAction() : "",
@@ -414,12 +428,10 @@ public class AuditBean implements Serializable {
byte[] csvData = csv.toString().getBytes(StandardCharsets.UTF_8);
telechargerFichier(csvData, "audit-logs-export.csv", "text/csv");
ajouterMessage(FacesMessage.SEVERITY_INFO, "Export",
"Export de " + logsAExporter.size() + " log(s) terminé");
errorHandler.showSuccess("Export", "Export de " + logsAExporter.size() + " log(s) terminé");
} catch (Exception e) {
LOGGER.severe("Erreur lors de l'export: " + e.getMessage());
ajouterMessage(FacesMessage.SEVERITY_ERROR, "Erreur",
"Impossible d'exporter les logs: " + e.getMessage());
LOG.errorf(e, "Erreur lors de l'export");
errorHandler.handleException(e, "lors de l'export des logs d'audit", null);
}
}
@@ -442,7 +454,7 @@ public class AuditBean implements Serializable {
fc.responseComplete();
} catch (Exception e) {
LOGGER.severe("Erreur téléchargement fichier: " + e.getMessage());
LOG.errorf(e, "Erreur téléchargement fichier");
throw new RuntimeException("Erreur lors du téléchargement", e);
}
}
@@ -488,12 +500,6 @@ public class AuditBean implements Serializable {
.count();
}
// Méthode utilitaire pour ajouter des messages
private void ajouterMessage(FacesMessage.Severity severity, String summary, String detail) {
FacesContext.getCurrentInstance()
.addMessage(null, new FacesMessage(severity, summary, detail));
}
// Getters et Setters
public Date getDateDebut() { return dateDebut; }
public void setDateDebut(Date dateDebut) {
@@ -537,12 +543,12 @@ public class AuditBean implements Serializable {
appliquerFiltres();
}
public List<AuditLogDTO> getEvenementsFiltres() {
public List<AuditLogResponse> getEvenementsFiltres() {
return logsFiltres != null ? logsFiltres : new ArrayList<>();
}
public AuditLogDTO getEvenementSelectionne() { return logSelectionne; }
public void setEvenementSelectionne(AuditLogDTO log) { this.logSelectionne = log; }
public AuditLogResponse getEvenementSelectionne() { return logSelectionne; }
public void setEvenementSelectionne(AuditLogResponse log) { this.logSelectionne = log; }
public String getFormatExport() { return formatExport; }
public void setFormatExport(String formatExport) { this.formatExport = formatExport; }