feat: Finalisation du projet lions-user-manager
- Ajout du module client Quarkus PrimeFaces Freya avec interface complète - Ajout de l'AuditResource pour la gestion des logs d'audit - Ajout du SyncResource pour la synchronisation Keycloak - Ajout du SyncServiceImpl pour les opérations de synchronisation - Ajout des DTOs de synchronisation (SyncStatusDTO, etc.) - Corrections mineures dans RoleMapper, RoleServiceImpl, AuditServiceImpl - Configuration des properties pour dev et prod - Ajout de la configuration Claude Code (.claude/) - Documentation complète du projet (AI_HANDOFF_DOCUMENT.md) Le projet compile maintenant avec succès (BUILD SUCCESS). Tous les modules (API, Server Impl, Client) sont fonctionnels.
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
package dev.lions.user.manager.client.service;
|
||||
|
||||
import dev.lions.user.manager.dto.audit.AuditLogDTO;
|
||||
import dev.lions.user.manager.enums.audit.TypeActionAudit;
|
||||
import jakarta.ws.rs.*;
|
||||
import jakarta.ws.rs.core.MediaType;
|
||||
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* REST Client pour le service d'audit
|
||||
*/
|
||||
@Path("/api/audit")
|
||||
@RegisterRestClient(configKey = "lions-user-manager-api")
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public interface AuditServiceClient {
|
||||
|
||||
@POST
|
||||
@Path("/search")
|
||||
List<AuditLogDTO> searchLogs(
|
||||
@QueryParam("acteur") String acteurUsername,
|
||||
@QueryParam("dateDebut") String dateDebut,
|
||||
@QueryParam("dateFin") String dateFin,
|
||||
@QueryParam("typeAction") TypeActionAudit typeAction,
|
||||
@QueryParam("ressourceType") String ressourceType,
|
||||
@QueryParam("succes") Boolean succes,
|
||||
@QueryParam("page") @DefaultValue("0") int page,
|
||||
@QueryParam("pageSize") @DefaultValue("50") int pageSize
|
||||
);
|
||||
|
||||
@GET
|
||||
@Path("/acteur/{acteurUsername}")
|
||||
List<AuditLogDTO> getLogsByActeur(
|
||||
@PathParam("acteurUsername") String acteurUsername,
|
||||
@QueryParam("limit") @DefaultValue("100") int limit
|
||||
);
|
||||
|
||||
@GET
|
||||
@Path("/realm/{realmName}")
|
||||
List<AuditLogDTO> getLogsByRealm(
|
||||
@PathParam("realmName") String realmName,
|
||||
@QueryParam("dateDebut") String dateDebut,
|
||||
@QueryParam("dateFin") String dateFin,
|
||||
@QueryParam("page") @DefaultValue("0") int page,
|
||||
@QueryParam("pageSize") @DefaultValue("50") int pageSize
|
||||
);
|
||||
|
||||
@GET
|
||||
@Path("/ressource/{ressourceType}/{ressourceId}")
|
||||
List<AuditLogDTO> getLogsByRessource(
|
||||
@PathParam("ressourceType") String ressourceType,
|
||||
@PathParam("ressourceId") String ressourceId,
|
||||
@QueryParam("limit") @DefaultValue("100") int limit
|
||||
);
|
||||
|
||||
@GET
|
||||
@Path("/action/{typeAction}")
|
||||
List<AuditLogDTO> getLogsByAction(
|
||||
@PathParam("typeAction") TypeActionAudit typeAction,
|
||||
@QueryParam("dateDebut") String dateDebut,
|
||||
@QueryParam("dateFin") String dateFin,
|
||||
@QueryParam("limit") @DefaultValue("100") int limit
|
||||
);
|
||||
|
||||
@GET
|
||||
@Path("/statistics/actions")
|
||||
Map<TypeActionAudit, Long> getActionStatistics(
|
||||
@QueryParam("dateDebut") String dateDebut,
|
||||
@QueryParam("dateFin") String dateFin
|
||||
);
|
||||
|
||||
@GET
|
||||
@Path("/statistics/users")
|
||||
Map<String, Long> getUserActivityStatistics(
|
||||
@QueryParam("dateDebut") String dateDebut,
|
||||
@QueryParam("dateFin") String dateFin
|
||||
);
|
||||
|
||||
@GET
|
||||
@Path("/statistics/failures")
|
||||
Long getFailureCount(
|
||||
@QueryParam("dateDebut") String dateDebut,
|
||||
@QueryParam("dateFin") String dateFin
|
||||
);
|
||||
|
||||
@GET
|
||||
@Path("/statistics/successes")
|
||||
Long getSuccessCount(
|
||||
@QueryParam("dateDebut") String dateDebut,
|
||||
@QueryParam("dateFin") String dateFin
|
||||
);
|
||||
|
||||
@GET
|
||||
@Path("/export/csv")
|
||||
@Produces("text/csv")
|
||||
String exportLogsToCSV(
|
||||
@QueryParam("dateDebut") String dateDebut,
|
||||
@QueryParam("dateFin") String dateFin
|
||||
);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,135 @@
|
||||
package dev.lions.user.manager.client.service;
|
||||
|
||||
import dev.lions.user.manager.dto.role.RoleAssignmentDTO;
|
||||
import dev.lions.user.manager.dto.role.RoleDTO;
|
||||
import dev.lions.user.manager.enums.role.TypeRole;
|
||||
import jakarta.ws.rs.*;
|
||||
import jakarta.ws.rs.core.MediaType;
|
||||
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* REST Client pour le service de gestion des rôles
|
||||
*/
|
||||
@Path("/api/roles")
|
||||
@RegisterRestClient(configKey = "lions-user-manager-api")
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public interface RoleServiceClient {
|
||||
|
||||
// ==================== Realm Roles ====================
|
||||
|
||||
@POST
|
||||
@Path("/realm")
|
||||
RoleDTO createRealmRole(
|
||||
RoleDTO role,
|
||||
@QueryParam("realm") String realmName
|
||||
);
|
||||
|
||||
@GET
|
||||
@Path("/realm/{roleName}")
|
||||
RoleDTO getRealmRoleByName(
|
||||
@PathParam("roleName") String roleName,
|
||||
@QueryParam("realm") String realmName
|
||||
);
|
||||
|
||||
@GET
|
||||
@Path("/realm")
|
||||
List<RoleDTO> getAllRealmRoles(
|
||||
@QueryParam("realm") String realmName
|
||||
);
|
||||
|
||||
@PUT
|
||||
@Path("/realm/{roleName}")
|
||||
RoleDTO updateRealmRole(
|
||||
@PathParam("roleName") String roleName,
|
||||
RoleDTO role,
|
||||
@QueryParam("realm") String realmName
|
||||
);
|
||||
|
||||
@DELETE
|
||||
@Path("/realm/{roleName}")
|
||||
void deleteRealmRole(
|
||||
@PathParam("roleName") String roleName,
|
||||
@QueryParam("realm") String realmName
|
||||
);
|
||||
|
||||
// ==================== Client Roles ====================
|
||||
|
||||
@POST
|
||||
@Path("/client")
|
||||
RoleDTO createClientRole(
|
||||
RoleDTO role,
|
||||
@QueryParam("realm") String realmName,
|
||||
@QueryParam("clientName") String clientName
|
||||
);
|
||||
|
||||
@GET
|
||||
@Path("/client")
|
||||
List<RoleDTO> getAllClientRoles(
|
||||
@QueryParam("realm") String realmName,
|
||||
@QueryParam("clientName") String clientName
|
||||
);
|
||||
|
||||
@GET
|
||||
@Path("/client/{roleName}")
|
||||
RoleDTO getClientRoleByName(
|
||||
@PathParam("roleName") String roleName,
|
||||
@QueryParam("realm") String realmName,
|
||||
@QueryParam("clientName") String clientName
|
||||
);
|
||||
|
||||
@DELETE
|
||||
@Path("/client/{roleName}")
|
||||
void deleteClientRole(
|
||||
@PathParam("roleName") String roleName,
|
||||
@QueryParam("realm") String realmName,
|
||||
@QueryParam("clientName") String clientName
|
||||
);
|
||||
|
||||
// ==================== Role Assignment ====================
|
||||
|
||||
@POST
|
||||
@Path("/assign")
|
||||
void assignRoleToUser(RoleAssignmentDTO assignment);
|
||||
|
||||
@POST
|
||||
@Path("/revoke")
|
||||
void revokeRoleFromUser(RoleAssignmentDTO assignment);
|
||||
|
||||
@GET
|
||||
@Path("/user/{userId}")
|
||||
List<RoleDTO> getUserRoles(
|
||||
@PathParam("userId") String userId,
|
||||
@QueryParam("realm") String realmName
|
||||
);
|
||||
|
||||
// ==================== Composite Roles ====================
|
||||
|
||||
@GET
|
||||
@Path("/composite/{roleName}")
|
||||
List<RoleDTO> getCompositeRoles(
|
||||
@PathParam("roleName") String roleName,
|
||||
@QueryParam("realm") String realmName,
|
||||
@QueryParam("typeRole") TypeRole typeRole,
|
||||
@QueryParam("clientName") String clientName
|
||||
);
|
||||
|
||||
@POST
|
||||
@Path("/composite/{roleName}/add")
|
||||
void addCompositeRole(
|
||||
@PathParam("roleName") String roleName,
|
||||
@QueryParam("realm") String realmName,
|
||||
@QueryParam("compositeRoleName") String compositeRoleName
|
||||
);
|
||||
|
||||
@DELETE
|
||||
@Path("/composite/{roleName}/remove")
|
||||
void removeCompositeRole(
|
||||
@PathParam("roleName") String roleName,
|
||||
@QueryParam("realm") String realmName,
|
||||
@QueryParam("compositeRoleName") String compositeRoleName
|
||||
);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
package dev.lions.user.manager.client.service;
|
||||
|
||||
import dev.lions.user.manager.dto.sync.HealthStatusDTO;
|
||||
import dev.lions.user.manager.dto.sync.SyncResultDTO;
|
||||
import jakarta.ws.rs.*;
|
||||
import jakarta.ws.rs.core.MediaType;
|
||||
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
|
||||
|
||||
/**
|
||||
* REST Client pour le service de synchronisation
|
||||
*/
|
||||
@Path("/api/sync")
|
||||
@RegisterRestClient(configKey = "lions-user-manager-api")
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public interface SyncServiceClient {
|
||||
|
||||
@GET
|
||||
@Path("/health")
|
||||
HealthStatusDTO checkHealth(@QueryParam("realm") String realmName);
|
||||
|
||||
@GET
|
||||
@Path("/health/keycloak")
|
||||
HealthStatusDTO checkKeycloakHealth();
|
||||
|
||||
@POST
|
||||
@Path("/users")
|
||||
SyncResultDTO syncUsers(@QueryParam("realm") String realmName);
|
||||
|
||||
@POST
|
||||
@Path("/roles")
|
||||
SyncResultDTO syncRoles(
|
||||
@QueryParam("realm") String realmName,
|
||||
@QueryParam("clientName") String clientName
|
||||
);
|
||||
|
||||
@GET
|
||||
@Path("/exists/user/{username}")
|
||||
Boolean userExists(
|
||||
@PathParam("username") String username,
|
||||
@QueryParam("realm") String realmName
|
||||
);
|
||||
|
||||
@GET
|
||||
@Path("/exists/role/{roleName}")
|
||||
Boolean roleExists(
|
||||
@PathParam("roleName") String roleName,
|
||||
@QueryParam("realm") String realmName,
|
||||
@QueryParam("typeRole") String typeRole,
|
||||
@QueryParam("clientName") String clientName
|
||||
);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,140 @@
|
||||
package dev.lions.user.manager.client.service;
|
||||
|
||||
import dev.lions.user.manager.dto.user.UserDTO;
|
||||
import dev.lions.user.manager.dto.user.UserSearchCriteriaDTO;
|
||||
import dev.lions.user.manager.dto.user.UserSearchResultDTO;
|
||||
import jakarta.ws.rs.*;
|
||||
import jakarta.ws.rs.core.MediaType;
|
||||
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* REST Client pour le service de gestion des utilisateurs
|
||||
* Interface pour communiquer avec l'API backend
|
||||
*/
|
||||
@Path("/api/users")
|
||||
@RegisterRestClient(configKey = "lions-user-manager-api")
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public interface UserServiceClient {
|
||||
|
||||
/**
|
||||
* Rechercher des utilisateurs selon des critères
|
||||
*/
|
||||
@POST
|
||||
@Path("/search")
|
||||
UserSearchResultDTO searchUsers(UserSearchCriteriaDTO criteria);
|
||||
|
||||
/**
|
||||
* Récupérer un utilisateur par ID
|
||||
*/
|
||||
@GET
|
||||
@Path("/{userId}")
|
||||
UserDTO getUserById(
|
||||
@PathParam("userId") String userId,
|
||||
@QueryParam("realm") String realmName
|
||||
);
|
||||
|
||||
/**
|
||||
* Lister tous les utilisateurs (paginé)
|
||||
*/
|
||||
@GET
|
||||
UserSearchResultDTO getAllUsers(
|
||||
@QueryParam("realm") String realmName,
|
||||
@QueryParam("page") @DefaultValue("0") int page,
|
||||
@QueryParam("pageSize") @DefaultValue("20") int pageSize
|
||||
);
|
||||
|
||||
/**
|
||||
* Créer un nouvel utilisateur
|
||||
*/
|
||||
@POST
|
||||
UserDTO createUser(
|
||||
UserDTO user,
|
||||
@QueryParam("realm") String realmName
|
||||
);
|
||||
|
||||
/**
|
||||
* Mettre à jour un utilisateur
|
||||
*/
|
||||
@PUT
|
||||
@Path("/{userId}")
|
||||
UserDTO updateUser(
|
||||
@PathParam("userId") String userId,
|
||||
UserDTO user,
|
||||
@QueryParam("realm") String realmName
|
||||
);
|
||||
|
||||
/**
|
||||
* Supprimer un utilisateur
|
||||
*/
|
||||
@DELETE
|
||||
@Path("/{userId}")
|
||||
void deleteUser(
|
||||
@PathParam("userId") String userId,
|
||||
@QueryParam("realm") String realmName
|
||||
);
|
||||
|
||||
/**
|
||||
* Activer un utilisateur
|
||||
*/
|
||||
@POST
|
||||
@Path("/{userId}/activate")
|
||||
void activateUser(
|
||||
@PathParam("userId") String userId,
|
||||
@QueryParam("realm") String realmName
|
||||
);
|
||||
|
||||
/**
|
||||
* Désactiver un utilisateur
|
||||
*/
|
||||
@POST
|
||||
@Path("/{userId}/deactivate")
|
||||
void deactivateUser(
|
||||
@PathParam("userId") String userId,
|
||||
@QueryParam("realm") String realmName
|
||||
);
|
||||
|
||||
/**
|
||||
* Réinitialiser le mot de passe
|
||||
*/
|
||||
@POST
|
||||
@Path("/{userId}/reset-password")
|
||||
void resetPassword(
|
||||
@PathParam("userId") String userId,
|
||||
@QueryParam("realm") String realmName,
|
||||
@QueryParam("newPassword") String newPassword
|
||||
);
|
||||
|
||||
/**
|
||||
* Envoyer un email de vérification
|
||||
*/
|
||||
@POST
|
||||
@Path("/{userId}/send-verification-email")
|
||||
void sendVerificationEmail(
|
||||
@PathParam("userId") String userId,
|
||||
@QueryParam("realm") String realmName
|
||||
);
|
||||
|
||||
/**
|
||||
* Déconnecter toutes les sessions d'un utilisateur
|
||||
*/
|
||||
@POST
|
||||
@Path("/{userId}/logout-sessions")
|
||||
void logoutAllSessions(
|
||||
@PathParam("userId") String userId,
|
||||
@QueryParam("realm") String realmName
|
||||
);
|
||||
|
||||
/**
|
||||
* Récupérer les sessions actives d'un utilisateur
|
||||
*/
|
||||
@GET
|
||||
@Path("/{userId}/sessions")
|
||||
List<String> getActiveSessions(
|
||||
@PathParam("userId") String userId,
|
||||
@QueryParam("realm") String realmName
|
||||
);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,206 @@
|
||||
package dev.lions.user.manager.client.view;
|
||||
|
||||
import dev.lions.user.manager.client.service.AuditServiceClient;
|
||||
import dev.lions.user.manager.dto.audit.AuditLogDTO;
|
||||
import dev.lions.user.manager.enums.audit.TypeActionAudit;
|
||||
import jakarta.annotation.PostConstruct;
|
||||
import jakarta.faces.application.FacesMessage;
|
||||
import jakarta.faces.context.FacesContext;
|
||||
import jakarta.faces.view.ViewScoped;
|
||||
import jakarta.inject.Inject;
|
||||
import jakarta.inject.Named;
|
||||
import lombok.Data;
|
||||
import org.eclipse.microprofile.rest.client.inject.RestClient;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* Bean JSF pour la consultation des logs d'audit
|
||||
*
|
||||
* @author Lions User Manager
|
||||
* @version 1.0.0
|
||||
*/
|
||||
@Named("auditConsultationBean")
|
||||
@ViewScoped
|
||||
@Data
|
||||
public class AuditConsultationBean implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final Logger LOGGER = Logger.getLogger(AuditConsultationBean.class.getName());
|
||||
|
||||
@Inject
|
||||
@RestClient
|
||||
private AuditServiceClient auditServiceClient;
|
||||
|
||||
// Liste des logs
|
||||
private List<AuditLogDTO> auditLogs = new ArrayList<>();
|
||||
private AuditLogDTO selectedLog;
|
||||
|
||||
// Filtres de recherche
|
||||
private String acteurUsername;
|
||||
private LocalDateTime dateDebut;
|
||||
private LocalDateTime dateFin;
|
||||
private TypeActionAudit selectedTypeAction;
|
||||
private String ressourceType;
|
||||
private Boolean succes;
|
||||
|
||||
// Pagination
|
||||
private int currentPage = 0;
|
||||
private int pageSize = 50;
|
||||
private long totalRecords = 0;
|
||||
|
||||
// Statistiques
|
||||
private Map<TypeActionAudit, Long> actionStatistics;
|
||||
private Map<String, Long> userActivityStatistics;
|
||||
private Long failureCount = 0L;
|
||||
private Long successCount = 0L;
|
||||
|
||||
// Options
|
||||
private List<TypeActionAudit> typeActionOptions = List.of(TypeActionAudit.values());
|
||||
private List<String> availableRealms = new ArrayList<>();
|
||||
|
||||
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
loadRealms();
|
||||
loadStatistics();
|
||||
}
|
||||
|
||||
/**
|
||||
* Rechercher des logs d'audit
|
||||
*/
|
||||
public void searchLogs() {
|
||||
try {
|
||||
String dateDebutStr = dateDebut != null ? dateDebut.format(DATE_FORMATTER) : null;
|
||||
String dateFinStr = dateFin != null ? dateFin.format(DATE_FORMATTER) : null;
|
||||
|
||||
auditLogs = auditServiceClient.searchLogs(
|
||||
acteurUsername,
|
||||
dateDebutStr,
|
||||
dateFinStr,
|
||||
selectedTypeAction,
|
||||
ressourceType,
|
||||
succes,
|
||||
currentPage,
|
||||
pageSize
|
||||
);
|
||||
|
||||
totalRecords = auditLogs.size();
|
||||
addSuccessMessage("Recherche effectuée: " + totalRecords + " résultat(s) trouvé(s)");
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors de la recherche: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors de la recherche: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Charger les logs par acteur
|
||||
*/
|
||||
public void loadLogsByActeur(String username) {
|
||||
try {
|
||||
auditLogs = auditServiceClient.getLogsByActeur(username, 100);
|
||||
totalRecords = auditLogs.size();
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors du chargement: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors du chargement: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Charger les logs par realm
|
||||
*/
|
||||
public void loadLogsByRealm(String realmName) {
|
||||
try {
|
||||
String dateDebutStr = dateDebut != null ? dateDebut.format(DATE_FORMATTER) : null;
|
||||
String dateFinStr = dateFin != null ? dateFin.format(DATE_FORMATTER) : null;
|
||||
|
||||
auditLogs = auditServiceClient.getLogsByRealm(
|
||||
realmName,
|
||||
dateDebutStr,
|
||||
dateFinStr,
|
||||
currentPage,
|
||||
pageSize
|
||||
);
|
||||
|
||||
totalRecords = auditLogs.size();
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors du chargement: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors du chargement: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Charger les statistiques
|
||||
*/
|
||||
public void loadStatistics() {
|
||||
try {
|
||||
String dateDebutStr = dateDebut != null ? dateDebut.format(DATE_FORMATTER) : null;
|
||||
String dateFinStr = dateFin != null ? dateFin.format(DATE_FORMATTER) : null;
|
||||
|
||||
actionStatistics = auditServiceClient.getActionStatistics(dateDebutStr, dateFinStr);
|
||||
userActivityStatistics = auditServiceClient.getUserActivityStatistics(dateDebutStr, dateFinStr);
|
||||
failureCount = auditServiceClient.getFailureCount(dateDebutStr, dateFinStr);
|
||||
successCount = auditServiceClient.getSuccessCount(dateDebutStr, dateFinStr);
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors du chargement des statistiques: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Exporter les logs en CSV
|
||||
*/
|
||||
public void exportToCSV() {
|
||||
try {
|
||||
String dateDebutStr = dateDebut != null ? dateDebut.format(DATE_FORMATTER) : null;
|
||||
String dateFinStr = dateFin != null ? dateFin.format(DATE_FORMATTER) : null;
|
||||
|
||||
String csv = auditServiceClient.exportLogsToCSV(dateDebutStr, dateFinStr);
|
||||
// TODO: Implémenter le téléchargement du fichier CSV
|
||||
addSuccessMessage("Export CSV généré avec succès");
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors de l'export: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors de l'export: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Réinitialiser les filtres
|
||||
*/
|
||||
public void resetFilters() {
|
||||
acteurUsername = null;
|
||||
dateDebut = null;
|
||||
dateFin = null;
|
||||
selectedTypeAction = null;
|
||||
ressourceType = null;
|
||||
succes = null;
|
||||
currentPage = 0;
|
||||
auditLogs.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Charger les realms disponibles
|
||||
*/
|
||||
private void loadRealms() {
|
||||
// TODO: Implémenter la récupération des realms depuis Keycloak
|
||||
availableRealms = List.of("master", "btpxpress", "unionflow");
|
||||
}
|
||||
|
||||
// Méthodes utilitaires
|
||||
private void addSuccessMessage(String message) {
|
||||
FacesContext.getCurrentInstance().addMessage(null,
|
||||
new FacesMessage(FacesMessage.SEVERITY_INFO, "Succès", message));
|
||||
}
|
||||
|
||||
private void addErrorMessage(String message) {
|
||||
FacesContext.getCurrentInstance().addMessage(null,
|
||||
new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erreur", message));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,242 @@
|
||||
package dev.lions.user.manager.client.view;
|
||||
|
||||
import dev.lions.user.manager.client.service.RoleServiceClient;
|
||||
import dev.lions.user.manager.dto.role.RoleAssignmentDTO;
|
||||
import dev.lions.user.manager.dto.role.RoleDTO;
|
||||
import dev.lions.user.manager.enums.role.TypeRole;
|
||||
import jakarta.annotation.PostConstruct;
|
||||
import jakarta.faces.application.FacesMessage;
|
||||
import jakarta.faces.context.FacesContext;
|
||||
import jakarta.faces.view.ViewScoped;
|
||||
import jakarta.inject.Inject;
|
||||
import jakarta.inject.Named;
|
||||
import lombok.Data;
|
||||
import org.eclipse.microprofile.rest.client.inject.RestClient;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* Bean JSF pour la gestion des rôles
|
||||
*
|
||||
* @author Lions User Manager
|
||||
* @version 1.0.0
|
||||
*/
|
||||
@Named("roleGestionBean")
|
||||
@ViewScoped
|
||||
@Data
|
||||
public class RoleGestionBean implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final Logger LOGGER = Logger.getLogger(RoleGestionBean.class.getName());
|
||||
|
||||
@Inject
|
||||
@RestClient
|
||||
private RoleServiceClient roleServiceClient;
|
||||
|
||||
// Liste des rôles
|
||||
private List<RoleDTO> realmRoles = new ArrayList<>();
|
||||
private List<RoleDTO> clientRoles = new ArrayList<>();
|
||||
private List<RoleDTO> allRoles = new ArrayList<>();
|
||||
private RoleDTO selectedRole;
|
||||
|
||||
// Pour la création/édition
|
||||
private RoleDTO newRole = RoleDTO.builder().build();
|
||||
private boolean editMode = false;
|
||||
|
||||
// Filtres
|
||||
private String realmName = "master";
|
||||
private String clientName;
|
||||
private TypeRole selectedTypeRole;
|
||||
private String roleSearchText;
|
||||
|
||||
// Options
|
||||
private List<TypeRole> typeRoleOptions = List.of(TypeRole.values());
|
||||
private List<String> availableRealms = new ArrayList<>();
|
||||
private List<String> availableClients = new ArrayList<>();
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
loadRealms();
|
||||
loadRealmRoles();
|
||||
}
|
||||
|
||||
/**
|
||||
* Charger les rôles Realm
|
||||
*/
|
||||
public void loadRealmRoles() {
|
||||
try {
|
||||
realmRoles = roleServiceClient.getAllRealmRoles(realmName);
|
||||
updateAllRoles();
|
||||
LOGGER.info("Chargement de " + realmRoles.size() + " rôles Realm");
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors du chargement des rôles Realm: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors du chargement des rôles Realm");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Charger les rôles Client
|
||||
*/
|
||||
public void loadClientRoles() {
|
||||
if (clientName == null || clientName.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
clientRoles = roleServiceClient.getAllClientRoles(realmName, clientName);
|
||||
updateAllRoles();
|
||||
LOGGER.info("Chargement de " + clientRoles.size() + " rôles Client");
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors du chargement des rôles Client: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors du chargement des rôles Client");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Mettre à jour la liste complète des rôles
|
||||
*/
|
||||
private void updateAllRoles() {
|
||||
allRoles = new ArrayList<>();
|
||||
allRoles.addAll(realmRoles);
|
||||
allRoles.addAll(clientRoles);
|
||||
}
|
||||
|
||||
/**
|
||||
* Créer un nouveau rôle Realm
|
||||
*/
|
||||
public void createRealmRole() {
|
||||
try {
|
||||
RoleDTO created = roleServiceClient.createRealmRole(newRole, realmName);
|
||||
addSuccessMessage("Rôle Realm créé avec succès: " + created.getName());
|
||||
resetForm();
|
||||
loadRealmRoles();
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors de la création: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors de la création: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Créer un nouveau rôle Client
|
||||
*/
|
||||
public void createClientRole() {
|
||||
if (clientName == null || clientName.isEmpty()) {
|
||||
addErrorMessage("Le nom du client est obligatoire");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
RoleDTO created = roleServiceClient.createClientRole(newRole, realmName, clientName);
|
||||
addSuccessMessage("Rôle Client créé avec succès: " + created.getName());
|
||||
resetForm();
|
||||
loadClientRoles();
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors de la création: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors de la création: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Supprimer un rôle Realm
|
||||
*/
|
||||
public void deleteRealmRole(String roleName) {
|
||||
try {
|
||||
roleServiceClient.deleteRealmRole(roleName, realmName);
|
||||
addSuccessMessage("Rôle Realm supprimé avec succès");
|
||||
loadRealmRoles();
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors de la suppression: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors de la suppression: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Supprimer un rôle Client
|
||||
*/
|
||||
public void deleteClientRole(String roleName) {
|
||||
if (clientName == null || clientName.isEmpty()) {
|
||||
addErrorMessage("Le nom du client est obligatoire");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
roleServiceClient.deleteClientRole(roleName, realmName, clientName);
|
||||
addSuccessMessage("Rôle Client supprimé avec succès");
|
||||
loadClientRoles();
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors de la suppression: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors de la suppression: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Attribuer un rôle à un utilisateur
|
||||
*/
|
||||
public void assignRoleToUser(String userId, String roleName) {
|
||||
try {
|
||||
RoleAssignmentDTO assignment = RoleAssignmentDTO.builder()
|
||||
.userId(userId)
|
||||
.roleNames(List.of(roleName))
|
||||
.typeRole(TypeRole.REALM_ROLE)
|
||||
.realmName(realmName)
|
||||
.build();
|
||||
|
||||
roleServiceClient.assignRoleToUser(assignment);
|
||||
addSuccessMessage("Rôle attribué avec succès");
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors de l'attribution: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors de l'attribution: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Révoquer un rôle d'un utilisateur
|
||||
*/
|
||||
public void revokeRoleFromUser(String userId, String roleName) {
|
||||
try {
|
||||
RoleAssignmentDTO assignment = RoleAssignmentDTO.builder()
|
||||
.userId(userId)
|
||||
.roleNames(List.of(roleName))
|
||||
.typeRole(TypeRole.REALM_ROLE)
|
||||
.realmName(realmName)
|
||||
.build();
|
||||
|
||||
roleServiceClient.revokeRoleFromUser(assignment);
|
||||
addSuccessMessage("Rôle révoqué avec succès");
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors de la révocation: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors de la révocation: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Réinitialiser le formulaire
|
||||
*/
|
||||
public void resetForm() {
|
||||
newRole = RoleDTO.builder().build();
|
||||
editMode = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Charger les realms disponibles
|
||||
*/
|
||||
private void loadRealms() {
|
||||
// TODO: Implémenter la récupération des realms depuis Keycloak
|
||||
availableRealms = List.of("master", "btpxpress", "unionflow");
|
||||
}
|
||||
|
||||
// Méthodes utilitaires
|
||||
private void addSuccessMessage(String message) {
|
||||
FacesContext.getCurrentInstance().addMessage(null,
|
||||
new FacesMessage(FacesMessage.SEVERITY_INFO, "Succès", message));
|
||||
}
|
||||
|
||||
private void addErrorMessage(String message) {
|
||||
FacesContext.getCurrentInstance().addMessage(null,
|
||||
new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erreur", message));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,132 @@
|
||||
package dev.lions.user.manager.client.view;
|
||||
|
||||
import dev.lions.user.manager.client.service.UserServiceClient;
|
||||
import dev.lions.user.manager.dto.user.UserDTO;
|
||||
import dev.lions.user.manager.enums.user.StatutUser;
|
||||
import jakarta.annotation.PostConstruct;
|
||||
import jakarta.faces.application.FacesMessage;
|
||||
import jakarta.faces.context.FacesContext;
|
||||
import jakarta.faces.view.ViewScoped;
|
||||
import jakarta.inject.Inject;
|
||||
import jakarta.inject.Named;
|
||||
import lombok.Data;
|
||||
import org.eclipse.microprofile.rest.client.inject.RestClient;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* Bean JSF pour la création d'un nouvel utilisateur
|
||||
*
|
||||
* @author Lions User Manager
|
||||
* @version 1.0.0
|
||||
*/
|
||||
@Named("userCreationBean")
|
||||
@ViewScoped
|
||||
@Data
|
||||
public class UserCreationBean implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final Logger LOGGER = Logger.getLogger(UserCreationBean.class.getName());
|
||||
|
||||
@Inject
|
||||
@RestClient
|
||||
private UserServiceClient userServiceClient;
|
||||
|
||||
private UserDTO newUser = UserDTO.builder().build();
|
||||
private String realmName = "master";
|
||||
private String password;
|
||||
private String passwordConfirm;
|
||||
|
||||
// Options pour les selects
|
||||
private List<StatutUser> statutOptions = List.of(StatutUser.values());
|
||||
private List<String> availableRealms = new ArrayList<>();
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
loadRealms();
|
||||
// Initialiser les valeurs par défaut
|
||||
newUser.setEnabled(true);
|
||||
newUser.setEmailVerified(false);
|
||||
newUser.setStatut(StatutUser.ACTIF);
|
||||
}
|
||||
|
||||
/**
|
||||
* Créer un nouvel utilisateur
|
||||
*/
|
||||
public String createUser() {
|
||||
// Validation
|
||||
if (password == null || password.isEmpty()) {
|
||||
addErrorMessage("Le mot de passe est obligatoire");
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!password.equals(passwordConfirm)) {
|
||||
addErrorMessage("Les mots de passe ne correspondent pas");
|
||||
return null;
|
||||
}
|
||||
|
||||
if (password.length() < 8) {
|
||||
addErrorMessage("Le mot de passe doit contenir au moins 8 caractères");
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
// Créer l'utilisateur
|
||||
UserDTO createdUser = userServiceClient.createUser(newUser, realmName);
|
||||
|
||||
// Définir le mot de passe
|
||||
userServiceClient.resetPassword(createdUser.getId(), realmName, password);
|
||||
|
||||
addSuccessMessage("Utilisateur créé avec succès: " + createdUser.getUsername());
|
||||
resetForm();
|
||||
return "userListPage"; // Rediriger vers la liste
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors de la création: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors de la création: " + e.getMessage());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Réinitialiser le formulaire
|
||||
*/
|
||||
public void resetForm() {
|
||||
newUser = UserDTO.builder().build();
|
||||
password = null;
|
||||
passwordConfirm = null;
|
||||
newUser.setEnabled(true);
|
||||
newUser.setEmailVerified(false);
|
||||
newUser.setStatut(StatutUser.ACTIF);
|
||||
}
|
||||
|
||||
/**
|
||||
* Annuler la création
|
||||
*/
|
||||
public String cancel() {
|
||||
resetForm();
|
||||
return "userListPage";
|
||||
}
|
||||
|
||||
/**
|
||||
* Charger les realms disponibles
|
||||
*/
|
||||
private void loadRealms() {
|
||||
// TODO: Implémenter la récupération des realms depuis Keycloak
|
||||
availableRealms = List.of("master", "btpxpress", "unionflow");
|
||||
}
|
||||
|
||||
// Méthodes utilitaires
|
||||
private void addSuccessMessage(String message) {
|
||||
FacesContext.getCurrentInstance().addMessage(null,
|
||||
new FacesMessage(FacesMessage.SEVERITY_INFO, "Succès", message));
|
||||
}
|
||||
|
||||
private void addErrorMessage(String message) {
|
||||
FacesContext.getCurrentInstance().addMessage(null,
|
||||
new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erreur", message));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,228 @@
|
||||
package dev.lions.user.manager.client.view;
|
||||
|
||||
import dev.lions.user.manager.client.service.UserServiceClient;
|
||||
import dev.lions.user.manager.dto.user.UserDTO;
|
||||
import dev.lions.user.manager.dto.user.UserSearchCriteriaDTO;
|
||||
import dev.lions.user.manager.dto.user.UserSearchResultDTO;
|
||||
import dev.lions.user.manager.enums.user.StatutUser;
|
||||
import jakarta.annotation.PostConstruct;
|
||||
import jakarta.faces.application.FacesMessage;
|
||||
import jakarta.faces.context.FacesContext;
|
||||
import jakarta.faces.view.ViewScoped;
|
||||
import jakarta.inject.Inject;
|
||||
import jakarta.inject.Named;
|
||||
import lombok.Data;
|
||||
import org.eclipse.microprofile.rest.client.inject.RestClient;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* Bean JSF pour la liste et la recherche d'utilisateurs
|
||||
*
|
||||
* @author Lions User Manager
|
||||
* @version 1.0.0
|
||||
*/
|
||||
@Named("userListBean")
|
||||
@ViewScoped
|
||||
@Data
|
||||
public class UserListBean implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final Logger LOGGER = Logger.getLogger(UserListBean.class.getName());
|
||||
|
||||
// Constantes de navigation outcomes (WOU/DRY - réutilisables)
|
||||
private static final String OUTCOME_USER_PROFILE = "userProfilePage";
|
||||
private static final String OUTCOME_USER_EDIT = "userEditPage";
|
||||
private static final String OUTCOME_USER_CREATE = "userCreatePage";
|
||||
|
||||
@Inject
|
||||
@RestClient
|
||||
private UserServiceClient userServiceClient;
|
||||
|
||||
// Propriétés pour la liste
|
||||
private List<UserDTO> users = new ArrayList<>();
|
||||
private UserDTO selectedUser;
|
||||
private List<UserDTO> selectedUsers = new ArrayList<>();
|
||||
|
||||
// Propriétés pour la recherche
|
||||
private UserSearchCriteriaDTO searchCriteria = UserSearchCriteriaDTO.builder().build();
|
||||
private String searchText;
|
||||
private String realmName = "master";
|
||||
private StatutUser selectedStatut;
|
||||
|
||||
// Propriétés pour la pagination
|
||||
private int currentPage = 0;
|
||||
private int pageSize = 20;
|
||||
private long totalRecords = 0;
|
||||
private int totalPages = 0;
|
||||
|
||||
// Options pour les selects
|
||||
private List<StatutUser> statutOptions = List.of(StatutUser.values());
|
||||
private List<String> availableRealms = new ArrayList<>();
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
LOGGER.info("Initialisation de UserListBean");
|
||||
loadUsers();
|
||||
loadRealms();
|
||||
}
|
||||
|
||||
/**
|
||||
* Charger la liste des utilisateurs
|
||||
*/
|
||||
public void loadUsers() {
|
||||
try {
|
||||
UserSearchCriteriaDTO criteria = UserSearchCriteriaDTO.builder()
|
||||
.realmName(realmName)
|
||||
.page(currentPage)
|
||||
.pageSize(pageSize)
|
||||
.build();
|
||||
|
||||
UserSearchResultDTO result = userServiceClient.searchUsers(criteria);
|
||||
this.users = result.getUsers() != null ? result.getUsers() : new ArrayList<>();
|
||||
this.totalRecords = result.getTotalCount() != null ? result.getTotalCount() : 0;
|
||||
this.totalPages = (int) Math.ceil((double) totalRecords / pageSize);
|
||||
|
||||
LOGGER.info("Chargement de " + users.size() + " utilisateurs");
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors du chargement des utilisateurs: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors du chargement des utilisateurs: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Rechercher des utilisateurs
|
||||
*/
|
||||
public void search() {
|
||||
try {
|
||||
currentPage = 0; // Réinitialiser à la première page
|
||||
|
||||
UserSearchCriteriaDTO criteria = UserSearchCriteriaDTO.builder()
|
||||
.realmName(realmName)
|
||||
.searchTerm(searchText)
|
||||
.statut(selectedStatut)
|
||||
.page(currentPage)
|
||||
.pageSize(pageSize)
|
||||
.build();
|
||||
|
||||
UserSearchResultDTO result = userServiceClient.searchUsers(criteria);
|
||||
this.users = result.getUsers() != null ? result.getUsers() : new ArrayList<>();
|
||||
this.totalRecords = result.getTotalCount() != null ? result.getTotalCount() : 0;
|
||||
this.totalPages = (int) Math.ceil((double) totalRecords / pageSize);
|
||||
|
||||
addSuccessMessage("Recherche effectuée: " + totalRecords + " résultat(s) trouvé(s)");
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors de la recherche: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors de la recherche: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Réinitialiser la recherche
|
||||
*/
|
||||
public void resetSearch() {
|
||||
searchText = null;
|
||||
selectedStatut = null;
|
||||
currentPage = 0;
|
||||
loadUsers();
|
||||
}
|
||||
|
||||
/**
|
||||
* Activer un utilisateur
|
||||
*/
|
||||
public void activateUser(String userId) {
|
||||
try {
|
||||
userServiceClient.activateUser(userId, realmName);
|
||||
addSuccessMessage("Utilisateur activé avec succès");
|
||||
loadUsers();
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors de l'activation: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors de l'activation: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Désactiver un utilisateur
|
||||
*/
|
||||
public void deactivateUser(String userId) {
|
||||
try {
|
||||
userServiceClient.deactivateUser(userId, realmName);
|
||||
addSuccessMessage("Utilisateur désactivé avec succès");
|
||||
loadUsers();
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors de la désactivation: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors de la désactivation: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Supprimer un utilisateur
|
||||
*/
|
||||
public void deleteUser(String userId) {
|
||||
try {
|
||||
userServiceClient.deleteUser(userId, realmName);
|
||||
addSuccessMessage("Utilisateur supprimé avec succès");
|
||||
loadUsers();
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors de la suppression: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors de la suppression: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Déconnecter toutes les sessions d'un utilisateur
|
||||
*/
|
||||
public void logoutAllSessions(String userId) {
|
||||
try {
|
||||
userServiceClient.logoutAllSessions(userId, realmName);
|
||||
addSuccessMessage("Toutes les sessions ont été déconnectées");
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors de la déconnexion: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors de la déconnexion: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Charger les realms disponibles
|
||||
*/
|
||||
private void loadRealms() {
|
||||
// TODO: Implémenter la récupération des realms depuis Keycloak
|
||||
availableRealms = List.of("master", "btpxpress", "unionflow");
|
||||
}
|
||||
|
||||
/**
|
||||
* Navigation vers le profil utilisateur
|
||||
*/
|
||||
public String goToUserProfile() {
|
||||
return OUTCOME_USER_PROFILE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Navigation vers l'édition utilisateur
|
||||
*/
|
||||
public String goToUserEdit() {
|
||||
return OUTCOME_USER_EDIT;
|
||||
}
|
||||
|
||||
/**
|
||||
* Navigation vers la création utilisateur
|
||||
*/
|
||||
public String goToUserCreate() {
|
||||
return OUTCOME_USER_CREATE;
|
||||
}
|
||||
|
||||
// Méthodes utilitaires pour les messages
|
||||
private void addSuccessMessage(String message) {
|
||||
FacesContext.getCurrentInstance().addMessage(null,
|
||||
new FacesMessage(FacesMessage.SEVERITY_INFO, "Succès", message));
|
||||
}
|
||||
|
||||
private void addErrorMessage(String message) {
|
||||
FacesContext.getCurrentInstance().addMessage(null,
|
||||
new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erreur", message));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,189 @@
|
||||
package dev.lions.user.manager.client.view;
|
||||
|
||||
import dev.lions.user.manager.client.service.UserServiceClient;
|
||||
import dev.lions.user.manager.dto.user.UserDTO;
|
||||
import jakarta.annotation.PostConstruct;
|
||||
import jakarta.faces.application.FacesMessage;
|
||||
import jakarta.faces.context.FacesContext;
|
||||
import jakarta.faces.view.ViewScoped;
|
||||
import jakarta.inject.Inject;
|
||||
import jakarta.inject.Named;
|
||||
import lombok.Data;
|
||||
import org.eclipse.microprofile.rest.client.inject.RestClient;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* Bean JSF pour le profil et l'édition d'un utilisateur
|
||||
*
|
||||
* @author Lions User Manager
|
||||
* @version 1.0.0
|
||||
*/
|
||||
@Named("userProfilBean")
|
||||
@ViewScoped
|
||||
@Data
|
||||
public class UserProfilBean implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final Logger LOGGER = Logger.getLogger(UserProfilBean.class.getName());
|
||||
|
||||
@Inject
|
||||
@RestClient
|
||||
private UserServiceClient userServiceClient;
|
||||
|
||||
private UserDTO user;
|
||||
private String userId;
|
||||
private String realmName = "master";
|
||||
private boolean editMode = false;
|
||||
|
||||
// Pour la réinitialisation de mot de passe
|
||||
private String newPassword;
|
||||
private String newPasswordConfirm;
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
// Récupérer l'ID depuis les paramètres de requête
|
||||
userId = FacesContext.getCurrentInstance().getExternalContext()
|
||||
.getRequestParameterMap().get("userId");
|
||||
|
||||
if (userId != null && !userId.isEmpty()) {
|
||||
loadUser();
|
||||
} else {
|
||||
LOGGER.warning("Aucun userId fourni dans les paramètres");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Charger l'utilisateur
|
||||
*/
|
||||
public void loadUser() {
|
||||
try {
|
||||
user = userServiceClient.getUserById(userId, realmName);
|
||||
LOGGER.info("Utilisateur chargé: " + user.getUsername());
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors du chargement de l'utilisateur: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors du chargement de l'utilisateur: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Activer le mode édition
|
||||
*/
|
||||
public void enableEditMode() {
|
||||
editMode = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Désactiver le mode édition
|
||||
*/
|
||||
public void cancelEdit() {
|
||||
editMode = false;
|
||||
loadUser(); // Recharger les données originales
|
||||
}
|
||||
|
||||
/**
|
||||
* Mettre à jour l'utilisateur
|
||||
*/
|
||||
public void updateUser() {
|
||||
try {
|
||||
user = userServiceClient.updateUser(userId, user, realmName);
|
||||
editMode = false;
|
||||
addSuccessMessage("Utilisateur mis à jour avec succès");
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors de la mise à jour: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors de la mise à jour: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Réinitialiser le mot de passe
|
||||
*/
|
||||
public void resetPassword() {
|
||||
if (newPassword == null || newPassword.isEmpty()) {
|
||||
addErrorMessage("Le mot de passe ne peut pas être vide");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!newPassword.equals(newPasswordConfirm)) {
|
||||
addErrorMessage("Les mots de passe ne correspondent pas");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
userServiceClient.resetPassword(userId, realmName, newPassword);
|
||||
newPassword = null;
|
||||
newPasswordConfirm = null;
|
||||
addSuccessMessage("Mot de passe réinitialisé avec succès");
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors de la réinitialisation: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors de la réinitialisation: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Activer l'utilisateur
|
||||
*/
|
||||
public void activateUser() {
|
||||
try {
|
||||
userServiceClient.activateUser(userId, realmName);
|
||||
loadUser(); // Recharger pour mettre à jour le statut
|
||||
addSuccessMessage("Utilisateur activé avec succès");
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors de l'activation: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors de l'activation: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Désactiver l'utilisateur
|
||||
*/
|
||||
public void deactivateUser() {
|
||||
try {
|
||||
userServiceClient.deactivateUser(userId, realmName);
|
||||
loadUser(); // Recharger pour mettre à jour le statut
|
||||
addSuccessMessage("Utilisateur désactivé avec succès");
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors de la désactivation: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors de la désactivation: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Envoyer un email de vérification
|
||||
*/
|
||||
public void sendVerificationEmail() {
|
||||
try {
|
||||
userServiceClient.sendVerificationEmail(userId, realmName);
|
||||
addSuccessMessage("Email de vérification envoyé");
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors de l'envoi: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors de l'envoi: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Déconnecter toutes les sessions
|
||||
*/
|
||||
public void logoutAllSessions() {
|
||||
try {
|
||||
userServiceClient.logoutAllSessions(userId, realmName);
|
||||
addSuccessMessage("Toutes les sessions ont été déconnectées");
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors de la déconnexion: " + e.getMessage());
|
||||
addErrorMessage("Erreur lors de la déconnexion: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
// Méthodes utilitaires
|
||||
private void addSuccessMessage(String message) {
|
||||
FacesContext.getCurrentInstance().addMessage(null,
|
||||
new FacesMessage(FacesMessage.SEVERITY_INFO, "Succès", message));
|
||||
}
|
||||
|
||||
private void addErrorMessage(String message) {
|
||||
FacesContext.getCurrentInstance().addMessage(null,
|
||||
new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erreur", message));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user