Skip to content

Commit

Permalink
Merge pull request #13061 from SORMAS-Foundation/feature-13042_exclud…
Browse files Browse the repository at this point in the history
…e_jurisdiction_fields_from_readOnly

#13042 - Add feature configuration for Keycloak synchronization plus …
  • Loading branch information
sergiupacurariu authored Mar 28, 2024
2 parents 36b9975 + 4d11fe2 commit 2120597
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public interface UserFacade {

UserDto saveUser(@Valid UserDto dto, boolean isUserSettingsUpdate);

UserDto setUserRoles(UserReferenceDto userReference, Set<UserRoleReferenceDto> userRoles);
UserDto saveUserRolesAndRestrictions(UserDto user, Set<UserRoleReferenceDto> userRoles);

boolean isLoginUnique(String uuid, String userName);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

import static java.util.Objects.isNull;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
Expand Down Expand Up @@ -53,6 +54,7 @@
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand Down Expand Up @@ -629,31 +631,43 @@ public UserDto saveUser(@Valid UserDto dto, boolean isUserSettingsUpdate) {
throw new AccessDeniedException(I18nProperties.getString(Strings.errorForbidden));
}

User user = userService.getByUuid(dto.getUuid());
User existingUser = userService.getByUuid(dto.getUuid());
// current user should be able to edit itself
if (!DataHelper.isSame(userService.getCurrentUser(), dto)) {
FacadeHelper.checkCreateAndEditRights(user, userService, UserRight.USER_CREATE, UserRight.USER_EDIT);
FacadeHelper.checkCreateAndEditRights(existingUser, userService, UserRight.USER_CREATE, UserRight.USER_EDIT);
}

return saveUserRoles(dto, isUserSettingsUpdate, user);
if (!isLoginUnique(existingUser == null ? null : existingUser.getUuid(), dto.getUserName())) {
throw new ValidationException(I18nProperties.getValidationError(Validations.userNameNotUnique));
}

validateUserRoles(dto.getUserRoles(), isUserSettingsUpdate, existingUser, dto.getCreationDate() != null);

User user = fillOrBuildEntity(dto, existingUser, true);
userService.ensurePersisted(user);

if (existingUser == null) {
userCreateEvent.fire(new UserCreateEvent(user));
} else {
userUpdateEvent.fire(new UserUpdateEvent(existingUser, user));
}

return toDto(user);
}

private UserDto saveUserRoles(UserDto dto, boolean isUserSettingsUpdate, User user) {
Collection<UserRoleDto> newRoles = userRoleFacade.getByReferences(dto.getUserRoles());
@Nullable
private User validateUserRoles(Set<UserRoleReferenceDto> roles, boolean isUserSettingsUpdate, User user, boolean isUserUpdate) {
Collection<UserRoleDto> newRoles = userRoleFacade.getByReferences(roles);

try {
userRoleFacade.validateUserRoleCombination(newRoles);
} catch (UserRoleDto.UserRoleValidationException e) {
throw new ValidationException(e);
}

if (!isLoginUnique(user == null ? null : user.getUuid(), dto.getUserName())) {
throw new ValidationException(I18nProperties.getValidationError(Validations.userNameNotUnique));
}

User oldUser = null;
Set<UserRight> oldUserRights = Collections.emptySet();
if (dto.getCreationDate() != null) {
if (isUserUpdate) {
try {
oldUser = (User) BeanUtils.cloneBean(user);
oldUserRights = UserRole.getUserRights(oldUser.getUserRoles());
Expand All @@ -671,28 +685,39 @@ private UserDto saveUserRoles(UserDto dto, boolean isUserSettingsUpdate, User us
throw new ValidationException(I18nProperties.getValidationError(Validations.removeUserEditRightFromOwnUser));
}
}
return oldUser;
}

user = fillOrBuildEntity(dto, user, true);
userService.ensurePersisted(user);
@Override
@RightsAllowed(UserRight._USER_EDIT)
public UserDto saveUserRolesAndRestrictions(UserDto userDto, Set<UserRoleReferenceDto> userRoles) {
User user = userService.getByReferenceDto(userDto.toReference());

if (oldUser == null) {
userCreateEvent.fire(new UserCreateEvent(user));
} else {
userUpdateEvent.fire(new UserUpdateEvent(oldUser, user));
User oldUser;
try {
oldUser = (User) BeanUtils.cloneBean(user);
} catch (IllegalAccessException | InstantiationException | InvocationTargetException | NoSuchMethodException e) {
throw new RuntimeException(e);
}

return toDto(user);
}
validateUserRoles(userDto.getUserRoles(), false, user, true);

@Override
@RightsAllowed(UserRight._USER_EDIT)
public UserDto setUserRoles(UserReferenceDto userReference, Set<UserRoleReferenceDto> userRoles) {
User user = userService.getByReferenceDto(userReference);
fillEntityUserRoles(user, userDto);

UserDto userToBeSaved = toDto(user);
userToBeSaved.setUserRoles(userRoles);
user.setRegion(regionService.getByReferenceDto(userDto.getRegion()));
user.setDistrict(districtService.getByReferenceDto(userDto.getDistrict()));
user.setCommunity(communityService.getByReferenceDto(userDto.getCommunity()));
user.setHealthFacility(facilityService.getByReferenceDto(userDto.getHealthFacility()));
user.setAssociatedOfficer(userService.getByReferenceDto(userDto.getAssociatedOfficer()));
user.setLaboratory(facilityService.getByReferenceDto(userDto.getLaboratory()));
user.setPointOfEntry(pointOfEntryService.getByReferenceDto(userDto.getPointOfEntry()));
user.setLimitedDiseases(userDto.getLimitedDiseases());

return saveUserRoles(userToBeSaved, false, user);
userService.ensurePersisted(user);

userUpdateEvent.fire(new UserUpdateEvent(oldUser, user));

return toDto(user);
}

@Override
Expand Down Expand Up @@ -830,6 +855,14 @@ private User fillOrBuildEntity(UserDto source, User target, boolean checkChangeD
target.setLanguage(source.getLanguage());
target.setHasConsentedToGdpr(source.isHasConsentedToGdpr());

fillEntityUserRoles(target, source);

target.updateJurisdictionLevel();

return target;
}

private void fillEntityUserRoles(User target, UserDto source) {
//Make sure userroles of target are attached
Set<UserRole> userRoles = Optional.of(target).map(User::getUserRoles).orElseGet(HashSet::new);
target.setUserRoles(userRoles);
Expand All @@ -845,10 +878,6 @@ private User fillOrBuildEntity(UserDto source, User target, boolean checkChangeD
target.getUserRoles().addAll(newUserRoles);
//Remove userroles that were removed
target.getUserRoles().removeIf(userRole -> !sourceUserRoleUuids.contains(userRole.getUuid()));

target.updateJurisdictionLevel();

return target;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ private void openRemoveUserAsOfficerPrompt(Consumer<Boolean> callback) {

private void saveUser(UserDto user) {
if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.AUTH_PROVIDER_TO_SORMAS_USER_SYNC)) {
FacadeProvider.getUserFacade().setUserRoles(user.toReference(), user.getUserRoles());
FacadeProvider.getUserFacade().saveUserRolesAndRestrictions(user, user.getUserRoles());
} else {
FacadeProvider.getUserFacade().saveUser(user, false);
}
Expand Down
14 changes: 12 additions & 2 deletions sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserEditForm.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import static de.symeda.sormas.ui.utils.LayoutUtil.loc;
import static java.util.function.Predicate.not;

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
Expand Down Expand Up @@ -80,6 +81,16 @@ public class UserEditForm extends AbstractEditForm<UserDto> {
private static final String LIMITED_DISEASES_HEADING_LOC = "limitedDiseasesHeadingLoc";
public static final String RESTRICT_DISEASES_CHECKBOX_LOC = "restrictDiseasesCheckboxLoc";
private static final String RESTRICT_DISEASES_DESCRIPTION_LOC = "restrictDiseasesDescriptionLoc";
public static List<String> excludedFields = Arrays.asList(
UserDto.USER_ROLES,
UserDto.REGION,
UserDto.DISTRICT,
UserDto.COMMUNITY,
UserDto.HEALTH_FACILITY,
UserDto.POINT_OF_ENTRY,
UserDto.ASSOCIATED_OFFICER,
UserDto.LABORATORY,
UserDto.LIMITED_DISEASES);

//@formatter:off
private static final String HTML_LAYOUT =
Expand Down Expand Up @@ -244,11 +255,10 @@ protected void addFields() {

if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.AUTH_PROVIDER_TO_SORMAS_USER_SYNC)) {
this.getFieldGroup().getFields().forEach(userField ->{
if (!userField.getId().equals(UserDto.USER_ROLES)) {
if (!excludedFields.contains(userField.getId())) {
userField.setEnabled(false);
}
});
this.getField(UserEditForm.RESTRICT_DISEASES_CHECKBOX_LOC).setEnabled(false);
}
}

Expand Down

0 comments on commit 2120597

Please sign in to comment.