From d8056e04a7d5571e5d9ec1661c7769bcba50aaaf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Vicen=C3=ADkov=C3=A1=20Jitka?=
 <Jitka.Vicenikova@partners.cz>
Date: Sun, 23 Apr 2023 10:36:40 +0200
Subject: [PATCH] Send notifications from application module

---
 .../cz/muni/pa165/config/ServiceConfig.java   |  6 +++
 .../pa165/service/ApplicationService.java     | 43 ++++++++++++++++---
 .../pa165/service/ApplicationServiceTest.java |  4 +-
 .../muni/pa165/facade/NotificationFacade.java |  6 ++-
 .../pa165/rest/NotificationController.java    |  5 ++-
 .../src/main/resources/application.properties |  1 -
 6 files changed, 53 insertions(+), 12 deletions(-)

diff --git a/application/src/main/java/cz/muni/pa165/config/ServiceConfig.java b/application/src/main/java/cz/muni/pa165/config/ServiceConfig.java
index e1616ef..9113f55 100644
--- a/application/src/main/java/cz/muni/pa165/config/ServiceConfig.java
+++ b/application/src/main/java/cz/muni/pa165/config/ServiceConfig.java
@@ -1,8 +1,10 @@
 package cz.muni.pa165.config;
 
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
+import org.springframework.web.client.RestTemplate;
 
 /**
  * @author Michal Badin
@@ -11,4 +13,8 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
 @ComponentScan
 @EnableTransactionManagement
 public class ServiceConfig {
+    @Bean
+    public RestTemplate restTemplate() {
+        return new RestTemplate();
+    }
 }
\ No newline at end of file
diff --git a/application/src/main/java/cz/muni/pa165/service/ApplicationService.java b/application/src/main/java/cz/muni/pa165/service/ApplicationService.java
index bdb6555..8061617 100644
--- a/application/src/main/java/cz/muni/pa165/service/ApplicationService.java
+++ b/application/src/main/java/cz/muni/pa165/service/ApplicationService.java
@@ -4,12 +4,16 @@ import cz.muni.pa165.data.enums.ApplicationStatusEnum;
 import cz.muni.pa165.data.model.Application;
 import cz.muni.pa165.data.repository.ApplicationRepository;
 import cz.muni.pa165.exceptions.ResourceNotFoundException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.client.RestClientException;
+import org.springframework.web.client.RestTemplate;
 
 import java.time.LocalDate;
 import java.util.HashMap;
@@ -22,12 +26,18 @@ import java.util.Optional;
  */
 @Service
 public class ApplicationService {
+    private static final Logger log = LoggerFactory.getLogger(ApplicationService.class);
+    private static final String NOTIFICATION_MODULE_URL_NEW = "http://localhost:8083/notification/application/new";
+    private static final String NOTIFICATION_MODULE_URL_STATUS = "http://localhost:8083/notification/application/status";
+    private static final List<String> NOTIFICATION_RECEIVERS = List.of("jitka.vicenikova@gmail.com");
 
     private final ApplicationRepository applicationRepository;
+    private final RestTemplate restTemplate;
 
     @Autowired
-    public ApplicationService(ApplicationRepository applicationRepository) {
+    public ApplicationService(ApplicationRepository applicationRepository, RestTemplate restTemplate) {
         this.applicationRepository = applicationRepository;
+        this.restTemplate = restTemplate;
     }
 
     @Transactional(readOnly = true)
@@ -38,7 +48,16 @@ public class ApplicationService {
     public Application create(Application application) {
         application.setFillingOutDate(LocalDate.now());
         application.setStatus(ApplicationStatusEnum.PENDING);
-        return applicationRepository.save(application);
+
+        var savedApplication = applicationRepository.save(application);
+
+        try {
+            sendPostRequest(savedApplication, NOTIFICATION_MODULE_URL_NEW);
+        } catch (RestClientException | IllegalArgumentException e) {
+            log.debug(String.format("The notification module is not reachable on the URL: %s", NOTIFICATION_MODULE_URL_NEW));
+        }
+
+        return savedApplication;
     }
 
     @Transactional(readOnly = true)
@@ -56,17 +75,27 @@ public class ApplicationService {
 
         applicationFromDb.get().setStatus(applicationStatusEnum);
 
-        return applicationRepository.save(applicationFromDb.get());
+        var savedApplication = applicationRepository.save(applicationFromDb.get());
+
+        if (savedApplication.getStatus() != ApplicationStatusEnum.PENDING) {
+            try {
+                sendPostRequest(savedApplication, NOTIFICATION_MODULE_URL_STATUS);
+            } catch (RestClientException | IllegalArgumentException e) {
+                log.debug(String.format("The notification module is not reachable on the URL: %s", NOTIFICATION_MODULE_URL_NEW));
+            }
+        }
+
+        return savedApplication;
     }
 
-   /* private void sendNewApplicationPostRequest(Application application) {
+    private void sendPostRequest(Application application, String url) {
         Map<String, Object> notification = new HashMap<>();
-        notification.put("carComponent", component);
+        notification.put("application", application);
         notification.put("receivers", NOTIFICATION_RECEIVERS);
 
         HttpHeaders headers = new HttpHeaders();
         headers.setContentType(MediaType.APPLICATION_JSON);
         HttpEntity<Map<String, Object>> request = new HttpEntity<>(notification, headers);
-        restTemplate.postForObject(NOTIFICATION_MODULE_URL, request, String.class);
-    }*/
+        restTemplate.postForObject(url, request, String.class);
+    }
 }
diff --git a/application/src/test/java/cz/muni/pa165/service/ApplicationServiceTest.java b/application/src/test/java/cz/muni/pa165/service/ApplicationServiceTest.java
index c2bd848..4bfd428 100644
--- a/application/src/test/java/cz/muni/pa165/service/ApplicationServiceTest.java
+++ b/application/src/test/java/cz/muni/pa165/service/ApplicationServiceTest.java
@@ -6,6 +6,7 @@ import cz.muni.pa165.data.repository.ApplicationRepository;
 import cz.muni.pa165.exceptions.ResourceNotFoundException;
 import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
+import org.springframework.web.client.RestTemplate;
 
 import java.time.LocalDate;
 import java.util.Optional;
@@ -16,7 +17,8 @@ import static org.mockito.Mockito.when;
 
 class ApplicationServiceTest {
     ApplicationRepository applicationRepository = Mockito.mock(ApplicationRepository.class);
-    ApplicationService service = new ApplicationService(applicationRepository);
+    RestTemplate restTemplate = Mockito.mock(RestTemplate.class);
+    ApplicationService service = new ApplicationService(applicationRepository, restTemplate);
     Application application = new Application(ApplicationStatusEnum.ACCEPTED, "John", "Doe",
             LocalDate.now().minusYears(20), "john.doe@aaa.com", LocalDate.now());
 
diff --git a/notification/src/main/java/cz/muni/pa165/facade/NotificationFacade.java b/notification/src/main/java/cz/muni/pa165/facade/NotificationFacade.java
index 95ef618..8f80200 100644
--- a/notification/src/main/java/cz/muni/pa165/facade/NotificationFacade.java
+++ b/notification/src/main/java/cz/muni/pa165/facade/NotificationFacade.java
@@ -1,9 +1,11 @@
 package cz.muni.pa165.facade;
 
-import cz.muni.pa165.generated.model.*;
+import cz.muni.pa165.generated.model.ApplicationNotificationDto;
+import cz.muni.pa165.generated.model.CarComponentNotificationDto;
+import cz.muni.pa165.generated.model.ConfirmationDto;
+import cz.muni.pa165.generated.model.NotificationDto;
 import cz.muni.pa165.service.NotificationService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 
 @Service
diff --git a/notification/src/main/java/cz/muni/pa165/rest/NotificationController.java b/notification/src/main/java/cz/muni/pa165/rest/NotificationController.java
index e27025a..975e713 100644
--- a/notification/src/main/java/cz/muni/pa165/rest/NotificationController.java
+++ b/notification/src/main/java/cz/muni/pa165/rest/NotificationController.java
@@ -2,7 +2,10 @@ package cz.muni.pa165.rest;
 
 import cz.muni.pa165.facade.NotificationFacade;
 import cz.muni.pa165.generated.api.NotificationServiceApiDelegate;
-import cz.muni.pa165.generated.model.*;
+import cz.muni.pa165.generated.model.ApplicationNotificationDto;
+import cz.muni.pa165.generated.model.CarComponentNotificationDto;
+import cz.muni.pa165.generated.model.ConfirmationDto;
+import cz.muni.pa165.generated.model.NotificationDto;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
diff --git a/notification/src/main/resources/application.properties b/notification/src/main/resources/application.properties
index a55abf0..67b74b1 100644
--- a/notification/src/main/resources/application.properties
+++ b/notification/src/main/resources/application.properties
@@ -1,5 +1,4 @@
 server.port=8083
-
 spring.mail.host=smtp.gmail.com
 spring.mail.port=587
 spring.mail.username=formula.team.management@gmail.com
-- 
GitLab