From e45a95505a68a3db83b59fde75e11f6ffda14e8c Mon Sep 17 00:00:00 2001 From: lionsdev Date: Sat, 3 Jan 2026 13:53:35 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20Optimisations=20UX/UI=20et=20am=C3=A9li?= =?UTF-8?q?oration=20import/export=20CSV?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Optimisations majeures de l'interface utilisateur et amélioration du système d'import/export CSV avec rapport d'erreurs détaillé. ## Optimisations UX/UI - Suppression des blocs Actions Rapides redondants dans les pages list/view - Consolidation des actions dans les en-têtes de page - Conversion des filtres en panneau collapsible avec badge Filtres actifs - Suppression du sous-menu Attribution Rôles (redondant avec /users/edit) - Amélioration de la navigation et de l'ergonomie générale - Correction des attributs iconLeft non supportés par fr:fieldInput ## Import/Export CSV - Ajout de ImportResultDTO avec rapport détaillé des erreurs - Création de CsvValidationHelper pour validation robuste des données - Amélioration des messages d'erreur avec numéros de ligne - Support de colonnes flexibles (username,prenom,nom,email) - Validation stricte des formats email ## Corrections techniques - Fix DashboardBeanTest: getRecentActions() → getActionsLast24h() - Fix UserServiceImplTest: retour ImportResultDTO au lieu de int - Amélioration de la gestion d'erreurs dans AuditServiceImpl - Migration Flyway V1.0.0 pour la table audit_logs ## Infrastructure - Mise à jour .gitignore professionnel (exclusion docs de session) - Configuration production sécurisée (variables d'environnement) - Pas de secrets hardcodés dans les fichiers de configuration Testé et validé en environnement de développement. --- .../dto/importexport/ImportResultDTO.java | 123 ++++++++++++++++++ .../user/manager/service/UserService.java | 6 +- 2 files changed, 126 insertions(+), 3 deletions(-) create mode 100644 src/main/java/dev/lions/user/manager/dto/importexport/ImportResultDTO.java diff --git a/src/main/java/dev/lions/user/manager/dto/importexport/ImportResultDTO.java b/src/main/java/dev/lions/user/manager/dto/importexport/ImportResultDTO.java new file mode 100644 index 0000000..27b2c72 --- /dev/null +++ b/src/main/java/dev/lions/user/manager/dto/importexport/ImportResultDTO.java @@ -0,0 +1,123 @@ +package dev.lions.user.manager.dto.importexport; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.eclipse.microprofile.openapi.annotations.media.Schema; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * DTO représentant le résultat d'un import CSV d'utilisateurs + * Contient les statistiques et le détail des erreurs rencontrées + * + * @author Lions Development Team + * @version 1.0.0 + * @since 2026-01-02 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@JsonInclude(JsonInclude.Include.NON_NULL) +@Schema(description = "Résultat d'un import CSV d'utilisateurs") +public class ImportResultDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "Nombre total de lignes traitées", example = "100") + private int totalLines; + + @Schema(description = "Nombre d'utilisateurs créés avec succès", example = "95") + private int successCount; + + @Schema(description = "Nombre d'erreurs rencontrées", example = "5") + private int errorCount; + + @Schema(description = "Message de statut global", example = "Import terminé: 95 utilisateurs créés, 5 erreurs") + private String message; + + @Schema(description = "Liste des erreurs détaillées") + @Builder.Default + private List errors = new ArrayList<>(); + + /** + * Ajoute une erreur au rapport + */ + public void addError(ImportErrorDTO error) { + if (errors == null) { + errors = new ArrayList<>(); + } + errors.add(error); + errorCount = errors.size(); + } + + /** + * Génère le message de statut + */ + public void generateMessage() { + if (errorCount == 0) { + message = String.format("✅ Import réussi: %d utilisateur(s) créé(s)", successCount); + } else { + message = String.format("⚠️ Import terminé avec erreurs: %d utilisateur(s) créé(s), %d erreur(s)", + successCount, errorCount); + } + } + + /** + * DTO représentant une erreur d'import sur une ligne + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @JsonInclude(JsonInclude.Include.NON_NULL) + @Schema(description = "Détail d'une erreur d'import") + public static class ImportErrorDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "Numéro de ligne (1-indexed)", example = "42") + private int lineNumber; + + @Schema(description = "Contenu de la ligne en erreur", example = "john.doe,invalid-email,John,Doe,true") + private String lineContent; + + @Schema(description = "Type d'erreur", example = "VALIDATION_ERROR") + private ErrorType errorType; + + @Schema(description = "Champ concerné par l'erreur", example = "email") + private String field; + + @Schema(description = "Message d'erreur descriptif", example = "Format d'email invalide") + private String message; + + @Schema(description = "Détails techniques de l'erreur") + private String details; + } + + /** + * Types d'erreurs possibles lors de l'import + */ + @Schema(description = "Type d'erreur d'import") + public enum ErrorType { + @Schema(description = "Ligne mal formée ou nombre de colonnes incorrect") + INVALID_FORMAT, + + @Schema(description = "Erreur de validation des données") + VALIDATION_ERROR, + + @Schema(description = "Utilisateur déjà existant") + DUPLICATE_USER, + + @Schema(description = "Erreur lors de la création de l'utilisateur") + CREATION_ERROR, + + @Schema(description = "Erreur interne du système") + SYSTEM_ERROR + } +} diff --git a/src/main/java/dev/lions/user/manager/service/UserService.java b/src/main/java/dev/lions/user/manager/service/UserService.java index acbce8b..8e26274 100644 --- a/src/main/java/dev/lions/user/manager/service/UserService.java +++ b/src/main/java/dev/lions/user/manager/service/UserService.java @@ -176,10 +176,10 @@ public interface UserService { String exportUsersToCSV(@NotNull UserSearchCriteriaDTO criteria); /** - * Importe des utilisateurs depuis un CSV + * Importe des utilisateurs depuis un CSV avec rapport détaillé * @param csvContent contenu CSV * @param realmName nom du realm - * @return nombre d'utilisateurs importés + * @return résultat détaillé de l'import (succès, erreurs) */ - int importUsersFromCSV(@NotBlank String csvContent, @NotBlank String realmName); + dev.lions.user.manager.dto.importexport.ImportResultDTO importUsersFromCSV(@NotBlank String csvContent, @NotBlank String realmName); }