Refactoring
This commit is contained in:
@@ -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électionné");
|
||||
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; }
|
||||
|
||||
Reference in New Issue
Block a user