Skip to content

Commit

Permalink
Merge pull request #13108 from SORMAS-Foundation/feature-13083-self-r…
Browse files Browse the repository at this point in the history
…eport-processing

Feature 13083 self report processing
  • Loading branch information
leventegal-she authored Jun 4, 2024
2 parents 9cef078 + 46ce322 commit b144f1f
Show file tree
Hide file tree
Showing 67 changed files with 2,686 additions and 465 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,8 @@ public class CaseCriteria extends CriteriaWithDateType implements ExternalShareC
*/
private Set<String> caseUuidsForMerge;

private String caseReferenceNumber;

public CaseCriteria() {
super(NewCaseDateType.class);
}
Expand Down Expand Up @@ -793,4 +795,14 @@ public CaseCriteria caseUuidsForMerge(Set<String> caseUuidsForMerge) {

return this;
}

@IgnoreForUrl
public String getCaseReferenceNumber() {
return caseReferenceNumber;
}

public CaseCriteria caseReferenceNumber(String caseReferenceNumber) {
this.caseReferenceNumber = caseReferenceNumber;
return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,9 @@ public class ContactCriteria extends BaseCriteria implements Serializable {
*/
private Set<String> contactUuidsForMerge;

private String caseReferenceNumber;
private Boolean withCase;

public UserRoleReferenceDto getReportingUserRole() {
return reportingUserRole;
}
Expand Down Expand Up @@ -752,4 +755,23 @@ public ContactCriteria contactUuidsForMerge(Set<String> contactUuidsForMerge) {

return this;
}

@IgnoreForUrl
public String getCaseReferenceNumber() {
return caseReferenceNumber;
}

public ContactCriteria caseReferenceNumber(String caseReferenceNumber) {
this.caseReferenceNumber = caseReferenceNumber;
return this;
}

public Boolean getWithCase() {
return withCase;
}

public ContactCriteria withCase(Boolean withNoCase) {
this.withCase = withNoCase;
return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -156,4 +156,6 @@ List<ProcessedEntity> saveBulkContacts(
boolean contactOfficerChange);

long getContactCount(CaseReferenceDto caze);

void linkContactToCase(ContactReferenceDto contactRef, CaseReferenceDto caseRef);
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,33 +15,26 @@

package de.symeda.sormas.api.externalmessage.processing;

import java.util.Collections;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
import java.util.function.Function;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.symeda.sormas.api.CountryHelper;
import de.symeda.sormas.api.caze.CaseCriteria;
import de.symeda.sormas.api.caze.CaseDataDto;
import de.symeda.sormas.api.caze.CaseSelectionDto;
import de.symeda.sormas.api.caze.CaseSimilarityCriteria;
import de.symeda.sormas.api.externalmessage.ExternalMessageDto;
import de.symeda.sormas.api.externalmessage.processing.ExternalMessageProcessingResult.EntitySelection;
import de.symeda.sormas.api.externalmessage.processing.flow.FlowThen;
import de.symeda.sormas.api.externalmessage.processing.flow.ProcessingResult;
import de.symeda.sormas.api.externalmessage.processing.flow.ProcessingResultStatus;
import de.symeda.sormas.api.feature.FeatureType;
import de.symeda.sormas.api.infrastructure.facility.FacilityDto;
import de.symeda.sormas.api.infrastructure.facility.FacilityReferenceDto;
import de.symeda.sormas.api.infrastructure.facility.FacilityType;
import de.symeda.sormas.api.person.PersonDto;
import de.symeda.sormas.api.person.PersonReferenceDto;
import de.symeda.sormas.api.user.UserDto;
import de.symeda.sormas.api.user.UserRight;
import de.symeda.sormas.api.utils.dataprocessing.EntitySelection;
import de.symeda.sormas.api.utils.dataprocessing.HandlerCallback;
import de.symeda.sormas.api.utils.dataprocessing.ProcessingResult;
import de.symeda.sormas.api.utils.dataprocessing.ProcessingResultStatus;
import de.symeda.sormas.api.utils.dataprocessing.flow.FlowThen;

public abstract class AbstractProcessingFlow {

Expand Down Expand Up @@ -149,23 +142,6 @@ private PersonDto buildPerson() {
return personDto;
}

protected List<CaseSelectionDto> getSimilarCases(PersonReferenceDto selectedPerson, ExternalMessageDto externalMessageDto) {

if (processingFacade.isFeatureDisabled(FeatureType.CASE_SURVEILANCE)
|| !processingFacade.hasAllUserRights(UserRight.CASE_CREATE, UserRight.CASE_EDIT)) {
return Collections.emptyList();
}

CaseCriteria caseCriteria = new CaseCriteria();
caseCriteria.person(selectedPerson);
caseCriteria.disease(externalMessageDto.getDisease());
CaseSimilarityCriteria caseSimilarityCriteria = new CaseSimilarityCriteria();
caseSimilarityCriteria.caseCriteria(caseCriteria);
caseSimilarityCriteria.personUuid(selectedPerson.getUuid());

return processingFacade.getSimilarCases(caseSimilarityCriteria);
}

protected CaseDataDto buildCase(PersonDto person, ExternalMessageDto externalMessageDto) {

CaseDataDto caseDto = CaseDataDto.build(person.toReference(), externalMessageDto.getDisease());
Expand Down Expand Up @@ -202,21 +178,4 @@ protected CaseDataDto buildCase(PersonDto person, ExternalMessageDto externalMes
return caseDto;
}

public static class HandlerCallback<T> {

public final CompletableFuture<ProcessingResult<T>> futureResult;

public HandlerCallback() {
this.futureResult = new CompletableFuture<>();
}

public void done(T result) {
futureResult.complete(ProcessingResult.continueWith(result));
}

public void cancel() {
futureResult.complete(ProcessingResult.withStatus(ProcessingResultStatus.CANCELED, null));
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,10 @@

import de.symeda.sormas.api.ConfigFacade;
import de.symeda.sormas.api.Disease;
import de.symeda.sormas.api.caze.CaseDataDto;
import de.symeda.sormas.api.caze.CaseFacade;
import de.symeda.sormas.api.caze.CaseSelectionDto;
import de.symeda.sormas.api.caze.CaseSimilarityCriteria;
import de.symeda.sormas.api.caze.surveillancereport.SurveillanceReportDto;
import de.symeda.sormas.api.caze.surveillancereport.SurveillanceReportFacade;
import de.symeda.sormas.api.contact.ContactDto;
import de.symeda.sormas.api.contact.ContactFacade;
import de.symeda.sormas.api.contact.ContactSimilarityCriteria;
import de.symeda.sormas.api.contact.SimilarContactDto;
import de.symeda.sormas.api.customizableenum.CustomEnumNotFoundException;
import de.symeda.sormas.api.customizableenum.CustomizableEnumFacade;
import de.symeda.sormas.api.customizableenum.CustomizableEnumType;
Expand All @@ -47,19 +41,15 @@
import de.symeda.sormas.api.externalmessage.ExternalMessageDto;
import de.symeda.sormas.api.externalmessage.ExternalMessageFacade;
import de.symeda.sormas.api.feature.FeatureConfigurationFacade;
import de.symeda.sormas.api.feature.FeatureType;
import de.symeda.sormas.api.infrastructure.community.CommunityFacade;
import de.symeda.sormas.api.infrastructure.community.CommunityReferenceDto;
import de.symeda.sormas.api.infrastructure.country.CountryFacade;
import de.symeda.sormas.api.infrastructure.country.CountryReferenceDto;
import de.symeda.sormas.api.infrastructure.district.DistrictFacade;
import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto;
import de.symeda.sormas.api.infrastructure.facility.FacilityDto;
import de.symeda.sormas.api.infrastructure.facility.FacilityFacade;
import de.symeda.sormas.api.infrastructure.facility.FacilityReferenceDto;
import de.symeda.sormas.api.infrastructure.facility.FacilityType;
import de.symeda.sormas.api.infrastructure.region.RegionFacade;
import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto;
import de.symeda.sormas.api.person.PersonContext;
import de.symeda.sormas.api.person.PersonDto;
import de.symeda.sormas.api.person.PersonFacade;
Expand All @@ -70,20 +60,14 @@
import de.symeda.sormas.api.sample.SampleFacade;
import de.symeda.sormas.api.sample.SampleReferenceDto;
import de.symeda.sormas.api.sample.SampleSimilarityCriteria;
import de.symeda.sormas.api.user.UserRight;
import de.symeda.sormas.api.utils.dataprocessing.AbstractProcessingFacade;

public abstract class ExternalMessageProcessingFacade {
public abstract class ExternalMessageProcessingFacade extends AbstractProcessingFacade {

protected final ExternalMessageFacade externalMessageFacade;
protected final ConfigFacade configFacade;
protected final FeatureConfigurationFacade featureConfigurationFacade;
protected final PersonFacade personFacade;
protected final CaseFacade caseFacade;
protected final RegionFacade regionFacade;
protected final DistrictFacade districtFacade;
protected final CommunityFacade communityFacade;
protected final FacilityFacade facilityFacade;
private final ContactFacade contactFacade;
private final EventFacade eventFacade;
private final EventParticipantFacade eventParticipantFacade;
private final SampleFacade sampleFacade;
Expand All @@ -110,16 +94,11 @@ public ExternalMessageProcessingFacade(
CustomizableEnumFacade customizableEnumFacade,
CountryFacade countryFacade,
SurveillanceReportFacade surveillanceReportFacade) {
super(featureConfigurationFacade, caseFacade, contactFacade, regionFacade, districtFacade, communityFacade);
this.externalMessageFacade = externalMessageFacade;
this.configFacade = configFacade;
this.featureConfigurationFacade = featureConfigurationFacade;
this.personFacade = personFacade;
this.caseFacade = caseFacade;
this.regionFacade = regionFacade;
this.districtFacade = districtFacade;
this.communityFacade = communityFacade;
this.facilityFacade = facilityFacade;
this.contactFacade = contactFacade;
this.eventFacade = eventFacade;
this.eventParticipantFacade = eventParticipantFacade;
this.sampleFacade = sampleFacade;
Expand All @@ -133,28 +112,6 @@ public boolean existsForwardedExternalMessageWith(String reportId) {
return externalMessageFacade.existsForwardedExternalMessageWith(reportId);
}

public boolean isFeatureDisabled(FeatureType featureType) {
return featureConfigurationFacade.isFeatureDisabled(featureType);
}

public abstract boolean hasAllUserRights(UserRight... userRights);

public List<CaseSelectionDto> getSimilarCases(CaseSimilarityCriteria caseSimilarityCriteria) {
return caseFacade.getSimilarCases(caseSimilarityCriteria);
}

public CaseDataDto getCaseDataByUuid(String uuid) {
return caseFacade.getCaseDataByUuid(uuid);
}

public List<SimilarContactDto> getMatchingContacts(ContactSimilarityCriteria contactSimilarityCriteria) {
return contactFacade.getMatchingContacts(contactSimilarityCriteria);
}

public ContactDto getContactByUuid(String uuid) {
return contactFacade.getByUuid(uuid);
}

public List<EventIndexDto> getEventsByCriteria(EventCriteria eventCriteria) {
return eventFacade.getIndexList(eventCriteria, null, null, null);
}
Expand Down Expand Up @@ -251,20 +208,4 @@ public PersonDto getPersonByContext(PersonContext personContext, String personUu
return personFacade.getByContext(personContext, personUuid);

}

public boolean isFeatureEnabled(FeatureType featureType) {
return featureConfigurationFacade.isFeatureEnabled(featureType);
}

public RegionReferenceDto getDefaultRegionReference() {
return regionFacade.getDefaultInfrastructureReference();
}

public DistrictReferenceDto getDefaultDistrictReference() {
return districtFacade.getDefaultInfrastructureReference();
}

public CommunityReferenceDto getDefaultCommunityReference() {
return communityFacade.getDefaultInfrastructureReference();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import de.symeda.sormas.api.person.PersonDto;
import de.symeda.sormas.api.sample.PathogenTestDto;
import de.symeda.sormas.api.sample.SampleDto;
import de.symeda.sormas.api.utils.dataprocessing.EntitySelection;

public class ExternalMessageProcessingResult {

Expand Down Expand Up @@ -172,30 +173,6 @@ public String toString() {
+ '}';
}

public static class EntitySelection<T> {

private final T entity;
private final boolean isNew;

public EntitySelection(T entity, boolean isNew) {
this.entity = entity;
this.isNew = isNew;
}

public T getEntity() {
return entity;
}

public boolean isNew() {
return isNew;
}

@Override
public String toString() {
return "EntitySelection{" + "entity=" + entity + ", isNew=" + isNew + '}';
}
}

public static class SampleSelection extends EntitySelection<SampleDto> {

private final SampleReportDto sampleReport;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
import de.symeda.sormas.api.caze.surveillancereport.ReportingType;
import de.symeda.sormas.api.caze.surveillancereport.SurveillanceReportDto;
import de.symeda.sormas.api.contact.ContactDto;
import de.symeda.sormas.api.contact.ContactSimilarityCriteria;
import de.symeda.sormas.api.contact.SimilarContactDto;
import de.symeda.sormas.api.event.EventCriteria;
import de.symeda.sormas.api.event.EventDto;
Expand All @@ -50,10 +49,6 @@
import de.symeda.sormas.api.externalmessage.processing.ExternalMessageMapper;
import de.symeda.sormas.api.externalmessage.processing.ExternalMessageProcessingFacade;
import de.symeda.sormas.api.externalmessage.processing.ExternalMessageProcessingResult;
import de.symeda.sormas.api.externalmessage.processing.PickOrCreateEntryResult;
import de.symeda.sormas.api.externalmessage.processing.flow.FlowThen;
import de.symeda.sormas.api.externalmessage.processing.flow.ProcessingResult;
import de.symeda.sormas.api.externalmessage.processing.flow.ProcessingResultStatus;
import de.symeda.sormas.api.feature.FeatureType;
import de.symeda.sormas.api.infrastructure.facility.FacilityDto;
import de.symeda.sormas.api.infrastructure.facility.FacilityReferenceDto;
Expand All @@ -66,6 +61,11 @@
import de.symeda.sormas.api.sample.SampleSimilarityCriteria;
import de.symeda.sormas.api.user.UserDto;
import de.symeda.sormas.api.user.UserRight;
import de.symeda.sormas.api.utils.dataprocessing.HandlerCallback;
import de.symeda.sormas.api.utils.dataprocessing.PickOrCreateEntryResult;
import de.symeda.sormas.api.utils.dataprocessing.ProcessingResult;
import de.symeda.sormas.api.utils.dataprocessing.ProcessingResultStatus;
import de.symeda.sormas.api.utils.dataprocessing.flow.FlowThen;

/**
* Abstract class defining the flow of processing a lab message allowing to choose between multiple options like create or select a
Expand Down Expand Up @@ -399,19 +399,6 @@ protected abstract void handlePickOrCreateEntry(
ExternalMessageDto externalMessageDto,
HandlerCallback<PickOrCreateEntryResult> callback);

private List<SimilarContactDto> getSimilarContacts(PersonReferenceDto selectedPerson, ExternalMessageDto externalMessage) {

if (processingFacade.isFeatureDisabled(FeatureType.CONTACT_TRACING)
|| !processingFacade.hasAllUserRights(UserRight.CONTACT_CREATE, UserRight.CONTACT_EDIT)) {
return Collections.emptyList();
}
ContactSimilarityCriteria contactSimilarityCriteria = new ContactSimilarityCriteria();
contactSimilarityCriteria.setPerson(selectedPerson);
contactSimilarityCriteria.setDisease(externalMessage.getDisease());

return processingFacade.getMatchingContacts(contactSimilarityCriteria);
}

private List<SimilarEventParticipantDto> getSimilarEventParticipants(PersonReferenceDto selectedPerson, ExternalMessageDto labMessage) {

if (processingFacade.isFeatureDisabled(FeatureType.EVENT_SURVEILLANCE)
Expand Down Expand Up @@ -499,8 +486,8 @@ private CompletionStage<ProcessingResult<PickOrCreateEntryResult>> pickOrCreateE
ExternalMessageDto externalMessage) {

PersonReferenceDto personRef = previousResult.getPerson().toReference();
List<CaseSelectionDto> similarCases = getSimilarCases(personRef, externalMessage);
List<SimilarContactDto> similarContacts = getSimilarContacts(personRef, externalMessage);
List<CaseSelectionDto> similarCases = processingFacade.getSimilarCases(personRef, externalMessage.getDisease());
List<SimilarContactDto> similarContacts = processingFacade.getSimilarContacts(personRef, externalMessage.getDisease());
List<SimilarEventParticipantDto> similarEventParticipants = getSimilarEventParticipants(personRef, externalMessage);

HandlerCallback<PickOrCreateEntryResult> callback = new HandlerCallback<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@
import de.symeda.sormas.api.caze.CaseSelectionDto;
import de.symeda.sormas.api.contact.SimilarContactDto;
import de.symeda.sormas.api.event.SimilarEventParticipantDto;
import de.symeda.sormas.api.externalmessage.processing.PickOrCreateEntryResult;
import de.symeda.sormas.api.person.PersonDto;
import de.symeda.sormas.api.utils.dataprocessing.PickOrCreateEntryResult;

public class PersonAndPickOrCreateEntryResult {

Expand Down
Loading

0 comments on commit b144f1f

Please sign in to comment.