Skip to content

Commit 15007a0

Browse files
committed
🐛 Manually handling Epidata that is alone without any normal
1 parent 2a1b1f3 commit 15007a0

4 files changed

Lines changed: 87 additions & 27 deletions

File tree

sormas-backend/src/main/java/de/symeda/sormas/backend/patch/DataPatcherImpl.java

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import de.symeda.sormas.api.Disease;
2727
import de.symeda.sormas.api.EntityDto;
2828
import de.symeda.sormas.api.caze.CaseDataDto;
29+
import de.symeda.sormas.api.customizablefield.CustomizableFieldContext;
2930
import de.symeda.sormas.api.customizablefield.CustomizableFieldValueDto;
3031
import de.symeda.sormas.api.externalmessage.survey.PatchDictionary;
3132
import de.symeda.sormas.api.externalmessage.survey.PatchField;
@@ -155,7 +156,7 @@ public DataPatchResponse patch(CaseDataPatchRequest request) {
155156
List<CustomizableFieldSinglePatchingResult> customizableResults = customizableFieldDataPatcher.patch(
156157
new CustomizableFieldDataPatchRequest().setCaseDataPatchRequest(request)
157158
.setPatchingTuples(patchingTuples.stream().filter(customizableFieldsPredicate).collect(Collectors.toList()))
158-
.setEntityUuidDictionary(buildEntityUuidDictionaryFrom(entityCache))
159+
.setEntityUuidDictionary(buildEntityUuidDictionaryFrom(entityCache, caseData))
159160
.setCaseDataDto(caseData));
160161

161162
List<SinglePatchResult> aggregatedResults = Stream.concat(plainResults.stream(), customizableResults.stream()).collect(Collectors.toList());
@@ -186,9 +187,10 @@ public DataPatchResponse patch(CaseDataPatchRequest request) {
186187
return response.setApplied(true);
187188
}
188189

189-
private static @NotNull Map<CustomizableContextIndexKey, String> buildEntityUuidDictionaryFrom(
190-
Map<Tuple<String, Integer>, AttachedEntityWrapper> entityCache) {
191-
return entityCache.entrySet()
190+
private static @NotNull Map<CustomizableContextIndexKey, Supplier<String>> buildEntityUuidDictionaryFrom(
191+
Map<Tuple<String, Integer>, AttachedEntityWrapper> entityCache,
192+
CaseDataDto caseData) {
193+
Map<CustomizableContextIndexKey, Supplier<String>> temporaryResult = entityCache.entrySet()
192194
.stream()
193195
.map(
194196
entry -> CustomizableFieldContextPatchMapping.fromI18nName(entry.getKey().getFirst())
@@ -197,7 +199,20 @@ public DataPatchResponse patch(CaseDataPatchRequest request) {
197199
new CustomizableContextIndexKey().setContext(context).setGroupIndex(entry.getKey().getSecond()),
198200
entry.getValue().getEntityDto().getUuid())))
199201
.flatMap(Optional::stream)
200-
.collect(Collectors.toMap(Tuple::getFirst, Tuple::getSecond));
202+
.collect(Collectors.toMap(Tuple::getFirst, t -> t::getSecond));
203+
204+
if (temporaryResult.keySet().stream().anyMatch(key -> key.getContext() == CustomizableFieldContext.EPIDATA)) {
205+
return temporaryResult;
206+
}
207+
208+
// manually adding epiData
209+
return Stream.concat(
210+
temporaryResult.entrySet().stream(),
211+
Stream.of(
212+
new AbstractMap.SimpleEntry<>(
213+
new CustomizableContextIndexKey().setContext(CustomizableFieldContext.EPIDATA),
214+
(Supplier<String>) () -> caseData.getEpiData().getUuid())))
215+
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
201216
}
202217

203218
private void saveCustomizableFieldsIfAppropriate(List<CustomizableFieldSinglePatchingResult> customizableResults) {

sormas-backend/src/main/java/de/symeda/sormas/backend/patch/customizablefield/CustomizableFieldDataPatchRequest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.List;
44
import java.util.Map;
55
import java.util.Objects;
6+
import java.util.function.Supplier;
67

78
import javax.validation.constraints.NotNull;
89

@@ -22,7 +23,7 @@ public final class CustomizableFieldDataPatchRequest {
2223
private CaseDataDto caseDataDto;
2324

2425
@NotNull
25-
private Map<CustomizableContextIndexKey, String> entityUuidDictionary;
26+
private Map<CustomizableContextIndexKey, Supplier<String>> entityUuidDictionary;
2627

2728
public CaseDataPatchRequest getCaseDataPatchRequest() {
2829
return caseDataPatchRequest;
@@ -51,11 +52,11 @@ public CustomizableFieldDataPatchRequest setCaseDataDto(CaseDataDto caseDataDto)
5152
return this;
5253
}
5354

54-
public Map<CustomizableContextIndexKey, String> getEntityUuidDictionary() {
55+
public Map<CustomizableContextIndexKey, Supplier<String>> getEntityUuidDictionary() {
5556
return entityUuidDictionary;
5657
}
5758

58-
public CustomizableFieldDataPatchRequest setEntityUuidDictionary(Map<CustomizableContextIndexKey, String> entityUuidDictionary) {
59+
public CustomizableFieldDataPatchRequest setEntityUuidDictionary(Map<CustomizableContextIndexKey, Supplier<String>> entityUuidDictionary) {
5960
this.entityUuidDictionary = entityUuidDictionary;
6061
return this;
6162
}

sormas-backend/src/main/java/de/symeda/sormas/backend/patch/customizablefield/CustomizableFieldDataPatcher.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
package de.symeda.sormas.backend.patch.customizablefield;
22

3-
import java.util.*;
3+
import java.util.HashMap;
4+
import java.util.List;
5+
import java.util.Map;
6+
import java.util.Objects;
7+
import java.util.Optional;
8+
import java.util.Set;
49
import java.util.function.Function;
10+
import java.util.function.Supplier;
511
import java.util.stream.Collectors;
612

713
import javax.ejb.EJB;
@@ -178,16 +184,19 @@ private Map<CustomizableFieldContext, Map<CustomizableFieldMetadataDto, Function
178184
contexts.stream().map(context -> {
179185
List<CustomizableFieldMetadataDto> activeFieldsForContext = metaDataFacade.getActiveFieldsForContext(context);
180186

181-
Map<CustomizableContextIndexKey, String> entityUuidDictionary = request.getEntityUuidDictionary();
187+
Map<CustomizableContextIndexKey, Supplier<String>> entityUuidDictionary = request.getEntityUuidDictionary();
182188

183189
Map<String, Map<CustomizableFieldMetadataDto, CustomizableFieldValueDto>> entityValuesCache = new HashMap<>();
184190

185191
Map<CustomizableFieldMetadataDto, Function<CustomizablePatchField, CustomizableFieldValueDto>> valueProviderDictionary =
186192
activeFieldsForContext.stream().collect(Collectors.toMap(Function.identity(), metaData -> (customizablePatchField) -> {
187193

188-
String entityUuid = entityUuidDictionary.get(
189-
new CustomizableContextIndexKey().setContext(customizablePatchField.getContext())
190-
.setGroupIndex(customizablePatchField.getGroupIndex()));
194+
String entityUuid =
195+
entityUuidDictionary
196+
.get(
197+
new CustomizableContextIndexKey().setContext(customizablePatchField.getContext())
198+
.setGroupIndex(customizablePatchField.getGroupIndex()))
199+
.get();
191200

192201
Map<CustomizableFieldMetadataDto, CustomizableFieldValueDto> alreadyExistingValuesForEntity =
193202
entityValuesCache.computeIfAbsent(entityUuid, uuid -> valueFacade.getValuesForEntity(uuid, context));

sormas-backend/src/test/java/de/symeda/sormas/patch/DataPatcherImplTest.java

Lines changed: 49 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import de.symeda.sormas.api.customizablefield.CustomizableFieldMetadataFacade;
3434
import de.symeda.sormas.api.customizablefield.CustomizableFieldType;
3535
import de.symeda.sormas.api.customizablefield.CustomizableFieldValueDto;
36+
import de.symeda.sormas.api.epidata.EpiDataDto;
3637
import de.symeda.sormas.api.exposure.ExposureDto;
3738
import de.symeda.sormas.api.exposure.ExposureType;
3839
import de.symeda.sormas.api.externalmessage.survey.PatchDictionary;
@@ -1175,6 +1176,32 @@ void patch_customizableField_text() {
11751176
() -> Assertions.assertEquals("world", values2.get(metadata).getValue()));
11761177
}
11771178

1179+
@Tag("customizable-fields")
1180+
@Test
1181+
void patch_customizableField_text_epidata() {
1182+
// PREPARE
1183+
CustomizableFieldMetadataDto metadata = createEpidataCustomField("cfText", CustomizableFieldType.TEXT);
1184+
CaseDataDto caze = creator.createUnclassifiedCase(Disease.PERTUSSIS);
1185+
String fieldKey = "Custom." + EpiDataDto.I18N_PREFIX + ".cfText";
1186+
1187+
// EXECUTE — value does not yet exist
1188+
DataPatchResponse response1 = victim().patch(
1189+
new CaseDataPatchRequest().setCaseUuid(caze.getUuid())
1190+
.setReplacementStrategy(DataReplacementStrategy.ALWAYS)
1191+
.setPatchDictionary(Map.of(fieldKey, "hello")));
1192+
1193+
// CHECK
1194+
Map<CustomizableFieldMetadataDto, CustomizableFieldValueDto> values1 = customizableValuesForEpiData(caze.getEpiData().getUuid());
1195+
Assertions.assertAll(
1196+
() -> Assertions.assertTrue(response1.getFailures().isEmpty(), "Failures: " + response1.getFailures()),
1197+
() -> Assertions.assertTrue(response1.isApplied()),
1198+
() -> Assertions.assertEquals("hello", values1.get(metadata).getValue()));
1199+
}
1200+
1201+
private CustomizableFieldMetadataDto createEpidataCustomField(String name, CustomizableFieldType type) {
1202+
return createCustomFieldFor(name, type, CustomizableFieldContext.EPIDATA);
1203+
}
1204+
11781205
@Tag("customizable-fields")
11791206
@Test
11801207
void patch_customizableField_textarea() {
@@ -1541,13 +1568,20 @@ void patch_customizableField_fieldDoesNotExist() {
15411568
}
15421569

15431570
private CustomizableFieldMetadataDto createCaseCustomField(String name, CustomizableFieldType type) {
1571+
return createCustomFieldFor(name, type, CustomizableFieldContext.CASE);
1572+
}
1573+
1574+
private CustomizableFieldMetadataDto createCustomFieldFor(String name, CustomizableFieldType type, CustomizableFieldContext context) {
15441575
CustomizableFieldMetadataFacade facade = getBean(CustomizableFieldMetadataFacadeEjb.CustomizableFieldMetadataFacadeEjbLocal.class);
1576+
15451577
CustomizableFieldMetadataDto dto = new CustomizableFieldMetadataDto();
1578+
15461579
dto.setName(name);
15471580
dto.setFieldType(type);
1548-
dto.setContextClass(CustomizableFieldContext.CASE);
1549-
dto.setUiGroup(CustomizableFieldGroup.CASE_DATA_GENERAL);
1581+
dto.setContextClass(context);
1582+
dto.setUiGroup(CustomizableFieldGroup.getGroupsForContext(context).stream().findFirst().orElseThrow());
15501583
dto.setUiLinePosition(1);
1584+
15511585
return facade.save(dto);
15521586
}
15531587

@@ -1595,23 +1629,24 @@ void patch_twoExposures_normalAndCustomizableFields() {
15951629
}
15961630

15971631
private Map<CustomizableFieldMetadataDto, CustomizableFieldValueDto> customizableValuesForCase(String caseUuid) {
1598-
return getBean(CustomizableFieldValueFacadeEjb.CustomizableFieldValueFacadeEjbLocal.class)
1599-
.getValuesForEntity(caseUuid, CustomizableFieldContext.CASE);
1632+
return customizableValuesFor(caseUuid, CustomizableFieldContext.CASE);
16001633
}
16011634

16021635
private Map<CustomizableFieldMetadataDto, CustomizableFieldValueDto> customizableValuesForExposure(String exposureUuid) {
1603-
return getBean(CustomizableFieldValueFacadeEjb.CustomizableFieldValueFacadeEjbLocal.class)
1604-
.getValuesForEntity(exposureUuid, CustomizableFieldContext.EXPOSURE);
1636+
return customizableValuesFor(exposureUuid, CustomizableFieldContext.EXPOSURE);
1637+
}
1638+
1639+
private Map<CustomizableFieldMetadataDto, CustomizableFieldValueDto> customizableValuesFor(
1640+
String exposureUuid,
1641+
CustomizableFieldContext exposure) {
1642+
return getBean(CustomizableFieldValueFacadeEjb.CustomizableFieldValueFacadeEjbLocal.class).getValuesForEntity(exposureUuid, exposure);
1643+
}
1644+
1645+
private Map<CustomizableFieldMetadataDto, CustomizableFieldValueDto> customizableValuesForEpiData(String exposureUuid) {
1646+
return customizableValuesFor(exposureUuid, CustomizableFieldContext.EPIDATA);
16051647
}
16061648

16071649
private CustomizableFieldMetadataDto createExposureCustomField(String name, CustomizableFieldType type) {
1608-
CustomizableFieldMetadataFacade facade = getBean(CustomizableFieldMetadataFacadeEjb.CustomizableFieldMetadataFacadeEjbLocal.class);
1609-
CustomizableFieldMetadataDto dto = new CustomizableFieldMetadataDto();
1610-
dto.setName(name);
1611-
dto.setFieldType(type);
1612-
dto.setContextClass(CustomizableFieldContext.EXPOSURE);
1613-
dto.setUiGroup(CustomizableFieldGroup.getGroupsForContext(CustomizableFieldContext.EXPOSURE).stream().findFirst().orElseThrow());
1614-
dto.setUiLinePosition(1);
1615-
return facade.save(dto);
1650+
return createCustomFieldFor(name, type, CustomizableFieldContext.EXPOSURE);
16161651
}
16171652
}

0 commit comments

Comments
 (0)