add Keycloak action, auto assigne club on création

This commit is contained in:
Thibaut Valentin 2024-01-29 22:25:26 +01:00
parent 978c055834
commit 251d0e25d6
2 changed files with 24 additions and 14 deletions

View File

@ -3,6 +3,7 @@ package fr.titionfire.ffsaf.domain.service;
import fr.titionfire.ffsaf.data.model.ClubModel; import fr.titionfire.ffsaf.data.model.ClubModel;
import fr.titionfire.ffsaf.data.model.MembreModel; import fr.titionfire.ffsaf.data.model.MembreModel;
import fr.titionfire.ffsaf.utils.KeycloakException; import fr.titionfire.ffsaf.utils.KeycloakException;
import fr.titionfire.ffsaf.utils.RequiredAction;
import io.smallrye.mutiny.Uni; import io.smallrye.mutiny.Uni;
import io.smallrye.mutiny.unchecked.Unchecked; import io.smallrye.mutiny.unchecked.Unchecked;
import io.vertx.mutiny.core.Vertx; import io.vertx.mutiny.core.Vertx;
@ -56,7 +57,7 @@ public class KeycloakService {
response.getStatusInfo().getReasonPhrase())); response.getStatusInfo().getReasonPhrase()));
} }
return keycloak.realm(realm).groups().group(clubGroup.getId()).toRepresentation().getSubGroups().stream() return keycloak.realm(realm).groups().group(clubGroup.getId()).getSubGroups(0, 1000, true).stream()
.filter(g -> g.getName().startsWith(club.getId() + "-")).findAny().map(GroupRepresentation::getId) .filter(g -> g.getName().startsWith(club.getId() + "-")).findAny().map(GroupRepresentation::getId)
.orElseThrow(() -> new KeycloakException("Fail to fetch group %s*".formatted(club.getId() + "-"))); .orElseThrow(() -> new KeycloakException("Fail to fetch group %s*".formatted(club.getId() + "-")));
} }
@ -112,22 +113,26 @@ public class KeycloakService {
String login = makeLogin(membreModel); String login = makeLogin(membreModel);
LOGGER.infof("Creation of user %s...", login); LOGGER.infof("Creation of user %s...", login);
return vertx.getOrCreateContext().executeBlocking(() -> { return vertx.getOrCreateContext().executeBlocking(() -> {
UserRepresentation user = new UserRepresentation(); UserRepresentation user = new UserRepresentation();
user.setUsername(login); user.setUsername(login);
user.setFirstName(membreModel.getFname()); user.setFirstName(membreModel.getFname());
user.setLastName(membreModel.getLname()); user.setLastName(membreModel.getLname());
user.setEnabled(true); user.setEmail(membreModel.getEmail());
user.setEnabled(true);
//user.setRequiredActions(List.of(UserModel.RequiredAction.VERIFY_EMAIL.name(), user.setRequiredActions(List.of(RequiredAction.VERIFY_EMAIL.name(),
// UserModel.RequiredAction.UPDATE_PASSWORD.name())); RequiredAction.UPDATE_PASSWORD.name()));
try (Response response = keycloak.realm(realm).users().create(user)) { try (Response response = keycloak.realm(realm).users().create(user)) {
if (!response.getStatusInfo().equals(Response.Status.CREATED) && !response.getStatusInfo().equals(Response.Status.CONFLICT)) if (!response.getStatusInfo().equals(Response.Status.CREATED) && !response.getStatusInfo().equals(Response.Status.CONFLICT))
throw new KeycloakException("Fail to creat user %s (reason=%s)".formatted(login, response.getStatusInfo().getReasonPhrase())); 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))); return getUser(login).orElseThrow(() -> new KeycloakException("Fail to fetch user %s".formatted(login)));
}).call(user -> membreService.setUserId(membreModel.getId(), user.getId())); })
.invoke(user -> membreModel.setUserId(user.getId()))
.call(user -> membreService.setUserId(membreModel.getId(), user.getId()))
.call(user -> setClubGroupMembre(membreModel, membreModel.getClub()));
} }
private Optional<UserRepresentation> getUser(String username) { private Optional<UserRepresentation> getUser(String username) {

View File

@ -0,0 +1,5 @@
package fr.titionfire.ffsaf.utils;
public enum RequiredAction {
VERIFY_EMAIL, UPDATE_PROFILE, CONFIGURE_TOTP, UPDATE_PASSWORD, TERMS_AND_CONDITIONS
}