diff --git a/src/main/java/fr/titionfire/ffsaf/domain/service/AffiliationService.java b/src/main/java/fr/titionfire/ffsaf/domain/service/AffiliationService.java index 3096633..4540909 100644 --- a/src/main/java/fr/titionfire/ffsaf/domain/service/AffiliationService.java +++ b/src/main/java/fr/titionfire/ffsaf/domain/service/AffiliationService.java @@ -2,6 +2,7 @@ package fr.titionfire.ffsaf.domain.service; import fr.titionfire.ffsaf.data.model.*; import fr.titionfire.ffsaf.data.repository.*; +import fr.titionfire.ffsaf.rest.client.StateIdService; import fr.titionfire.ffsaf.rest.data.SimpleAffiliation; import fr.titionfire.ffsaf.rest.data.SimpleReqAffiliation; import fr.titionfire.ffsaf.rest.exception.DBadRequestException; @@ -21,11 +22,13 @@ import io.smallrye.mutiny.unchecked.Unchecked; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import org.eclipse.microprofile.config.inject.ConfigProperty; +import org.eclipse.microprofile.rest.client.inject.RestClient; import org.hibernate.reactive.mutiny.Mutiny; import org.jboss.logging.Logger; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Stream; @WithSession @@ -60,6 +63,9 @@ public class AffiliationService { @Inject LoggerService ls; + @RestClient + StateIdService stateIdService; + @ConfigProperty(name = "upload_dir") String media; @@ -73,6 +79,8 @@ public class AffiliationService { public Uni pre_save(AffiliationRequestForm form, boolean unique) { AffiliationRequestModel affModel = form.toModel(); int currentSaison = Utils.getSaison(); + List out = new ArrayList<>(); + out.add(affModel.getState_id()); return Uni.createFrom().item(affModel) .invoke(Unchecked.consumer(model -> { @@ -80,14 +88,24 @@ public class AffiliationService { throw new DBadRequestException("Saison non valid"); } })) - .chain(() -> repositoryRequest.count("state_id = ?1 and saison = ?2", affModel.getState_id(), - affModel.getSaison())) - .onItem().invoke(Unchecked.consumer(count -> { - if (count != 0 && unique) { - throw new DBadRequestException("Demande d'affiliation déjà existante"); - } - })) - .chain(() -> clubRepository.find("StateId = ?1", affModel.getState_id()).firstResult().chain(club -> + .chain(() -> stateIdService.get_status(affModel.getState_id()).onItem().transform(o -> { + if (o.getId_rna() != null && !o.getId_rna().isBlank()) + out.add(o.getId_rna()); + if (o.getId_siren() != null && !o.getId_siren().isBlank()) + out.add(o.getId_siren()); + if (o.getIdentite().getId_siret_siege() != null && !o.getIdentite().getId_siret_siege().isBlank()) + out.add(o.getIdentite().getId_siret_siege()); + return out; + }).onFailure().recoverWithItem(out) + .chain(a -> repositoryRequest.count("state_id IN ?1 and saison = ?2", + out, affModel.getSaison())) + .onItem().invoke(Unchecked.consumer(count -> { + if (count != 0 && unique) { + throw new DBadRequestException("Demande d'affiliation déjà existante"); + } + })) + ) + .chain(() -> clubRepository.find("StateId IN ?1", out).firstResult().chain(club -> repository.count("club = ?1 and saison = ?2", club, affModel.getSaison()))) .onItem().invoke(Unchecked.consumer(count -> { if (count != 0) { @@ -349,17 +367,23 @@ public class AffiliationService { } private Uni acceptOld(AffiliationRequestSaveForm form, AffiliationRequestModel model, ClubModel club) { + AtomicBoolean nameChange = new AtomicBoolean(false); LOGGER.debug("Old Club Accepted"); return Uni.createFrom().nullItem() .chain(() -> { - club.setName(form.getName()); + if (!form.getName().equals(club.getName())) { + club.setName(form.getName()); + nameChange.set(true); + } club.setCountry("FR"); club.setStateId(form.getState_id()); club.setAddress(form.getAddress()); club.setContact_intern(form.getContact()); return Panache.withTransaction(() -> clubRepository.persist(club) .chain(() -> repository.persist(new AffiliationModel(null, club, model.getSaison()))) - .chain(() -> repositoryRequest.delete(model))); + .chain(() -> repositoryRequest.delete(model))) + .call(() -> nameChange.get() ? keycloakService.updateGroupFromClub(club) // update group in keycloak + : Uni.createFrom().nullItem()); }) .map(__ -> club); } diff --git a/src/main/java/fr/titionfire/ffsaf/domain/service/ClubService.java b/src/main/java/fr/titionfire/ffsaf/domain/service/ClubService.java index f9d8a76..d5ae83d 100644 --- a/src/main/java/fr/titionfire/ffsaf/domain/service/ClubService.java +++ b/src/main/java/fr/titionfire/ffsaf/domain/service/ClubService.java @@ -32,6 +32,7 @@ import org.eclipse.microprofile.config.inject.ConfigProperty; import org.hibernate.reactive.mutiny.Mutiny; import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; import static fr.titionfire.ffsaf.net2.Client_Thread.MAPPER; @@ -193,12 +194,17 @@ public class ClubService { } public Uni update(long id, FullClubForm input) { + AtomicBoolean nameChange = new AtomicBoolean(false); + return repository.findById(id).call(m -> Mutiny.fetch(m.getContact())) .onItem().transformToUni(Unchecked.function(m -> { TypeReference> typeRef = new TypeReference<>() { }; - m.setName(input.getName()); + if (!input.getName().equals(m.getName())) { + m.setName(input.getName()); + nameChange.set(true); + } m.setCountry(input.getCountry()); m.setInternational(input.isInternational()); @@ -228,6 +234,8 @@ public class ClubService { } return Panache.withTransaction(() -> repository.persist(m)).call(() -> ls.append()); })) + .call(clubModel -> nameChange.get() ? keycloakService.updateGroupFromClub(clubModel) // update group in keycloak + : Uni.createFrom().nullItem()) .invoke(membreModel -> SReqClub.sendIfNeed(serverCustom.clients, SimpleClubModel.fromModel(membreModel))) .map(__ -> "OK"); diff --git a/src/main/java/fr/titionfire/ffsaf/domain/service/KeycloakService.java b/src/main/java/fr/titionfire/ffsaf/domain/service/KeycloakService.java index 1c74ba6..1218a82 100644 --- a/src/main/java/fr/titionfire/ffsaf/domain/service/KeycloakService.java +++ b/src/main/java/fr/titionfire/ffsaf/domain/service/KeycloakService.java @@ -85,6 +85,31 @@ public class KeycloakService { return Uni.createFrom().item(club::getClubId); } + public Uni updateGroupFromClub(ClubModel club) { + if (club.getClubId() == null) { + return getGroupFromClub(club); + } else { + LOGGER.infof("Updating name of club group %d-%s...", club.getId(), club.getName()); + return vertx.getOrCreateContext().executeBlocking(() -> { + GroupRepresentation clubGroup = + keycloak.realm(realm).groups().groups().stream().filter(g -> g.getName().equals("club")) + .findAny() + .orElseThrow(() -> new KeycloakException("Fail to fetch group %s".formatted("club"))); + + keycloak.realm(realm).groups().group(clubGroup.getId()).getSubGroups(0, 1000, true).stream() + .filter(g -> g.getName().startsWith(club.getId() + "-")).findAny() + .ifPresent(groupRepresentation -> { + groupRepresentation.setName(club.getId() + "-" + club.getName()); + keycloak.realm(realm).groups().group(groupRepresentation.getId()) + .update(groupRepresentation); + }); + + return club.getClubId(); + } + ); + } + } + public Uni getUserFromMember(MembreModel membreModel) { if (membreModel.getUserId() == null) { return Uni.createFrom() @@ -199,16 +224,16 @@ public class KeycloakService { public Uni initCompte(long id) { return membreService.getById(id).invoke(Unchecked.consumer(membreModel -> { - if (membreModel.getUserId() != null) - throw new KeycloakException("User already linked to the user id=" + id); - if (membreModel.getEmail() == null) - throw new KeycloakException("User email is null"); - if (membreModel.getFname() == null || membreModel.getLname() == null) - throw new KeycloakException("User name is null"); - })).chain(membreModel -> creatUser(membreModel).chain(user -> { - LOGGER.infof("Set user id %s to membre %s", user.getId(), membreModel.getId()); - return membreService.setUserId(membreModel.getId(), user.getId()).map(__ -> user.getId()); - })); + if (membreModel.getUserId() != null) + throw new KeycloakException("User already linked to the user id=" + id); + if (membreModel.getEmail() == null) + throw new KeycloakException("User email is null"); + if (membreModel.getFname() == null || membreModel.getLname() == null) + throw new KeycloakException("User name is null"); + })).chain(membreModel -> creatUser(membreModel).chain(user -> { + LOGGER.infof("Set user id %s to membre %s", user.getId(), membreModel.getId()); + return membreService.setUserId(membreModel.getId(), user.getId()).map(__ -> user.getId()); + })); } private Uni creatUser(MembreModel membreModel) { diff --git a/src/main/java/fr/titionfire/ffsaf/rest/data/AssoData.java b/src/main/java/fr/titionfire/ffsaf/rest/data/AssoData.java index a7e1f39..4bb71fb 100644 --- a/src/main/java/fr/titionfire/ffsaf/rest/data/AssoData.java +++ b/src/main/java/fr/titionfire/ffsaf/rest/data/AssoData.java @@ -15,6 +15,7 @@ public class AssoData { @RegisterForReflection public static class Identite { String nom; + String id_siret_siege; } @Data diff --git a/src/main/webapp/src/pages/DemandeAff.jsx b/src/main/webapp/src/pages/DemandeAff.jsx index e2e46ee..8df8659 100644 --- a/src/main/webapp/src/pages/DemandeAff.jsx +++ b/src/main/webapp/src/pages/DemandeAff.jsx @@ -257,7 +257,7 @@ function AssoInfo({initData, needFile}) {
N° SIRET ou RNA* - setStateId(e.target.value)}/>