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 22f26c7..bc8a9a4 100644 --- a/src/main/java/fr/titionfire/ffsaf/domain/service/KeycloakService.java +++ b/src/main/java/fr/titionfire/ffsaf/domain/service/KeycloakService.java @@ -104,7 +104,7 @@ public class KeycloakService { public Uni updateRole(String id, List toAdd, List toRemove) { return vertx.getOrCreateContext().executeBlocking(() -> { RoleScopeResource resource = keycloak.realm(realm).users().get(id).roles().realmLevel(); - List roles = keycloak.realm(realm) .roles().list(); + List roles = keycloak.realm(realm).roles().list(); resource.add(roles.stream().filter(r -> toAdd.contains(r.getName())).toList()); resource.remove(roles.stream().filter(r -> toRemove.contains(r.getName())).toList()); return "OK"; @@ -127,9 +127,18 @@ public class KeycloakService { } private Uni creatUser(MembreModel membreModel) { - String login = makeLogin(membreModel); - LOGGER.infof("Creation of user %s...", login); return vertx.getOrCreateContext().executeBlocking(() -> { + String login; + int i = 1; + do { + login = makeLogin(membreModel); + if (i > 1) { + login += i; + } + i++; + } while (!keycloak.realm(realm).users().searchByUsername(login, true).isEmpty()); + LOGGER.infof("Creation of user %s...", login); + UserRepresentation user = new UserRepresentation(); user.setUsername(login); user.setFirstName(membreModel.getFname()); @@ -145,13 +154,18 @@ public class KeycloakService { throw new KeycloakException("Fail to creat user %s (reason=%s)".formatted(login, response.getStatusInfo().getReasonPhrase())); } - return getUser(login).orElseThrow(() -> new KeycloakException("Fail to fetch user %s".formatted(login))); + String finalLogin = login; + return getUser(login).orElseThrow(() -> new KeycloakException("Fail to fetch user %s".formatted(finalLogin))); }) .invoke(user -> membreModel.setUserId(user.getId())) .call(user -> membreService.setUserId(membreModel.getId(), user.getId())) .call(user -> setClubGroupMembre(membreModel, membreModel.getClub())); } + public Uni setId(long id, String nid) { + return membreService.setUserId(id, nid).map(__ -> "OK"); + } + private Optional getUser(String username) { List users = keycloak.realm(realm).users().searchByUsername(username, true); diff --git a/src/main/java/fr/titionfire/ffsaf/rest/CompteEndpoints.java b/src/main/java/fr/titionfire/ffsaf/rest/CompteEndpoints.java index 299759b..bc7fd12 100644 --- a/src/main/java/fr/titionfire/ffsaf/rest/CompteEndpoints.java +++ b/src/main/java/fr/titionfire/ffsaf/rest/CompteEndpoints.java @@ -33,6 +33,13 @@ public class CompteEndpoints { return service.initCompte(id); } + @PUT + @Path("{id}/setUUID/{nid}") + @RolesAllowed("federation_admin") + public Uni initCompte(@PathParam("id") long id, @PathParam("nid") String nid) { + return service.setId(id, nid); + } + @GET @Path("{id}/roles") @RolesAllowed("federation_admin") diff --git a/src/main/webapp/src/pages/admin/MemberPage.jsx b/src/main/webapp/src/pages/admin/MemberPage.jsx index c06da70..db5faec 100644 --- a/src/main/webapp/src/pages/admin/MemberPage.jsx +++ b/src/main/webapp/src/pages/admin/MemberPage.jsx @@ -278,16 +278,38 @@ function CompteInfo({userData}) { } ) } + const sendId = (event) => { + event.preventDefault(); + + toast.promise( + apiAxios.put(`/compte/${userData.id}/setUUID/${event.target.uuid?.value}`), + { + pending: "Définition de l'identifient en cours", + success: "Identifient défini avec succès 🎉", + error: "Échec de la définition de l'identifient 😕 " + } + ) + } return
-
Compte
+
+
+ +
    +
  • +
+
+
{userData.userId ? : <>
-
+
Ce membre ne dispose pas de compte...
@@ -299,6 +321,28 @@ function CompteInfo({userData}) { }
+
}