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

Commit 16cdeee

Browse files
authored
4215_delete_cases_events_in_survnet (SORMAS-Foundation#4258)
* SORMAS-Foundation#4215 Implement Case & Events deletion trigger for SurvNet and added it to the case deletions * SORMAS-Foundation#4215 Added SurvNet deletion to events of type cluster * SORMAS-Foundation#4215 Changed delete approach to delete all valid entities and report those which cannot be deleted * SORMAS-Foundation#4215 Fixed wrong event calculations
1 parent 774c71c commit 16cdeee

7 files changed

Lines changed: 223 additions & 36 deletions

File tree

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,7 @@ public interface Strings {
432432
String headingSetOutbreakStatus = "headingSetOutbreakStatus";
433433
String headingShowLabMessage = "headingShowLabMessage";
434434
String headingSignsAndSymptoms = "headingSignsAndSymptoms";
435+
String headingSomeCasesNotDeleted = "headingSomeCasesNotDeleted";
435436
String headingSomeEventsNotDeleted = "headingSomeEventsNotDeleted";
436437
String headingStoppedFollowUp = "headingStoppedFollowUp";
437438
String headingSyncUsers = "headingSyncUsers";
@@ -610,6 +611,7 @@ public interface Strings {
610611
String messageCasesDeleted = "messageCasesDeleted";
611612
String messageCasesEdited = "messageCasesEdited";
612613
String messageCasesMerged = "messageCasesMerged";
614+
String messageCasesNotDeletedReasonSurvnet = "messageCasesNotDeletedReasonSurvnet";
613615
String messageCaseTransfered = "messageCaseTransfered";
614616
String messageChangePathogenTestResult = "messageChangePathogenTestResult";
615617
String messageCheckInputData = "messageCheckInputData";
@@ -639,7 +641,9 @@ public interface Strings {
639641
String messageConvertEventParticipantToCase = "messageConvertEventParticipantToCase";
640642
String messageConvertEventParticipantToCaseDifferentDiseases = "messageConvertEventParticipantToCaseDifferentDiseases";
641643
String messageCopyPassword = "messageCopyPassword";
644+
String messageCountCasesNotDeleted = "messageCountCasesNotDeleted";
642645
String messageCountEventsNotDeleted = "messageCountEventsNotDeleted";
646+
String messageCountEventsNotDeletedSurvnet = "messageCountEventsNotDeletedSurvnet";
643647
String messageCountriesArchived = "messageCountriesArchived";
644648
String messageCountriesDearchived = "messageCountriesDearchived";
645649
String messageCountryArchived = "messageCountryArchived";
@@ -677,6 +681,7 @@ public interface Strings {
677681
String messageEventsDeleted = "messageEventsDeleted";
678682
String messageEventsEdited = "messageEventsEdited";
679683
String messageEventsNotDeletedReason = "messageEventsNotDeletedReason";
684+
String messageEventsNotDeletedReasonSurvnet = "messageEventsNotDeletedReasonSurvnet";
680685
String messageEventSubordinateEventUnlinked = "messageEventSubordinateEventUnlinked";
681686
String messageEventSuperordinateEventUnlinked = "messageEventSuperordinateEventUnlinked";
682687
String messageExportConfigurationDeleted = "messageExportConfigurationDeleted";
@@ -910,6 +915,7 @@ public interface Strings {
910915
String reportedOn = "reportedOn";
911916
String step = "step";
912917
String SurvnetGateway_confirmSend = "SurvnetGateway.confirmSend";
918+
String SurvnetGateway_notificationEntryNotDeleted = "SurvnetGateway.notificationEntryNotDeleted";
913919
String SurvnetGateway_notificationEntryNotSent = "SurvnetGateway.notificationEntryNotSent";
914920
String SurvnetGateway_notificationEntrySent = "SurvnetGateway.notificationEntrySent";
915921
String SurvnetGateway_notificationErrorSending = "SurvnetGateway.notificationErrorSending";

sormas-api/src/main/java/de/symeda/sormas/api/survnet/SurvnetGatewayFacade.java

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

1616
package de.symeda.sormas.api.survnet;
1717

18+
import de.symeda.sormas.api.caze.CaseDataDto;
19+
import de.symeda.sormas.api.event.EventDto;
20+
1821
import java.util.List;
1922

2023
import javax.ejb.Remote;
@@ -36,4 +39,8 @@ public interface SurvnetGatewayFacade {
3639
int sendCases(List<String> caseUuids);
3740

3841
int sendEvents(List<String> eventUuids);
42+
43+
int deleteCases(List<CaseDataDto> cases);
44+
45+
int deleteEvents(List<EventDto> events);
3946
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,7 @@ headingNewSourceCases = New Cases not Previously Known to Be Contacts
479479
headingNoCaseFound = No case found
480480
headingNoEventFound = No event found
481481
headingEventNotDeleted = Event not deleted
482+
headingSomeCasesNotDeleted = Some cases were not deleted
482483
headingSomeEventsNotDeleted = Some events were not deleted
483484
headingContactConfirmationRequired = Contact confirmation required
484485
headingSelectSourceCase = Select Source Case
@@ -648,6 +649,7 @@ messageCasesDearchived = All selected cases have been de-archived
648649
messageCasesDeleted = All selected cases have been deleted
649650
messageCasesEdited = All cases have been edited
650651
messageCasesMerged = Cases merged and duplicate case deleted.
652+
messageCasesNotDeletedReasonSurvnet = Some cases were not deleted because the communication with SurvNet failed.
651653
messageChangePathogenTestResult = The result of this pathogen test differs from the current overall pathogen test result of the sample. Do you want to update its result to %s?
652654
messageCheckInputData = Please check the input data
653655
messageClinicalCourseSaved = Clinical course saved
@@ -689,8 +691,11 @@ messageEventSaved = Event data saved
689691
messageEventsArchived = All selected events have been archived
690692
messageEventsDearchived = All selected events have been de-archived
691693
messageEventsDeleted = All selected events have been deleted
694+
messageCountCasesNotDeleted = %s cases not deleted. CasesIds not deleted: %s
692695
messageCountEventsNotDeleted = %s events not deleted. Event Ids not deleted: %s
693696
messageEventsNotDeletedReason = No events that contain event participants linked will be deleted. Please remove the events participants from the event in order to be able to delete it.
697+
messageCountEventsNotDeletedSurvnet=%s events not deleted due to SurvNet communication. Event Ids not deleted: %s
698+
messageEventsNotDeletedReasonSurvnet=Some events were not deleted because the communication with SurvNet failed.
694699
messageEventsEdited = All events have been edited
695700
messageExportFailed = There was an error preventing the data to be exported. Please contact an admin and inform them about this issue.
696701
messageExportConfigurationDeleted = Export configuration deleted
@@ -978,4 +983,5 @@ SurvnetGateway.notificationErrorSending = Error when sending entry
978983
SurvnetGateway.unableToSend=Please save or discard any unsaved changes before sending the %s to Survnet.
979984
SurvnetGateway.confirmSend=Are you sure you want to send the %s to Survnet?
980985

986+
SurvnetGateway.notificationEntryNotDeleted = Entry %s could not be deleted in SurvNet
981987
warningDashboardMapTooManyMarkers = There are %d places to display and it is possible that your browser will freeze while displaying them.

sormas-backend/src/main/java/de/symeda/sormas/backend/survnet/SurvnetGatewayFacadeEjb.java

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
import javax.ws.rs.client.Entity;
2525
import javax.ws.rs.core.Response;
2626

27+
import de.symeda.sormas.api.caze.CaseDataDto;
28+
import de.symeda.sormas.api.event.EventDto;
29+
import de.symeda.sormas.backend.caze.Case;
2730
import org.apache.commons.lang3.StringUtils;
2831

2932
import de.symeda.sormas.api.survnet.SurvnetGatewayFacade;
@@ -69,6 +72,34 @@ private int sendRequest(ExportParameters params) {
6972
return response.getStatus();
7073
}
7174

75+
@Override
76+
public int deleteCases(List<CaseDataDto> cases) {
77+
DeleteParameters params = new DeleteParameters();
78+
params.setCases(cases);
79+
80+
return sendDeleteRequest(params);
81+
}
82+
83+
@Override
84+
public int deleteEvents(List<EventDto> events) {
85+
DeleteParameters params = new DeleteParameters();
86+
params.setEvents(events);
87+
88+
return sendDeleteRequest(params);
89+
}
90+
91+
private int sendDeleteRequest(DeleteParameters params) {
92+
String serviceUrl = configFacade.getSurvnetGatewayUrl().trim();
93+
Response response = ClientBuilder.newBuilder()
94+
.connectTimeout(30, TimeUnit.SECONDS)
95+
.build()
96+
.target(serviceUrl)
97+
.path("delete")
98+
.request()
99+
.post(Entity.json(params));
100+
return response.getStatus();
101+
}
102+
72103
public static class ExportParameters {
73104

74105
private List<String> caseUuids;
@@ -90,4 +121,27 @@ public void setEventUuids(List<String> eventUuids) {
90121
this.eventUuids = eventUuids;
91122
}
92123
}
124+
125+
public static class DeleteParameters {
126+
127+
private List<CaseDataDto> cases;
128+
129+
private List<EventDto> events;
130+
131+
public List<CaseDataDto> getCases() {
132+
return cases;
133+
}
134+
135+
public void setCases(List<CaseDataDto> cases) {
136+
this.cases = cases;
137+
}
138+
139+
public List<EventDto> getEvents() {
140+
return events;
141+
}
142+
143+
public void setEvents(List<EventDto> events) {
144+
this.events = events;
145+
}
146+
}
93147
}

sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,16 @@
1818
package de.symeda.sormas.ui.caze;
1919

2020
import java.util.Collection;
21+
import java.util.Collections;
2122
import java.util.Date;
2223
import java.util.List;
2324
import java.util.Objects;
2425
import java.util.Optional;
2526
import java.util.function.Consumer;
2627
import java.util.stream.Collectors;
2728

29+
import com.vaadin.server.Sizeable;
30+
import de.symeda.sormas.api.utils.HtmlHelper;
2831
import org.apache.commons.lang3.StringUtils;
2932

3033
import com.vaadin.navigator.Navigator;
@@ -858,8 +861,14 @@ private void appendSpecialCommands(CaseDataDto caze, CommitDiscardWrapperCompone
858861

859862
if (UserProvider.getCurrent().hasUserRight(UserRight.CASE_DELETE)) {
860863
editView.addDeleteListener(() -> {
861-
FacadeProvider.getCaseFacade().deleteCase(caze.getUuid());
862-
UI.getCurrent().getNavigator().navigateTo(CasesView.VIEW_NAME);
864+
if (deleteCase(caze)) {
865+
UI.getCurrent().getNavigator().navigateTo(CasesView.VIEW_NAME);
866+
} else {
867+
Notification.show(
868+
String.format(I18nProperties.getString(Strings.SurvnetGateway_notificationEntryNotDeleted), DataHelper.getShortUuid(caze.getUuid())),
869+
"",
870+
Type.ERROR_MESSAGE);
871+
}
863872
}, I18nProperties.getString(Strings.entityCase));
864873
}
865874

@@ -887,6 +896,19 @@ private void appendSpecialCommands(CaseDataDto caze, CommitDiscardWrapperCompone
887896
}
888897
}
889898

899+
private boolean deleteCase(CaseDataDto caze) {
900+
boolean deletable = true;
901+
if (FacadeProvider.getSurvnetGatewayFacade().isFeatureEnabled() && caze.getDisease() == Disease.CORONAVIRUS) {
902+
deletable = SurvnetGateway.deleteInSurvnet(SurvnetGatewayType.CASES, Collections.singletonList(caze));
903+
}
904+
if (deletable) {
905+
FacadeProvider.getCaseFacade().deleteCase(caze.getUuid());
906+
return true;
907+
}
908+
return false;
909+
910+
}
911+
890912
public CommitDiscardWrapperComponent<HospitalizationForm> getHospitalizationComponent(final String caseUuid, ViewMode viewMode) {
891913

892914
CaseDataDto caze = findCase(caseUuid);
@@ -1186,15 +1208,37 @@ public void deleteAllSelectedItems(Collection<? extends CaseIndexDto> selectedRo
11861208
} else {
11871209
VaadinUiUtil
11881210
.showDeleteConfirmationWindow(String.format(I18nProperties.getString(Strings.confirmationDeleteCases), selectedRows.size()), () -> {
1211+
int countNotDeletedCases = 0;
1212+
StringBuilder nonDeletableCases = new StringBuilder();
11891213
for (CaseIndexDto selectedRow : selectedRows) {
1190-
FacadeProvider.getCaseFacade().deleteCase(selectedRow.getUuid());
1214+
if (!deleteCase(FacadeProvider.getCaseFacade().getCaseDataByUuid(selectedRow.getUuid()))) {
1215+
countNotDeletedCases++;
1216+
nonDeletableCases.append(selectedRow.getUuid(), 0, 6).append(", ");
1217+
}
1218+
}
1219+
if (nonDeletableCases.length() > 0) {
1220+
nonDeletableCases = new StringBuilder(" " + nonDeletableCases.substring(0, nonDeletableCases.length() - 2) + ". ");
11911221
}
11921222
callback.run();
1193-
new Notification(
1194-
I18nProperties.getString(Strings.headingCasesDeleted),
1195-
I18nProperties.getString(Strings.messageCasesDeleted),
1196-
Type.HUMANIZED_MESSAGE,
1197-
false).show(Page.getCurrent());
1223+
if (countNotDeletedCases == 0) {
1224+
new Notification(
1225+
I18nProperties.getString(Strings.headingCasesDeleted),
1226+
I18nProperties.getString(Strings.messageCasesDeleted),
1227+
Type.HUMANIZED_MESSAGE,
1228+
false).show(Page.getCurrent());
1229+
} else {
1230+
Window response = VaadinUiUtil.showSimplePopupWindow(
1231+
I18nProperties.getString(Strings.headingSomeCasesNotDeleted),
1232+
String.format(
1233+
"%1s <br/> <br/> %2s",
1234+
String.format(
1235+
I18nProperties.getString(Strings.messageCountCasesNotDeleted),
1236+
String.format("<b>%s</b>", countNotDeletedCases),
1237+
String.format("<b>%s</b>", HtmlHelper.cleanHtml(nonDeletableCases.toString()))),
1238+
I18nProperties.getString(Strings.messageCasesNotDeletedReasonSurvnet)),
1239+
ContentMode.HTML);
1240+
response.setWidth(600, Sizeable.Unit.PIXELS);
1241+
}
11981242
});
11991243
}
12001244
}

0 commit comments

Comments
 (0)