Skip to content

Commit 226f7d0

Browse files
committed
🐛: FIX: #13830: National user cannot assign case even though it's enabled in user role configuration.
#13830
1 parent a7b8ac4 commit 226f7d0

1 file changed

Lines changed: 44 additions & 29 deletions

File tree

sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserService.java

Lines changed: 44 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -15,31 +15,15 @@
1515
package de.symeda.sormas.backend.user;
1616

1717
import java.text.MessageFormat;
18-
import java.util.Arrays;
19-
import java.util.Collection;
20-
import java.util.Collections;
21-
import java.util.HashMap;
22-
import java.util.List;
23-
import java.util.Map;
24-
import java.util.Random;
25-
import java.util.Set;
18+
import java.util.*;
2619
import java.util.stream.Collectors;
2720

2821
import javax.ejb.EJB;
2922
import javax.ejb.LocalBean;
3023
import javax.ejb.Stateless;
3124
import javax.inject.Inject;
3225
import javax.persistence.TypedQuery;
33-
import javax.persistence.criteria.CriteriaBuilder;
34-
import javax.persistence.criteria.CriteriaQuery;
35-
import javax.persistence.criteria.Expression;
36-
import javax.persistence.criteria.From;
37-
import javax.persistence.criteria.Join;
38-
import javax.persistence.criteria.JoinType;
39-
import javax.persistence.criteria.ParameterExpression;
40-
import javax.persistence.criteria.Predicate;
41-
import javax.persistence.criteria.Root;
42-
import javax.persistence.criteria.Subquery;
26+
import javax.persistence.criteria.*;
4327
import javax.transaction.Transactional;
4428

4529
import org.apache.commons.collections4.CollectionUtils;
@@ -48,13 +32,7 @@
4832
import de.symeda.sormas.api.infrastructure.InfrastructureHelper;
4933
import de.symeda.sormas.api.infrastructure.facility.FacilityType;
5034
import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto;
51-
import de.symeda.sormas.api.user.JurisdictionLevel;
52-
import de.symeda.sormas.api.user.NotificationProtocol;
53-
import de.symeda.sormas.api.user.NotificationType;
54-
import de.symeda.sormas.api.user.UserCriteria;
55-
import de.symeda.sormas.api.user.UserRight;
56-
import de.symeda.sormas.api.user.UserRoleDto;
57-
import de.symeda.sormas.api.user.UserRoleReferenceDto;
35+
import de.symeda.sormas.api.user.*;
5836
import de.symeda.sormas.api.utils.DataHelper;
5937
import de.symeda.sormas.api.utils.DefaultEntityHelper;
6038
import de.symeda.sormas.api.utils.PasswordHelper;
@@ -254,11 +232,21 @@ public List<UserReference> getUserReferences(
254232
boolean userEntityJoinUsed = false;
255233

256234
if (CollectionUtils.isNotEmpty(regionUuids)) {
235+
logger.debug("regionUuids: [{}]", regionUuids);
257236
Join<User, Region> regionJoin = userRoot.join(User.REGION, JoinType.LEFT);
258-
filter = CriteriaBuilderHelper.and(cb, filter, cb.in(regionJoin.get(AbstractDomainObject.UUID)).value(regionUuids));
237+
238+
filter = CriteriaBuilderHelper.and(
239+
cb,
240+
filter,
241+
CriteriaBuilderHelper.or(
242+
cb,
243+
cb.in(regionJoin.get(AbstractDomainObject.UUID)).value(regionUuids),
244+
createCurrentUserHasNationJurisdictionFilter(cb, userRoot)));
259245
userEntityJoinUsed = true;
260246
}
261247
if (CollectionUtils.isNotEmpty(districtUuids)) {
248+
logger.debug("districtUuids: [{}]", districtUuids);
249+
262250
Join<User, District> districtJoin = userRoot.join(User.DISTRICT, JoinType.LEFT);
263251
Join<User, Region> userRegionJoin = userRoot.join(User.REGION, JoinType.LEFT);
264252
Join<Region, District> districtRegionJoin = userRegionJoin.join(Region.DISTRICTS, JoinType.LEFT);
@@ -269,11 +257,18 @@ public List<UserReference> getUserReferences(
269257
cb.in(districtRegionJoin.get(AbstractDomainObject.UUID)).value(districtUuids),
270258
cb.equal(root.get(UserReference.JURISDICTION_LEVEL), JurisdictionLevel.REGION)));
271259

272-
filter = CriteriaBuilderHelper.and(cb, filter, districtFilter);
260+
filter = CriteriaBuilderHelper
261+
.and(cb, filter, CriteriaBuilderHelper.or(cb, districtFilter, createCurrentUserHasNationJurisdictionFilter(cb, userRoot)));
273262
userEntityJoinUsed = true;
274263
}
275264
if (!hasRight(UserRight.SEE_PERSONAL_DATA_OUTSIDE_JURISDICTION)) {
276-
filter = CriteriaBuilderHelper.and(cb, filter, createCurrentUserJurisdictionFilter(cb, userRoot));
265+
logger.debug("Not looking for user right [SEE_PERSONAL_DATA_OUTSIDE_JURISDICTION]");
266+
267+
filter = CriteriaBuilderHelper.and(
268+
cb,
269+
filter,
270+
CriteriaBuilderHelper
271+
.or(cb, createCurrentUserJurisdictionFilter(cb, userRoot), createCurrentUserHasNationJurisdictionFilter(cb, userRoot)));
277272
userEntityJoinUsed = true;
278273
}
279274

@@ -298,12 +293,20 @@ public List<UserReference> getUserReferences(
298293

299294
//exlude users with limited diseases
300295
if (excludeLimitedDiseaseUsers) {
296+
logger.debug("Search will be limited to diseases of the user");
301297
filter = CriteriaBuilderHelper.and(cb, filter, cb.isNull(userRoot.get(User.LIMITED_DISEASES)));
302298
}
303299

304300
if (CollectionUtils.isNotEmpty(communityUuids)) {
301+
logger.debug("communityUuids: [{}]", communityUuids);
305302
Join<User, Community> communityJoin = userRoot.join(User.COMMUNITY, JoinType.LEFT);
306-
filter = CriteriaBuilderHelper.and(cb, filter, cb.in(communityJoin.get(AbstractDomainObject.UUID)).value(communityUuids));
303+
filter = CriteriaBuilderHelper.and(
304+
cb,
305+
filter,
306+
CriteriaBuilderHelper.or(
307+
cb,
308+
cb.in(communityJoin.get(AbstractDomainObject.UUID)).value(communityUuids),
309+
createCurrentUserHasNationJurisdictionFilter(cb, userRoot)));
307310
}
308311

309312
if (filter != null) {
@@ -725,9 +728,21 @@ public Predicate createCurrentUserJurisdictionFilter(CriteriaBuilder cb, From<?,
725728
}
726729
}
727730

731+
public Predicate createCurrentUserHasNationJurisdictionFilter(CriteriaBuilder cb, From<?, User> from) {
732+
User currentUser = getCurrentUser();
733+
734+
if (currentUser.getJurisdictionLevel() == JurisdictionLevel.NATION) {
735+
logger.error("getJurisdictionLevel = NATION");
736+
return cb.equal(from.get(User.JURISDICTION_LEVEL), JurisdictionLevel.NATION);
737+
}
738+
739+
return cb.equal(from.get(User.JURISDICTION_LEVEL), JurisdictionLevel.NATION);
740+
}
741+
728742
public Predicate buildUserRightsFilter(Root<User> from, Collection<UserRight> userRights) {
729743

730744
if (userRights != null && !userRights.isEmpty()) {
745+
logger.error("User rights: [{}]", userRights);
731746
Join<User, UserRole> rolesJoin = from.join(User.USER_ROLES, JoinType.LEFT);
732747
Join<UserRole, UserRight> rightsJoin = rolesJoin.join(UserRole.USER_RIGHTS, JoinType.LEFT);
733748
return rightsJoin.in(Collections.singletonList(userRights));

0 commit comments

Comments
 (0)