Sync: code local unifié

Synchronisation du code source local (fait foi).

Signed-off-by: lions dev Team
This commit is contained in:
dahoud
2026-03-15 16:25:40 +00:00
parent e82dc356f3
commit 75a19988b0
730 changed files with 53599 additions and 13145 deletions

View File

@@ -1,8 +1,6 @@
package dev.lions.unionflow.server.service;
import dev.lions.unionflow.server.entity.Evenement;
import dev.lions.unionflow.server.entity.Evenement.StatutEvenement;
import dev.lions.unionflow.server.entity.Evenement.TypeEvenement;
import dev.lions.unionflow.server.repository.EvenementRepository;
import dev.lions.unionflow.server.repository.MembreRepository;
import dev.lions.unionflow.server.repository.OrganisationRepository;
@@ -13,6 +11,8 @@ import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
import java.time.LocalDateTime;
import jakarta.ws.rs.NotFoundException;
import org.hibernate.Hibernate;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -20,7 +20,8 @@ import java.util.UUID;
import org.jboss.logging.Logger;
/**
* Service métier pour la gestion des événements Version simplifiée pour tester les imports et
* Service métier pour la gestion des événements Version simplifiée pour tester
* les imports et
* Lombok
*
* @author UnionFlow Team
@@ -32,13 +33,17 @@ public class EvenementService {
private static final Logger LOG = Logger.getLogger(EvenementService.class);
@Inject EvenementRepository evenementRepository;
@Inject
EvenementRepository evenementRepository;
@Inject MembreRepository membreRepository;
@Inject
MembreRepository membreRepository;
@Inject OrganisationRepository organisationRepository;
@Inject
OrganisationRepository organisationRepository;
@Inject KeycloakService keycloakService;
@Inject
KeycloakService keycloakService;
/**
* Crée un nouvel événement
@@ -69,7 +74,7 @@ public class EvenementService {
// Valeurs par défaut
if (evenement.getStatut() == null) {
evenement.setStatut(StatutEvenement.PLANIFIE);
evenement.setStatut("PLANIFIE");
}
if (evenement.getActif() == null) {
evenement.setActif(true);
@@ -90,7 +95,7 @@ public class EvenementService {
/**
* Met à jour un événement existant
*
* @param id l'UUID de l'événement
* @param id l'UUID de l'événement
* @param evenementMisAJour les nouvelles données
* @return l'événement mis à jour
* @throws IllegalArgumentException si l'événement n'existe pas
@@ -99,11 +104,10 @@ public class EvenementService {
public Evenement mettreAJourEvenement(UUID id, Evenement evenementMisAJour) {
LOG.infof("Mise à jour événement ID: %s", id);
Evenement evenementExistant =
evenementRepository
.findByIdOptional(id)
.orElseThrow(
() -> new IllegalArgumentException("Événement non trouvé avec l'ID: " + id));
Evenement evenementExistant = evenementRepository
.findByIdOptional(id)
.orElseThrow(
() -> new NotFoundException("Événement non trouvé avec l'ID: " + id));
// Vérifier les permissions
if (!peutModifierEvenement(evenementExistant)) {
@@ -130,6 +134,9 @@ public class EvenementService {
evenementExistant.setContactOrganisateur(evenementMisAJour.getContactOrganisateur());
evenementExistant.setMaterielRequis(evenementMisAJour.getMaterielRequis());
evenementExistant.setVisiblePublic(evenementMisAJour.getVisiblePublic());
if (evenementMisAJour.getStatut() != null) {
evenementExistant.setStatut(evenementMisAJour.getStatut());
}
// Métadonnées de modification
evenementExistant.setModifiePar(keycloakService.getCurrentUserEmail());
@@ -137,6 +144,10 @@ public class EvenementService {
evenementRepository.update(evenementExistant);
LOG.infof("Événement mis à jour avec succès: ID=%s", id);
// Initialiser les relations lazy pour éviter LazyInitializationException lors
// de la sérialisation JSON
Hibernate.initialize(evenementExistant.getOrganisation());
Hibernate.initialize(evenementExistant.getOrganisateur());
return evenementExistant;
}
@@ -167,7 +178,7 @@ public class EvenementService {
}
/** Liste les événements par type */
public List<Evenement> listerParType(TypeEvenement type, Page page, Sort sort) {
public List<Evenement> listerParType(String type, Page page, Sort sort) {
return evenementRepository.findByType(type, page, sort);
}
@@ -181,11 +192,10 @@ public class EvenementService {
public void supprimerEvenement(UUID id) {
LOG.infof("Suppression événement ID: %s", id);
Evenement evenement =
evenementRepository
.findByIdOptional(id)
.orElseThrow(
() -> new IllegalArgumentException("Événement non trouvé avec l'ID: " + id));
Evenement evenement = evenementRepository
.findByIdOptional(id)
.orElseThrow(
() -> new NotFoundException("Événement non trouvé avec l'ID: " + id));
// Vérifier les permissions
if (!peutModifierEvenement(evenement)) {
@@ -209,19 +219,18 @@ public class EvenementService {
/**
* Change le statut d'un événement
*
* @param id l'UUID de l'événement
* @param id l'UUID de l'événement
* @param nouveauStatut le nouveau statut
* @return l'événement mis à jour
*/
@Transactional
public Evenement changerStatut(UUID id, StatutEvenement nouveauStatut) {
public Evenement changerStatut(UUID id, String nouveauStatut) {
LOG.infof("Changement statut événement ID: %s vers %s", id, nouveauStatut);
Evenement evenement =
evenementRepository
.findByIdOptional(id)
.orElseThrow(
() -> new IllegalArgumentException("Événement non trouvé avec l'ID: " + id));
Evenement evenement = evenementRepository
.findByIdOptional(id)
.orElseThrow(
() -> new NotFoundException("Événement non trouvé avec l'ID: " + id));
// Vérifier les permissions
if (!peutModifierEvenement(evenement)) {
@@ -320,9 +329,9 @@ public class EvenementService {
/** Valide un changement de statut */
private void validerChangementStatut(
StatutEvenement statutActuel, StatutEvenement nouveauStatut) {
String statutActuel, String nouveauStatut) {
// Règles de transition simplifiées pour la version mobile
if (statutActuel == StatutEvenement.TERMINE || statutActuel == StatutEvenement.ANNULE) {
if ("TERMINE".equals(statutActuel) || "ANNULE".equals(statutActuel)) {
throw new IllegalArgumentException(
"Impossible de changer le statut d'un événement terminé ou annulé");
}
@@ -337,4 +346,22 @@ public class EvenementService {
String utilisateurActuel = keycloakService.getCurrentUserEmail();
return utilisateurActuel != null && utilisateurActuel.equals(evenement.getCreePar());
}
/**
* Indique si l'utilisateur connecté est inscrit à l'événement.
* Utilisé par l'app mobile pour afficher le statut d'inscription sur la page détail.
*/
public boolean isUserInscrit(UUID evenementId) {
Evenement evenement = evenementRepository.findByIdOptional(evenementId).orElse(null);
if (evenement == null) {
return false;
}
String email = keycloakService.getCurrentUserEmail();
if (email == null || email.isBlank()) {
return false;
}
return membreRepository.findByEmail(email)
.map(m -> evenement.isMemberInscrit(m.getId()))
.orElse(false);
}
}