From 4ea8cf6d16d58adc5c2693754540b083d5e8e985 Mon Sep 17 00:00:00 2001 From: anubhavBeehyv Date: Wed, 13 Sep 2023 16:11:36 +0530 Subject: [PATCH 1/8] Removed communication module from require modules. --- .../controller/TransmissionController.java | 61 ------------------- bahmnicore-omod/src/main/resources/config.xml | 2 +- 2 files changed, 1 insertion(+), 62 deletions(-) delete mode 100644 bahmnicore-omod/src/main/java/org/bahmni/module/bahmnicore/web/v1_0/controller/TransmissionController.java diff --git a/bahmnicore-omod/src/main/java/org/bahmni/module/bahmnicore/web/v1_0/controller/TransmissionController.java b/bahmnicore-omod/src/main/java/org/bahmni/module/bahmnicore/web/v1_0/controller/TransmissionController.java deleted file mode 100644 index b348113ebe..0000000000 --- a/bahmnicore-omod/src/main/java/org/bahmni/module/bahmnicore/web/v1_0/controller/TransmissionController.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.bahmni.module.bahmnicore.web.v1_0.controller; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.http.HttpResponse; -import org.apache.http.HttpResponseFactory; -import org.apache.http.HttpStatus; -import org.apache.http.HttpVersion; -import org.apache.http.impl.DefaultHttpResponseFactory; -import org.apache.http.message.BasicStatusLine; -import org.bahmni.module.bahmnicore.web.v1_0.contract.BahmniMailContent; -import org.bahmni.module.communication.api.CommunicationService; -import org.bahmni.module.communication.model.MailContent; -import org.bahmni.module.communication.model.Recipient; -import org.openmrs.Patient; -import org.openmrs.api.PatientService; -import org.openmrs.api.context.Context; -import org.openmrs.module.webservices.rest.web.RestConstants; -import org.openmrs.module.webservices.rest.web.v1_0.controller.BaseRestController; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.PathVariable; - -@Controller -@RequestMapping(value = "/rest/" + RestConstants.VERSION_1 + "/patient/{patientUuid}/send/") -public class TransmissionController extends BaseRestController { - - private final Log log = LogFactory.getLog(this.getClass()); - - @Autowired - PatientService patientService; - - @PostMapping(value = "email") - @ResponseBody - public Object sendEmail(@RequestBody BahmniMailContent bahmniMailContent, @PathVariable("patientUuid") String patientUuid) { - HttpResponseFactory factory = new DefaultHttpResponseFactory(); - HttpResponse response = null; - if(Boolean.valueOf(Context.getAdministrationService().getGlobalProperty("bahmni.enableEmailPrescriptionOption"))) { - try { - Patient patient = patientService.getPatientByUuid(patientUuid); - String recipientName = patient.getGivenName() + (patient.getMiddleName()!=null ? " " + patient.getMiddleName() : "") + (patient.getFamilyName()!=null ? " " + patient.getFamilyName() : ""); - String recipientEmail = patient.getAttribute("email").getValue(); - Recipient recipient = new Recipient(recipientName, recipientEmail); - bahmniMailContent.setRecipient(recipient); - Context.getService(CommunicationService.class).sendEmail(bahmniMailContent); - response = factory.newHttpResponse(new BasicStatusLine(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "Mail sent successfully"), null); - } catch (Exception exception) { - log.error("Unable to send email", exception); - response = factory.newHttpResponse(new BasicStatusLine(HttpVersion.HTTP_1_1, HttpStatus.SC_INTERNAL_SERVER_ERROR, "Unable to send email"), null); - } - } else { - response = factory.newHttpResponse(new BasicStatusLine(HttpVersion.HTTP_1_1, HttpStatus.SC_METHOD_NOT_ALLOWED, "Sending email is not enabled"), null); - } - return response; - } - -} diff --git a/bahmnicore-omod/src/main/resources/config.xml b/bahmnicore-omod/src/main/resources/config.xml index e916179e24..039bb26aea 100644 --- a/bahmnicore-omod/src/main/resources/config.xml +++ b/bahmnicore-omod/src/main/resources/config.xml @@ -33,7 +33,7 @@ org.openmrs.module.episodes org.openmrs.module.auditlog org.bahmni.module.bahmnicommons - org.bahmni.module.communication + From fc207f9a0f4c03721c89b8595ed7334078ddeb2d Mon Sep 17 00:00:00 2001 From: anubhavBeehyv Date: Fri, 29 Sep 2023 17:51:09 +0530 Subject: [PATCH 2/8] Usage of communication module to send sms using events published from bahmni-core. --- bahmnicore-api/pom.xml | 4 + .../module/bahmnicore/events/BahmniEvent.java | 35 ++++++++ .../bahmnicore/events/BahmniEventType.java | 16 ++++ .../bahmnicore/events/EncounterEvent.java | 29 +++++++ .../bahmnicore/events/PatientEvent.java | 28 +++++++ .../events/advice/EncounterAdvice.java | 62 ++++++++++++++ .../events/advice/PatientAdvice.java | 63 +++++++++++++++ .../PatientSmsEventListener.java | 80 +++++++++++++++++++ .../eventPublisher/BahmniEventPublisher.java | 21 +++++ .../util/BahmniAsyncThreadExecutor.java | 28 +++++++ bahmnicore-omod/src/main/resources/config.xml | 27 ++++++- pom.xml | 2 +- 12 files changed, 390 insertions(+), 5 deletions(-) create mode 100644 bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/BahmniEvent.java create mode 100644 bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/BahmniEventType.java create mode 100644 bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/EncounterEvent.java create mode 100644 bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/PatientEvent.java create mode 100644 bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/advice/EncounterAdvice.java create mode 100644 bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/advice/PatientAdvice.java create mode 100644 bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/eventListener/PatientSmsEventListener.java create mode 100644 bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/eventPublisher/BahmniEventPublisher.java create mode 100644 bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/util/BahmniAsyncThreadExecutor.java diff --git a/bahmnicore-api/pom.xml b/bahmnicore-api/pom.xml index 2b447e3a7e..4aaf0cf22a 100644 --- a/bahmnicore-api/pom.xml +++ b/bahmnicore-api/pom.xml @@ -83,6 +83,10 @@ joda-time 2.0 + + org.bahmni.module + communication-api + org.bahmni.module bahmni-emr-api diff --git a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/BahmniEvent.java b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/BahmniEvent.java new file mode 100644 index 0000000000..21924dcbb1 --- /dev/null +++ b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/BahmniEvent.java @@ -0,0 +1,35 @@ +package org.bahmni.module.bahmnicore.events; + +import org.openmrs.api.context.UserContext; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; + +@Component +public class BahmniEvent { + + private static final long version = 1L; + public UserContext userContext; + public String eventId; + public BahmniEventType eventType; + public String payloadId; + public LocalDateTime publishedDateTime; + + public UserContext getUserContext() { + return userContext; + } + public String getEventId() { + return eventId; + } + public BahmniEventType getEventType() { + return eventType; + } + public String getPayloadId() { + return payloadId; + } + + public LocalDateTime getPublishedDateTime() { + return publishedDateTime; + } +} + diff --git a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/BahmniEventType.java b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/BahmniEventType.java new file mode 100644 index 0000000000..0f2dd642ce --- /dev/null +++ b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/BahmniEventType.java @@ -0,0 +1,16 @@ +package org.bahmni.module.bahmnicore.events; + +public enum BahmniEventType { + BAHMNI_PATIENT_CREATED("bahmni-patient"), + BAHMNI_PATIENT_UPDATED("bahmni-patient"), + BAHMNI_ENCOUNTER_CREATED("bahmni-encounter"), + BAHMNI_ENCOUNTER_UPDATED("bahmni-encounter"); + + private final String topic; + BahmniEventType(String topic) { + this.topic = topic; + } + public String topic() { + return topic; + } +} \ No newline at end of file diff --git a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/EncounterEvent.java b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/EncounterEvent.java new file mode 100644 index 0000000000..bbda65c16e --- /dev/null +++ b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/EncounterEvent.java @@ -0,0 +1,29 @@ +package org.bahmni.module.bahmnicore.events; + +import org.openmrs.Encounter; +import org.openmrs.Patient; +import org.openmrs.api.context.Context; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.UUID; + +@Component +public class EncounterEvent extends BahmniEvent { + + private Encounter encounter; + + public void createEncounterEvent(BahmniEventType eventType, Encounter encounter) { + this.eventType = eventType; + this.encounter = encounter; + this.eventId = UUID.randomUUID().toString(); + this.payloadId = encounter.getUuid(); + this.publishedDateTime = LocalDateTime.now(); + this.userContext= Context.getUserContext(); + } + + public Encounter getEncounter() { + return encounter; + } +} + diff --git a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/PatientEvent.java b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/PatientEvent.java new file mode 100644 index 0000000000..a0901bba25 --- /dev/null +++ b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/PatientEvent.java @@ -0,0 +1,28 @@ +package org.bahmni.module.bahmnicore.events; + +import org.openmrs.Patient; +import org.openmrs.api.context.Context; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.UUID; + +@Component +public class PatientEvent extends BahmniEvent { + + private Patient patient; + + public void createPatientEvent(BahmniEventType eventType, Patient patient) { + this.eventType = eventType; + this.patient = patient; + this.eventId = UUID.randomUUID().toString(); + this.payloadId = patient.getUuid(); + this.publishedDateTime = LocalDateTime.now(); + this.userContext= Context.getUserContext(); + } + + public Patient getPatient() { + return patient; + } +} + diff --git a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/advice/EncounterAdvice.java b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/advice/EncounterAdvice.java new file mode 100644 index 0000000000..8b0bde10b1 --- /dev/null +++ b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/advice/EncounterAdvice.java @@ -0,0 +1,62 @@ +package org.bahmni.module.bahmnicore.events.advice; + +import com.google.common.collect.Sets; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.bahmni.module.bahmnicore.events.BahmniEventType; +import org.bahmni.module.bahmnicore.events.EncounterEvent; +import org.bahmni.module.bahmnicore.events.eventPublisher.BahmniEventPublisher; +import org.openmrs.Encounter; +import org.openmrs.api.context.Context; +import org.springframework.aop.AfterReturningAdvice; +import org.springframework.aop.MethodBeforeAdvice; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +import static org.bahmni.module.bahmnicore.events.BahmniEventType.BAHMNI_ENCOUNTER_CREATED; +import static org.bahmni.module.bahmnicore.events.BahmniEventType.BAHMNI_ENCOUNTER_UPDATED; + + +public class EncounterAdvice implements AfterReturningAdvice, MethodBeforeAdvice { + + private final Logger log = LogManager.getLogger(this.getClass()); + private final BahmniEventPublisher eventPublisher; + private final EncounterEvent encounterEvent; + private final ThreadLocal> threadLocal = new ThreadLocal<>(); + private final String ENCOUNTER_ID_KEY = "encounterId"; + private final Set adviceMethodNames = Sets.newHashSet("saveEncounter"); + + public EncounterAdvice() { + this.eventPublisher = Context.getRegisteredComponent("bahmniEventPublisher", BahmniEventPublisher.class); + this.encounterEvent = Context.getRegisteredComponent("encounterEvent", EncounterEvent.class); + } + + @Override + public void afterReturning(Object returnValue, Method method, Object[] arguments, Object target) { + if (adviceMethodNames.contains(method.getName())) { + Map encounterInfo = threadLocal.get(); + if (encounterInfo != null) { + BahmniEventType eventType = encounterInfo.get(ENCOUNTER_ID_KEY) == null ? BAHMNI_ENCOUNTER_CREATED : BAHMNI_ENCOUNTER_UPDATED; + threadLocal.remove(); + + Encounter encounter = (Encounter) returnValue; + encounterEvent.createEncounterEvent(eventType, encounter); + eventPublisher.publishEvent(encounterEvent); + + log.info("Successfully published event with uuid : " + encounter.getUuid()); + } + } + } + @Override + public void before(Method method, Object[] objects, Object o) { + if (adviceMethodNames.contains(method.getName())) { + Encounter encounter = (Encounter) objects[0]; + Map encounterInfo = new HashMap<>(1); + encounterInfo.put(ENCOUNTER_ID_KEY, encounter.getId()); + threadLocal.set(encounterInfo); + } + } +} diff --git a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/advice/PatientAdvice.java b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/advice/PatientAdvice.java new file mode 100644 index 0000000000..086b7cafc7 --- /dev/null +++ b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/advice/PatientAdvice.java @@ -0,0 +1,63 @@ +package org.bahmni.module.bahmnicore.events.advice; + +import com.google.common.collect.Sets; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.bahmni.module.bahmnicore.events.BahmniEventType; +import org.bahmni.module.bahmnicore.events.PatientEvent; +import org.bahmni.module.bahmnicore.events.eventPublisher.BahmniEventPublisher; +import org.openmrs.Patient; +import org.openmrs.api.context.Context; +import org.springframework.aop.AfterReturningAdvice; +import org.springframework.aop.MethodBeforeAdvice; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +import static org.bahmni.module.bahmnicore.events.BahmniEventType.BAHMNI_PATIENT_CREATED; +import static org.bahmni.module.bahmnicore.events.BahmniEventType.BAHMNI_PATIENT_UPDATED; + + +public class PatientAdvice implements AfterReturningAdvice, MethodBeforeAdvice { + + private final Logger log = LogManager.getLogger(PatientAdvice.class); + private final BahmniEventPublisher eventPublisher; + private final ThreadLocal> threadLocal = new ThreadLocal<>(); + private final String PATIENT_ID_KEY = "patientId"; + private final PatientEvent patientEvent; + private final Set adviceMethodNames = Sets.newHashSet("savePatient"); + + public PatientAdvice() { + this.eventPublisher = Context.getRegisteredComponent("bahmniEventPublisher", BahmniEventPublisher.class); + this.patientEvent = Context.getRegisteredComponent("patientEvent", PatientEvent.class); + } + + @Override + public void afterReturning(Object returnValue, Method method, Object[] arguments, Object target) { + if (adviceMethodNames.contains(method.getName())) { + Map patientInfo = threadLocal.get(); + if (patientInfo != null) { + BahmniEventType eventType = patientInfo.get(PATIENT_ID_KEY) == null ? BAHMNI_PATIENT_CREATED : BAHMNI_PATIENT_UPDATED; + threadLocal.remove(); + + Patient patient = (Patient) returnValue; + patientEvent.createPatientEvent(eventType, patient); + eventPublisher.publishEvent(patientEvent); + + log.info("Successfully published event with uuid : " + patient.getUuid()); + } + } + } + @Override + public void before(Method method, Object[] objects, Object o) { + if (adviceMethodNames.contains(method.getName())) { + Patient patient = (Patient) objects[0]; + + Map patientInfo = new HashMap<>(1); + patientInfo.put(PATIENT_ID_KEY, patient.getId()); + threadLocal.set(patientInfo); + } + } +} diff --git a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/eventListener/PatientSmsEventListener.java b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/eventListener/PatientSmsEventListener.java new file mode 100644 index 0000000000..ce5e35e277 --- /dev/null +++ b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/eventListener/PatientSmsEventListener.java @@ -0,0 +1,80 @@ +package org.bahmni.module.bahmnicore.events.eventListener; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.bahmni.module.bahmnicore.events.BahmniEventType; +import org.bahmni.module.bahmnicore.events.PatientEvent; +import org.bahmni.module.communication.service.CommunicationService; +import org.bahmni.module.communication.service.MessageBuilderService; +import org.openmrs.Patient; +import org.openmrs.PersonAttribute; +import org.openmrs.api.AdministrationService; +import org.openmrs.api.context.Context; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +@Component +public class PatientSmsEventListener { + + private final Log log = LogFactory.getLog(this.getClass()); + + + @Async("BahmniAsyncThreadExecutor") + @EventListener + public void onApplicationEvent(PatientEvent event) { + try { + Context.openSession(); + Context.setUserContext(event.getUserContext()); + if (event.getEventType() == BahmniEventType.BAHMNI_PATIENT_CREATED) { + handlePatientCreatedEvent(event.getPatient()); + } + } catch(Exception e){ + log.error("Exception occurred during event processing", e); + } finally{ + Context.closeSession(); + } + } + + private void handlePatientCreatedEvent(Patient patient) { + AdministrationService administrationService = Context.getService(AdministrationService.class); + boolean patientRegistrationSMSProperty = Boolean.parseBoolean(administrationService.getGlobalProperty("sms.enableRegistrationSMSAlert","false")); + if (!patientRegistrationSMSProperty) + return; + String phoneNumber = getPhoneNumber(patient); + if (phoneNumber != null) { + MessageBuilderService messageBuilderService = Context.getRegisteredComponent("messageBuilderService", MessageBuilderService.class); + CommunicationService communicationService = Context.getRegisteredComponent("communicationService", CommunicationService.class); + String message=messageBuilderService.getRegistrationMessage(createArgumentsMapForPatientRegistration(patient)); + communicationService.sendSMS(phoneNumber, message); + } + } + + public Map createArgumentsMapForPatientRegistration(Patient patient) { + String helpdeskNumber = Context.getAdministrationService().getGlobalPropertyObject("clinic.helpDeskNumber").getPropertyValue(); + String clinicTime = Context.getAdministrationService().getGlobalPropertyObject("clinic.clinicTimings").getPropertyValue(); + Map arguments = new HashMap<>(); + arguments.put("location", Context.getUserContext().getLocation().getName()); + arguments.put("identifier", patient.getPatientIdentifier().getIdentifier()); + arguments.put("patientname", patient.getGivenName() + " " + patient.getFamilyName()); + arguments.put("gender", patient.getGender()); + arguments.put("age", patient.getAge().toString()); + arguments.put("helpdesknumber", helpdeskNumber); + arguments.put("facilitytimings", clinicTime); + return arguments; + } + + private String getPhoneNumber(Patient patient) { + PersonAttribute phoneNumber = patient.getAttribute("phoneNumber"); + if (phoneNumber == null) { + log.info("No mobile number found for the patient. SMS not sent."); + return null; + } + return phoneNumber.getValue(); + } +} + + diff --git a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/eventPublisher/BahmniEventPublisher.java b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/eventPublisher/BahmniEventPublisher.java new file mode 100644 index 0000000000..0ff4b9bdbb --- /dev/null +++ b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/eventPublisher/BahmniEventPublisher.java @@ -0,0 +1,21 @@ +package org.bahmni.module.bahmnicore.events.eventPublisher; + +import org.bahmni.module.bahmnicore.events.BahmniEvent; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.context.ApplicationEventPublisherAware; +import org.springframework.lang.NonNull; +import org.springframework.stereotype.Component; + +@Component +public class BahmniEventPublisher implements ApplicationEventPublisherAware { + + private ApplicationEventPublisher eventPublisher; + + @Override + public void setApplicationEventPublisher(@NonNull ApplicationEventPublisher applicationEventPublisher) { + this.eventPublisher = applicationEventPublisher; + } + public void publishEvent(BahmniEvent event) { + this.eventPublisher.publishEvent(event); + } +} \ No newline at end of file diff --git a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/util/BahmniAsyncThreadExecutor.java b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/util/BahmniAsyncThreadExecutor.java new file mode 100644 index 0000000000..db49d734e7 --- /dev/null +++ b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/util/BahmniAsyncThreadExecutor.java @@ -0,0 +1,28 @@ +/** + * This Source Code Form is subject to the terms of the Mozilla Public License, + * v. 2.0. If a copy of the MPL was not distributed with this file, You can + * obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under + * the terms of the Healthcare Disclaimer located at http://openmrs.org/license. + * + * Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS + * graphic logo is a trademark of OpenMRS Inc. + */ +package org.bahmni.module.bahmnicore.util; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; + +@Configuration +@EnableAsync +public class BahmniAsyncThreadExecutor { + + @Bean(name = "BahmniAsyncThreadExecutor") + public Executor threadPoolTaskExecutor() { + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); + return threadPoolTaskExecutor; + } +} diff --git a/bahmnicore-omod/src/main/resources/config.xml b/bahmnicore-omod/src/main/resources/config.xml index 039bb26aea..d11fee49a5 100644 --- a/bahmnicore-omod/src/main/resources/config.xml +++ b/bahmnicore-omod/src/main/resources/config.xml @@ -33,7 +33,7 @@ org.openmrs.module.episodes org.openmrs.module.auditlog org.bahmni.module.bahmnicommons - + org.bahmni.module.communication @@ -136,7 +136,7 @@ BahmniConfig.hbm.xml EntityMapping.hbm.xml EntityMappingType.hbm.xml - + @@ -146,7 +146,9 @@ bahmni.relationshipTypeMap - Relationship Type Map format Eg:{ "patient": ["Sibling", "Parent"],"provider": ["Doctor"]}.If no value is specified default is patient relationship. + Relationship Type Map format Eg:{ "patient": ["Sibling", "Parent"],"provider": ["Doctor"]}.If no + value is specified default is patient relationship. + @@ -188,7 +190,24 @@ bahmni.diagnosisSetForNewDiagnosisConcepts - UUID of set member of diagnosis set of sets. New Diagnosis concepts from terminology server will be added to this set + UUID of set member of diagnosis set of sets. New Diagnosis concepts from terminology server will be + added to this set + + + sms.enableRegistrationSMSAlert + false + Boolean to enable sending sms when ptient registers + + + + + org.openmrs.api.PatientService + org.bahmni.module.bahmnicore.events.advice.PatientAdvice + + + org.openmrs.api.EncounterService + org.bahmni.module.bahmnicore.events.advice.EncounterAdvice + diff --git a/pom.xml b/pom.xml index 3cdbf81185..4425d5e2bf 100644 --- a/pom.xml +++ b/pom.xml @@ -573,7 +573,7 @@ org.bahmni.module communication-api - 1.1.0 + 1.2.0-SNAPSHOT jar provided From 01ed6725923c3537d5f00a3c9fa9aa06dea6c6dd Mon Sep 17 00:00:00 2001 From: anubhavBeehyv Date: Fri, 29 Sep 2023 17:55:57 +0530 Subject: [PATCH 3/8] Addition of transmission controller back to bahmni-core. --- .../controller/TransmissionController.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 bahmnicore-omod/src/main/java/org/bahmni/module/bahmnicore/web/v1_0/controller/TransmissionController.java diff --git a/bahmnicore-omod/src/main/java/org/bahmni/module/bahmnicore/web/v1_0/controller/TransmissionController.java b/bahmnicore-omod/src/main/java/org/bahmni/module/bahmnicore/web/v1_0/controller/TransmissionController.java new file mode 100644 index 0000000000..39973d112d --- /dev/null +++ b/bahmnicore-omod/src/main/java/org/bahmni/module/bahmnicore/web/v1_0/controller/TransmissionController.java @@ -0,0 +1,60 @@ +package org.bahmni.module.bahmnicore.web.v1_0.controller; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.HttpResponse; +import org.apache.http.HttpResponseFactory; +import org.apache.http.HttpStatus; +import org.apache.http.HttpVersion; +import org.apache.http.impl.DefaultHttpResponseFactory; +import org.apache.http.message.BasicStatusLine; +import org.bahmni.module.bahmnicore.web.v1_0.contract.BahmniMailContent; +import org.bahmni.module.communication.model.Recipient; +import org.bahmni.module.communication.service.CommunicationService; +import org.openmrs.Patient; +import org.openmrs.api.PatientService; +import org.openmrs.api.context.Context; +import org.openmrs.module.webservices.rest.web.RestConstants; +import org.openmrs.module.webservices.rest.web.v1_0.controller.BaseRestController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.PathVariable; + +@Controller +@RequestMapping(value = "/rest/" + RestConstants.VERSION_1 + "/patient/{patientUuid}/send/") +public class TransmissionController extends BaseRestController { + + private final Log log = LogFactory.getLog(this.getClass()); + + @Autowired + PatientService patientService; + + @PostMapping(value = "email") + @ResponseBody + public Object sendEmail(@RequestBody BahmniMailContent bahmniMailContent, @PathVariable("patientUuid") String patientUuid) { + HttpResponseFactory factory = new DefaultHttpResponseFactory(); + HttpResponse response = null; + if(Boolean.valueOf(Context.getAdministrationService().getGlobalProperty("bahmni.enableEmailPrescriptionOption"))) { + try { + Patient patient = patientService.getPatientByUuid(patientUuid); + String recipientName = patient.getGivenName() + (patient.getMiddleName()!=null ? " " + patient.getMiddleName() : "") + (patient.getFamilyName()!=null ? " " + patient.getFamilyName() : ""); + String recipientEmail = patient.getAttribute("email").getValue(); + Recipient recipient = new Recipient(recipientName, recipientEmail); + bahmniMailContent.setRecipient(recipient); + Context.getService(CommunicationService.class).sendEmail(bahmniMailContent); + response = factory.newHttpResponse(new BasicStatusLine(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "Mail sent successfully"), null); + } catch (Exception exception) { + log.error("Unable to send email", exception); + response = factory.newHttpResponse(new BasicStatusLine(HttpVersion.HTTP_1_1, HttpStatus.SC_INTERNAL_SERVER_ERROR, "Unable to send email"), null); + } + } else { + response = factory.newHttpResponse(new BasicStatusLine(HttpVersion.HTTP_1_1, HttpStatus.SC_METHOD_NOT_ALLOWED, "Sending email is not enabled"), null); + } + return response; + } + +} \ No newline at end of file From fe39a448e9dcfab98aad7d6858b9d11cf5c4f047 Mon Sep 17 00:00:00 2001 From: anubhavBeehyv <123312249+anubhavBeehyv@users.noreply.github.com> Date: Fri, 29 Sep 2023 17:57:12 +0530 Subject: [PATCH 4/8] Update config.xml --- bahmnicore-omod/src/main/resources/config.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bahmnicore-omod/src/main/resources/config.xml b/bahmnicore-omod/src/main/resources/config.xml index d11fee49a5..f25262ed89 100644 --- a/bahmnicore-omod/src/main/resources/config.xml +++ b/bahmnicore-omod/src/main/resources/config.xml @@ -146,8 +146,7 @@ bahmni.relationshipTypeMap - Relationship Type Map format Eg:{ "patient": ["Sibling", "Parent"],"provider": ["Doctor"]}.If no - value is specified default is patient relationship. + Relationship Type Map format Eg:{ "patient": ["Sibling", "Parent"],"provider": ["Doctor"]}.If no value is specified default is patient relationship. From 709d8dc42e2ce66a9d14e308bc6f581d5290173a Mon Sep 17 00:00:00 2001 From: anubhavBeehyv <123312249+anubhavBeehyv@users.noreply.github.com> Date: Fri, 29 Sep 2023 17:58:35 +0530 Subject: [PATCH 5/8] Update config.xml --- bahmnicore-omod/src/main/resources/config.xml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/bahmnicore-omod/src/main/resources/config.xml b/bahmnicore-omod/src/main/resources/config.xml index f25262ed89..20c7fe8481 100644 --- a/bahmnicore-omod/src/main/resources/config.xml +++ b/bahmnicore-omod/src/main/resources/config.xml @@ -146,8 +146,7 @@ bahmni.relationshipTypeMap - Relationship Type Map format Eg:{ "patient": ["Sibling", "Parent"],"provider": ["Doctor"]}.If no value is specified default is patient relationship. - + Relationship Type Map format Eg:{ "patient": ["Sibling", "Parent"],"provider": ["Doctor"]}.If no value is specified default is patient relationship. @@ -189,9 +188,7 @@ bahmni.diagnosisSetForNewDiagnosisConcepts - UUID of set member of diagnosis set of sets. New Diagnosis concepts from terminology server will be - added to this set - + UUID of set member of diagnosis set of sets. New Diagnosis concepts from terminology server will be added to this set From be237067db530772e3dcd58da2f04a9ff9becfde Mon Sep 17 00:00:00 2001 From: anubhavBeehyv Date: Thu, 5 Oct 2023 20:02:46 +0530 Subject: [PATCH 6/8] Resolved git comments --- .../module/bahmnicore/events/BahmniEvent.java | 25 ++----- .../bahmnicore/events/EncounterEvent.java | 16 +--- .../bahmnicore/events/PatientEvent.java | 10 +-- .../events/advice/EncounterAdvice.java | 73 +++++++++---------- .../events/advice/PatientAdvice.java | 4 +- .../PatientSmsEventListener.java | 4 +- ...java => EmailCommunicationController.java} | 4 +- 7 files changed, 55 insertions(+), 81 deletions(-) rename bahmnicore-omod/src/main/java/org/bahmni/module/bahmnicore/web/v1_0/controller/{TransmissionController.java => EmailCommunicationController.java} (95%) diff --git a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/BahmniEvent.java b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/BahmniEvent.java index 21924dcbb1..1681c1e017 100644 --- a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/BahmniEvent.java +++ b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/BahmniEvent.java @@ -1,11 +1,11 @@ package org.bahmni.module.bahmnicore.events; +import org.openmrs.api.context.Context; import org.openmrs.api.context.UserContext; -import org.springframework.stereotype.Component; import java.time.LocalDateTime; +import java.util.UUID; -@Component public class BahmniEvent { private static final long version = 1L; @@ -15,21 +15,12 @@ public class BahmniEvent { public String payloadId; public LocalDateTime publishedDateTime; - public UserContext getUserContext() { - return userContext; - } - public String getEventId() { - return eventId; - } - public BahmniEventType getEventType() { - return eventType; - } - public String getPayloadId() { - return payloadId; - } - - public LocalDateTime getPublishedDateTime() { - return publishedDateTime; + public BahmniEvent(BahmniEventType bahmniEventType) { + this.eventType = bahmniEventType; + this.eventId = UUID.randomUUID().toString(); + this.publishedDateTime = LocalDateTime.now(); + this.userContext= Context.getUserContext(); + this.payloadId=""; } } diff --git a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/EncounterEvent.java b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/EncounterEvent.java index bbda65c16e..a3b0107902 100644 --- a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/EncounterEvent.java +++ b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/EncounterEvent.java @@ -1,25 +1,15 @@ package org.bahmni.module.bahmnicore.events; import org.openmrs.Encounter; -import org.openmrs.Patient; -import org.openmrs.api.context.Context; -import org.springframework.stereotype.Component; -import java.time.LocalDateTime; -import java.util.UUID; - -@Component public class EncounterEvent extends BahmniEvent { private Encounter encounter; - public void createEncounterEvent(BahmniEventType eventType, Encounter encounter) { - this.eventType = eventType; + public EncounterEvent(BahmniEventType bahmniEventType, Encounter encounter) { + super(bahmniEventType); this.encounter = encounter; - this.eventId = UUID.randomUUID().toString(); - this.payloadId = encounter.getUuid(); - this.publishedDateTime = LocalDateTime.now(); - this.userContext= Context.getUserContext(); + this.payloadId=encounter.getUuid(); } public Encounter getEncounter() { diff --git a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/PatientEvent.java b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/PatientEvent.java index a0901bba25..dba79af640 100644 --- a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/PatientEvent.java +++ b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/PatientEvent.java @@ -7,18 +7,14 @@ import java.time.LocalDateTime; import java.util.UUID; -@Component public class PatientEvent extends BahmniEvent { private Patient patient; - public void createPatientEvent(BahmniEventType eventType, Patient patient) { - this.eventType = eventType; + public PatientEvent(BahmniEventType bahmniEventType, Patient patient) { + super(bahmniEventType); this.patient = patient; - this.eventId = UUID.randomUUID().toString(); - this.payloadId = patient.getUuid(); - this.publishedDateTime = LocalDateTime.now(); - this.userContext= Context.getUserContext(); + this.payloadId=patient.getUuid(); } public Patient getPatient() { diff --git a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/advice/EncounterAdvice.java b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/advice/EncounterAdvice.java index 8b0bde10b1..649a21f563 100644 --- a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/advice/EncounterAdvice.java +++ b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/advice/EncounterAdvice.java @@ -22,41 +22,40 @@ public class EncounterAdvice implements AfterReturningAdvice, MethodBeforeAdvice { - private final Logger log = LogManager.getLogger(this.getClass()); - private final BahmniEventPublisher eventPublisher; - private final EncounterEvent encounterEvent; - private final ThreadLocal> threadLocal = new ThreadLocal<>(); - private final String ENCOUNTER_ID_KEY = "encounterId"; - private final Set adviceMethodNames = Sets.newHashSet("saveEncounter"); - - public EncounterAdvice() { - this.eventPublisher = Context.getRegisteredComponent("bahmniEventPublisher", BahmniEventPublisher.class); - this.encounterEvent = Context.getRegisteredComponent("encounterEvent", EncounterEvent.class); - } - - @Override - public void afterReturning(Object returnValue, Method method, Object[] arguments, Object target) { - if (adviceMethodNames.contains(method.getName())) { - Map encounterInfo = threadLocal.get(); - if (encounterInfo != null) { - BahmniEventType eventType = encounterInfo.get(ENCOUNTER_ID_KEY) == null ? BAHMNI_ENCOUNTER_CREATED : BAHMNI_ENCOUNTER_UPDATED; - threadLocal.remove(); - - Encounter encounter = (Encounter) returnValue; - encounterEvent.createEncounterEvent(eventType, encounter); - eventPublisher.publishEvent(encounterEvent); - - log.info("Successfully published event with uuid : " + encounter.getUuid()); - } - } - } - @Override - public void before(Method method, Object[] objects, Object o) { - if (adviceMethodNames.contains(method.getName())) { - Encounter encounter = (Encounter) objects[0]; - Map encounterInfo = new HashMap<>(1); - encounterInfo.put(ENCOUNTER_ID_KEY, encounter.getId()); - threadLocal.set(encounterInfo); - } - } + private final Logger log = LogManager.getLogger(this.getClass()); + private final BahmniEventPublisher eventPublisher; + private final ThreadLocal> threadLocal = new ThreadLocal<>(); + private final String ENCOUNTER_ID_KEY = "encounterId"; + private final Set adviceMethodNames = Sets.newHashSet("saveEncounter"); + + public EncounterAdvice() { + this.eventPublisher = Context.getRegisteredComponent("bahmniEventPublisher", BahmniEventPublisher.class); + } + + @Override + public void afterReturning(Object returnValue, Method method, Object[] arguments, Object target) { + if (adviceMethodNames.contains(method.getName())) { + Map encounterInfo = threadLocal.get(); + if (encounterInfo != null) { + BahmniEventType eventType = encounterInfo.get(ENCOUNTER_ID_KEY) == null ? BAHMNI_ENCOUNTER_CREATED : BAHMNI_ENCOUNTER_UPDATED; + threadLocal.remove(); + + Encounter encounter = (Encounter) returnValue; + EncounterEvent encounterEvent = new EncounterEvent(eventType, encounter); + eventPublisher.publishEvent(encounterEvent); + + log.info("Successfully published event with uuid : " + encounter.getUuid()); + } + } + } + + @Override + public void before(Method method, Object[] objects, Object o) { + if (adviceMethodNames.contains(method.getName())) { + Encounter encounter = (Encounter) objects[0]; + Map encounterInfo = new HashMap<>(1); + encounterInfo.put(ENCOUNTER_ID_KEY, encounter.getId()); + threadLocal.set(encounterInfo); + } + } } diff --git a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/advice/PatientAdvice.java b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/advice/PatientAdvice.java index 086b7cafc7..50bbd77e02 100644 --- a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/advice/PatientAdvice.java +++ b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/advice/PatientAdvice.java @@ -26,12 +26,10 @@ public class PatientAdvice implements AfterReturningAdvice, MethodBeforeAdvice { private final BahmniEventPublisher eventPublisher; private final ThreadLocal> threadLocal = new ThreadLocal<>(); private final String PATIENT_ID_KEY = "patientId"; - private final PatientEvent patientEvent; private final Set adviceMethodNames = Sets.newHashSet("savePatient"); public PatientAdvice() { this.eventPublisher = Context.getRegisteredComponent("bahmniEventPublisher", BahmniEventPublisher.class); - this.patientEvent = Context.getRegisteredComponent("patientEvent", PatientEvent.class); } @Override @@ -43,7 +41,7 @@ public void afterReturning(Object returnValue, Method method, Object[] arguments threadLocal.remove(); Patient patient = (Patient) returnValue; - patientEvent.createPatientEvent(eventType, patient); + PatientEvent patientEvent =new PatientEvent(eventType,patient); eventPublisher.publishEvent(patientEvent); log.info("Successfully published event with uuid : " + patient.getUuid()); diff --git a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/eventListener/PatientSmsEventListener.java b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/eventListener/PatientSmsEventListener.java index ce5e35e277..6c48d0e52a 100644 --- a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/eventListener/PatientSmsEventListener.java +++ b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/eventListener/PatientSmsEventListener.java @@ -28,8 +28,8 @@ public class PatientSmsEventListener { public void onApplicationEvent(PatientEvent event) { try { Context.openSession(); - Context.setUserContext(event.getUserContext()); - if (event.getEventType() == BahmniEventType.BAHMNI_PATIENT_CREATED) { + Context.setUserContext(event.userContext); + if (event.eventType == BahmniEventType.BAHMNI_PATIENT_CREATED) { handlePatientCreatedEvent(event.getPatient()); } } catch(Exception e){ diff --git a/bahmnicore-omod/src/main/java/org/bahmni/module/bahmnicore/web/v1_0/controller/TransmissionController.java b/bahmnicore-omod/src/main/java/org/bahmni/module/bahmnicore/web/v1_0/controller/EmailCommunicationController.java similarity index 95% rename from bahmnicore-omod/src/main/java/org/bahmni/module/bahmnicore/web/v1_0/controller/TransmissionController.java rename to bahmnicore-omod/src/main/java/org/bahmni/module/bahmnicore/web/v1_0/controller/EmailCommunicationController.java index 39973d112d..28cac1ad84 100644 --- a/bahmnicore-omod/src/main/java/org/bahmni/module/bahmnicore/web/v1_0/controller/TransmissionController.java +++ b/bahmnicore-omod/src/main/java/org/bahmni/module/bahmnicore/web/v1_0/controller/EmailCommunicationController.java @@ -25,8 +25,8 @@ import org.springframework.web.bind.annotation.PathVariable; @Controller -@RequestMapping(value = "/rest/" + RestConstants.VERSION_1 + "/patient/{patientUuid}/send/") -public class TransmissionController extends BaseRestController { +@RequestMapping(value = "/rest/" + RestConstants.VERSION_1 + "/patient/{patientUuid}/send/")//change to send-prescription-email +public class EmailCommunicationController extends BaseRestController { private final Log log = LogFactory.getLog(this.getClass()); From bc630c110d07ead06a2bde846922e19db5164650 Mon Sep 17 00:00:00 2001 From: anubhavBeehyv <123312249+anubhavBeehyv@users.noreply.github.com> Date: Thu, 12 Oct 2023 19:12:55 +0530 Subject: [PATCH 7/8] typo in patient --- bahmnicore-omod/src/main/resources/config.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bahmnicore-omod/src/main/resources/config.xml b/bahmnicore-omod/src/main/resources/config.xml index 20c7fe8481..d33c63144f 100644 --- a/bahmnicore-omod/src/main/resources/config.xml +++ b/bahmnicore-omod/src/main/resources/config.xml @@ -194,7 +194,7 @@ sms.enableRegistrationSMSAlert false - Boolean to enable sending sms when ptient registers + Boolean to enable sending sms when patient registers From 1bd2614335a5b6deb169ea4793d8481ab7b07fb5 Mon Sep 17 00:00:00 2001 From: anubhavBeehyv Date: Wed, 18 Oct 2023 11:37:12 +0530 Subject: [PATCH 8/8] Removed clinic timings attribute. --- .../events/eventListener/PatientSmsEventListener.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/eventListener/PatientSmsEventListener.java b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/eventListener/PatientSmsEventListener.java index 6c48d0e52a..0a527134a8 100644 --- a/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/eventListener/PatientSmsEventListener.java +++ b/bahmnicore-api/src/main/java/org/bahmni/module/bahmnicore/events/eventListener/PatientSmsEventListener.java @@ -55,7 +55,6 @@ private void handlePatientCreatedEvent(Patient patient) { public Map createArgumentsMapForPatientRegistration(Patient patient) { String helpdeskNumber = Context.getAdministrationService().getGlobalPropertyObject("clinic.helpDeskNumber").getPropertyValue(); - String clinicTime = Context.getAdministrationService().getGlobalPropertyObject("clinic.clinicTimings").getPropertyValue(); Map arguments = new HashMap<>(); arguments.put("location", Context.getUserContext().getLocation().getName()); arguments.put("identifier", patient.getPatientIdentifier().getIdentifier()); @@ -63,7 +62,6 @@ public Map createArgumentsMapForPatientRegistration(Patient pati arguments.put("gender", patient.getGender()); arguments.put("age", patient.getAge().toString()); arguments.put("helpdesknumber", helpdeskNumber); - arguments.put("facilitytimings", clinicTime); return arguments; }