From 733dd2e70f0d31b1da446a077a45932f51683d0b Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Thu, 27 Apr 2023 11:05:02 +0530 Subject: [PATCH 01/11] Get Patient registration event from bahmni and publish to GCP topic. 1. Authentication with Bahmni 2. Integration Atom feed. 3. Introducing db for tracking the events that has been subscribed and published. 4. Added liquibase for migration. --- pom.xml | 68 +++++++++++ .../bahmni/BahmniEventPublisherService.java | 1 + .../gcp/GCPEventPublisherService.java | 2 +- .../bahmni/AtomFeedClientConfiguration.java | 50 ++++++++ .../bahmni/AtomFeedClientFactory.java | 35 ++++++ .../bahmni/AtomFeedClientProperties.java | 30 +++++ .../bahmni/BahmniEventSubscriber.java | 79 +++++++------ src/main/resources/application.yaml | 31 ++++- src/main/resources/atomfeed.properties | 1 + src/main/resources/liquibase.xml | 61 ++++++++++ .../bahmni/AtomFeedClientPropertiesTest.java | 39 +++++++ .../bahmni/BahmniEventSubscriberTest.java | 108 +++++++++--------- .../SubscriberConfigurationTest.java | 6 +- 13 files changed, 414 insertions(+), 97 deletions(-) create mode 100644 src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientConfiguration.java create mode 100755 src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientFactory.java create mode 100644 src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientProperties.java create mode 100755 src/main/resources/atomfeed.properties create mode 100755 src/main/resources/liquibase.xml create mode 100644 src/test/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientPropertiesTest.java diff --git a/pom.xml b/pom.xml index 97b5241..18f1af8 100644 --- a/pom.xml +++ b/pom.xml @@ -15,6 +15,7 @@ event-router-service 17 + 1.10.1 4.1.3 2022.0.2 @@ -35,12 +36,79 @@ com.google.cloud spring-cloud-gcp-starter-pubsub + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.projectlombok + lombok + RELEASE + provided + + + org.bahmni.module + web-clients + 0.94.3 + + + org.ict4h + atomfeed-client + ${atomfeed.version} + + + javax.persistence + persistence-api + + + + + org.ict4h.openmrs + openmrs-atomfeed-common + 2.6.2 + + + org.ict4h + atomfeed-spring-server + 1.10.1 + + + com.mysql + mysql-connector-j + runtime + + + org.apache.httpcomponents + httpclient + + + commons-io + commons-io + 2.4 + + + commons-lang + commons-lang + 2.6 + + + org.liquibase + liquibase-core + + org.springframework.boot spring-boot-starter-test test + + org.ict4h + atomfeed-commons + ${atomfeed.version} + tests + test + diff --git a/src/main/java/org/bahmni/eventrouterservice/publisher/bahmni/BahmniEventPublisherService.java b/src/main/java/org/bahmni/eventrouterservice/publisher/bahmni/BahmniEventPublisherService.java index 96abba9..4ddda44 100644 --- a/src/main/java/org/bahmni/eventrouterservice/publisher/bahmni/BahmniEventPublisherService.java +++ b/src/main/java/org/bahmni/eventrouterservice/publisher/bahmni/BahmniEventPublisherService.java @@ -24,6 +24,7 @@ public BahmniEventPublisherService(BahmniEventPublisher eventPublisher, Publishe public void publish(String payload, String publisherId) { String endpoint = publisherConfiguration.getEndpointFor(publisherId); eventPublisher.publish(endpoint, payload); + logger.info("Successfully publish the message on url :" + endpoint); logger.debug("Successfully publish the message on url :" + endpoint + " with payload " + payload); } } diff --git a/src/main/java/org/bahmni/eventrouterservice/publisher/gcp/GCPEventPublisherService.java b/src/main/java/org/bahmni/eventrouterservice/publisher/gcp/GCPEventPublisherService.java index 736587f..53fd8d5 100644 --- a/src/main/java/org/bahmni/eventrouterservice/publisher/gcp/GCPEventPublisherService.java +++ b/src/main/java/org/bahmni/eventrouterservice/publisher/gcp/GCPEventPublisherService.java @@ -1,7 +1,6 @@ package org.bahmni.eventrouterservice.publisher.gcp; import org.bahmni.eventrouterservice.configuration.Topic; -import org.bahmni.eventrouterservice.publisher.bahmni.BahmniEventPublisherService; import org.bahmni.eventrouterservice.publisher.common.service.EventPublisherService; import org.bahmni.eventrouterservice.publisher.configuration.PublisherConfiguration; import org.slf4j.Logger; @@ -30,6 +29,7 @@ public GCPEventPublisherService(GCPEventPublisher eventPublisher, PublisherConfi public void publish(String payload, String publisherId) { Topic topic = publisherConfiguration.getTopicFor(publisherId); eventPublisher.publish(topic.getName(), payload); + logger.info("Successfully publish the message on topic :" + topic.getName()); logger.debug("Successfully publish the message on topic :" + topic.getName() + " with payload " + payload); } } diff --git a/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientConfiguration.java b/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientConfiguration.java new file mode 100644 index 0000000..746ed8e --- /dev/null +++ b/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientConfiguration.java @@ -0,0 +1,50 @@ +package org.bahmni.eventrouterservice.subscriber.bahmni; + +import org.bahmni.webclients.ConnectionDetails; +import org.bahmni.webclients.HttpClient; +import org.bahmni.webclients.openmrs.OpenMRSLoginAuthenticator; +import org.ict4h.atomfeed.client.AtomFeedProperties; +import org.ict4h.atomfeed.client.repository.jdbc.AllFailedEventsJdbcImpl; +import org.ict4h.atomfeed.client.repository.jdbc.AllMarkersJdbcImpl; +import org.ict4h.atomfeed.server.transaction.AtomFeedSpringTransactionSupport; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.PlatformTransactionManager; + +import javax.sql.DataSource; + +@Configuration +public class AtomFeedClientConfiguration { + + @Bean + public AtomFeedSpringTransactionSupport atomFeedSpringTransactionSupport(PlatformTransactionManager platformTransactionManager, DataSource dataSource) { + return new AtomFeedSpringTransactionSupport(platformTransactionManager, dataSource); + } + + @Bean + public HttpClient bahmniHttpClient(AtomFeedClientProperties feedProperties) { + ConnectionDetails connectionDetails = new ConnectionDetails(feedProperties.getAuthUri() + , feedProperties.getUser(), feedProperties.getPassword(), + feedProperties.getConnectionTimeoutInMilliseconds(), feedProperties.getReplyTimeoutInMilliseconds()); + return new org.bahmni.webclients.HttpClient(connectionDetails, + new OpenMRSLoginAuthenticator(connectionDetails)); + } + + @Bean + public AllMarkersJdbcImpl markersJdbc(AtomFeedSpringTransactionSupport atomFeedSpringTransactionSupport) { + return new AllMarkersJdbcImpl(atomFeedSpringTransactionSupport); + } + + @Bean + public AllFailedEventsJdbcImpl failedEventsJdbc(AtomFeedSpringTransactionSupport atomFeedSpringTransactionSupport) { + return new AllFailedEventsJdbcImpl(atomFeedSpringTransactionSupport); + } + + @Bean + public AtomFeedProperties atomFeedProperties(AtomFeedClientProperties feedProperties) { + AtomFeedProperties atomFeedProperties = new AtomFeedProperties(); + atomFeedProperties.setMaxFailedEvents(feedProperties.getMaxFailedEvents()); + atomFeedProperties.setControlsEventProcessing(true); + return atomFeedProperties; + } +} \ No newline at end of file diff --git a/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientFactory.java b/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientFactory.java new file mode 100755 index 0000000..2e95497 --- /dev/null +++ b/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientFactory.java @@ -0,0 +1,35 @@ +package org.bahmni.eventrouterservice.subscriber.bahmni; + +import lombok.AllArgsConstructor; +import org.bahmni.webclients.ClientCookies; +import org.bahmni.webclients.HttpClient; +import org.ict4h.atomfeed.client.AtomFeedProperties; +import org.ict4h.atomfeed.client.repository.AllFeeds; +import org.ict4h.atomfeed.client.repository.jdbc.AllFailedEventsJdbcImpl; +import org.ict4h.atomfeed.client.repository.jdbc.AllMarkersJdbcImpl; +import org.ict4h.atomfeed.client.service.AtomFeedClient; +import org.ict4h.atomfeed.client.service.EventWorker; +import org.ict4h.atomfeed.client.service.FeedClient; +import org.ict4h.atomfeed.server.transaction.AtomFeedSpringTransactionSupport; +import org.springframework.stereotype.Component; + +import java.net.URI; + +@AllArgsConstructor +@Component +public class AtomFeedClientFactory { + private final AtomFeedSpringTransactionSupport atomFeedSpringTransactionSupport; + private final AllMarkersJdbcImpl allMarkersJdbc; + private final AllFailedEventsJdbcImpl failedEventsJdbc; + private final AtomFeedProperties atomFeedProperties; + private final HttpClient bahmniHttpClient; + private final AtomFeedClientProperties feedProperties; + + public FeedClient get(String feedURI, + EventWorker eventWorker) { + ClientCookies cookies = bahmniHttpClient.getCookies(URI.create(feedProperties.getAuthUri())); + AllFeeds allFeeds = new AllFeeds(atomFeedProperties, cookies); + return new AtomFeedClient(allFeeds, allMarkersJdbc, failedEventsJdbc, + atomFeedProperties, atomFeedSpringTransactionSupport, URI.create(feedURI), eventWorker); + } +} diff --git a/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientProperties.java b/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientProperties.java new file mode 100644 index 0000000..8ecb2d3 --- /dev/null +++ b/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientProperties.java @@ -0,0 +1,30 @@ +package org.bahmni.eventrouterservice.subscriber.bahmni; + +import lombok.AllArgsConstructor; +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import java.net.MalformedURLException; +import java.net.URL; + +@Data +@Configuration +@ConfigurationProperties(prefix = "bahmni") +public class AtomFeedClientProperties { + private String authUri; + private String user; + private String password; + private int connectionTimeoutInMilliseconds; + private int replyTimeoutInMilliseconds; + private int maxFailedEvents; + + public String baseURL() { + try { + URL openMRSAuthURL = new URL(authUri); + return String.format("%s://%s", openMRSAuthURL.getProtocol(), openMRSAuthURL.getAuthority()); + } catch (MalformedURLException e) { + throw new RuntimeException("Is not a valid URL - " + authUri); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/BahmniEventSubscriber.java b/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/BahmniEventSubscriber.java index dc9ebce..d8084da 100644 --- a/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/BahmniEventSubscriber.java +++ b/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/BahmniEventSubscriber.java @@ -1,72 +1,79 @@ package org.bahmni.eventrouterservice.subscriber.bahmni; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.bahmni.eventrouterservice.configuration.ServiceName; import org.bahmni.eventrouterservice.publisher.common.service.EventPublisherService; import org.bahmni.eventrouterservice.publisher.common.service.EventPublisherServiceFactory; import org.bahmni.eventrouterservice.subscriber.common.exception.FailedToSubscribeException; import org.bahmni.eventrouterservice.subscriber.configuration.SubscriberConfiguration; import org.bahmni.eventrouterservice.subscriber.configuration.SubscriberConfiguration.SubscriberDescription; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.bahmni.webclients.HttpClient; +import org.ict4h.atomfeed.client.domain.Event; +import org.ict4h.atomfeed.client.service.EventWorker; +import org.ict4h.atomfeed.client.service.FeedClient; import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; +import java.net.URI; import java.util.List; @Component +@AllArgsConstructor +@Slf4j public class BahmniEventSubscriber implements Runnable { - Logger logger = LoggerFactory.getLogger(BahmniEventSubscriber.class); - private final SubscriberConfiguration subscriberConfiguration; private final EventPublisherServiceFactory eventPublisherServiceFactory; - private final RestTemplate restTemplate; - - private final ObjectMapper objectMapper; - - @Autowired - public BahmniEventSubscriber(SubscriberConfiguration subscriberConfiguration, - EventPublisherServiceFactory eventPublisherServiceFactory, - RestTemplate restTemplate, - ObjectMapper objectMapper) { - this.subscriberConfiguration = subscriberConfiguration; - this.eventPublisherServiceFactory = eventPublisherServiceFactory; - this.restTemplate = restTemplate; - this.objectMapper = objectMapper; - } + private final HttpClient bahmniHttpClient; + private final AtomFeedClientProperties feedProperties; + private final AtomFeedClientFactory atomFeedClientFactory; @Override public void run() { try { - logger.info("Bhamni Subscriber job started..."); + log.info("Bhamni Subscriber job started..."); List subscriberDescriptions = subscriberConfiguration .getSubscribersAsPerOrderOfSubscriptionFor(ServiceName.BAHMNI); for(SubscriberDescription subscriber: subscriberDescriptions) { - List records = restTemplate.getForObject(subscriber.getEndpoint(), List.class); - logger.info("Total records consumed : "+ records.size()+" from url : "+subscriber.getEndpoint()); - if(!records.isEmpty()) - publish(records, subscriber); - logger.info("Total records published : "+ records.size()+" fetched from url : "+subscriber.getEndpoint()); + EventPublisherService publisherService = eventPublisherServiceFactory.getById(subscriber.getPublisherId()); + Worker newWorker = new Worker(bahmniHttpClient, + feedProperties.baseURL(), + publisherService, + subscriber.getPublisherId()); + + FeedClient atomFeedClient = atomFeedClientFactory.get(subscriber.getEndpoint(), newWorker); + atomFeedClient.processEvents(); } - logger.info("Bhamni Subscriber Job Finished."); + log.info("Bhamni Subscriber Job Finished."); } catch (Exception exception) { - logger.error("Bhamni Subscriber Job Termination with cause : " + exception.getMessage()); + log.error("Bhamni Subscriber Job Termination with cause : " + exception.getMessage()); throw new FailedToSubscribeException(exception); } } + @Slf4j + @AllArgsConstructor + public static class Worker implements EventWorker { + private final HttpClient bahmniHttpClient; + private final String baseURL; + private final EventPublisherService publisherService; + private final String publisherId; - private void publish(List records, SubscriberDescription subscriber) throws JsonProcessingException { - EventPublisherService publisherService = eventPublisherServiceFactory.getById(subscriber.getPublisherId()); - for(Object record : records) { - logger.debug("Successfully received the payload from bahmni to publish : " + record); - String recordAsString = objectMapper.writeValueAsString(record); - publisherService.publish(recordAsString, subscriber.getPublisherId()); + @Override + public void process(Event event) { + log.info("Getting patient details ..."); + + URI patientContentURI = URI.create(baseURL + event.getContent()); + String patientFeed = bahmniHttpClient.get(patientContentURI); + + log.info("Successfully received the payload from bahmni to publish : " + patientFeed); + + publisherService.publish(patientFeed, publisherId); } + + @Override + public void cleanUp(Event event) {} } } \ No newline at end of file diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 2f251bb..d0422bb 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -9,9 +9,34 @@ spring: credentials: location: file:${GCP_CREDENTIALS_FILE_LOCATION:""} -publisher-configuration-file: ${PUBLISHER_CONFIGURATION_FILE_LOCATION:""} -subscriber-configuration-file: ${SUBSCRIBER_CONFIGURATION_FILE_LOCATION:""} -subscriber-schedule-configuration-file: ${SUBSCRIBER_SCHEDULE_CONFIGURATION_FILE_LOCATION:""} + datasource: + url: jdbc:mysql://${EVENT_ROUTER_DB_HOST}:${EVENT_ROUTER_DB_PORT}/${EVENT_ROUTER_DB_NAME}?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=True + username: ${EVENT_ROUTER_DB_USERNAME} + password: ${EVENT_ROUTER_DB_PASSWORD} + jpa: + generate-ddl: false + database-platform: org.hibernate.dialect.MySQLDialect + show-sql: false + hibernate: + ddl-auto: none + liquibase: + change-log: classpath:liquibase.xml + +publisher-configuration-file: ${PUBLISHER_CONFIGURATION_FILE_LOCATION} +subscriber-configuration-file: ${SUBSCRIBER_CONFIGURATION_FILE_LOCATION} +subscriber-schedule-configuration-file: ${SUBSCRIBER_SCHEDULE_CONFIGURATION_FILE_LOCATION} + +bahmni: + maxFailedEvents: ${MAX_FAILED_EVENTS:1} + authUri: http://${OPENMRS_HOST}:${OPENMRS_PORT}/openmrs/ws/rest/v1/session + user: ${OPENMRS_ATOMFEED_USER} + password: ${OPENMRS_ATOMFEED_PASSWORD} + connectionTimeoutInMilliseconds: ${CONNECTION_TIMEOUT_IN_MILLISECONDS} + replyTimeoutInMilliseconds: ${REPLY_TIMEOUT_IN_MILLISECONDS} + +logging: + level: + org: INFO management: endpoints: diff --git a/src/main/resources/atomfeed.properties b/src/main/resources/atomfeed.properties new file mode 100755 index 0000000..db238ba --- /dev/null +++ b/src/main/resources/atomfeed.properties @@ -0,0 +1 @@ +# keeping this file for the atom-feed integration diff --git a/src/main/resources/liquibase.xml b/src/main/resources/liquibase.xml new file mode 100755 index 0000000..a66f2b6 --- /dev/null +++ b/src/main/resources/liquibase.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientPropertiesTest.java b/src/test/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientPropertiesTest.java new file mode 100644 index 0000000..41992a3 --- /dev/null +++ b/src/test/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientPropertiesTest.java @@ -0,0 +1,39 @@ +package org.bahmni.eventrouterservice.subscriber.bahmni; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class AtomFeedClientPropertiesTest { + + @Test + public void giveValidAuthURL_whenGettingBaseURL_thenReturnBaseUrlFromAuthURI() { + String authURI = "http://openmrs:8080/openmrs/ws/rest/v1/session"; + + AtomFeedClientProperties properties = new AtomFeedClientProperties(); + properties.setAuthUri(authURI); + properties.setUser("user"); + properties.setPassword("password"); + properties.setConnectionTimeoutInMilliseconds(3000); + properties.setReplyTimeoutInMilliseconds(3000); + properties.setMaxFailedEvents(2); + + assertEquals("http://openmrs:8080", properties.baseURL()); + } + + @Test + public void giveInValidAuthURL_whenGettingBaseURL_thenThrowRuntimeException() { + String authURI = "openmrs:8080/openmrs/ws/rest/v1/session"; + + AtomFeedClientProperties properties = new AtomFeedClientProperties(); + properties.setAuthUri(authURI); + properties.setUser("user"); + properties.setPassword("password"); + properties.setConnectionTimeoutInMilliseconds(3000); + properties.setReplyTimeoutInMilliseconds(3000); + properties.setMaxFailedEvents(2); + + RuntimeException exception = assertThrows(RuntimeException.class, properties::baseURL); + assertEquals("Is not a valid URL - "+authURI, exception.getMessage()); + } +} \ No newline at end of file diff --git a/src/test/java/org/bahmni/eventrouterservice/subscriber/bahmni/BahmniEventSubscriberTest.java b/src/test/java/org/bahmni/eventrouterservice/subscriber/bahmni/BahmniEventSubscriberTest.java index dd19476..743dff6 100644 --- a/src/test/java/org/bahmni/eventrouterservice/subscriber/bahmni/BahmniEventSubscriberTest.java +++ b/src/test/java/org/bahmni/eventrouterservice/subscriber/bahmni/BahmniEventSubscriberTest.java @@ -1,6 +1,5 @@ package org.bahmni.eventrouterservice.subscriber.bahmni; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.bahmni.eventrouterservice.publisher.common.exception.PublisherNotConfiguredException; @@ -8,22 +7,25 @@ import org.bahmni.eventrouterservice.publisher.gcp.GCPEventPublisherService; import org.bahmni.eventrouterservice.subscriber.common.exception.FailedToSubscribeException; import org.bahmni.eventrouterservice.subscriber.configuration.SubscriberConfiguration; +import org.bahmni.webclients.HttpClient; +import org.ict4h.atomfeed.client.domain.Event; +import org.ict4h.atomfeed.client.service.FeedClient; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.web.client.RestTemplate; import java.io.IOException; +import java.net.URI; import java.util.Collections; import java.util.List; import static org.bahmni.eventrouterservice.configuration.ServiceName.BAHMNI; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) class BahmniEventSubscriberTest { @@ -33,12 +35,16 @@ class BahmniEventSubscriberTest { @Mock private EventPublisherServiceFactory eventPublisherServiceFactory; @Mock - private RestTemplate restTemplate; + private HttpClient bahmniHttpClient; + @Mock + private AtomFeedClientProperties feedProperties; + @Mock + private AtomFeedClientFactory atomFeedClientFactory; private BahmniEventSubscriber bahmniEventSubscriber; @BeforeEach public void setup() { - bahmniEventSubscriber = new BahmniEventSubscriber(subscriberConfiguration, eventPublisherServiceFactory, restTemplate, new ObjectMapper()); + bahmniEventSubscriber = new BahmniEventSubscriber(subscriberConfiguration, eventPublisherServiceFactory, bahmniHttpClient, feedProperties, atomFeedClientFactory); } @Test @@ -50,70 +56,80 @@ public void givenScheduledOfSubscribing_whenSubscribing_thenSuccessfullyGetTheLi Mockito.verify(subscriberConfiguration, Mockito.times(1)).getSubscribersAsPerOrderOfSubscriptionFor(BAHMNI); } + @Test - public void givenScheduledOfSubscribing_whenSubscribing_thenSuccessfullyFetchRecordsForEachSubscription() { + public void givenScheduledOfSubscribing_whenSubscribing_thenSuccessfullyGetThePublisherToPublishEvents() { Mockito.when(subscriberConfiguration.getSubscribersAsPerOrderOfSubscriptionFor(BAHMNI)).thenReturn(defaultDescriptions()); - Mockito.when(restTemplate.getForObject("https://gorest.co.in/public/v2/users", List.class)).thenReturn(Collections.emptyList()); + Mockito.when(eventPublisherServiceFactory.getById("gcp-patient-registration")) + .thenReturn(mock(GCPEventPublisherService.class)); + Mockito.when(atomFeedClientFactory.get(any(), any())).thenReturn(mock(FeedClient.class)); bahmniEventSubscriber.run(); - Mockito.verify(restTemplate, Mockito.times(1)).getForObject("https://gorest.co.in/public/v2/users", List.class); + Mockito.verify(eventPublisherServiceFactory, Mockito.times(1)).getById("gcp-patient-registration"); } @Test - public void givenScheduledOfSubscribing_whenSubscribing_thenSuccessfullyGetThePublisherToPublishEvents() { + public void givenScheduledOfSubscribing_whenSubscribing_thenSuccessfullyInvokeProcessEvents() { Mockito.when(subscriberConfiguration.getSubscribersAsPerOrderOfSubscriptionFor(BAHMNI)).thenReturn(defaultDescriptions()); Mockito.when(eventPublisherServiceFactory.getById("gcp-patient-registration")) .thenReturn(mock(GCPEventPublisherService.class)); - Mockito.when(restTemplate.getForObject("https://gorest.co.in/public/v2/users", List.class)).thenReturn(defaultResponse()); + FeedClient feedClient = mock(FeedClient.class); + Mockito.when(atomFeedClientFactory.get(any(), any())).thenReturn(feedClient); bahmniEventSubscriber.run(); Mockito.verify(eventPublisherServiceFactory, Mockito.times(1)).getById("gcp-patient-registration"); + + Mockito.verify(feedClient, Mockito.times(defaultDescriptions().size())).processEvents(); } + @Test - public void givenScheduledOfSubscribing_whenSubscribing_thenSuccessfullyPublishEvents() { + public void givenScheduledOfSubscribing_whenSubscribing_thenFailedToGetPublisher() { Mockito.when(subscriberConfiguration.getSubscribersAsPerOrderOfSubscriptionFor(BAHMNI)).thenReturn(defaultDescriptions()); - GCPEventPublisherService publisherService = mock(GCPEventPublisherService.class); Mockito.when(eventPublisherServiceFactory.getById("gcp-patient-registration")) - .thenReturn(publisherService); - Mockito.when(restTemplate.getForObject("https://gorest.co.in/public/v2/users", List.class)).thenReturn(defaultResponse()); - - bahmniEventSubscriber.run(); - - String payload = "{\"id\":904244,\"name\":\"Dwaipayan Johar\",\"email\":\"dwaipayan_johar@erdman.name\",\"gender\":\"female\",\"status\":\"inactive\"}"; + .thenThrow(new PublisherNotConfiguredException("gcp-patient-registration")); - Mockito.verify(publisherService, Mockito.times(defaultDescriptions().size())).publish(payload, "gcp-patient-registration"); + assertThrows(FailedToSubscribeException.class, () -> bahmniEventSubscriber.run()); } + @Test - public void givenScheduledOfSubscribingAndNoRecordsFoundAgainstSubscription_whenSubscribing_thenDoNotPublishEvents() { - Mockito.when(subscriberConfiguration.getSubscribersAsPerOrderOfSubscriptionFor(BAHMNI)).thenReturn(defaultDescriptions()); + public void givenEvent_whenInvokingProcessEventOnWorker_thenGetAndPublishPatientFeed() { GCPEventPublisherService publisherService = mock(GCPEventPublisherService.class); - Mockito.when(restTemplate.getForObject("https://gorest.co.in/public/v2/users", List.class)).thenReturn(emptyResponse()); + String publisherId = "gcp-patient-registration"; + String baseURL = "http://openmrs:8080"; + String feedURI = "/openmrs/ws/rest/v1/patient/bf379289-62b7-47b3-ab7b-5186cb6fc46c?v=full"; + BahmniEventSubscriber.Worker worker = new BahmniEventSubscriber.Worker(bahmniHttpClient, baseURL, publisherService, publisherId); - bahmniEventSubscriber.run(); + Mockito.when(bahmniHttpClient.get(URI.create(baseURL+feedURI))).thenReturn(defaultResponse()); + Mockito.doNothing().when(publisherService).publish(defaultResponse(), publisherId); + + Event tempEvent = new Event("eventId", feedURI); + worker.process(tempEvent); - Mockito.verify(publisherService, Mockito.times(0)).publish(any(), any()); + verify(bahmniHttpClient, times(1)).get(URI.create(baseURL+feedURI)); + verify(publisherService, times(1)).publish(defaultResponse(), publisherId); } @Test - public void givenScheduledOfSubscribing_whenSubscribing_thenFailedToSubscribeEvents() { - Mockito.when(subscriberConfiguration.getSubscribersAsPerOrderOfSubscriptionFor(BAHMNI)).thenReturn(defaultDescriptions()); - Mockito.when(restTemplate.getForObject("https://gorest.co.in/public/v2/users", List.class)).thenThrow(new RuntimeException()); + public void givenEventAndGetPatientFeedIsThrowingError_whenInvokingProcessEventOnWorker_thenShouldNotPublishPatientFeed() { + GCPEventPublisherService publisherService = mock(GCPEventPublisherService.class); + String publisherId = "gcp-patient-registration"; + String baseURL = "http://openmrs:8080"; + String feedURI = "/openmrs/ws/rest/v1/patient/bf379289-62b7-47b3-ab7b-5186cb6fc46c?v=full"; + BahmniEventSubscriber.Worker worker = new BahmniEventSubscriber.Worker(bahmniHttpClient, baseURL, publisherService, publisherId); - assertThrows(FailedToSubscribeException.class, () -> bahmniEventSubscriber.run()); - } + Mockito.when(bahmniHttpClient.get(URI.create(baseURL+feedURI))).thenThrow(new RuntimeException()); - @Test - public void givenScheduledOfSubscribing_whenSubscribing_thenFailedToGetPublisher() { - Mockito.when(subscriberConfiguration.getSubscribersAsPerOrderOfSubscriptionFor(BAHMNI)).thenReturn(defaultDescriptions()); - Mockito.when(eventPublisherServiceFactory.getById("gcp-patient-registration")) - .thenThrow(new PublisherNotConfiguredException("gcp-patient-registration")); - Mockito.when(restTemplate.getForObject("https://gorest.co.in/public/v2/users", List.class)).thenReturn(defaultResponse()); + Event tempEvent = new Event("eventId", feedURI); + try { + worker.process(tempEvent); + }catch (RuntimeException e) {} - assertThrows(FailedToSubscribeException.class, () -> bahmniEventSubscriber.run()); + verify(bahmniHttpClient, times(1)).get(URI.create(baseURL+feedURI)); + verify(publisherService, times(0)).publish(defaultResponse(), publisherId); } private List defaultDescriptions() { @@ -136,8 +152,8 @@ private List defaultDescriptions( } } - private List defaultResponse() { - String json = """ + private String defaultResponse() { + return """ [ { "id": 904244, @@ -148,21 +164,5 @@ private List defaultResponse() { } ] """; - try { - return new ObjectMapper().readValue(json, List.class); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - } - - private List emptyResponse() { - String json = """ - [] - """; - try { - return new ObjectMapper().readValue(json, List.class); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } } } \ No newline at end of file diff --git a/src/test/java/org/bahmni/eventrouterservice/subscriber/configuration/SubscriberConfigurationTest.java b/src/test/java/org/bahmni/eventrouterservice/subscriber/configuration/SubscriberConfigurationTest.java index daf88c7..57afc22 100644 --- a/src/test/java/org/bahmni/eventrouterservice/subscriber/configuration/SubscriberConfigurationTest.java +++ b/src/test/java/org/bahmni/eventrouterservice/subscriber/configuration/SubscriberConfigurationTest.java @@ -36,16 +36,16 @@ public void givenInvalidDescriptionConfigurationFile_whenInstantiating_thenThrow public void givenInvalidScheduleConfigurationFile_whenInstantiating_thenThrowException() { String subscriberDescriptionConfigurationPath = "src/test/resources/subscriber-description-configuration.json"; - String subscriberScheduleConfigurationPath = "src/test/resources/subscriber-schedule-configuration-invalid.json"; + String subscriberScheduleConfigurationInvalidPath = "src/test/resources/subscriber-schedule-configuration-invalid.json"; FailedToLoadConfiguration exception = assertThrows(FailedToLoadConfiguration.class, - () -> new SubscriberConfiguration(subscriberDescriptionConfigurationPath, subscriberScheduleConfigurationPath, new ObjectMapper())); + () -> new SubscriberConfiguration(subscriberDescriptionConfigurationPath, subscriberScheduleConfigurationInvalidPath, new ObjectMapper())); assertEquals("Failed to load configuration file : src/test/resources/subscriber-schedule-configuration-invalid.json", exception.getMessage()); } @Test - public void givenConfigurationFile_whenGettingOrderedSubscription_thenGetOrderSubscriptionConfiguration() { + public void givenConfigurationFile_whenGettingOrderedSubscription_thenReturnOrderSubscriptionConfiguration() { String subscriberDescriptionConfigurationPath = "src/test/resources/subscriber-description-configuration.json"; String subscriberScheduleConfigurationPath = "src/test/resources/subscriber-schedule-configuration.json"; From 1be9bd816bb187477b0a18160e017984172a3bac Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Sat, 29 Apr 2023 10:12:58 +0530 Subject: [PATCH 02/11] 1. Refactoring packages --- .../eventrouterservice/configuration/ServiceName.java | 5 ----- .../org/bahmni/eventrouterservice/model/ServiceName.java | 5 +++++ .../{configuration => model}/Topic.java | 2 +- .../publisher/bahmni/BahmniEventPublisher.java | 2 +- .../publisher/bahmni/BahmniEventPublisherService.java | 2 +- .../publisher/configuration/PublisherConfiguration.java | 8 ++++---- .../EndpointNotConfiguredForPublisherException.java | 2 +- .../{common => }/exception/FailedToPublishException.java | 2 +- .../exception/PublisherNotConfiguredException.java | 2 +- .../TopicNotConfiguredForPublisherException.java | 2 +- .../publisher/gcp/GCPEventPublisher.java | 3 +-- .../publisher/gcp/GCPEventPublisherService.java | 4 ++-- .../{common => }/service/EventPublisherService.java | 2 +- .../service/EventPublisherServiceFactory.java | 4 ++-- .../subscriber/bahmni/BahmniEventSubscriber.java | 8 ++++---- .../subscriber/configuration/SubscriberConfiguration.java | 4 ++-- .../SubscriberTaskSchedulerConfiguration.java | 2 +- .../exception/FailedToSubscribeException.java | 2 +- .../subscriber/gcp/GCPEventSubscriber.java | 8 ++++---- .../publisher/bahmni/BahmniEventPublisherTest.java | 2 +- .../EndpointNotConfiguredForPublisherExceptionTest.java | 1 + .../common/exception/FailedToPublishExceptionTest.java | 1 + .../exception/PublisherNotConfiguredExceptionTest.java | 1 + .../TopicNotConfiguredForPublisherExceptionTest.java | 1 + .../common/service/EventPublisherServiceFactoryTest.java | 4 +++- .../configuration/PublisherConfigurationTest.java | 4 ++-- .../publisher/gcp/GCPEventPublisherServiceTest.java | 2 +- .../publisher/gcp/GCPEventPublisherTest.java | 2 +- .../subscriber/bahmni/BahmniEventSubscriberTest.java | 8 ++++---- .../common/exception/FailedToSubscribeExceptionTest.java | 1 + .../configuration/SubscriberConfigurationTest.java | 2 +- .../subscriber/gcp/GCPEventSubscriberTest.java | 6 +++--- 32 files changed, 55 insertions(+), 49 deletions(-) delete mode 100644 src/main/java/org/bahmni/eventrouterservice/configuration/ServiceName.java create mode 100644 src/main/java/org/bahmni/eventrouterservice/model/ServiceName.java rename src/main/java/org/bahmni/eventrouterservice/{configuration => model}/Topic.java (90%) rename src/main/java/org/bahmni/eventrouterservice/publisher/{common => }/exception/EndpointNotConfiguredForPublisherException.java (78%) rename src/main/java/org/bahmni/eventrouterservice/publisher/{common => }/exception/FailedToPublishException.java (84%) rename src/main/java/org/bahmni/eventrouterservice/publisher/{common => }/exception/PublisherNotConfiguredException.java (75%) rename src/main/java/org/bahmni/eventrouterservice/publisher/{common => }/exception/TopicNotConfiguredForPublisherException.java (77%) rename src/main/java/org/bahmni/eventrouterservice/publisher/{common => }/service/EventPublisherService.java (60%) rename src/main/java/org/bahmni/eventrouterservice/publisher/{common => }/service/EventPublisherServiceFactory.java (92%) rename src/main/java/org/bahmni/eventrouterservice/subscriber/{common => }/exception/FailedToSubscribeException.java (74%) diff --git a/src/main/java/org/bahmni/eventrouterservice/configuration/ServiceName.java b/src/main/java/org/bahmni/eventrouterservice/configuration/ServiceName.java deleted file mode 100644 index 16b2d41..0000000 --- a/src/main/java/org/bahmni/eventrouterservice/configuration/ServiceName.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.bahmni.eventrouterservice.configuration; - -public enum ServiceName { - BAHMNI, GCP -} diff --git a/src/main/java/org/bahmni/eventrouterservice/model/ServiceName.java b/src/main/java/org/bahmni/eventrouterservice/model/ServiceName.java new file mode 100644 index 0000000..cf82d03 --- /dev/null +++ b/src/main/java/org/bahmni/eventrouterservice/model/ServiceName.java @@ -0,0 +1,5 @@ +package org.bahmni.eventrouterservice.model; + +public enum ServiceName { + BAHMNI, GCP +} diff --git a/src/main/java/org/bahmni/eventrouterservice/configuration/Topic.java b/src/main/java/org/bahmni/eventrouterservice/model/Topic.java similarity index 90% rename from src/main/java/org/bahmni/eventrouterservice/configuration/Topic.java rename to src/main/java/org/bahmni/eventrouterservice/model/Topic.java index dd2991f..9e5691a 100644 --- a/src/main/java/org/bahmni/eventrouterservice/configuration/Topic.java +++ b/src/main/java/org/bahmni/eventrouterservice/model/Topic.java @@ -1,4 +1,4 @@ -package org.bahmni.eventrouterservice.configuration; +package org.bahmni.eventrouterservice.model; import com.fasterxml.jackson.annotation.JsonAutoDetect; diff --git a/src/main/java/org/bahmni/eventrouterservice/publisher/bahmni/BahmniEventPublisher.java b/src/main/java/org/bahmni/eventrouterservice/publisher/bahmni/BahmniEventPublisher.java index 357f759..ed92e70 100644 --- a/src/main/java/org/bahmni/eventrouterservice/publisher/bahmni/BahmniEventPublisher.java +++ b/src/main/java/org/bahmni/eventrouterservice/publisher/bahmni/BahmniEventPublisher.java @@ -1,6 +1,6 @@ package org.bahmni.eventrouterservice.publisher.bahmni; -import org.bahmni.eventrouterservice.publisher.common.exception.FailedToPublishException; +import org.bahmni.eventrouterservice.publisher.exception.FailedToPublishException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/org/bahmni/eventrouterservice/publisher/bahmni/BahmniEventPublisherService.java b/src/main/java/org/bahmni/eventrouterservice/publisher/bahmni/BahmniEventPublisherService.java index 4ddda44..0297166 100644 --- a/src/main/java/org/bahmni/eventrouterservice/publisher/bahmni/BahmniEventPublisherService.java +++ b/src/main/java/org/bahmni/eventrouterservice/publisher/bahmni/BahmniEventPublisherService.java @@ -1,6 +1,6 @@ package org.bahmni.eventrouterservice.publisher.bahmni; -import org.bahmni.eventrouterservice.publisher.common.service.EventPublisherService; +import org.bahmni.eventrouterservice.publisher.service.EventPublisherService; import org.bahmni.eventrouterservice.publisher.configuration.PublisherConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/org/bahmni/eventrouterservice/publisher/configuration/PublisherConfiguration.java b/src/main/java/org/bahmni/eventrouterservice/publisher/configuration/PublisherConfiguration.java index e027f96..1e05663 100644 --- a/src/main/java/org/bahmni/eventrouterservice/publisher/configuration/PublisherConfiguration.java +++ b/src/main/java/org/bahmni/eventrouterservice/publisher/configuration/PublisherConfiguration.java @@ -3,11 +3,11 @@ import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import org.bahmni.eventrouterservice.configuration.ServiceName; -import org.bahmni.eventrouterservice.configuration.Topic; +import org.bahmni.eventrouterservice.model.ServiceName; +import org.bahmni.eventrouterservice.model.Topic; import org.bahmni.eventrouterservice.exception.FailedToLoadConfiguration; -import org.bahmni.eventrouterservice.publisher.common.exception.EndpointNotConfiguredForPublisherException; -import org.bahmni.eventrouterservice.publisher.common.exception.TopicNotConfiguredForPublisherException; +import org.bahmni.eventrouterservice.publisher.exception.EndpointNotConfiguredForPublisherException; +import org.bahmni.eventrouterservice.publisher.exception.TopicNotConfiguredForPublisherException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; diff --git a/src/main/java/org/bahmni/eventrouterservice/publisher/common/exception/EndpointNotConfiguredForPublisherException.java b/src/main/java/org/bahmni/eventrouterservice/publisher/exception/EndpointNotConfiguredForPublisherException.java similarity index 78% rename from src/main/java/org/bahmni/eventrouterservice/publisher/common/exception/EndpointNotConfiguredForPublisherException.java rename to src/main/java/org/bahmni/eventrouterservice/publisher/exception/EndpointNotConfiguredForPublisherException.java index fe76caf..b602a8f 100644 --- a/src/main/java/org/bahmni/eventrouterservice/publisher/common/exception/EndpointNotConfiguredForPublisherException.java +++ b/src/main/java/org/bahmni/eventrouterservice/publisher/exception/EndpointNotConfiguredForPublisherException.java @@ -1,4 +1,4 @@ -package org.bahmni.eventrouterservice.publisher.common.exception; +package org.bahmni.eventrouterservice.publisher.exception; public class EndpointNotConfiguredForPublisherException extends RuntimeException { public EndpointNotConfiguredForPublisherException(String publisherId) { diff --git a/src/main/java/org/bahmni/eventrouterservice/publisher/common/exception/FailedToPublishException.java b/src/main/java/org/bahmni/eventrouterservice/publisher/exception/FailedToPublishException.java similarity index 84% rename from src/main/java/org/bahmni/eventrouterservice/publisher/common/exception/FailedToPublishException.java rename to src/main/java/org/bahmni/eventrouterservice/publisher/exception/FailedToPublishException.java index f09da2a..dd4e815 100644 --- a/src/main/java/org/bahmni/eventrouterservice/publisher/common/exception/FailedToPublishException.java +++ b/src/main/java/org/bahmni/eventrouterservice/publisher/exception/FailedToPublishException.java @@ -1,4 +1,4 @@ -package org.bahmni.eventrouterservice.publisher.common.exception; +package org.bahmni.eventrouterservice.publisher.exception; public class FailedToPublishException extends RuntimeException { public FailedToPublishException(String destination, Exception exception) { diff --git a/src/main/java/org/bahmni/eventrouterservice/publisher/common/exception/PublisherNotConfiguredException.java b/src/main/java/org/bahmni/eventrouterservice/publisher/exception/PublisherNotConfiguredException.java similarity index 75% rename from src/main/java/org/bahmni/eventrouterservice/publisher/common/exception/PublisherNotConfiguredException.java rename to src/main/java/org/bahmni/eventrouterservice/publisher/exception/PublisherNotConfiguredException.java index 48f70c8..d34634a 100644 --- a/src/main/java/org/bahmni/eventrouterservice/publisher/common/exception/PublisherNotConfiguredException.java +++ b/src/main/java/org/bahmni/eventrouterservice/publisher/exception/PublisherNotConfiguredException.java @@ -1,4 +1,4 @@ -package org.bahmni.eventrouterservice.publisher.common.exception; +package org.bahmni.eventrouterservice.publisher.exception; public class PublisherNotConfiguredException extends RuntimeException { public PublisherNotConfiguredException(String publisherId) { diff --git a/src/main/java/org/bahmni/eventrouterservice/publisher/common/exception/TopicNotConfiguredForPublisherException.java b/src/main/java/org/bahmni/eventrouterservice/publisher/exception/TopicNotConfiguredForPublisherException.java similarity index 77% rename from src/main/java/org/bahmni/eventrouterservice/publisher/common/exception/TopicNotConfiguredForPublisherException.java rename to src/main/java/org/bahmni/eventrouterservice/publisher/exception/TopicNotConfiguredForPublisherException.java index c7cd825..c9238ce 100644 --- a/src/main/java/org/bahmni/eventrouterservice/publisher/common/exception/TopicNotConfiguredForPublisherException.java +++ b/src/main/java/org/bahmni/eventrouterservice/publisher/exception/TopicNotConfiguredForPublisherException.java @@ -1,4 +1,4 @@ -package org.bahmni.eventrouterservice.publisher.common.exception; +package org.bahmni.eventrouterservice.publisher.exception; public class TopicNotConfiguredForPublisherException extends RuntimeException { public TopicNotConfiguredForPublisherException(String publisherId) { diff --git a/src/main/java/org/bahmni/eventrouterservice/publisher/gcp/GCPEventPublisher.java b/src/main/java/org/bahmni/eventrouterservice/publisher/gcp/GCPEventPublisher.java index 042a407..23bfbc1 100644 --- a/src/main/java/org/bahmni/eventrouterservice/publisher/gcp/GCPEventPublisher.java +++ b/src/main/java/org/bahmni/eventrouterservice/publisher/gcp/GCPEventPublisher.java @@ -1,7 +1,7 @@ package org.bahmni.eventrouterservice.publisher.gcp; import com.google.cloud.spring.pubsub.core.PubSubTemplate; -import org.bahmni.eventrouterservice.publisher.common.exception.FailedToPublishException; +import org.bahmni.eventrouterservice.publisher.exception.FailedToPublishException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -9,7 +9,6 @@ import org.springframework.stereotype.Component; import java.util.concurrent.CancellationException; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @ConditionalOnProperty( diff --git a/src/main/java/org/bahmni/eventrouterservice/publisher/gcp/GCPEventPublisherService.java b/src/main/java/org/bahmni/eventrouterservice/publisher/gcp/GCPEventPublisherService.java index 53fd8d5..de9fb3a 100644 --- a/src/main/java/org/bahmni/eventrouterservice/publisher/gcp/GCPEventPublisherService.java +++ b/src/main/java/org/bahmni/eventrouterservice/publisher/gcp/GCPEventPublisherService.java @@ -1,7 +1,7 @@ package org.bahmni.eventrouterservice.publisher.gcp; -import org.bahmni.eventrouterservice.configuration.Topic; -import org.bahmni.eventrouterservice.publisher.common.service.EventPublisherService; +import org.bahmni.eventrouterservice.model.Topic; +import org.bahmni.eventrouterservice.publisher.service.EventPublisherService; import org.bahmni.eventrouterservice.publisher.configuration.PublisherConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/org/bahmni/eventrouterservice/publisher/common/service/EventPublisherService.java b/src/main/java/org/bahmni/eventrouterservice/publisher/service/EventPublisherService.java similarity index 60% rename from src/main/java/org/bahmni/eventrouterservice/publisher/common/service/EventPublisherService.java rename to src/main/java/org/bahmni/eventrouterservice/publisher/service/EventPublisherService.java index e0cf2ad..80e4b6a 100644 --- a/src/main/java/org/bahmni/eventrouterservice/publisher/common/service/EventPublisherService.java +++ b/src/main/java/org/bahmni/eventrouterservice/publisher/service/EventPublisherService.java @@ -1,4 +1,4 @@ -package org.bahmni.eventrouterservice.publisher.common.service; +package org.bahmni.eventrouterservice.publisher.service; public interface EventPublisherService { void publish(String payload, String publisherId); diff --git a/src/main/java/org/bahmni/eventrouterservice/publisher/common/service/EventPublisherServiceFactory.java b/src/main/java/org/bahmni/eventrouterservice/publisher/service/EventPublisherServiceFactory.java similarity index 92% rename from src/main/java/org/bahmni/eventrouterservice/publisher/common/service/EventPublisherServiceFactory.java rename to src/main/java/org/bahmni/eventrouterservice/publisher/service/EventPublisherServiceFactory.java index f3c7bd1..4d2e8fd 100644 --- a/src/main/java/org/bahmni/eventrouterservice/publisher/common/service/EventPublisherServiceFactory.java +++ b/src/main/java/org/bahmni/eventrouterservice/publisher/service/EventPublisherServiceFactory.java @@ -1,7 +1,7 @@ -package org.bahmni.eventrouterservice.publisher.common.service; +package org.bahmni.eventrouterservice.publisher.service; import org.bahmni.eventrouterservice.publisher.bahmni.BahmniEventPublisherService; -import org.bahmni.eventrouterservice.publisher.common.exception.PublisherNotConfiguredException; +import org.bahmni.eventrouterservice.publisher.exception.PublisherNotConfiguredException; import org.bahmni.eventrouterservice.publisher.configuration.PublisherConfiguration; import org.bahmni.eventrouterservice.publisher.gcp.GCPEventPublisherService; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/BahmniEventSubscriber.java b/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/BahmniEventSubscriber.java index d8084da..9785f1c 100644 --- a/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/BahmniEventSubscriber.java +++ b/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/BahmniEventSubscriber.java @@ -2,10 +2,10 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.bahmni.eventrouterservice.configuration.ServiceName; -import org.bahmni.eventrouterservice.publisher.common.service.EventPublisherService; -import org.bahmni.eventrouterservice.publisher.common.service.EventPublisherServiceFactory; -import org.bahmni.eventrouterservice.subscriber.common.exception.FailedToSubscribeException; +import org.bahmni.eventrouterservice.model.ServiceName; +import org.bahmni.eventrouterservice.publisher.service.EventPublisherService; +import org.bahmni.eventrouterservice.publisher.service.EventPublisherServiceFactory; +import org.bahmni.eventrouterservice.subscriber.exception.FailedToSubscribeException; import org.bahmni.eventrouterservice.subscriber.configuration.SubscriberConfiguration; import org.bahmni.eventrouterservice.subscriber.configuration.SubscriberConfiguration.SubscriberDescription; import org.bahmni.webclients.HttpClient; diff --git a/src/main/java/org/bahmni/eventrouterservice/subscriber/configuration/SubscriberConfiguration.java b/src/main/java/org/bahmni/eventrouterservice/subscriber/configuration/SubscriberConfiguration.java index 2733733..2bba305 100644 --- a/src/main/java/org/bahmni/eventrouterservice/subscriber/configuration/SubscriberConfiguration.java +++ b/src/main/java/org/bahmni/eventrouterservice/subscriber/configuration/SubscriberConfiguration.java @@ -1,7 +1,7 @@ package org.bahmni.eventrouterservice.subscriber.configuration; -import org.bahmni.eventrouterservice.configuration.ServiceName; -import org.bahmni.eventrouterservice.configuration.Topic; +import org.bahmni.eventrouterservice.model.ServiceName; +import org.bahmni.eventrouterservice.model.Topic; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.core.type.TypeReference; diff --git a/src/main/java/org/bahmni/eventrouterservice/subscriber/configuration/SubscriberTaskSchedulerConfiguration.java b/src/main/java/org/bahmni/eventrouterservice/subscriber/configuration/SubscriberTaskSchedulerConfiguration.java index 9eec31a..e31749e 100644 --- a/src/main/java/org/bahmni/eventrouterservice/subscriber/configuration/SubscriberTaskSchedulerConfiguration.java +++ b/src/main/java/org/bahmni/eventrouterservice/subscriber/configuration/SubscriberTaskSchedulerConfiguration.java @@ -1,6 +1,6 @@ package org.bahmni.eventrouterservice.subscriber.configuration; -import org.bahmni.eventrouterservice.configuration.ServiceName; +import org.bahmni.eventrouterservice.model.ServiceName; import org.bahmni.eventrouterservice.subscriber.bahmni.BahmniEventSubscriber; import org.bahmni.eventrouterservice.subscriber.gcp.GCPEventSubscriber; import org.bahmni.eventrouterservice.subscriber.configuration.SubscriberConfiguration.SubscriberSchedule; diff --git a/src/main/java/org/bahmni/eventrouterservice/subscriber/common/exception/FailedToSubscribeException.java b/src/main/java/org/bahmni/eventrouterservice/subscriber/exception/FailedToSubscribeException.java similarity index 74% rename from src/main/java/org/bahmni/eventrouterservice/subscriber/common/exception/FailedToSubscribeException.java rename to src/main/java/org/bahmni/eventrouterservice/subscriber/exception/FailedToSubscribeException.java index 3b64651..a345f92 100644 --- a/src/main/java/org/bahmni/eventrouterservice/subscriber/common/exception/FailedToSubscribeException.java +++ b/src/main/java/org/bahmni/eventrouterservice/subscriber/exception/FailedToSubscribeException.java @@ -1,4 +1,4 @@ -package org.bahmni.eventrouterservice.subscriber.common.exception; +package org.bahmni.eventrouterservice.subscriber.exception; public class FailedToSubscribeException extends RuntimeException { public FailedToSubscribeException(Exception exception) { diff --git a/src/main/java/org/bahmni/eventrouterservice/subscriber/gcp/GCPEventSubscriber.java b/src/main/java/org/bahmni/eventrouterservice/subscriber/gcp/GCPEventSubscriber.java index dedb959..933eed1 100644 --- a/src/main/java/org/bahmni/eventrouterservice/subscriber/gcp/GCPEventSubscriber.java +++ b/src/main/java/org/bahmni/eventrouterservice/subscriber/gcp/GCPEventSubscriber.java @@ -1,9 +1,9 @@ package org.bahmni.eventrouterservice.subscriber.gcp; -import org.bahmni.eventrouterservice.configuration.ServiceName; -import org.bahmni.eventrouterservice.publisher.common.service.EventPublisherService; -import org.bahmni.eventrouterservice.publisher.common.service.EventPublisherServiceFactory; -import org.bahmni.eventrouterservice.subscriber.common.exception.FailedToSubscribeException; +import org.bahmni.eventrouterservice.model.ServiceName; +import org.bahmni.eventrouterservice.publisher.service.EventPublisherService; +import org.bahmni.eventrouterservice.publisher.service.EventPublisherServiceFactory; +import org.bahmni.eventrouterservice.subscriber.exception.FailedToSubscribeException; import org.bahmni.eventrouterservice.subscriber.configuration.SubscriberConfiguration; import com.google.cloud.spring.pubsub.core.PubSubTemplate; import com.google.cloud.spring.pubsub.support.AcknowledgeablePubsubMessage; diff --git a/src/test/java/org/bahmni/eventrouterservice/publisher/bahmni/BahmniEventPublisherTest.java b/src/test/java/org/bahmni/eventrouterservice/publisher/bahmni/BahmniEventPublisherTest.java index 415123f..3253b41 100644 --- a/src/test/java/org/bahmni/eventrouterservice/publisher/bahmni/BahmniEventPublisherTest.java +++ b/src/test/java/org/bahmni/eventrouterservice/publisher/bahmni/BahmniEventPublisherTest.java @@ -1,6 +1,6 @@ package org.bahmni.eventrouterservice.publisher.bahmni; -import org.bahmni.eventrouterservice.publisher.common.exception.FailedToPublishException; +import org.bahmni.eventrouterservice.publisher.exception.FailedToPublishException; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; diff --git a/src/test/java/org/bahmni/eventrouterservice/publisher/common/exception/EndpointNotConfiguredForPublisherExceptionTest.java b/src/test/java/org/bahmni/eventrouterservice/publisher/common/exception/EndpointNotConfiguredForPublisherExceptionTest.java index 431c64e..1ff0b59 100644 --- a/src/test/java/org/bahmni/eventrouterservice/publisher/common/exception/EndpointNotConfiguredForPublisherExceptionTest.java +++ b/src/test/java/org/bahmni/eventrouterservice/publisher/common/exception/EndpointNotConfiguredForPublisherExceptionTest.java @@ -1,5 +1,6 @@ package org.bahmni.eventrouterservice.publisher.common.exception; +import org.bahmni.eventrouterservice.publisher.exception.EndpointNotConfiguredForPublisherException; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/org/bahmni/eventrouterservice/publisher/common/exception/FailedToPublishExceptionTest.java b/src/test/java/org/bahmni/eventrouterservice/publisher/common/exception/FailedToPublishExceptionTest.java index 94b61ae..699ca95 100644 --- a/src/test/java/org/bahmni/eventrouterservice/publisher/common/exception/FailedToPublishExceptionTest.java +++ b/src/test/java/org/bahmni/eventrouterservice/publisher/common/exception/FailedToPublishExceptionTest.java @@ -1,5 +1,6 @@ package org.bahmni.eventrouterservice.publisher.common.exception; +import org.bahmni.eventrouterservice.publisher.exception.FailedToPublishException; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/src/test/java/org/bahmni/eventrouterservice/publisher/common/exception/PublisherNotConfiguredExceptionTest.java b/src/test/java/org/bahmni/eventrouterservice/publisher/common/exception/PublisherNotConfiguredExceptionTest.java index 5cddfe9..41e21ec 100644 --- a/src/test/java/org/bahmni/eventrouterservice/publisher/common/exception/PublisherNotConfiguredExceptionTest.java +++ b/src/test/java/org/bahmni/eventrouterservice/publisher/common/exception/PublisherNotConfiguredExceptionTest.java @@ -1,5 +1,6 @@ package org.bahmni.eventrouterservice.publisher.common.exception; +import org.bahmni.eventrouterservice.publisher.exception.PublisherNotConfiguredException; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/org/bahmni/eventrouterservice/publisher/common/exception/TopicNotConfiguredForPublisherExceptionTest.java b/src/test/java/org/bahmni/eventrouterservice/publisher/common/exception/TopicNotConfiguredForPublisherExceptionTest.java index 08dff16..5fe0c84 100644 --- a/src/test/java/org/bahmni/eventrouterservice/publisher/common/exception/TopicNotConfiguredForPublisherExceptionTest.java +++ b/src/test/java/org/bahmni/eventrouterservice/publisher/common/exception/TopicNotConfiguredForPublisherExceptionTest.java @@ -1,5 +1,6 @@ package org.bahmni.eventrouterservice.publisher.common.exception; +import org.bahmni.eventrouterservice.publisher.exception.TopicNotConfiguredForPublisherException; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/org/bahmni/eventrouterservice/publisher/common/service/EventPublisherServiceFactoryTest.java b/src/test/java/org/bahmni/eventrouterservice/publisher/common/service/EventPublisherServiceFactoryTest.java index 7bf7fd8..8c94a33 100644 --- a/src/test/java/org/bahmni/eventrouterservice/publisher/common/service/EventPublisherServiceFactoryTest.java +++ b/src/test/java/org/bahmni/eventrouterservice/publisher/common/service/EventPublisherServiceFactoryTest.java @@ -3,10 +3,12 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.bahmni.eventrouterservice.publisher.bahmni.BahmniEventPublisherService; -import org.bahmni.eventrouterservice.publisher.common.exception.PublisherNotConfiguredException; +import org.bahmni.eventrouterservice.publisher.exception.PublisherNotConfiguredException; import org.bahmni.eventrouterservice.publisher.configuration.PublisherConfiguration; import org.bahmni.eventrouterservice.publisher.configuration.PublisherConfiguration.PublisherDescription; import org.bahmni.eventrouterservice.publisher.gcp.GCPEventPublisherService; +import org.bahmni.eventrouterservice.publisher.service.EventPublisherService; +import org.bahmni.eventrouterservice.publisher.service.EventPublisherServiceFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; diff --git a/src/test/java/org/bahmni/eventrouterservice/publisher/configuration/PublisherConfigurationTest.java b/src/test/java/org/bahmni/eventrouterservice/publisher/configuration/PublisherConfigurationTest.java index 7303954..5d5651a 100644 --- a/src/test/java/org/bahmni/eventrouterservice/publisher/configuration/PublisherConfigurationTest.java +++ b/src/test/java/org/bahmni/eventrouterservice/publisher/configuration/PublisherConfigurationTest.java @@ -2,8 +2,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.bahmni.eventrouterservice.exception.FailedToLoadConfiguration; -import org.bahmni.eventrouterservice.publisher.common.exception.EndpointNotConfiguredForPublisherException; -import org.bahmni.eventrouterservice.publisher.common.exception.TopicNotConfiguredForPublisherException; +import org.bahmni.eventrouterservice.publisher.exception.EndpointNotConfiguredForPublisherException; +import org.bahmni.eventrouterservice.publisher.exception.TopicNotConfiguredForPublisherException; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/src/test/java/org/bahmni/eventrouterservice/publisher/gcp/GCPEventPublisherServiceTest.java b/src/test/java/org/bahmni/eventrouterservice/publisher/gcp/GCPEventPublisherServiceTest.java index b949b3c..2469689 100644 --- a/src/test/java/org/bahmni/eventrouterservice/publisher/gcp/GCPEventPublisherServiceTest.java +++ b/src/test/java/org/bahmni/eventrouterservice/publisher/gcp/GCPEventPublisherServiceTest.java @@ -1,6 +1,6 @@ package org.bahmni.eventrouterservice.publisher.gcp; -import org.bahmni.eventrouterservice.configuration.Topic; +import org.bahmni.eventrouterservice.model.Topic; import org.bahmni.eventrouterservice.publisher.configuration.PublisherConfiguration; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; diff --git a/src/test/java/org/bahmni/eventrouterservice/publisher/gcp/GCPEventPublisherTest.java b/src/test/java/org/bahmni/eventrouterservice/publisher/gcp/GCPEventPublisherTest.java index 761d13f..6210a00 100644 --- a/src/test/java/org/bahmni/eventrouterservice/publisher/gcp/GCPEventPublisherTest.java +++ b/src/test/java/org/bahmni/eventrouterservice/publisher/gcp/GCPEventPublisherTest.java @@ -1,7 +1,7 @@ package org.bahmni.eventrouterservice.publisher.gcp; import com.google.cloud.spring.pubsub.core.PubSubTemplate; -import org.bahmni.eventrouterservice.publisher.common.exception.FailedToPublishException; +import org.bahmni.eventrouterservice.publisher.exception.FailedToPublishException; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; diff --git a/src/test/java/org/bahmni/eventrouterservice/subscriber/bahmni/BahmniEventSubscriberTest.java b/src/test/java/org/bahmni/eventrouterservice/subscriber/bahmni/BahmniEventSubscriberTest.java index 743dff6..ccec8bf 100644 --- a/src/test/java/org/bahmni/eventrouterservice/subscriber/bahmni/BahmniEventSubscriberTest.java +++ b/src/test/java/org/bahmni/eventrouterservice/subscriber/bahmni/BahmniEventSubscriberTest.java @@ -2,10 +2,10 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import org.bahmni.eventrouterservice.publisher.common.exception.PublisherNotConfiguredException; -import org.bahmni.eventrouterservice.publisher.common.service.EventPublisherServiceFactory; +import org.bahmni.eventrouterservice.publisher.exception.PublisherNotConfiguredException; +import org.bahmni.eventrouterservice.publisher.service.EventPublisherServiceFactory; import org.bahmni.eventrouterservice.publisher.gcp.GCPEventPublisherService; -import org.bahmni.eventrouterservice.subscriber.common.exception.FailedToSubscribeException; +import org.bahmni.eventrouterservice.subscriber.exception.FailedToSubscribeException; import org.bahmni.eventrouterservice.subscriber.configuration.SubscriberConfiguration; import org.bahmni.webclients.HttpClient; import org.ict4h.atomfeed.client.domain.Event; @@ -22,7 +22,7 @@ import java.util.Collections; import java.util.List; -import static org.bahmni.eventrouterservice.configuration.ServiceName.BAHMNI; +import static org.bahmni.eventrouterservice.model.ServiceName.BAHMNI; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; diff --git a/src/test/java/org/bahmni/eventrouterservice/subscriber/common/exception/FailedToSubscribeExceptionTest.java b/src/test/java/org/bahmni/eventrouterservice/subscriber/common/exception/FailedToSubscribeExceptionTest.java index 2b78f8c..16c74e0 100644 --- a/src/test/java/org/bahmni/eventrouterservice/subscriber/common/exception/FailedToSubscribeExceptionTest.java +++ b/src/test/java/org/bahmni/eventrouterservice/subscriber/common/exception/FailedToSubscribeExceptionTest.java @@ -1,5 +1,6 @@ package org.bahmni.eventrouterservice.subscriber.common.exception; +import org.bahmni.eventrouterservice.subscriber.exception.FailedToSubscribeException; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/src/test/java/org/bahmni/eventrouterservice/subscriber/configuration/SubscriberConfigurationTest.java b/src/test/java/org/bahmni/eventrouterservice/subscriber/configuration/SubscriberConfigurationTest.java index 57afc22..987ec57 100644 --- a/src/test/java/org/bahmni/eventrouterservice/subscriber/configuration/SubscriberConfigurationTest.java +++ b/src/test/java/org/bahmni/eventrouterservice/subscriber/configuration/SubscriberConfigurationTest.java @@ -1,7 +1,7 @@ package org.bahmni.eventrouterservice.subscriber.configuration; import com.fasterxml.jackson.databind.ObjectMapper; -import org.bahmni.eventrouterservice.configuration.ServiceName; +import org.bahmni.eventrouterservice.model.ServiceName; import org.bahmni.eventrouterservice.exception.FailedToLoadConfiguration; import org.junit.jupiter.api.Test; diff --git a/src/test/java/org/bahmni/eventrouterservice/subscriber/gcp/GCPEventSubscriberTest.java b/src/test/java/org/bahmni/eventrouterservice/subscriber/gcp/GCPEventSubscriberTest.java index 5618ff9..05bdb66 100644 --- a/src/test/java/org/bahmni/eventrouterservice/subscriber/gcp/GCPEventSubscriberTest.java +++ b/src/test/java/org/bahmni/eventrouterservice/subscriber/gcp/GCPEventSubscriberTest.java @@ -7,8 +7,8 @@ import com.google.protobuf.ByteString; import com.google.pubsub.v1.PubsubMessage; import org.bahmni.eventrouterservice.publisher.bahmni.BahmniEventPublisherService; -import org.bahmni.eventrouterservice.publisher.common.service.EventPublisherServiceFactory; -import org.bahmni.eventrouterservice.subscriber.common.exception.FailedToSubscribeException; +import org.bahmni.eventrouterservice.publisher.service.EventPublisherServiceFactory; +import org.bahmni.eventrouterservice.subscriber.exception.FailedToSubscribeException; import org.bahmni.eventrouterservice.subscriber.configuration.SubscriberConfiguration; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -22,7 +22,7 @@ import java.util.List; import java.util.concurrent.CompletableFuture; -import static org.bahmni.eventrouterservice.configuration.ServiceName.GCP; +import static org.bahmni.eventrouterservice.model.ServiceName.GCP; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.*; From 5f6646662a5d7c967cca79bb43dcace8eda57d64 Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Mon, 1 May 2023 22:21:00 +0530 Subject: [PATCH 03/11] 1. Refactor Standardized endpoint and url terminology --- .../bahmni/AtomFeedClientConfiguration.java | 2 +- .../bahmni/AtomFeedClientFactory.java | 6 +-- .../bahmni/AtomFeedClientProperties.java | 16 +------- .../bahmni/BahmniEventSubscriber.java | 2 +- src/main/resources/application.yaml | 9 +++-- .../bahmni/AtomFeedClientPropertiesTest.java | 39 ------------------- .../subscriber-description-configuration.json | 4 +- 7 files changed, 14 insertions(+), 64 deletions(-) delete mode 100644 src/test/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientPropertiesTest.java diff --git a/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientConfiguration.java b/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientConfiguration.java index 746ed8e..5d3fc58 100644 --- a/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientConfiguration.java +++ b/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientConfiguration.java @@ -23,7 +23,7 @@ public AtomFeedSpringTransactionSupport atomFeedSpringTransactionSupport(Platfor @Bean public HttpClient bahmniHttpClient(AtomFeedClientProperties feedProperties) { - ConnectionDetails connectionDetails = new ConnectionDetails(feedProperties.getAuthUri() + ConnectionDetails connectionDetails = new ConnectionDetails(feedProperties.getAuthUrl() , feedProperties.getUser(), feedProperties.getPassword(), feedProperties.getConnectionTimeoutInMilliseconds(), feedProperties.getReplyTimeoutInMilliseconds()); return new org.bahmni.webclients.HttpClient(connectionDetails, diff --git a/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientFactory.java b/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientFactory.java index 2e95497..861442e 100755 --- a/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientFactory.java +++ b/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientFactory.java @@ -25,11 +25,11 @@ public class AtomFeedClientFactory { private final HttpClient bahmniHttpClient; private final AtomFeedClientProperties feedProperties; - public FeedClient get(String feedURI, + public FeedClient get(String feedEndpoint, EventWorker eventWorker) { - ClientCookies cookies = bahmniHttpClient.getCookies(URI.create(feedProperties.getAuthUri())); + ClientCookies cookies = bahmniHttpClient.getCookies(URI.create(feedProperties.getAuthUrl())); AllFeeds allFeeds = new AllFeeds(atomFeedProperties, cookies); return new AtomFeedClient(allFeeds, allMarkersJdbc, failedEventsJdbc, - atomFeedProperties, atomFeedSpringTransactionSupport, URI.create(feedURI), eventWorker); + atomFeedProperties, atomFeedSpringTransactionSupport, URI.create(feedProperties.getBaseUrl() + feedEndpoint), eventWorker); } } diff --git a/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientProperties.java b/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientProperties.java index 8ecb2d3..7f210df 100644 --- a/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientProperties.java +++ b/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientProperties.java @@ -1,30 +1,18 @@ package org.bahmni.eventrouterservice.subscriber.bahmni; -import lombok.AllArgsConstructor; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; -import java.net.MalformedURLException; -import java.net.URL; - @Data @Configuration @ConfigurationProperties(prefix = "bahmni") public class AtomFeedClientProperties { - private String authUri; + private String authUrl; private String user; private String password; private int connectionTimeoutInMilliseconds; private int replyTimeoutInMilliseconds; private int maxFailedEvents; - - public String baseURL() { - try { - URL openMRSAuthURL = new URL(authUri); - return String.format("%s://%s", openMRSAuthURL.getProtocol(), openMRSAuthURL.getAuthority()); - } catch (MalformedURLException e) { - throw new RuntimeException("Is not a valid URL - " + authUri); - } - } + private String baseUrl; } \ No newline at end of file diff --git a/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/BahmniEventSubscriber.java b/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/BahmniEventSubscriber.java index 9785f1c..18a2d55 100644 --- a/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/BahmniEventSubscriber.java +++ b/src/main/java/org/bahmni/eventrouterservice/subscriber/bahmni/BahmniEventSubscriber.java @@ -39,7 +39,7 @@ public void run() { EventPublisherService publisherService = eventPublisherServiceFactory.getById(subscriber.getPublisherId()); Worker newWorker = new Worker(bahmniHttpClient, - feedProperties.baseURL(), + feedProperties.getBaseUrl(), publisherService, subscriber.getPublisherId()); diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index d0422bb..b98c09a 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -27,19 +27,20 @@ subscriber-configuration-file: ${SUBSCRIBER_CONFIGURATION_FILE_LOCATION} subscriber-schedule-configuration-file: ${SUBSCRIBER_SCHEDULE_CONFIGURATION_FILE_LOCATION} bahmni: - maxFailedEvents: ${MAX_FAILED_EVENTS:1} - authUri: http://${OPENMRS_HOST}:${OPENMRS_PORT}/openmrs/ws/rest/v1/session + baseUrl: http://${OPENMRS_HOST}:${OPENMRS_PORT} + authUrl: ${bahmni.baseUrl}/openmrs/ws/rest/v1/session user: ${OPENMRS_ATOMFEED_USER} password: ${OPENMRS_ATOMFEED_PASSWORD} connectionTimeoutInMilliseconds: ${CONNECTION_TIMEOUT_IN_MILLISECONDS} replyTimeoutInMilliseconds: ${REPLY_TIMEOUT_IN_MILLISECONDS} + maxFailedEvents: ${MAX_FAILED_EVENTS:1} logging: level: - org: INFO + root: ${LOGGING_LEVEL:INFO} management: endpoints: web: exposure: - include: "*" \ No newline at end of file + include: health,scheduledtasks,liquibase,metrics \ No newline at end of file diff --git a/src/test/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientPropertiesTest.java b/src/test/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientPropertiesTest.java deleted file mode 100644 index 41992a3..0000000 --- a/src/test/java/org/bahmni/eventrouterservice/subscriber/bahmni/AtomFeedClientPropertiesTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.bahmni.eventrouterservice.subscriber.bahmni; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; - -class AtomFeedClientPropertiesTest { - - @Test - public void giveValidAuthURL_whenGettingBaseURL_thenReturnBaseUrlFromAuthURI() { - String authURI = "http://openmrs:8080/openmrs/ws/rest/v1/session"; - - AtomFeedClientProperties properties = new AtomFeedClientProperties(); - properties.setAuthUri(authURI); - properties.setUser("user"); - properties.setPassword("password"); - properties.setConnectionTimeoutInMilliseconds(3000); - properties.setReplyTimeoutInMilliseconds(3000); - properties.setMaxFailedEvents(2); - - assertEquals("http://openmrs:8080", properties.baseURL()); - } - - @Test - public void giveInValidAuthURL_whenGettingBaseURL_thenThrowRuntimeException() { - String authURI = "openmrs:8080/openmrs/ws/rest/v1/session"; - - AtomFeedClientProperties properties = new AtomFeedClientProperties(); - properties.setAuthUri(authURI); - properties.setUser("user"); - properties.setPassword("password"); - properties.setConnectionTimeoutInMilliseconds(3000); - properties.setReplyTimeoutInMilliseconds(3000); - properties.setMaxFailedEvents(2); - - RuntimeException exception = assertThrows(RuntimeException.class, properties::baseURL); - assertEquals("Is not a valid URL - "+authURI, exception.getMessage()); - } -} \ No newline at end of file diff --git a/src/test/resources/subscriber-description-configuration.json b/src/test/resources/subscriber-description-configuration.json index 5e19f08..a655da2 100644 --- a/src/test/resources/subscriber-description-configuration.json +++ b/src/test/resources/subscriber-description-configuration.json @@ -12,7 +12,7 @@ { "source": { "serviceName": "BAHMNI", - "endpoint": "https://gorest.co.in/public/v2/users/updation" + "endpoint": "/public/v2/users/updation" }, "orderOfSubscription": 2, "publisherId": "gcp-patient-updation" @@ -20,7 +20,7 @@ { "source": { "serviceName": "BAHMNI", - "endpoint": "https://gorest.co.in/public/v2/users" + "endpoint": "/public/v2/users" }, "orderOfSubscription": 1, "publisherId": "gcp-patient-registration" From 8082f7794ea78794d08f076298621086df99957e Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Tue, 2 May 2023 16:57:55 +0530 Subject: [PATCH 04/11] 1. Updated README from patient registration event --- README.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index a5a47e6..15aa4f9 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,16 @@ # event-router-service -Event router service will be responsible for routing the events from Bhamni to external system and vice versa. +Event router service routes the events from Bhamni to external system and vice versa. +As of now it supports routing the message from Bahmni to GCP Pub sub and GCP pub sub to Bahmni. +Configuration has to be provided both as an environment variable and through configuration files. -As of now it supports routing the message from Bahmni to GCP Pub sub and GCP pub sub to Bahmni. -We can incrementally add the support for external systems. - -Configuration has to be provided both environment variable and through external files. +Subscription from bahmni Run test using below command: mvn clean install Run Application using below command: -mvn spring-boot:run -Dspring-boot.run.jvmArguments="-DGCP_PUB_SUB_ENABLED=true -DGCP_PROJECT_ID= -DGCP_CREDENTIALS_FILE_LOCATION=.json -DPUBLISHER_CONFIGURATION_FILE_LOCATION=.json -DSUBSCRIBER_CONFIGURATION_FILE_LOCATION=.json -DSUBSCRIBER_SCHEDULE_CONFIGURATION_FILE_LOCATION=.json" +mvn spring-boot:run -Dspring-boot.run.jvmArguments="-DGCP_PUB_SUB_ENABLED=true -DGCP_PROJECT_ID= -DGCP_CREDENTIALS_FILE_LOCATION=.json -DPUBLISHER_CONFIGURATION_FILE_LOCATION=.json -DSUBSCRIBER_CONFIGURATION_FILE_LOCATION=.json -DSUBSCRIBER_SCHEDULE_CONFIGURATION_FILE_LOCATION=.json -DEVENT_ROUTER_DB_HOST=http://localhost -DEVENT_ROUTER_DB_PORT=3306 -DEVENT_ROUTER_DB_USERNAME=event_router_user -DEVENT_ROUTER_DB_PASSWORD=passw0rd -DEVENT_ROUTER_DB_NAME=event_router -DOPENMRS_HOST=localhost -DOPENMRS_PORT=8080 -DOPENMRS_ATOMFEED_USER=admin -DOPENMRS_ATOMFEED_PASSWORD=Admin123 -DMAX_FAILED_EVENTS=1 -DCONNECTION_TIMEOUT_IN_MILLISECONDS=5000 -DREPLY_TIMEOUT_IN_MILLISECONDS=5000 -DLOGGING_LEVEL=INFO" sample publisher-description-configuration: @@ -51,7 +50,7 @@ sample subscriber-description-configuration.json: { "source": { "serviceName": "BAHMNI", - "endpoint": "https://gorest.co.in/public/v2/users" + "endpoint": "/openmrs/ws/atomfeed/patient/recent" }, "orderOfSubscription": 1, "publisherId": "gcp-patient-registration" From 52dc4eb45670cc22dedd18a1b7d3ab2e39382984 Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Fri, 5 May 2023 17:46:31 +0530 Subject: [PATCH 05/11] [Ritesh/Umair] Added github action workflow file --- .github/workflows/deploy_publish.yaml | 50 +++++++++++++++++++++ .github/workflows/validate_pull_request.yml | 20 +++++++++ 2 files changed, 70 insertions(+) create mode 100644 .github/workflows/deploy_publish.yaml create mode 100644 .github/workflows/validate_pull_request.yml diff --git a/.github/workflows/deploy_publish.yaml b/.github/workflows/deploy_publish.yaml new file mode 100644 index 0000000..3971076 --- /dev/null +++ b/.github/workflows/deploy_publish.yaml @@ -0,0 +1,50 @@ +name: Build and Publish +on: + push: + branches: + - Bahmni-IPD-master + - patient_registration + paths-ignore: + - "**.md" + workflow_dispatch: + +jobs: + Trivy: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + - name: Trivy Scan + run: | + wget -q https://raw.githubusercontent.com/Bahmni/bahmni-infra-utils/main/trivy_scan.sh && chmod +x trivy_scan.sh + ./trivy_scan.sh + rm trivy_scan.sh + build-publish-docker: + name: Build & Publish Docker Image + runs-on: ubuntu-20.04 + needs: Trivy + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-java@v3 + with: + distribution: 'corretto' + java-version: '17' + - name: Build & Test + run: ./mvnw clean install + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - name: Login to DockerHub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_HUB_USERNAME }} + password: ${{ secrets.DOCKER_HUB_TOKEN }} + - name: Docker Build and push + uses: docker/build-push-action@v3 + with: + context: . + platforms: linux/amd64,linux/arm64 + file: Dockerfile + push: true + tags: bahmni/event-router-service:ipd-${{ github.run_number }}, bahmni/event-router-service:ipd \ No newline at end of file diff --git a/.github/workflows/validate_pull_request.yml b/.github/workflows/validate_pull_request.yml new file mode 100644 index 0000000..cfd7f15 --- /dev/null +++ b/.github/workflows/validate_pull_request.yml @@ -0,0 +1,20 @@ +name: A workflow to validate PRs + +on: + pull_request: + branches: [ Bahmni-IPD-master ] + +jobs: + build: + + runs-on: ubuntu-20.04 + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js 14.x + uses: actions/setup-node@v1 + with: + node-version: '14.x' + - run: npm install + - run: npm test + - run: npm run build \ No newline at end of file From 6b9bb5e4f36ab0ed17611ca66b3f9c9b68b6dcc9 Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Fri, 5 May 2023 17:56:50 +0530 Subject: [PATCH 06/11] [Ritesh/Umair] Updating library version for fixing vulnerability. --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 18f1af8..0047323 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 3.0.5 + 3.0.6 org.bahmni @@ -84,7 +84,7 @@ commons-io commons-io - 2.4 + 2.7 commons-lang From 1051e4079efaa0dd478c5eec9f5b955aef91b3e8 Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Fri, 5 May 2023 18:09:04 +0530 Subject: [PATCH 07/11] [Ritesh/Umair] ignoring snakeyaml vulnerability in trivy. --- .trivyignore | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .trivyignore diff --git a/.trivyignore b/.trivyignore new file mode 100644 index 0000000..40df1f2 --- /dev/null +++ b/.trivyignore @@ -0,0 +1,3 @@ +# Ignoring snakeyaml dependency 1.33 which is critical vulnerability because liquibase-core is using that. +# Even latest version of liquibase-core that is 4.21 as of now is also using this. +CVE-2022-1471 \ No newline at end of file From 1177703a3a389bd5120263f66c3ee92a2be4c829 Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Fri, 5 May 2023 18:21:45 +0530 Subject: [PATCH 08/11] [Ritesh/Umair] Added workflow trigger --- .github/workflows/deploy_publish.yaml | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy_publish.yaml b/.github/workflows/deploy_publish.yaml index 3971076..15d04b8 100644 --- a/.github/workflows/deploy_publish.yaml +++ b/.github/workflows/deploy_publish.yaml @@ -47,4 +47,26 @@ jobs: platforms: linux/amd64,linux/arm64 file: Dockerfile push: true - tags: bahmni/event-router-service:ipd-${{ github.run_number }}, bahmni/event-router-service:ipd \ No newline at end of file + tags: bahmni/event-router-service:ipd-${{ github.run_number }}, bahmni/event-router-service:ipd + + trigger-workflow: + name: Trigger workflow to deploy to docker env + needs: + - Trivy + - build-publish-docker + runs-on: ubuntu-latest + env: + ORG_NAME: cureinternational + REPOSITORY_NAME: cure-bahmni-docker + EVENT_TYPE: bahmni-ipd-event-router-service-event + steps: + - name: Create repository_dispatch + run: | + trigger_result=$(curl -s -o trigger_response.txt -w "%{http_code}" -X POST -H "Accept: application/vnd.github.v3+json" -H 'authorization: Bearer ${{ secrets.BAHMNI_PAT }}' https://api.github.com/repos/${ORG_NAME}/${REPOSITORY_NAME}/dispatches -d '{"event_type":"'"${EVENT_TYPE}"'"}') + if [ $trigger_result == 204 ];then + echo "Trigger to $ORG_NAME/$REPOSITORY_NAME Success" + else + echo "Trigger to $ORG_NAME/$REPOSITORY_NAME Failed" + cat trigger_response.txt + exit 1 + fi \ No newline at end of file From f063909a30d891d3c1da04706795e1b7fb5b0c97 Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Fri, 5 May 2023 19:32:22 +0530 Subject: [PATCH 09/11] [Ritesh/Umair] Changing workflow trigger --- .github/workflows/deploy_publish.yaml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deploy_publish.yaml b/.github/workflows/deploy_publish.yaml index 15d04b8..4706e9c 100644 --- a/.github/workflows/deploy_publish.yaml +++ b/.github/workflows/deploy_publish.yaml @@ -52,17 +52,15 @@ jobs: trigger-workflow: name: Trigger workflow to deploy to docker env needs: - - Trivy - build-publish-docker + - Trivy runs-on: ubuntu-latest env: - ORG_NAME: cureinternational - REPOSITORY_NAME: cure-bahmni-docker EVENT_TYPE: bahmni-ipd-event-router-service-event steps: - name: Create repository_dispatch run: | - trigger_result=$(curl -s -o trigger_response.txt -w "%{http_code}" -X POST -H "Accept: application/vnd.github.v3+json" -H 'authorization: Bearer ${{ secrets.BAHMNI_PAT }}' https://api.github.com/repos/${ORG_NAME}/${REPOSITORY_NAME}/dispatches -d '{"event_type":"'"${EVENT_TYPE}"'"}') + trigger_result=$(curl -s -o trigger_response.txt -w "%{http_code}" -X POST -H "Accept: application/vnd.github.v3+json" -H 'authorization: Bearer ${{ secrets.BAHMNI_PAT }}' https://api.github.com/repos/${{ secrets.IPD_ORG_NAME }}/${{ secrets.IPD_REPOSITORY_NAME }}/dispatches -d '{"event_type":"'"${EVENT_TYPE}"'"}') if [ $trigger_result == 204 ];then echo "Trigger to $ORG_NAME/$REPOSITORY_NAME Success" else From 3d244320b7cc5ee3e8564c439d48bb6cda0d9a47 Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Fri, 5 May 2023 19:39:19 +0530 Subject: [PATCH 10/11] [Ritesh/Umair] Updating workflow trigger --- .github/workflows/deploy_publish.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy_publish.yaml b/.github/workflows/deploy_publish.yaml index 4706e9c..ac2cfa2 100644 --- a/.github/workflows/deploy_publish.yaml +++ b/.github/workflows/deploy_publish.yaml @@ -62,9 +62,9 @@ jobs: run: | trigger_result=$(curl -s -o trigger_response.txt -w "%{http_code}" -X POST -H "Accept: application/vnd.github.v3+json" -H 'authorization: Bearer ${{ secrets.BAHMNI_PAT }}' https://api.github.com/repos/${{ secrets.IPD_ORG_NAME }}/${{ secrets.IPD_REPOSITORY_NAME }}/dispatches -d '{"event_type":"'"${EVENT_TYPE}"'"}') if [ $trigger_result == 204 ];then - echo "Trigger to $ORG_NAME/$REPOSITORY_NAME Success" + echo "Trigger Success" else - echo "Trigger to $ORG_NAME/$REPOSITORY_NAME Failed" + echo "Trigger Failed" cat trigger_response.txt exit 1 fi \ No newline at end of file From be707b38a00f9b49c51d3459f9519d6b2b0d61cc Mon Sep 17 00:00:00 2001 From: Ritesh Ghiya Date: Mon, 8 May 2023 15:59:28 +0530 Subject: [PATCH 11/11] [Ritesh/Umair] Updating PAT --- .github/workflows/deploy_publish.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy_publish.yaml b/.github/workflows/deploy_publish.yaml index ac2cfa2..8fb0dfc 100644 --- a/.github/workflows/deploy_publish.yaml +++ b/.github/workflows/deploy_publish.yaml @@ -60,7 +60,7 @@ jobs: steps: - name: Create repository_dispatch run: | - trigger_result=$(curl -s -o trigger_response.txt -w "%{http_code}" -X POST -H "Accept: application/vnd.github.v3+json" -H 'authorization: Bearer ${{ secrets.BAHMNI_PAT }}' https://api.github.com/repos/${{ secrets.IPD_ORG_NAME }}/${{ secrets.IPD_REPOSITORY_NAME }}/dispatches -d '{"event_type":"'"${EVENT_TYPE}"'"}') + trigger_result=$(curl -s -o trigger_response.txt -w "%{http_code}" -X POST -H "Accept: application/vnd.github.v3+json" -H 'authorization: Bearer ${{ secrets.IPD_PAT }}' https://api.github.com/repos/${{ secrets.IPD_ORG_NAME }}/${{ secrets.IPD_REPOSITORY_NAME }}/dispatches -d '{"event_type":"'"${EVENT_TYPE}"'"}') if [ $trigger_result == 204 ];then echo "Trigger Success" else