Skip to content

Commit a8db1b5

Browse files
author
=
committed
✨ displaying of person contact details: phone and email
1 parent 745b52f commit a8db1b5

5 files changed

Lines changed: 147 additions & 28 deletions

File tree

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,49 @@
11
package de.symeda.sormas.backend.patch.partial_retrieval;
22

3-
import de.symeda.sormas.api.EntityDto;
4-
import de.symeda.sormas.api.patch.partial_retrieval.FieldInfo;
3+
import static de.symeda.sormas.backend.patch.PatchFieldHelper.PATH_SEPARATOR;
54

5+
import java.util.List;
66
import java.util.Set;
7+
import java.util.stream.Collectors;
8+
import java.util.stream.Stream;
9+
10+
import javax.enterprise.context.ApplicationScoped;
11+
12+
import de.symeda.sormas.api.EntityDto;
13+
import de.symeda.sormas.api.i18n.I18nProperties;
14+
import de.symeda.sormas.api.patch.partial_retrieval.FieldInfo;
15+
import de.symeda.sormas.api.person.PersonContactDetailDto;
16+
import de.symeda.sormas.api.person.PersonContactDetailType;
17+
import de.symeda.sormas.api.person.PersonDto;
718

19+
@ApplicationScoped
820
public class ContactDetailsFieldValueRetriever implements SpecificFieldValueRetriever {
9-
@Override
10-
public FieldInfo getFieldInfo(String fieldName, EntityDto entityDto) {
11-
// TODO.
12-
return null;
13-
}
14-
15-
@Override
16-
public Set<String> getSupportedFields() {
17-
return Set.of();
18-
}
21+
22+
@Override
23+
public FieldInfo getFieldInfo(String fieldName, EntityDto entityDto) {
24+
PersonDto personDto = (PersonDto) entityDto;
25+
26+
boolean isPhone = fieldName.contains(PersonContactDetailDto.PHONE_NUMBER_TYPE);
27+
PersonContactDetailType targetType = isPhone ? PersonContactDetailType.PHONE : PersonContactDetailType.EMAIL;
28+
29+
String contactValues = personDto.getPersonContactDetails()
30+
.stream()
31+
.filter(detail -> targetType.equals(detail.getPersonContactDetailType()))
32+
.map(PersonContactDetailDto::getContactInformation)
33+
.collect(Collectors.joining("; "));
34+
35+
String captionKey = isPhone ? PersonContactDetailDto.PHONE_NUMBER_TYPE : PersonContactDetailDto.CONTACT_INFORMATION;
36+
String translatedFieldName = I18nProperties.getCaption(
37+
PersonContactDetailDto.I18N_PREFIX + PATH_SEPARATOR + captionKey,
38+
captionKey);
39+
40+
return new FieldInfo().setFieldType(List.class).setFieldValue(contactValues).setTranslatedFieldName(translatedFieldName);
41+
}
42+
43+
@Override
44+
public Set<String> getSupportedFields() {
45+
return Stream.of(PersonContactDetailDto.PHONE_NUMBER_TYPE, PersonContactDetailDto.CONTACT_INFORMATION)
46+
.map(suffix -> PersonContactDetailDto.I18N_PREFIX + PATH_SEPARATOR + suffix)
47+
.collect(Collectors.toSet());
48+
}
1949
}

sormas-backend/src/main/java/de/symeda/sormas/backend/patch/partial_retrieval/PartialRetrieverImpl.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ public class PartialRetrieverImpl implements PartialRetriever {
5555
@Inject
5656
private TypeToDisplayRegistry typeToDisplayRegistry;
5757

58+
@Inject
59+
private SpecificFieldValueRetrieverRegistry specificFieldValueRetrieverRegistry;
60+
5861
@EJB
5962
private FeatureConfigurationFacadeEjb.FeatureConfigurationFacadeEjbLocal featureConfigurationFacade;
6063

@@ -89,14 +92,21 @@ public PartialRetrievalResponse retrievePartial(PartialRetrievalRequest request)
8992
String physicalPathName = pathWithoutAlias.substring(pathWithoutAlias.indexOf('.') + 1);
9093

9194
String aliasPath = pathAliasHelper.toAliasPath(pathWithoutAlias);
92-
Optional<EntityDto> adequateBean = getAdequateBean(pathWithoutAlias, caseData, beanCache);
95+
Optional<EntityDto> adequateBeanOpt = getAdequateBean(pathWithoutAlias, caseData, beanCache);
9396

94-
if (adequateBean.isEmpty()) {
97+
if (adequateBeanOpt.isEmpty()) {
9598
return Tuple.of(originalFieldName, new Tuple<>((FieldInfo) null, PartialRetrievalFailureCause.ENTITY_COULD_NOT_BE_FOUND));
9699
}
97100

101+
EntityDto adequateBean = adequateBeanOpt.orElseThrow();
102+
Optional<FieldInfo> specificFieldInfo = specificFieldValueRetrieverRegistry.getFieldInfo(aliasPath, adequateBean);
103+
104+
if (specificFieldInfo.isPresent()) {
105+
return Tuple.of(originalFieldName, new Tuple<>(specificFieldInfo.get(), (PartialRetrievalFailureCause) null));
106+
}
107+
98108
Tuple<Tuple<Class<?>, Object>, PropertyAccessFailure> propertyType = PropertyAccessor
99-
.getPropertyTypeAndValue(adequateBean.orElseThrow(), physicalPathName, getFieldVisibilityCheckers(caseData.getDisease()));
109+
.getPropertyTypeAndValue(adequateBean, physicalPathName, getFieldVisibilityCheckers(caseData.getDisease()));
100110

101111
PropertyAccessFailure propertyAccessFailure = propertyType.getSecond();
102112
if (propertyAccessFailure != null) {

sormas-backend/src/main/java/de/symeda/sormas/backend/patch/partial_retrieval/SpecificFieldValueRetriever.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,4 @@ public interface SpecificFieldValueRetriever {
3939
default boolean supports(@NotNull String targetFieldName) {
4040
return getSupportedFields().contains(targetFieldName);
4141
}
42-
43-
default String toFieldName(String prefix, String fieldName) {
44-
return prefix + '.' + fieldName;
45-
}
4642
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package de.symeda.sormas.backend.patch.partial_retrieval;
2+
3+
import java.util.List;
4+
import java.util.Optional;
5+
import java.util.stream.Collectors;
6+
7+
import javax.annotation.PostConstruct;
8+
import javax.enterprise.context.ApplicationScoped;
9+
import javax.enterprise.inject.Instance;
10+
import javax.inject.Inject;
11+
import javax.validation.constraints.NotNull;
12+
13+
import org.slf4j.Logger;
14+
import org.slf4j.LoggerFactory;
15+
16+
import de.symeda.sormas.api.EntityDto;
17+
import de.symeda.sormas.api.patch.partial_retrieval.FieldInfo;
18+
19+
@ApplicationScoped
20+
public class SpecificFieldValueRetrieverRegistry {
21+
22+
private final static Logger logger = LoggerFactory.getLogger(SpecificFieldValueRetrieverRegistry.class);
23+
24+
@Inject
25+
private Instance<SpecificFieldValueRetriever> instances;
26+
27+
public SpecificFieldValueRetrieverRegistry() {
28+
}
29+
30+
public Optional<FieldInfo> getFieldInfo(@NotNull String fieldName, @NotNull EntityDto entityDto) {
31+
return instances.stream()
32+
.filter(retriever -> retriever.supports(fieldName))
33+
.findAny()
34+
.map(retriever -> {
35+
logger.debug("Field [{}] will be handled by retriever: [{}]", fieldName, retriever);
36+
return retriever.getFieldInfo(fieldName, entityDto);
37+
});
38+
}
39+
}

sormas-backend/src/test/java/de/symeda/sormas/backend/patch/partial_retrieval/PartialRetrieverImplTest.java

Lines changed: 53 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.util.Set;
55

66
import de.symeda.sormas.api.person.PersonContactDetailDto;
7+
import de.symeda.sormas.api.person.PersonContactDetailType;
78
import org.junit.jupiter.api.Assertions;
89
import org.junit.jupiter.api.Test;
910

@@ -113,8 +114,6 @@ void retrievePartial_german() {
113114
.setFieldsToRetrieve(Set.of(clinicalConfirmation, symptomsAbdominalPain)));
114115

115116
// CHECK
116-
System.out.println("actual = " + actual);
117-
118117
FieldInfo caseDiseaseFieldInfo = actual.getFieldInfoDictionary().get(clinicalConfirmation);
119118
FieldInfo symptomsAbdominalPainFieldInfo = actual.getFieldInfoDictionary().get(symptomsAbdominalPain);
120119
Assertions.assertAll(
@@ -145,8 +144,6 @@ void retrievePartial_person() {
145144
.retrievePartial(new PartialRetrievalRequest().setCaseUuid(originalCase.getUuid()).setFieldsToRetrieve(Set.of(personFirstNameFieldName)));
146145

147146
// CHECK
148-
System.out.println("actual = " + actual);
149-
150147
FieldInfo personFirstNameFieldInfo = actual.getFieldInfoDictionary().get(personFirstNameFieldName);
151148
Assertions.assertAll(
152149
() -> Assertions.assertTrue(actual.getFailuresDictionary().isEmpty()),
@@ -167,8 +164,6 @@ void retrievePartial_null_value() {
167164
new PartialRetrievalRequest().setCaseUuid(originalCase.getUuid()).setFieldsToRetrieve(Set.of(caseClassificationDateFieldName)));
168165

169166
// CHECK
170-
System.out.println("actual = " + actual);
171-
172167
FieldInfo classificationDateFieldInfo = actual.getFieldInfoDictionary().get(caseClassificationDateFieldName);
173168
Assertions.assertAll(
174169
() -> Assertions.assertTrue(actual.getFailuresDictionary().isEmpty()),
@@ -186,21 +181,70 @@ void retrieve_contact_details_phone() {
186181
PersonReferenceDto personRef = originalCase.getPerson();
187182

188183
PersonDto person = getPersonFacade().getByUuid(personRef.getUuid());
184+
List<PersonContactDetailDto> contactDetails = person.getPersonContactDetails();
185+
186+
PersonContactDetailDto primaryPhoneNumber = new PersonContactDetailDto();
187+
primaryPhoneNumber.setContactInformation("09876543");
188+
primaryPhoneNumber.setPersonContactDetailType(PersonContactDetailType.PHONE);
189+
primaryPhoneNumber.setPrimaryContact(true);
190+
contactDetails.add(primaryPhoneNumber);
191+
192+
PersonContactDetailDto secondaryPhoneNumber = new PersonContactDetailDto();
193+
secondaryPhoneNumber.setContactInformation("12345678");
194+
secondaryPhoneNumber.setPersonContactDetailType(PersonContactDetailType.PHONE);
195+
contactDetails.add(secondaryPhoneNumber);
196+
197+
getPersonFacade().save(person);
189198

190199
// EXECUTE
191200
String personContactDetails = toFieldName(PersonContactDetailDto.I18N_PREFIX, PersonContactDetailDto.PHONE_NUMBER_TYPE);
192201
PartialRetrievalResponse actual = victim()
193202
.retrievePartial(new PartialRetrievalRequest().setCaseUuid(originalCase.getUuid()).setFieldsToRetrieve(Set.of(personContactDetails)));
194203

195204
// CHECK
196-
System.out.println("actual = " + actual);
205+
FieldInfo personFirstNameFieldInfo = actual.getFieldInfoDictionary().get(personContactDetails);
206+
Assertions.assertAll(
207+
() -> Assertions.assertTrue(actual.getFailuresDictionary().isEmpty()),
208+
() -> Assertions.assertTrue(actual.getFieldInfoDictionary().containsKey(personContactDetails)),
209+
() -> Assertions.assertEquals("Phone number type", personFirstNameFieldInfo.getTranslatedFieldName()),
210+
() -> Assertions.assertEquals("09876543; 12345678", personFirstNameFieldInfo.getFieldValue()));
211+
}
197212

213+
@Test
214+
void retrieve_contact_details_email() {
215+
// PREPARE
216+
Disease disease = Disease.RUBELLA;
217+
CaseDataDto originalCase = creator.createUnclassifiedCase(disease);
218+
219+
PersonReferenceDto personRef = originalCase.getPerson();
220+
221+
PersonDto person = getPersonFacade().getByUuid(personRef.getUuid());
222+
List<PersonContactDetailDto> contactDetails = person.getPersonContactDetails();
223+
224+
PersonContactDetailDto emailContactDetail = new PersonContactDetailDto();
225+
emailContactDetail.setContactInformation("mail@mail.ch");
226+
emailContactDetail.setPersonContactDetailType(PersonContactDetailType.EMAIL);
227+
contactDetails.add(emailContactDetail);
228+
229+
PersonContactDetailDto phoneContactDetail = new PersonContactDetailDto();
230+
phoneContactDetail.setContactInformation("MUST_NOT_BE_RETRIEVED");
231+
phoneContactDetail.setPersonContactDetailType(PersonContactDetailType.PHONE);
232+
contactDetails.add(phoneContactDetail);
233+
234+
getPersonFacade().save(person);
235+
236+
// EXECUTE
237+
String personContactDetails = toFieldName(PersonContactDetailDto.I18N_PREFIX, PersonContactDetailDto.CONTACT_INFORMATION);
238+
PartialRetrievalResponse actual = victim()
239+
.retrievePartial(new PartialRetrievalRequest().setCaseUuid(originalCase.getUuid()).setFieldsToRetrieve(Set.of(personContactDetails)));
240+
241+
// CHECK
198242
FieldInfo personFirstNameFieldInfo = actual.getFieldInfoDictionary().get(personContactDetails);
199243
Assertions.assertAll(
200244
() -> Assertions.assertTrue(actual.getFailuresDictionary().isEmpty()),
201245
() -> Assertions.assertTrue(actual.getFieldInfoDictionary().containsKey(personContactDetails)),
202-
() -> Assertions.assertEquals("First name", personFirstNameFieldInfo.getTranslatedFieldName()),
203-
() -> Assertions.assertEquals(person.getFirstName(), personFirstNameFieldInfo.getFieldValue()));
246+
() -> Assertions.assertEquals("Contact information", personFirstNameFieldInfo.getTranslatedFieldName()),
247+
() -> Assertions.assertEquals("mail@mail.ch", personFirstNameFieldInfo.getFieldValue()));
204248
}
205249

206250
private static String toFieldName(String prefix, String fieldName) {

0 commit comments

Comments
 (0)