Skip to content
Snippets Groups Projects
Commit 861ba57d authored by Hugues.Cazeaux's avatar Hugues.Cazeaux
Browse files

refactor: user sync

parent 76f9ec5c
No related branches found
No related tags found
No related merge requests found
......@@ -22,6 +22,10 @@
<dependency>
<groupId>ch.unige.solidify</groupId>
<artifactId>solidify-client</artifactId>
</dependency>
<dependency>
<groupId>ch.unige.solidify</groupId>
<artifactId>solidify-controller</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
......
package ch.unige.solidify.auth.client.service;
import java.util.Optional;
import org.slf4j.Logger;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.web.client.RestTemplate;
import ch.unige.solidify.auth.model.AuthUserDto;
import ch.unige.solidify.auth.model.UserInfo;
import ch.unige.solidify.exception.SolidifyRuntimeException;
import ch.unige.solidify.model.SolidifyApplicationRole;
import ch.unige.solidify.rest.Resource;
import ch.unige.solidify.rest.RestCollectionPage;
import ch.unige.solidify.service.ResourceService;
import ch.unige.solidify.util.TrustedRestClientTool;
public interface UserSynchronizationService {
public static final String USERS_ENDPOINT = "/users/";
public default <T extends Resource & UserInfo> void synchronizeUsers(Logger log, TrustedRestClientTool restClientTool, String authModuleUrl,
ResourceService<T> userService) {
Pageable pageable = PageRequest.of(0, RestCollectionPage.MAX_SIZE_PAGE);
Page<T> userList;
do {
userList = userService.findAll(pageable);
for (T user : userList) {
try {
final AuthUserDto authUserDto = this.getAuthenticatedUser(restClientTool, authModuleUrl, user.getExternalUid());
// Update login info & role
this.synchronizeUserInfo(user, authUserDto);
// Synchronize Orcid
userService.synchronizeOrcid(authUserDto, user.getPerson());
log.info("User {} synchronized", user.getFullName());
} catch (RuntimeException e) {
log.error("User {} not synchronized", user.getFullName());
}
}
pageable = pageable.next();
} while (!userList.isEmpty());
}
public default AuthUserDto getAuthenticatedUser(TrustedRestClientTool restClientTool, String authModuleUrl, String externalUid) {
RestTemplate restTemplate = restClientTool.getClient();
AuthUserDto authUser = restTemplate.getForEntity(authModuleUrl + USERS_ENDPOINT + externalUid, AuthUserDto.class).getBody();
if (authUser == null) {
throw new IllegalStateException();
}
return authUser;
}
public default void synchronizeUserInfo(UserInfo user, AuthUserDto authUserDto) {
// Update login info & role
this.updateLastLogin(user, authUserDto);
this.updateApplicationRole(user, authUserDto);
this.save(user);
}
public default void updateApplicationRole(UserInfo user, AuthUserDto authUserDto) {
if (authUserDto.getApplicationRole() == null) {
throw new SolidifyRuntimeException("User DTO (" + authUserDto.getExternalUid() + ") has a null application role");
}
if (!this.haveSameRole(user, authUserDto)) {
Optional<SolidifyApplicationRole> role = this.applicationRoleRepository.findById(authUserDto.getApplicationRole().getResId());
if (role.isPresent()) {
user.setApplicationRole(role.get());
} else {
throw new SolidifyRuntimeException("Cannot find application role (" + authUserDto.getApplicationRole().getResId() + ")");
}
}
}
public void updateLastLogin(UserInfo user, AuthUserDto authUser);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment