feat(sync): MembreRoleSyncService + count admins dynamique

- Nouveau MembreRoleSyncService.ensureOrgAdminRole : auto-crée un MembreRole ORGADMIN
  quand un user avec rôle Keycloak ADMIN_ORGANISATION se connecte sans entrée DB
  (couvre les comptes créés directement dans Keycloak).
- OrganisationContextFilter appelle syncService.ensureOrgAdminRole quand le rôle
  Keycloak est présent mais MembreRole absent (non bloquant sur erreur).
- MembreRoleRepository.countAdminsByOrganisationId : count strict (ORGADMIN + actif
  + dateDebut/dateFin valides) avec fallback sur codes alternatifs si strict=0.
- OrganisationService.convertToResponse : nombreAdministrateurs dynamique via
  MembreRoleRepository (remplace le champ Organisation jamais mis à jour).
This commit is contained in:
dahoud
2026-04-15 20:05:49 +00:00
parent e81c75b828
commit 78d8fd7cd8
4 changed files with 176 additions and 1 deletions

View File

@@ -11,6 +11,7 @@ import dev.lions.unionflow.server.repository.AdresseRepository;
import dev.lions.unionflow.server.repository.EvenementRepository;
import dev.lions.unionflow.server.repository.MembreOrganisationRepository;
import dev.lions.unionflow.server.repository.MembreRepository;
import dev.lions.unionflow.server.repository.MembreRoleRepository;
import dev.lions.unionflow.server.repository.TypeReferenceRepository;
import dev.lions.unionflow.server.entity.Organisation;
import dev.lions.unionflow.server.repository.OrganisationRepository;
@@ -63,6 +64,9 @@ public class OrganisationService {
@Inject
EvenementRepository evenementRepository;
@Inject
MembreRoleRepository membreRoleRepository;
/**
* Crée une nouvelle organisation
*
@@ -565,11 +569,16 @@ public class OrganisationService {
dto.setObjectifs(organisation.getObjectifs());
dto.setActivitesPrincipales(organisation.getActivitesPrincipales());
dto.setNombreMembres(organisation.getNombreMembres());
dto.setNombreAdministrateurs(organisation.getNombreAdministrateurs());
if (organisation.getId() != null) {
// Compte dynamique des administrateurs (rôle ADMIN_ORGANISATION actif)
// — le champ Organisation.nombreAdministrateurs n'est pas tenu à jour.
long countAdmins = membreRoleRepository.countAdminsByOrganisationId(organisation.getId());
dto.setNombreAdministrateurs((int) countAdmins);
long countEvenements = evenementRepository.countActifsByOrganisationId(organisation.getId());
dto.setNombreEvenements((int) countEvenements);
} else {
dto.setNombreAdministrateurs(0);
dto.setNombreEvenements(0);
}
dto.setBudgetAnnuel(organisation.getBudgetAnnuel());