Files
unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/service/RoleService.java

172 lines
4.6 KiB
Java

package dev.lions.unionflow.server.service;
import dev.lions.unionflow.server.entity.Organisation;
import dev.lions.unionflow.server.entity.Role;
import dev.lions.unionflow.server.entity.Role.TypeRole;
import dev.lions.unionflow.server.repository.OrganisationRepository;
import dev.lions.unionflow.server.repository.RoleRepository;
import dev.lions.unionflow.server.service.KeycloakService;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
import jakarta.ws.rs.NotFoundException;
import java.util.List;
import java.util.UUID;
import org.jboss.logging.Logger;
/**
* Service métier pour la gestion des rôles
*
* @author UnionFlow Team
* @version 3.0
* @since 2025-01-29
*/
@ApplicationScoped
public class RoleService {
private static final Logger LOG = Logger.getLogger(RoleService.class);
@Inject RoleRepository roleRepository;
@Inject OrganisationRepository organisationRepository;
@Inject KeycloakService keycloakService;
/**
* Crée un nouveau rôle
*
* @param role Rôle à créer
* @return Rôle créé
*/
@Transactional
public Role creerRole(Role role) {
LOG.infof("Création d'un nouveau rôle: %s", role.getCode());
// Vérifier l'unicité du code
if (roleRepository.findByCode(role.getCode()).isPresent()) {
throw new IllegalArgumentException("Un rôle avec ce code existe déjà: " + role.getCode());
}
// Métadonnées
role.setCreePar(keycloakService.getCurrentUserEmail());
roleRepository.persist(role);
LOG.infof("Rôle créé avec succès: ID=%s, Code=%s", role.getId(), role.getCode());
return role;
}
/**
* Met à jour un rôle existant
*
* @param id ID du rôle
* @param roleModifie Rôle avec les modifications
* @return Rôle mis à jour
*/
@Transactional
public Role mettreAJourRole(UUID id, Role roleModifie) {
LOG.infof("Mise à jour du rôle ID: %s", id);
Role role =
roleRepository
.findRoleById(id)
.orElseThrow(() -> new NotFoundException("Rôle non trouvé avec l'ID: " + id));
// Vérifier l'unicité du code si modifié
if (!role.getCode().equals(roleModifie.getCode())) {
if (roleRepository.findByCode(roleModifie.getCode()).isPresent()) {
throw new IllegalArgumentException("Un rôle avec ce code existe déjà: " + roleModifie.getCode());
}
}
// Mise à jour
role.setCode(roleModifie.getCode());
role.setLibelle(roleModifie.getLibelle());
role.setDescription(roleModifie.getDescription());
role.setNiveauHierarchique(roleModifie.getNiveauHierarchique());
role.setTypeRole(roleModifie.getTypeRole());
role.setOrganisation(roleModifie.getOrganisation());
role.setModifiePar(keycloakService.getCurrentUserEmail());
roleRepository.persist(role);
LOG.infof("Rôle mis à jour avec succès: ID=%s", id);
return role;
}
/**
* Trouve un rôle par son ID
*
* @param id ID du rôle
* @return Rôle ou null
*/
public Role trouverParId(UUID id) {
return roleRepository.findRoleById(id).orElse(null);
}
/**
* Trouve un rôle par son code
*
* @param code Code du rôle
* @return Rôle ou null
*/
public Role trouverParCode(String code) {
return roleRepository.findByCode(code).orElse(null);
}
/**
* Liste tous les rôles système
*
* @return Liste des rôles système
*/
public List<Role> listerRolesSysteme() {
return roleRepository.findRolesSysteme();
}
/**
* Liste tous les rôles d'une organisation
*
* @param organisationId ID de l'organisation
* @return Liste des rôles
*/
public List<Role> listerParOrganisation(UUID organisationId) {
return roleRepository.findByOrganisationId(organisationId);
}
/**
* Liste tous les rôles actifs
*
* @return Liste des rôles actifs
*/
public List<Role> listerTousActifs() {
return roleRepository.findAllActifs();
}
/**
* Supprime (désactive) un rôle
*
* @param id ID du rôle
*/
@Transactional
public void supprimerRole(UUID id) {
LOG.infof("Suppression du rôle ID: %s", id);
Role role =
roleRepository
.findRoleById(id)
.orElseThrow(() -> new NotFoundException("Rôle non trouvé avec l'ID: " + id));
// Vérifier si c'est un rôle système
if (role.isRoleSysteme()) {
throw new IllegalStateException("Impossible de supprimer un rôle système");
}
role.setActif(false);
role.setModifiePar(keycloakService.getCurrentUserEmail());
roleRepository.persist(role);
LOG.infof("Rôle supprimé avec succès: ID=%s", id);
}
}