From 034a9198134183a7a4145202401f9fd0b9a75f7a Mon Sep 17 00:00:00 2001
From: LEMERCIER Denis <denis.lemercier@soprasteria.com>
Date: Mon, 7 Oct 2024 10:55:27 +0200
Subject: [PATCH] Creation du mode onlyapi pour api-event-calculs

---
 CHANGELOG.md                                  |  1 +
 services/api-event-calculs/pom.xml            |  6 +++
 .../infrastructure/config/CacheConfig.java    |  2 +-
 .../config/KafkaConfiguration.java            |  2 +
 .../export/IndicateurController.java          |  2 +-
 .../sync/calculs/SyncCalculsController.java   |  2 +
 .../ListenEquipementPhysique.java             |  2 +
 .../kafkalistener/ListenMessagerie.java       |  2 +
 .../kafkalistener/ListenOperationNonIT.java   |  2 +
 .../src/main/resources/application-full.yaml  | 31 +++++++++++++
 .../main/resources/application-onlyapi.yaml   | 12 +++++
 .../src/main/resources/application.yaml       | 46 ++++++-------------
 .../ApiEventCalculsApplicationTests.java      |  2 +-
 13 files changed, 76 insertions(+), 36 deletions(-)
 create mode 100644 services/api-event-calculs/src/main/resources/application-full.yaml
 create mode 100644 services/api-event-calculs/src/main/resources/application-onlyapi.yaml

diff --git a/CHANGELOG.md b/CHANGELOG.md
index da9cb47d..39d4d36d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,7 @@ Tous les changements de ce projet seront documentés dans ce document.
 
 ## [Non livré]
 
+- Mode API : Ajout d'un mode API only dans le composant api-event-calculs permettant d'utiliser le composant sans base de données ou kafka.
 - Nettoyage : Suppression complète du calcul de l'impact du réseau à partir d'un équipement physique de type réseau (donc suppression des champs goTelecharge et nbJourUtiliseAn dans l'inventaire des équipements physiques). Désormais, l'impact du réseau se calcule grâce aux opérations non IT -> [Issue10](https://gitlab-forge.din.developpement-durable.gouv.fr/pub/numeco/m4g/numecoeval/-/issues/10)
 - Customisation des référentiels par organisation : les référentiels TypeItem, FacteurCaracterisation, CorrespondanceRefEquipement et Hypotheses peuvent être personnalisés par une organisation -> [Issue9](https://gitlab-forge.din.developpement-durable.gouv.fr/pub/numeco/m4g/numecoeval/-/issues/9)
 
diff --git a/services/api-event-calculs/pom.xml b/services/api-event-calculs/pom.xml
index 86161507..12431968 100644
--- a/services/api-event-calculs/pom.xml
+++ b/services/api-event-calculs/pom.xml
@@ -60,6 +60,12 @@
             <scope>runtime</scope>
         </dependency>
 
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+
         <dependency>
             <groupId>org.springframework.kafka</groupId>
             <artifactId>spring-kafka</artifactId>
diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/config/CacheConfig.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/config/CacheConfig.java
index 77b917c4..6cb04ee8 100644
--- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/config/CacheConfig.java
+++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/config/CacheConfig.java
@@ -14,7 +14,7 @@ import java.util.concurrent.TimeUnit;
 @EnableCaching
 @EnableScheduling
 @Configuration
-@Profile("!test")
+@Profile("!test & !onlyapi")
 public class CacheConfig {
 
     @CacheEvict(value = {
diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/config/KafkaConfiguration.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/config/KafkaConfiguration.java
index 0a23a8d1..dcbf04d5 100644
--- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/config/KafkaConfiguration.java
+++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/config/KafkaConfiguration.java
@@ -4,11 +4,13 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
 import org.springframework.kafka.listener.DefaultErrorHandler;
 import org.springframework.util.backoff.FixedBackOff;
 
 @Configuration
 @Slf4j
+@Profile("!onlyapi")
 public class KafkaConfiguration {
 
     @Value("${spring.kafka.back-off-sec}")
diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/controller/export/IndicateurController.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/controller/export/IndicateurController.java
index 993a8663..14a8b375 100644
--- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/controller/export/IndicateurController.java
+++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/controller/export/IndicateurController.java
@@ -21,7 +21,7 @@ import java.util.List;
  */
 @RestController
 @Slf4j
-@Profile("!prod & !test")
+@Profile("!prod & !test & !onlyapi")
 @RequestMapping("indicateur")
 public class IndicateurController {
 
diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/controller/sync/calculs/SyncCalculsController.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/controller/sync/calculs/SyncCalculsController.java
index 327e85e3..a78f0542 100644
--- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/controller/sync/calculs/SyncCalculsController.java
+++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/controller/sync/calculs/SyncCalculsController.java
@@ -5,11 +5,13 @@ import org.mte.numecoeval.calculs.infrastructure.service.sync.calculs.SyncCalcul
 import org.mte.numecoeval.calculs.sync.generated.api.model.ReponseCalculRest;
 import org.mte.numecoeval.calculs.sync.generated.api.model.SyncCalculRest;
 import org.mte.numecoeval.calculs.sync.generated.api.server.CalculsEquipementPhysiqueEtOperationNonItEtMessagerieApi;
+import org.springframework.context.annotation.Profile;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.RestController;
 
 @RestController
 @AllArgsConstructor
+@Profile("!onlyapi")
 public class SyncCalculsController implements CalculsEquipementPhysiqueEtOperationNonItEtMessagerieApi {
 
     SyncCalculService syncCalculService;
diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/kafkalistener/ListenEquipementPhysique.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/kafkalistener/ListenEquipementPhysique.java
index 7bb761ea..23072224 100644
--- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/kafkalistener/ListenEquipementPhysique.java
+++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/kafkalistener/ListenEquipementPhysique.java
@@ -4,12 +4,14 @@ import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.mte.numecoeval.calculs.infrastructure.service.calcul.MainEquipementPhysiqueService;
 import org.mte.numecoeval.topic.data.EquipementPhysiqueDTO;
+import org.springframework.context.annotation.Profile;
 import org.springframework.kafka.annotation.KafkaListener;
 import org.springframework.stereotype.Component;
 
 @Component
 @Slf4j
 @AllArgsConstructor
+@Profile("!onlyapi")
 public class ListenEquipementPhysique {
 
     private MainEquipementPhysiqueService mainEquipementPhysiqueService;
diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/kafkalistener/ListenMessagerie.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/kafkalistener/ListenMessagerie.java
index 5c94e031..d3bb9f5f 100644
--- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/kafkalistener/ListenMessagerie.java
+++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/kafkalistener/ListenMessagerie.java
@@ -4,12 +4,14 @@ import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.mte.numecoeval.calculs.infrastructure.service.calcul.MainMessagerieService;
 import org.mte.numecoeval.topic.data.MessagerieDTO;
+import org.springframework.context.annotation.Profile;
 import org.springframework.kafka.annotation.KafkaListener;
 import org.springframework.stereotype.Component;
 
 @Component
 @Slf4j
 @AllArgsConstructor
+@Profile("!onlyapi")
 public class ListenMessagerie {
 
     private MainMessagerieService mainMessagerieService;
diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/kafkalistener/ListenOperationNonIT.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/kafkalistener/ListenOperationNonIT.java
index 61b4e1c0..5c45f30f 100644
--- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/kafkalistener/ListenOperationNonIT.java
+++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/kafkalistener/ListenOperationNonIT.java
@@ -4,12 +4,14 @@ import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.mte.numecoeval.calculs.infrastructure.service.calcul.MainOperationNonITService;
 import org.mte.numecoeval.topic.data.OperationNonITDTO;
+import org.springframework.context.annotation.Profile;
 import org.springframework.kafka.annotation.KafkaListener;
 import org.springframework.stereotype.Component;
 
 @Component
 @Slf4j
 @AllArgsConstructor
+@Profile("!onlyapi")
 public class ListenOperationNonIT {
 
     private MainOperationNonITService mainOperationNonITService;
diff --git a/services/api-event-calculs/src/main/resources/application-full.yaml b/services/api-event-calculs/src/main/resources/application-full.yaml
new file mode 100644
index 00000000..9b3c0aa0
--- /dev/null
+++ b/services/api-event-calculs/src/main/resources/application-full.yaml
@@ -0,0 +1,31 @@
+spring:
+  sql:
+    init:
+      mode: always
+  # Base de données
+  datasource:
+    generate-unique-name: true
+    url: "jdbc:postgresql://localhost:5432/postgres?reWriteBatchedInserts=true"
+    username: postgres
+    password: postgres
+    driver-class-name: org.postgresql.Driver
+    tomcat:
+      test-on-borrow: false
+      jmx-enabled: false
+      max-active: 100
+  # Kafka
+  kafka:
+    bootstrap-servers: localhost:9092
+    back-off-sec: 10
+    consumer:
+      group-id: api-event-calculs
+      auto-offset-reset: earliest
+      enable-auto-commit: false
+      max-poll-records: 50
+      isolation.level: read_committed
+      value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
+      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
+      properties:
+        spring.json.trusted.packages: "org.mte.numecoeval.*"
+
+
diff --git a/services/api-event-calculs/src/main/resources/application-onlyapi.yaml b/services/api-event-calculs/src/main/resources/application-onlyapi.yaml
new file mode 100644
index 00000000..7329b532
--- /dev/null
+++ b/services/api-event-calculs/src/main/resources/application-onlyapi.yaml
@@ -0,0 +1,12 @@
+spring:
+  sql:
+    init:
+      mode: never
+  datasource:
+    generate-unique-name: true
+    url: "jdbc:h2:mem:notused"
+    username: sa
+    password: password
+    driver-class-name: org.h2.Driver
+  jpa:
+    database-platform: org.hibernate.dialect.H2Dialect
diff --git a/services/api-event-calculs/src/main/resources/application.yaml b/services/api-event-calculs/src/main/resources/application.yaml
index 070760f9..ba3dfc42 100644
--- a/services/api-event-calculs/src/main/resources/application.yaml
+++ b/services/api-event-calculs/src/main/resources/application.yaml
@@ -1,32 +1,16 @@
+server:
+  port: 18085
+  shutdown: graceful
+
+# 3 profiles :
+# full    : read from kafka and save into ind_* database tables
+# onlyapi : only uses APIs for calculations, not connected to kafka
+# test    : for test purposes
 spring:
-  sql:
-    init:
-      mode: always
-  # Base de données
-  datasource:
-    generate-unique-name: true
-    url: "jdbc:postgresql://localhost:5432/postgres?reWriteBatchedInserts=true"
-    username: postgres
-    password: postgres
-    driver-class-name: org.postgresql.Driver
-    tomcat:
-      test-on-borrow: false
-      jmx-enabled: false
-      max-active: 100
-  # Kafka
-  kafka:
-    bootstrap-servers: localhost:9092
-    back-off-sec: 10
-    consumer:
-      group-id: api-event-calculs
-      auto-offset-reset: earliest
-      enable-auto-commit: false
-      max-poll-records: 50
-      isolation.level: read_committed
-      value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
-      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
-      properties:
-        spring.json.trusted.packages: "org.mte.numecoeval.*"
+  profiles:
+    active:
+      full
+      # onlyapi
 
 # Application
 numecoeval:
@@ -44,10 +28,6 @@ numecoeval:
     ttl: "20"
     donnesfiltrees: "1"
 
-server:
-  port: 18085
-  shutdown: graceful
-
 # Actuator
 management:
   server:
@@ -61,4 +41,4 @@ management:
     web:
       base-path: /
       exposure:
-        include: health,prometheus,httptrace,info,metrics,mappings
\ No newline at end of file
+        include: health,prometheus,httptrace,info,metrics,mappings
diff --git a/services/api-event-calculs/src/test/java/org/mte/numecoeval/calculs/ApiEventCalculsApplicationTests.java b/services/api-event-calculs/src/test/java/org/mte/numecoeval/calculs/ApiEventCalculsApplicationTests.java
index fefa1b0e..d71dccbd 100644
--- a/services/api-event-calculs/src/test/java/org/mte/numecoeval/calculs/ApiEventCalculsApplicationTests.java
+++ b/services/api-event-calculs/src/test/java/org/mte/numecoeval/calculs/ApiEventCalculsApplicationTests.java
@@ -39,7 +39,7 @@ import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.times;
 
 @SpringBootTest
-@ActiveProfiles(profiles = {"test"})
+@ActiveProfiles(profiles = {"test", "onlyapi"})
 @Slf4j
 @EnableAutoConfiguration(exclude = {SecurityAutoConfiguration.class, DataSourceAutoConfiguration.class, KafkaAutoConfiguration.class})
 class ApiEventCalculsApplicationTests {
-- 
GitLab