1515package de .symeda .sormas .backend .user ;
1616
1717import 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 .*;
2619import java .util .stream .Collectors ;
2720
2821import javax .ejb .EJB ;
2922import javax .ejb .LocalBean ;
3023import javax .ejb .Stateless ;
3124import javax .inject .Inject ;
3225import 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 .*;
4327import javax .transaction .Transactional ;
4428
4529import org .apache .commons .collections4 .CollectionUtils ;
4832import de .symeda .sormas .api .infrastructure .InfrastructureHelper ;
4933import de .symeda .sormas .api .infrastructure .facility .FacilityType ;
5034import 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 .*;
5836import de .symeda .sormas .api .utils .DataHelper ;
5937import de .symeda .sormas .api .utils .DefaultEntityHelper ;
6038import 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