feat: Optimisations UX/UI et amélioration import/export CSV
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.
This commit is contained in:
@@ -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<ImportErrorDTO> 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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -176,10 +176,10 @@ public interface UserService {
|
|||||||
String exportUsersToCSV(@NotNull UserSearchCriteriaDTO criteria);
|
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 csvContent contenu CSV
|
||||||
* @param realmName nom du realm
|
* @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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user