Skip to content

Commit b9a38bb

Browse files
Not allowing disease variant to update, if it is used in any case.
Otherwise user will see the unwanted error message while opening the case/case management.
1 parent ab2aa0b commit b9a38bb

4 files changed

Lines changed: 44 additions & 1 deletion

File tree

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ public interface Validations {
5151
String contactFollowUpUntilDateSoftValidation = "contactFollowUpUntilDateSoftValidation";
5252
String contactWithoutInfrastructureData = "contactWithoutInfrastructureData";
5353
String customizableEnumValueAllowedCharacters = "customizableEnumValueAllowedCharacters";
54+
String customizableEnumValueAlreadyInUse = "customizableEnumValueAlreadyInUse";
5455
String customizableEnumValueDuplicateLanguage = "customizableEnumValueDuplicateLanguage";
5556
String customizableEnumValueDuplicateValue = "customizableEnumValueDuplicateValue";
5657
String customizableEnumValueEmptyTranslations = "customizableEnumValueEmptyTranslations";

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,3 +332,4 @@ smsAuthKeyValueValidation = SMS Auth key value is not valid
332332
smsAuthSecretValueValidation = SMS Auth secret value is not valid
333333
systemConfigurationValueValidationInvalidBackgroundColor = Pre-defined values are: green, red, indigo, gray, default (case-sensitive) otherwise must match hexadecimal format (with or without hash "#"), example: #dd2b0e or #4AA or dd2b0e
334334
systemConfigurationValueValidationMenuSubtitle = Can be empty or up to 16 (any) characters. Can be used to define name of the environment: PRODUCTION - TEST etc.
335+
customizableEnumValueAlreadyInUse = The customizable value %s is using for %s case(s) and cannot be deleted or deactivated. Please update all references to this value before trying again.

sormas-backend/src/main/java/de/symeda/sormas/backend/customizableenum/CustomizableEnumFacadeEjb.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.HashMap;
2727
import java.util.List;
2828
import java.util.Map;
29+
import java.util.Objects;
2930
import java.util.Optional;
3031
import java.util.Set;
3132
import java.util.concurrent.ConcurrentHashMap;
@@ -168,7 +169,19 @@ public CustomizableEnumValueDto save(CustomizableEnumValueDto dto) {
168169
validate(dto);
169170

170171
CustomizableEnumValue existingEntity = service.getByUuid(dto.getUuid());
171-
172+
// if existingEntity disease removed and it is mapped to the cases, shouldn't allow to save the entity
173+
if (existingEntity != null && CollectionUtils.isNotEmpty(existingEntity.getDiseases()) && CollectionUtils.isNotEmpty(dto.getDiseases())) {
174+
existingEntity.getDiseases().stream().filter(disease -> !dto.getDiseases().contains(disease)).findAny().ifPresent(disease -> {
175+
List<String> uuids = service.areCasesUsingCustomizableEnumValue(disease, getEnumValue(dto.getDataType(), disease, dto.getValue()));
176+
if (!uuids.isEmpty()) {
177+
throw new ValidationRuntimeException(
178+
I18nProperties.getValidationError(
179+
Validations.customizableEnumValueAlreadyInUse,
180+
disease.getName(),
181+
uuids.stream().filter(Objects::nonNull).collect(Collectors.joining(", "))));
182+
}
183+
});
184+
}
172185
for (Disease disease : dto.getDiseases()) {
173186
List<String> dataTypeValues = enumValues.get(dto.getDataType()).getOrDefault(disease, Collections.emptyList());
174187
if (existingEntity == null && dataTypeValues != null && dataTypeValues.contains(dto.getValue())) {

sormas-backend/src/main/java/de/symeda/sormas/backend/customizableenum/CustomizableEnumValueService.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515

1616
package de.symeda.sormas.backend.customizableenum;
1717

18+
import java.util.List;
19+
import java.util.stream.Collectors;
20+
21+
import javax.ejb.EJB;
1822
import javax.ejb.LocalBean;
1923
import javax.ejb.Stateless;
2024
import javax.persistence.criteria.CriteriaBuilder;
@@ -23,15 +27,23 @@
2327
import javax.persistence.criteria.Predicate;
2428
import javax.persistence.criteria.Root;
2529

30+
import de.symeda.sormas.api.Disease;
31+
import de.symeda.sormas.api.caze.CaseCriteria;
2632
import de.symeda.sormas.api.customizableenum.CustomizableEnumCriteria;
33+
import de.symeda.sormas.api.disease.DiseaseVariant;
2734
import de.symeda.sormas.api.utils.DataHelper;
35+
import de.symeda.sormas.backend.caze.Case;
36+
import de.symeda.sormas.backend.caze.CaseService;
2837
import de.symeda.sormas.backend.common.AdoServiceWithUserFilterAndJurisdiction;
2938
import de.symeda.sormas.backend.common.CriteriaBuilderHelper;
3039

3140
@Stateless
3241
@LocalBean
3342
public class CustomizableEnumValueService extends AdoServiceWithUserFilterAndJurisdiction<CustomizableEnumValue> {
3443

44+
@EJB
45+
private CaseService caseService;
46+
3547
public CustomizableEnumValueService() {
3648
super(CustomizableEnumValue.class);
3749
}
@@ -70,4 +82,20 @@ public Predicate buildCriteriaFilter(CustomizableEnumCriteria criteria, Criteria
7082
return filter;
7183
}
7284

85+
/**
86+
* Get all cases for a specific disease and disease variant that are using a customizable enum value. This is used to determine whether
87+
* a customizable enum value can be deleted or not.
88+
*
89+
* @param disease
90+
* @param diseaseVariant
91+
* @return
92+
*/
93+
public List<String> areCasesUsingCustomizableEnumValue(Disease disease, DiseaseVariant diseaseVariant) {
94+
CaseCriteria caseCriteria = new CaseCriteria();
95+
caseCriteria.setDisease(disease);
96+
caseCriteria.setDiseaseVariant(diseaseVariant);
97+
List<Case> result = caseService.findBy(caseCriteria, false);
98+
return result.stream().map(Case::getUuid).collect(Collectors.toList());
99+
}
100+
73101
}

0 commit comments

Comments
 (0)