Skip to content
This repository was archived by the owner on May 5, 2021. It is now read-only.

Commit 1d9e11c

Browse files
author
barnabartha
committed
SORMAS-Foundation#2890 - validate user can import campaign data only for it's jurisdiction
1 parent da87b84 commit 1d9e11c

4 files changed

Lines changed: 57 additions & 9 deletions

File tree

sormas-api/src/main/java/de/symeda/sormas/api/i18n/Validations.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,13 @@ public interface Validations {
4747
String importCommunityNotUnique = "importCommunityNotUnique";
4848
String importDistrictAlreadyExists = "importDistrictAlreadyExists";
4949
String importDistrictNotUnique = "importDistrictNotUnique";
50+
String importEntryCommunityNotInJurisdiction = "importEntryCommunityNotInJurisdiction";
51+
String importEntryDistrictNotInJurisdiction = "importEntryDistrictNotInJurisdiction";
5052
String importEntryDoesNotExist = "importEntryDoesNotExist";
5153
String importEntryDoesNotExistDbOrCommunity = "importEntryDoesNotExistDbOrCommunity";
5254
String importEntryDoesNotExistDbOrDistrict = "importEntryDoesNotExistDbOrDistrict";
5355
String importEntryDoesNotExistDbOrRegion = "importEntryDoesNotExistDbOrRegion";
56+
String importEntryRegionNotInJurisdiction = "importEntryRegionNotInJurisdiction";
5457
String importErrorInColumn = "importErrorInColumn";
5558
String importFacilityAlreadyExists = "importFacilityAlreadyExists";
5659
String importFacilityNotUniqueInCommunity = "importFacilityNotUniqueInCommunity";

sormas-api/src/main/resources/validations.properties

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ importEntryDoesNotExist = Invalid value %s in column %s; Entry does not exist in
3434
importEntryDoesNotExistDbOrCommunity = Invalid value %s in column %s; Entry does not exist in the database or in the specified community or is archived (Or maybe a wrong facility type was specified)
3535
importEntryDoesNotExistDbOrDistrict = Invalid value %s in column %s; Entry does not exist in the database or in the specified district or is archived (Or maybe a wrong facility type was specified)
3636
importEntryDoesNotExistDbOrRegion = Invalid value %s in column %s; Entry does not exist in the database or in the specified region or is archived
37+
importEntryRegionNotInJurisdiction = Invalid value %s in column %s; Specified region is not within you're user's jurisdiction
38+
importEntryDistrictNotInJurisdiction = Invalid value %s in column %s; Specified region is not within you're user's jurisdiction
39+
importEntryCommunityNotInJurisdiction = Invalid value %s in column %s; Specified region is not within you're user's jurisdiction
3740
importErrorInColumn = The import failed because of an error in column %s
3841
importFacilityNotUniqueInCommunity = Invalid value %s in column %s; Facility name is not unique in the chosen community, make sure there is only one facility with this name belonging to the chosen community in the database
3942
importFacilityNotUniqueInDistrict = Invalid value %s in column %s; Facility name is not unique in the chosen district, make sure there is only one facility with this name belonging to the chosen district in the database or specify a community

sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/data/CampaignFormDataFacadeEjb.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,8 @@ public long count(CampaignFormDataCriteria criteria) {
500500
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
501501
Root<CampaignFormData> root = cq.from(CampaignFormData.class);
502502

503-
Predicate filter = campaignFormDataService.createCriteriaFilter(criteria, cb, root);
503+
Predicate filter = AbstractAdoService
504+
.and(cb, campaignFormDataService.createCriteriaFilter(criteria, cb, root), campaignFormDataService.createUserFilter(cb, cq, root));
504505
if (filter != null) {
505506
cq.where(filter);
506507
}

sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/importer/CampaignFormDataImporter.java

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import java.lang.reflect.InvocationTargetException;
88
import java.text.ParseException;
99
import java.util.Arrays;
10-
import java.util.Iterator;
1110
import java.util.LinkedHashMap;
1211
import java.util.LinkedList;
1312
import java.util.List;
@@ -36,7 +35,12 @@
3635
import de.symeda.sormas.api.i18n.Validations;
3736
import de.symeda.sormas.api.region.CommunityReferenceDto;
3837
import de.symeda.sormas.api.region.DistrictReferenceDto;
38+
import de.symeda.sormas.api.region.RegionReferenceDto;
39+
import de.symeda.sormas.api.user.JurisdictionLevel;
40+
import de.symeda.sormas.api.user.UserDto;
41+
import de.symeda.sormas.api.user.UserFacade;
3942
import de.symeda.sormas.api.user.UserReferenceDto;
43+
import de.symeda.sormas.api.user.UserRole;
4044
import de.symeda.sormas.ui.importer.DataImporter;
4145
import de.symeda.sormas.ui.importer.ImportErrorException;
4246
import de.symeda.sormas.ui.importer.ImportLineResult;
@@ -49,6 +53,8 @@ public class CampaignFormDataImporter extends DataImporter {
4953
private String campaignFormMetaUUID;
5054
private CampaignReferenceDto campaignReferenceDto;
5155

56+
private UserFacade userFacade;
57+
5258
public CampaignFormDataImporter(
5359
File inputFile,
5460
boolean hasEntityClassRow,
@@ -58,6 +64,8 @@ public CampaignFormDataImporter(
5864
super(inputFile, hasEntityClassRow, currentUser);
5965
this.campaignFormMetaUUID = campaignUUID;
6066
this.campaignReferenceDto = campaignFormDataDto;
67+
68+
this.userFacade = FacadeProvider.getUserFacade();
6169
}
6270

6371
@Override
@@ -87,31 +95,32 @@ protected ImportLineResult importDataFromCsvLine(
8795
CampaignFormMetaDto campaginMetaDto = FacadeProvider.getCampaignFormMetaFacade().getCampaignFormMetaByUuid(campaignFormMetaUUID);
8896
campaignFormData.setCampaign(campaignReferenceDto);
8997
campaignFormData.setCampaignFormMeta(new CampaignFormMetaReferenceDto(campaignFormMetaUUID, campaginMetaDto.getFormName()));
90-
Map<String,String> invalidEntries = validateFormValues(campaginMetaDto, campaignFormData);
98+
Map<String, String> invalidEntries = validateFormValues(campaginMetaDto, campaignFormData);
9199
if (!invalidEntries.isEmpty()) {
92-
for(String e:invalidEntries.keySet()){
93-
writeImportError(values, I18nProperties.getValidationError(Validations.importWrongDataTypeError,invalidEntries.get(e),e));
100+
for (String e : invalidEntries.keySet()) {
101+
writeImportError(values, I18nProperties.getValidationError(Validations.importWrongDataTypeError, invalidEntries.get(e), e));
94102
}
95103
return ImportLineResult.ERROR;
96-
} else {
104+
} else {
97105
FacadeProvider.getCampaignFormDataFacade().saveCampaignFormData(campaignFormData);
98106
}
99107
} catch (ImportErrorException e) {
108+
writeImportError(values, e.getMessage());
100109
return ImportLineResult.ERROR;
101110
}
102111

103112
return ImportLineResult.SUCCESS;
104113
}
105114

106-
private Map<String,String> validateFormValues(CampaignFormMetaDto campaginMetaDto, CampaignFormDataDto campaignFormData) {
107-
Map<String,String> wrongEntries = new LinkedHashMap<>();
115+
private Map<String, String> validateFormValues(CampaignFormMetaDto campaginMetaDto, CampaignFormDataDto campaignFormData) {
116+
Map<String, String> wrongEntries = new LinkedHashMap<>();
108117
List<CampaignFormElement> formElements = campaginMetaDto.getCampaignFormElements();
109118
Optional<CampaignFormElement> formElementOptional;
110119
for (CampaignFormDataEntry formDataEntry : campaignFormData.getFormValues()) {
111120
formElementOptional = formElements.stream().filter(formElement -> formElement.getId().equals(formDataEntry.getId())).findFirst();
112121
if (formElementOptional.isPresent()) {
113122
if (!isEntryValid(formElementOptional.get(), formDataEntry)) {
114-
wrongEntries.put(formElementOptional.get().getId(),formDataEntry.getValue().toString());
123+
wrongEntries.put(formElementOptional.get().getId(), formDataEntry.getValue().toString());
115124

116125
}
117126
}
@@ -146,6 +155,8 @@ private CampaignFormDataDto insertColumnEntryIntoData(CampaignFormDataDto campai
146155
propertyDescriptor = new PropertyDescriptor(entryHeaderPath[i], currentElement.getClass());
147156
Class<?> propertyType = propertyDescriptor.getPropertyType();
148157
if (!executeDefaultInvokings(propertyDescriptor, currentElement, entry[i], entryHeaderPath)) {
158+
final UserDto currentUserDto = userFacade.getByUuid(currentUser.getUuid());
159+
final JurisdictionLevel jurisdictionLevel = UserRole.getJurisdictionLevel(currentUserDto.getUserRoles());
149160
/*
150161
* if (propertyType.isAssignableFrom(CampaignReferenceDto.class)) {
151162
* CampaignDto campaign = FacadeProvider.getCampaignFacade().getByUuid(entry[i]);
@@ -156,6 +167,13 @@ private CampaignFormDataDto insertColumnEntryIntoData(CampaignFormDataDto campai
156167
* } else
157168
*/
158169
if (propertyType.isAssignableFrom(DistrictReferenceDto.class)) {
170+
if (jurisdictionLevel == JurisdictionLevel.DISTRICT && !currentUserDto.getDistrict().getCaption().equals(entry[i])) {
171+
throw new ImportErrorException(
172+
I18nProperties.getValidationError(
173+
Validations.importEntryDistrictNotInJurisdiction,
174+
entry,
175+
buildEntityProperty(entryHeaderPath)));
176+
}
159177
List<DistrictReferenceDto> district =
160178
FacadeProvider.getDistrictFacade().getByName(entry[i], currentElement.getRegion(), true);
161179
if (district.isEmpty()) {
@@ -172,6 +190,13 @@ private CampaignFormDataDto insertColumnEntryIntoData(CampaignFormDataDto campai
172190
propertyDescriptor.getWriteMethod().invoke(currentElement, district.get(0));
173191
}
174192
} else if (propertyType.isAssignableFrom(CommunityReferenceDto.class)) {
193+
if (jurisdictionLevel == JurisdictionLevel.COMMUNITY && !currentUserDto.getCommunity().getCaption().equals(entry[i])) {
194+
throw new ImportErrorException(
195+
I18nProperties.getValidationError(
196+
Validations.importEntryCommunityNotInJurisdiction,
197+
entry,
198+
buildEntityProperty(entryHeaderPath)));
199+
}
175200
List<CommunityReferenceDto> community =
176201
FacadeProvider.getCommunityFacade().getByName(entry[i], currentElement.getDistrict(), true);
177202
if (community.isEmpty()) {
@@ -213,4 +238,20 @@ private CampaignFormDataDto insertColumnEntryIntoData(CampaignFormDataDto campai
213238
}
214239
return currentElement;
215240
}
241+
242+
@Override
243+
protected boolean executeDefaultInvokings(PropertyDescriptor pd, Object element, String entry, String[] entryHeaderPath)
244+
throws InvocationTargetException, IllegalAccessException, ParseException, ImportErrorException {
245+
final boolean returnBoolean = super.executeDefaultInvokings(pd, element, entry, entryHeaderPath);
246+
final Class<?> propertyType = pd.getPropertyType();
247+
if (propertyType.isAssignableFrom(RegionReferenceDto.class)) {
248+
final UserDto currentUserDto = userFacade.getByUuid(currentUser.getUuid());
249+
final JurisdictionLevel jurisdictionLevel = UserRole.getJurisdictionLevel(currentUserDto.getUserRoles());
250+
if (jurisdictionLevel == JurisdictionLevel.REGION && !currentUserDto.getRegion().getCaption().equals(entry)) {
251+
throw new ImportErrorException(
252+
I18nProperties.getValidationError(Validations.importEntryRegionNotInJurisdiction, entry, buildEntityProperty(entryHeaderPath)));
253+
}
254+
}
255+
return returnBoolean;
256+
}
216257
}

0 commit comments

Comments
 (0)