From efa2557e6fcdb4b54a44ec3ba1f499fc094b1df1 Mon Sep 17 00:00:00 2001 From: LZRS <12814349+LZRS@users.noreply.github.com> Date: Tue, 31 Aug 2021 17:25:18 +0300 Subject: [PATCH] for RACD events, check no event exists with case_number, and flag case_number and flag, should be unique --- pom.xml | 2 +- .../opensrp/repository/EventsRepository.java | 9 +++++ .../postgres/EventsRepositoryImpl.java | 8 +++-- .../mapper/custom/CustomEventMapper.java | 3 ++ .../mapper/custom/xml/CustomEventMapper.xml | 7 ++++ .../org/opensrp/service/EventService.java | 34 ++++++++++++++++++- .../util/constants/EventConstants.java | 3 ++ .../org/opensrp/service/EventServiceTest.java | 34 ++++++++++++++++++- 8 files changed, 95 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index d36864239..2a14be4f8 100755 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ opensrp-server-core jar - 2.12.5-SNAPSHOT + 2.12.6-SNAPSHOT opensrp-server-core OpenSRP Server Core module https://github.com/OpenSRP/opensrp-server-core diff --git a/src/main/java/org/opensrp/repository/EventsRepository.java b/src/main/java/org/opensrp/repository/EventsRepository.java index ab2fa34fe..91db455f3 100644 --- a/src/main/java/org/opensrp/repository/EventsRepository.java +++ b/src/main/java/org/opensrp/repository/EventsRepository.java @@ -8,6 +8,7 @@ import org.smartregister.domain.Event; import org.smartregister.pathevaluator.dao.EventDao; import org.opensrp.search.EventSearchBean; +import org.springframework.lang.NonNull; public interface EventsRepository extends BaseRepository, EventDao { @@ -95,5 +96,13 @@ Pair, Long> findIdsByEventType(String eventType, boolean isDeleted, List findBaseEntityIdsByLocation(String locationId); List getEventData(String planIdentifier, String eventType, Date fromDate, Date toDate); + + /** + * Checks if events exists + * @param caseNumber + * @param flag + * @return true if exists else false + */ + boolean checkEventExists(@NonNull String caseNumber, @NonNull String flag); } diff --git a/src/main/java/org/opensrp/repository/postgres/EventsRepositoryImpl.java b/src/main/java/org/opensrp/repository/postgres/EventsRepositoryImpl.java index 89c5b9d13..40995f31e 100644 --- a/src/main/java/org/opensrp/repository/postgres/EventsRepositoryImpl.java +++ b/src/main/java/org/opensrp/repository/postgres/EventsRepositoryImpl.java @@ -23,6 +23,7 @@ import org.smartregister.converters.EventConverter; import org.smartregister.domain.Event; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.lang.NonNull; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @@ -715,6 +716,9 @@ public List findEventsByJurisdictionIdAndPlan(String juri .collect(Collectors.toList()); /**@formatter:on*/ } - - + + @Override + public boolean checkEventExists(@NonNull String caseNumber, @NonNull String flag) { + return eventMapper.selectCaseTriggeredEventExists(caseNumber, flag); + } } diff --git a/src/main/java/org/opensrp/repository/postgres/mapper/custom/CustomEventMapper.java b/src/main/java/org/opensrp/repository/postgres/mapper/custom/CustomEventMapper.java index a6d59f5f6..32453e747 100644 --- a/src/main/java/org/opensrp/repository/postgres/mapper/custom/CustomEventMapper.java +++ b/src/main/java/org/opensrp/repository/postgres/mapper/custom/CustomEventMapper.java @@ -34,4 +34,7 @@ List selectByBaseEntityIdAndDetails(@Param("baseEntityId") String baseEnt int updateByPrimaryKeyAndGenerateServerVersion(Event record); + boolean selectCaseTriggeredEventExists(@Param("caseNumber") String caseNumber, + @Param("flag") String flag); + } diff --git a/src/main/java/org/opensrp/repository/postgres/mapper/custom/xml/CustomEventMapper.xml b/src/main/java/org/opensrp/repository/postgres/mapper/custom/xml/CustomEventMapper.xml index df450ee58..4e908236a 100644 --- a/src/main/java/org/opensrp/repository/postgres/mapper/custom/xml/CustomEventMapper.xml +++ b/src/main/java/org/opensrp/repository/postgres/mapper/custom/xml/CustomEventMapper.xml @@ -134,5 +134,12 @@ and e.date_deleted is null + diff --git a/src/main/java/org/opensrp/service/EventService.java b/src/main/java/org/opensrp/service/EventService.java index bbb44eb64..9b41fdbe3 100644 --- a/src/main/java/org/opensrp/service/EventService.java +++ b/src/main/java/org/opensrp/service/EventService.java @@ -24,18 +24,34 @@ import org.smartregister.domain.PlanDefinition; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.lang.NonNull; import org.springframework.stereotype.Service; import java.text.SimpleDateFormat; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.UUID; import java.util.stream.Collectors; import static org.opensrp.util.constants.EventConstants.BIRTH_REGISTRATION_EVENT; import static org.opensrp.util.constants.EventConstants.CARD_ID_PREFIX; +import static org.opensrp.util.constants.EventConstants.CASE_NUMBER; import static org.opensrp.util.constants.EventConstants.CODED; import static org.opensrp.util.constants.EventConstants.CONCEPT; import static org.opensrp.util.constants.EventConstants.DATE; import static org.opensrp.util.constants.EventConstants.DOSE; +import static org.opensrp.util.constants.EventConstants.EVENT_TYPE_CASE_DETAILS; +import static org.opensrp.util.constants.EventConstants.FLAG; import static org.opensrp.util.constants.EventConstants.GROWTH_MONITORING_EVENT; import static org.opensrp.util.constants.EventConstants.NFC_CARD_IDENTIFIER; import static org.opensrp.util.constants.EventConstants.NUMERIC; @@ -189,6 +205,18 @@ && getByBaseEntityAndFormSubmissionId(event.getBaseEntityId(), event.getFormSubm "An event already exists with given baseEntity and formSubmission combination. Consider updating"); } + if (event.getEventType() != null + && event.getEventType().equals(EVENT_TYPE_CASE_DETAILS) + && event.getDetails() != null + && StringUtils.isNotBlank(event.getDetails().get(CASE_NUMBER))){ + String caseNumber = event.getDetails().get(CASE_NUMBER); + String flag = event.getDetails().get(FLAG); + boolean caseEventExists = checkIfEventExists(caseNumber, flag); + if (caseEventExists){ + throw new DuplicateKeyException("An event already exists with case_number " + caseNumber + ", and flag '" + flag + "'"); + } + } + event.setDateCreated(DateTime.now()); allEvents.add(event); triggerPlanEvaluation(event, username); @@ -674,4 +702,8 @@ public ExportImagesSummary getImagesMetadataForFlagProblemEvent(String planIdent } + public boolean checkIfEventExists(@NonNull String caseNumber, @NonNull String flag){ + return allEvents.checkEventExists(caseNumber, flag); + } + } diff --git a/src/main/java/org/opensrp/util/constants/EventConstants.java b/src/main/java/org/opensrp/util/constants/EventConstants.java index 400fc1dab..5de0532b9 100644 --- a/src/main/java/org/opensrp/util/constants/EventConstants.java +++ b/src/main/java/org/opensrp/util/constants/EventConstants.java @@ -24,4 +24,7 @@ public interface EventConstants { String CONCEPT = "concept"; String YES = "yes"; String PLAN_IDENTIFIER = "planIdentifier"; + String CASE_NUMBER = "case_number"; + String FLAG = "flag"; + String EVENT_TYPE_CASE_DETAILS = "Case_Details"; } diff --git a/src/test/java/org/opensrp/service/EventServiceTest.java b/src/test/java/org/opensrp/service/EventServiceTest.java index 836b07990..8bf1572ad 100644 --- a/src/test/java/org/opensrp/service/EventServiceTest.java +++ b/src/test/java/org/opensrp/service/EventServiceTest.java @@ -5,15 +5,19 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyObject; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; import static org.opensrp.common.AllConstants.Event.OPENMRS_UUID_IDENTIFIER_TYPE; import static org.opensrp.repository.postgres.EventsRepositoryTest.createFlagProblemEvent; +import static org.opensrp.util.constants.EventConstants.CASE_NUMBER; +import static org.opensrp.util.constants.EventConstants.EVENT_TYPE_CASE_DETAILS; +import static org.opensrp.util.constants.EventConstants.FLAG; import java.sql.SQLException; import java.util.HashMap; @@ -225,6 +229,34 @@ public void testAddEventShouldEvaluatePlan() { verify(planRepository, times(1)).get(stringArgumentCaptor.capture()); verify(taskGenerator, times(1)).processPlanEvaluation(planDefinitionArgumentCaptor.capture(),stringArgumentCaptor.capture(),eventArgumentCaptor.capture()); } + + @Test(expected = DuplicateKeyException.class) + public void testAddCaseTriggeredEventThrowsExceptionOnDuplicate() { + Obs obs = new Obs("concept", "decimal", "1730AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", null, "3.5", null, "weight"); + Event event = new Event() + .withBaseEntityId("4355345345488") + .withEventType(EVENT_TYPE_CASE_DETAILS) + .withFormSubmissionId("gjhg34534 nvbnv3345345__16") + .withEventDate(new DateTime()) + .withObs(obs); + event.addDetails(CASE_NUMBER, "141311000005892210504"); + event.addDetails(FLAG, "Source"); + PlanDefinition plan = new PlanDefinition(); + plan.setIdentifier("identifier"); + + when(planRepository.get(anyString())).thenReturn(plan); + Mockito.doNothing().when(taskGenerator).processPlanEvaluation(any(PlanDefinition.class), anyString(), any(Event.class)); + eventService.addEvent(event, username); + + Event savedEvent = eventService.findByFormSubmissionId("gjhg34534 nvbnv3345345__16"); + assertNotNull(savedEvent); + assertNotNull(savedEvent.getId()); + assertNotNull(eventService.getById(savedEvent.getId())); + + // add as duplicate with different FormSubmissionId + Event duplicateEvent = event.withFormSubmissionId("gjhg34534 nvbnv3345345__3444556"); + eventService.addEvent(duplicateEvent, username); + } @Test public void testProcessOutOfArea() throws SQLException {