Skip to content

Commit c9eb989

Browse files
authored
FIX: NgSurvey integration fixes (#14056)
1 parent f2b861f commit c9eb989

10 files changed

Lines changed: 134 additions & 65 deletions

File tree

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1673,6 +1673,7 @@ public interface Strings {
16731673
String messageSurveyResponseAllFieldsApplied = "messageSurveyResponseAllFieldsApplied";
16741674
String messageSurveyResponseNotYetProcessed = "messageSurveyResponseNotYetProcessed";
16751675
String messageSurveyResponseReprocessed = "messageSurveyResponseReprocessed";
1676+
String messageSurveyResponseReprocessedFailure = "messageSurveyResponseReprocessedFailure";
16761677
String messageSurveySaved = "messageSurveySaved";
16771678
String messageSurveyTokenDelete = "messageSurveyTokenDelete";
16781679
String messageSurveyTokenSaved = "messageSurveyTokenSaved";

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2098,6 +2098,7 @@ headingSurveyResponseCorrectAndReprocess=Correct & Reprocess
20982098
messageSurveyResponseAllFieldsApplied=All fields were successfully applied
20992099
messageSurveyResponseNotYetProcessed=This response has not been processed yet
21002100
messageSurveyResponseReprocessed=The response has been successfully reprocessed
2101+
messageSurveyResponseReprocessedFailure=There was a failure when reprocessing the response, please try to edit it again to check what caused the issue.
21012102

21022103
# External Message Attachment Notification (new)
21032104

sormas-backend/src/main/java/de/symeda/sormas/backend/common/CriteriaBuilderHelper.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,22 @@ public static Predicate andEquals(CriteriaBuilder cb, Supplier<Join<?, ?>> joinS
110110
return hasUuid == null ? filter : andEquals(cb, joinSupplier.get(), filter, hasUuid.getUuid(), AbstractDomainObject.UUID);
111111
}
112112

113+
/**
114+
*
115+
* @param cb
116+
* The builder of the query to filter.
117+
* @param expression
118+
* string field to check for null and "empty-ness".
119+
* @return Predicate that results to true if field is not null and not empty.
120+
* Example: "" -> false, null -> false, "SORMAS" -> true.
121+
*/
122+
public static Predicate notNullAndNotEmpty(CriteriaBuilder cb, Expression<String> expression) {
123+
Predicate notNull = cb.isNotNull(expression);
124+
Predicate notEmpty = cb.gt(cb.length(expression), 0);
125+
126+
return cb.and(notNull, notEmpty);
127+
}
128+
113129
public static Predicate andInValues(Collection<?> values, Predicate filter, CriteriaBuilder cb, Path<Object> path) {
114130
if (CollectionUtils.isEmpty(values)) {
115131
return filter;
@@ -222,8 +238,10 @@ public static List<Order> orders(CriteriaBuilder cb, boolean ascending, Expressi
222238
}
223239

224240
public interface OrderBuilder {
241+
225242
List<Order> build(Expression<?>... expressions);
226243
}
244+
227245
public static OrderBuilder createOrderBuilder(CriteriaBuilder cb, boolean ascending) {
228246
return (Expression<?>... expressions) -> Stream.of(expressions).map(e -> ascending ? cb.asc(e) : cb.desc(e)).collect(Collectors.toList());
229247
}

sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessageFacadeEjb.java

Lines changed: 82 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,15 @@
1717

1818
import static java.util.stream.Collectors.toList;
1919

20-
import java.util.*;
20+
import java.util.ArrayList;
21+
import java.util.Collections;
22+
import java.util.Date;
23+
import java.util.LinkedHashMap;
24+
import java.util.List;
25+
import java.util.Map;
26+
import java.util.Objects;
27+
import java.util.Optional;
28+
import java.util.Set;
2129
import java.util.concurrent.ExecutionException;
2230
import java.util.stream.Collectors;
2331
import java.util.stream.Stream;
@@ -33,7 +41,15 @@
3341
import javax.persistence.EntityManager;
3442
import javax.persistence.PersistenceContext;
3543
import javax.persistence.Tuple;
36-
import javax.persistence.criteria.*;
44+
import javax.persistence.criteria.CriteriaBuilder;
45+
import javax.persistence.criteria.CriteriaQuery;
46+
import javax.persistence.criteria.Expression;
47+
import javax.persistence.criteria.Join;
48+
import javax.persistence.criteria.JoinType;
49+
import javax.persistence.criteria.Order;
50+
import javax.persistence.criteria.Predicate;
51+
import javax.persistence.criteria.Root;
52+
import javax.persistence.criteria.Selection;
3753
import javax.validation.Valid;
3854
import javax.validation.constraints.NotNull;
3955

@@ -55,10 +71,25 @@
5571
import de.symeda.sormas.api.customizableenum.CustomEnumNotFoundException;
5672
import de.symeda.sormas.api.customizableenum.CustomizableEnumType;
5773
import de.symeda.sormas.api.event.EventParticipantReferenceDto;
58-
import de.symeda.sormas.api.externalmessage.*;
74+
import de.symeda.sormas.api.externalmessage.ExternalMessageAdapterFacade;
75+
import de.symeda.sormas.api.externalmessage.ExternalMessageCriteria;
76+
import de.symeda.sormas.api.externalmessage.ExternalMessageDto;
77+
import de.symeda.sormas.api.externalmessage.ExternalMessageFacade;
78+
import de.symeda.sormas.api.externalmessage.ExternalMessageFetchResult;
79+
import de.symeda.sormas.api.externalmessage.ExternalMessageIndexDto;
80+
import de.symeda.sormas.api.externalmessage.ExternalMessageReferenceDto;
81+
import de.symeda.sormas.api.externalmessage.ExternalMessageResult;
82+
import de.symeda.sormas.api.externalmessage.ExternalMessageStatus;
83+
import de.symeda.sormas.api.externalmessage.ExternalMessageType;
84+
import de.symeda.sormas.api.externalmessage.NewMessagesState;
5985
import de.symeda.sormas.api.externalmessage.labmessage.SampleReportDto;
6086
import de.symeda.sormas.api.externalmessage.processing.ExternalMessageProcessingResult;
61-
import de.symeda.sormas.api.externalmessage.survey.*;
87+
import de.symeda.sormas.api.externalmessage.survey.ExternalMessageSurveyResponseRequest;
88+
import de.symeda.sormas.api.externalmessage.survey.ExternalMessageSurveyResponseWrapper;
89+
import de.symeda.sormas.api.externalmessage.survey.ExternalSurveyResponseData;
90+
import de.symeda.sormas.api.externalmessage.survey.PatchDictionary;
91+
import de.symeda.sormas.api.externalmessage.survey.PatchField;
92+
import de.symeda.sormas.api.externalmessage.survey.SurveyAsExternalMessageAdapterFacade;
6293
import de.symeda.sormas.api.feature.FeatureType;
6394
import de.symeda.sormas.api.feature.FeatureTypeProperty;
6495
import de.symeda.sormas.api.i18n.Captions;
@@ -102,7 +133,11 @@
102133
import de.symeda.sormas.backend.systemevent.sync.SyncFacadeEjb;
103134
import de.symeda.sormas.backend.user.User;
104135
import de.symeda.sormas.backend.user.UserService;
105-
import de.symeda.sormas.backend.util.*;
136+
import de.symeda.sormas.backend.util.DtoHelper;
137+
import de.symeda.sormas.backend.util.IterableHelper;
138+
import de.symeda.sormas.backend.util.ModelConstants;
139+
import de.symeda.sormas.backend.util.QueryHelper;
140+
import de.symeda.sormas.backend.util.RightsAllowed;
106141

107142
@Stateless(name = "ExternalMessageFacade")
108143
@RightsAllowed({
@@ -308,44 +343,48 @@ public List<ExternalMessageDto> saveAndProcessSurveyResponses(Date since) {
308343

309344
ExternalMessageAdapterFacade externalLabResultsFacade = getExternalSurveyProviderFacade();
310345
ExternalMessageResult<List<ExternalMessageDto>> externalMessagesResult = externalLabResultsFacade.getExternalMessages(since);
311-
List<ExternalMessageDto> surveyResponses = externalMessagesResult.getValue();
312346

313-
List<String> reportIds = surveyResponses.stream().map(ExternalMessageDto::getReportId).filter(Objects::nonNull).collect(toList());
347+
List<ExternalMessageDto> filteredSurveyResponses = externalMessagesResult.getValue().stream().filter(Objects::nonNull).collect(toList());
348+
List<String> reportIds = filteredSurveyResponses.stream().map(ExternalMessageDto::getReportId).filter(Objects::nonNull).collect(toList());
314349

315-
if (!reportIds.isEmpty()) {
316-
logger.debug("ReportIds that will be processed: [{}]", reportIds);
317-
Map<String, de.symeda.sormas.api.utils.Tuple<ExternalMessageStatus, String>> statusUuidTuplesByReportId =
318-
externalMessageService.getUuidsByReportIds(reportIds);
319-
320-
Set<String> unProcessedMessagesReportIds = statusUuidTuplesByReportId.entrySet()
321-
.stream()
322-
.filter(tuple -> tuple.getValue().getFirst() == ExternalMessageStatus.UNPROCESSED)
323-
.map(Map.Entry::getKey)
324-
.collect(Collectors.toSet());
350+
if (CollectionUtils.isEmpty(reportIds)) {
351+
logger.info("No reportIds found, this means there is no new external survey responses. Stopping processing");
352+
return List.of();
353+
}
325354

326-
Set<String> alreadyPresentReportIds = statusUuidTuplesByReportId.keySet();
355+
logger.debug("ReportIds that will be processed: [{}]", reportIds);
356+
Map<String, de.symeda.sormas.api.utils.Tuple<ExternalMessageStatus, String>> statusUuidTuplesByReportId =
357+
externalMessageService.getUuidsByReportIds(reportIds);
327358

328-
surveyResponses.forEach(dto -> {
329-
de.symeda.sormas.api.utils.Tuple<ExternalMessageStatus, String> tuple = statusUuidTuplesByReportId.get(dto.getReportId());
330-
if (tuple != null && tuple.getFirst() == ExternalMessageStatus.UNPROCESSED) {
331-
dto.setUuid(tuple.getSecond());
332-
}
333-
});
359+
Set<String> unProcessedMessagesReportIds = statusUuidTuplesByReportId.entrySet()
360+
.stream()
361+
.filter(tuple -> tuple.getValue().getFirst() == ExternalMessageStatus.UNPROCESSED)
362+
.map(Map.Entry::getKey)
363+
.collect(Collectors.toSet());
334364

335-
surveyResponses = surveyResponses.stream()
336-
.filter(
337-
externalMessage -> !alreadyPresentReportIds.contains(externalMessage.getReportId())
338-
|| unProcessedMessagesReportIds.contains(externalMessage.getReportId()))
339-
.collect(toList());
365+
Set<String> alreadyPresentReportIds = statusUuidTuplesByReportId.keySet();
340366

341-
if (logger.isTraceEnabled()) {
342-
logger.trace("Computed survey responses: \n{}", ObjectMapperProvider.writeValueAsStringFailSafe(surveyResponses));
367+
// to replace existing messages and NOT creating new ones for same survey responses
368+
filteredSurveyResponses.forEach(dto -> {
369+
de.symeda.sormas.api.utils.Tuple<ExternalMessageStatus, String> tuple = statusUuidTuplesByReportId.get(dto.getReportId());
370+
if (tuple != null && tuple.getFirst() == ExternalMessageStatus.UNPROCESSED) {
371+
dto.setUuid(tuple.getSecond());
343372
}
373+
});
374+
375+
filteredSurveyResponses = filteredSurveyResponses.stream()
376+
.filter(
377+
externalMessage -> !alreadyPresentReportIds.contains(externalMessage.getReportId())
378+
|| unProcessedMessagesReportIds.contains(externalMessage.getReportId()))
379+
.collect(toList());
380+
381+
if (logger.isTraceEnabled()) {
382+
logger.trace("Computed survey responses: \n{}", ObjectMapperProvider.writeValueAsStringFailSafe(filteredSurveyResponses));
344383
}
345384

346385
List<ExternalMessageDto> savedDtos;
347386
try {
348-
List<SurveyResponseProcessingResult> processingResults = automaticSurveyResponseProcessor.processSurveyResponses(surveyResponses);
387+
List<SurveyResponseProcessingResult> processingResults = automaticSurveyResponseProcessor.processSurveyResponses(filteredSurveyResponses);
349388

350389
processingResults.forEach(wrapper -> {
351390
ProcessingResultStatus result = wrapper.getResultStatus();
@@ -354,12 +393,12 @@ public List<ExternalMessageDto> saveAndProcessSurveyResponses(Date since) {
354393
}
355394
});
356395
} catch (InterruptedException e) {
357-
logger.error("Could not process lab message with UUID [{}]", extractUuids(surveyResponses), e);
396+
logger.error("Could not process lab message with UUID [{}]", extractUuids(filteredSurveyResponses), e);
358397
Thread.currentThread().interrupt();
359398
} catch (ExecutionException e) {
360-
logger.error("Could not process survey responses with UUID [{}]", extractUuids(surveyResponses), e);
399+
logger.error("Could not process survey responses with UUID [{}]", extractUuids(filteredSurveyResponses), e);
361400
} finally {
362-
savedDtos = surveyResponses.stream().map(this::save).collect(toList());
401+
savedDtos = filteredSurveyResponses.stream().map(this::save).collect(toList());
363402
}
364403

365404
if (logger.isTraceEnabled()) {
@@ -913,7 +952,7 @@ private SurveyAsExternalMessageAdapterFacade getExternalSurveyProviderFacade() {
913952
String jndiName =
914953
Optional.ofNullable(systemConfigurationValueFacade.getValue(SURVEY_AS_EXTERNAL_MESSAGE_ADAPTER_JNDI_CONFIG_KEY)).orElseGet(() -> {
915954
String defaultName = "java:global/sormas-esante-adapter/SurveyExternalMessageAdapterFacadeEjb";
916-
logger.info("External Survey Provider JNDI Key not found, using default: [{}]", defaultName);
955+
logger.debug("External Survey Provider JNDI Key not found, using default: [{}]", defaultName);
917956
return defaultName;
918957
});
919958
try {
@@ -1020,23 +1059,27 @@ public ExternalMessageDto overwriteSurveyResponse(String uuid, PatchDictionary c
10201059
.setAllowFallbackValues(latestRequest.isAllowFallbackValues())
10211060
.setSkipIfAlreadyProcessed(latestRequest.isSkipIfAlreadyProcessed())
10221061
.setPatchedInCaseOfFailures(latestRequest.isPatchedInCaseOfFailures())
1023-
.setPatchDictionary(correctedDictionary);
1062+
.setPatchDictionary(correctedDictionary)
1063+
.setExcludedPatchDictionary(latestRequest.getExcludedPatchDictionary());
10241064

10251065
logger.debug("Request after transformation: [{}]", correctedRequest);
10261066

10271067
ExternalMessageSurveyResponseWrapper updatedWrapper = new ExternalMessageSurveyResponseWrapper().setRequest(correctedRequest);
10281068
externalMessage.getSurveyResponseData().setUpdated(updatedWrapper);
10291069

1070+
ExternalMessageDto result;
10301071
try {
1031-
automaticSurveyResponseProcessor.processSurveyResponses(java.util.List.of(externalMessage));
1072+
automaticSurveyResponseProcessor.processSurveyResponses(List.of(externalMessage));
10321073
} catch (InterruptedException e) {
10331074
Thread.currentThread().interrupt();
10341075
throw new RuntimeException("Interrupted while reprocessing survey response", e);
10351076
} catch (java.util.concurrent.ExecutionException e) {
10361077
throw new RuntimeException("Error while reprocessing survey response", e);
1078+
} finally {
1079+
result = save(externalMessage);
10371080
}
10381081

1039-
return save(externalMessage);
1082+
return result;
10401083
}
10411084

10421085
@Override

sormas-backend/src/main/java/de/symeda/sormas/backend/externalmessage/ExternalMessageService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,6 @@ public Map<String, de.symeda.sormas.api.utils.Tuple<ExternalMessageStatus, Strin
337337
Collectors.toMap(
338338
tuple -> tuple.get(1, String.class),
339339
tuple -> new de.symeda.sormas.api.utils.Tuple<>(tuple.get(2, ExternalMessageStatus.class), tuple.get(0, String.class)),
340-
(a, b) -> a));
340+
(tuple1, tuple2) -> tuple1));
341341
}
342342
}

sormas-backend/src/main/java/de/symeda/sormas/backend/survey/SurveyFacadeEjb.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ public List<SurveyDto> getAllWithExternalSurveyId() {
193193
CriteriaBuilder cb = em.getCriteriaBuilder();
194194
CriteriaQuery<Survey> cq = cb.createQuery(Survey.class);
195195
Root<Survey> from = cq.from(Survey.class);
196-
cq.where(cb.isNotNull(from.get(Survey.EXTERNAL_ID)));
196+
cq.where(CriteriaBuilderHelper.notNullAndNotEmpty(cb, from.get(Survey.EXTERNAL_ID)));
197197
cq.orderBy(cb.desc(from.get(Survey.ID)));
198198

199199
return getAsStream(cq).map(this::toDto).collect(Collectors.toList());

sormas-backend/src/main/java/de/symeda/sormas/backend/survey/SurveyTokenFacadeEjb.java

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,25 +32,13 @@
3232
import javax.persistence.EntityManager;
3333
import javax.persistence.PersistenceContext;
3434
import javax.persistence.Tuple;
35-
import javax.persistence.criteria.CriteriaBuilder;
36-
import javax.persistence.criteria.CriteriaQuery;
37-
import javax.persistence.criteria.Order;
38-
import javax.persistence.criteria.Path;
39-
import javax.persistence.criteria.Predicate;
40-
import javax.persistence.criteria.Root;
41-
import javax.persistence.criteria.Selection;
35+
import javax.persistence.criteria.*;
4236
import javax.validation.Valid;
4337

4438
import org.slf4j.Logger;
4539
import org.slf4j.LoggerFactory;
4640

47-
import de.symeda.sormas.api.survey.SurveyDto;
48-
import de.symeda.sormas.api.survey.SurveyReferenceDto;
49-
import de.symeda.sormas.api.survey.SurveyTokenCriteria;
50-
import de.symeda.sormas.api.survey.SurveyTokenDto;
51-
import de.symeda.sormas.api.survey.SurveyTokenFacade;
52-
import de.symeda.sormas.api.survey.SurveyTokenIndexDto;
53-
import de.symeda.sormas.api.survey.SurveyTokenReferenceDto;
41+
import de.symeda.sormas.api.survey.*;
5442
import de.symeda.sormas.api.survey.external.ExternalSurveyProviderFacade;
5543
import de.symeda.sormas.api.survey.external.views.ExternalSurveyView;
5644
import de.symeda.sormas.api.systemconfiguration.SystemConfigurationValueFacade;
@@ -365,7 +353,7 @@ public ExternalSurveyView getExternalSurveyView(String surveyTokenUuid) {
365353

366354
private ExternalSurveyProviderFacade getExternalSurveyProviderFacade() {
367355
String jndiName = Optional.ofNullable(systemConfigurationValueFacade.getValue(EXTERNAL_SURVEY_PROVIDER_JNDI_KEY)).orElseGet(() -> {
368-
logger.info("External Survey Provider JNDI Key not found, using default");
356+
logger.debug("External Survey Provider JNDI Key not found, using default");
369357
return "java:global/sormas-esante-adapter/NgSurveyProviderFacade";
370358
});
371359
try {

sormas-backend/src/main/resources/sql/sormas_schema.sql

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16468,4 +16468,17 @@ ALTER TABLE pathogentest_history DROP COLUMN IF EXISTS resultdetails;
1646816468
ALTER TABLE pathogentest ENABLE TRIGGER versioning_trigger;
1646916469
INSERT INTO schema_version (version_number, comment) VALUES (643, 'Remove Malaria-specific result details pathogen test column, preserving values into testresulttext issue #14016');
1647016470

16471+
DELETE FROM systemconfigurationvalue
16472+
WHERE config_key LIKE 'NG_SUVEY_%' OR config_key LIKE 'NG_SURVEY_%' OR config_key = 'SURVEY_PERIOD_INTERVAL_DAYS';
16473+
16474+
UPDATE featureconfiguration
16475+
SET properties = json_build_object(
16476+
'FETCH_MODE', false,
16477+
'FORCE_AUTOMATIC_PROCESSING', true,
16478+
'SURVEY_FETCH_ENABLED', false
16479+
)
16480+
WHERE featuretype = 'EXTERNAL_MESSAGES';
16481+
16482+
INSERT INTO schema_version (version_number, comment) VALUES (643, 'Removal survey configurations');
16483+
1647116484
-- *** Insert new sql commands BEFORE this line. Remember to always consider _history tables. ***

sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/surveyresponse/SurveyResponseDetailsWindow.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,9 @@ public SurveyResponseDetailsWindow(ExternalMessageDto externalMessage, Runnable
210210
&& result.getPatchResponse().hasFailures()
211211
&& !result.getPatchResponse().getFailures().isEmpty();
212212

213-
if (canProcess && hasFailures) {
213+
boolean responseReceivedButNotApplied = result != null && result.getPatchResponse() != null && !result.getPatchResponse().isApplied();
214+
215+
if (canProcess && (hasFailures || (responseReceivedButNotApplied))) {
214216
final DisplayablePartialRetrievalResponse finalDisplayDataForEditor = displayData;
215217
Button correctButton =
216218
ButtonHelper.createButton(Captions.actionCorrectAndReprocess, I18nProperties.getCaption(Captions.actionCorrectAndReprocess), e -> {

sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/surveyresponse/SurveyResponseFailureEditor.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,14 @@
1414
*/
1515
package de.symeda.sormas.ui.externalmessage.surveyresponse;
1616

17-
import java.util.HashMap;
18-
import java.util.LinkedHashMap;
19-
import java.util.List;
20-
import java.util.Map;
21-
import java.util.stream.Collectors;
17+
import java.util.*;
2218

2319
import com.vaadin.ui.*;
2420
import com.vaadin.ui.themes.ValoTheme;
2521

2622
import de.symeda.sormas.api.FacadeProvider;
2723
import de.symeda.sormas.api.externalmessage.ExternalMessageDto;
24+
import de.symeda.sormas.api.externalmessage.ExternalMessageStatus;
2825
import de.symeda.sormas.api.externalmessage.survey.ExternalMessageSurveyResponseResult;
2926
import de.symeda.sormas.api.externalmessage.survey.ExternalMessageSurveyResponseWrapper;
3027
import de.symeda.sormas.api.externalmessage.survey.PatchDictionary;
@@ -139,7 +136,7 @@ public SurveyResponseFailureEditor(ExternalMessageDto externalMessage, Displayab
139136
CssStyles.style(validHeading, CssStyles.H4);
140137
mainLayout.addComponent(validHeading);
141138

142-
List<Map.Entry<PatchField, Object>> validEntries = validValues.entrySet().stream().collect(Collectors.toList());
139+
List<Map.Entry<PatchField, Object>> validEntries = new ArrayList<>(validValues.entrySet());
143140

144141
Grid<Map.Entry<PatchField, Object>> validGrid = new Grid<>();
145142
validGrid.setSizeFull();
@@ -182,10 +179,16 @@ public SurveyResponseFailureEditor(ExternalMessageDto externalMessage, Displayab
182179
valueEditors.get(patchField).getValue());
183180
}
184181

185-
FacadeProvider.getExternalMessageFacade()
182+
ExternalMessageDto externalMessageDto = FacadeProvider.getExternalMessageFacade()
186183
.overwriteSurveyResponse(externalMessage.getUuid(), new PatchDictionary().setDictionary(correctedDictionary));
187184

188-
Notification.show(I18nProperties.getString(Strings.messageSurveyResponseReprocessed), Notification.Type.HUMANIZED_MESSAGE);
185+
if (externalMessageDto.getStatus() == ExternalMessageStatus.PROCESSED) {
186+
Notification.show(I18nProperties.getString(Strings.messageSurveyResponseReprocessed), Notification.Type.HUMANIZED_MESSAGE);
187+
} else {
188+
Notification
189+
.show(I18nProperties.getString(Strings.messageSurveyResponseReprocessedFailure), Notification.Type.HUMANIZED_MESSAGE);
190+
}
191+
189192
close();
190193
onReprocessed.run();
191194
}, ValoTheme.BUTTON_PRIMARY);

0 commit comments

Comments
 (0)