From 9382da7101c0bff0c4877dcfb4e3cb9fcd5f2377 Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Tue, 5 Mar 2024 17:00:12 +0100 Subject: [PATCH 1/5] refactor: do not use singleton like rest template object --- .../pseudonym/GpasPseudonymGenerator.java | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/main/java/dev/dnpm/etl/processor/pseudonym/GpasPseudonymGenerator.java b/src/main/java/dev/dnpm/etl/processor/pseudonym/GpasPseudonymGenerator.java index 3d367bc..446bd16 100644 --- a/src/main/java/dev/dnpm/etl/processor/pseudonym/GpasPseudonymGenerator.java +++ b/src/main/java/dev/dnpm/etl/processor/pseudonym/GpasPseudonymGenerator.java @@ -67,11 +67,13 @@ public class GpasPseudonymGenerator implements Generator { private final RetryTemplate retryTemplate; private final Logger log = LoggerFactory.getLogger(GpasPseudonymGenerator.class); + private final RestTemplate restTemplate; + private SSLContext customSslContext; - private RestTemplate restTemplate; public GpasPseudonymGenerator(GPasConfigProperties gpasCfg, RetryTemplate retryTemplate) { this.retryTemplate = retryTemplate; + this.restTemplate = getRestTemplete(); this.gPasUrl = gpasCfg.getUri(); this.psnTargetDomain = gpasCfg.getTarget(); @@ -139,7 +141,6 @@ public class GpasPseudonymGenerator implements Generator { HttpEntity requestEntity = new HttpEntity<>(gPasRequestBody, this.httpHeader); ResponseEntity responseEntity; - var restTemplate = getRestTemplete(); try { responseEntity = retryTemplate.execute( @@ -226,14 +227,8 @@ public class GpasPseudonymGenerator implements Generator { } protected RestTemplate getRestTemplete() { - - if (restTemplate != null) { - return restTemplate; - } - if (customSslContext == null) { - restTemplate = new RestTemplate(); - return restTemplate; + return new RestTemplate(); } final var sslsf = new SSLConnectionSocketFactory(customSslContext); final Registry socketFactoryRegistry = RegistryBuilder.create() @@ -246,7 +241,6 @@ public class GpasPseudonymGenerator implements Generator { final HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory( httpClient); - restTemplate = new RestTemplate(requestFactory); - return restTemplate; + return new RestTemplate(requestFactory); } } From 36549622948da2cb2e66012876e5eef15e839aa2 Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Wed, 6 Mar 2024 10:00:17 +0100 Subject: [PATCH 2/5] feat: initial implementation of gPAS connection check --- .../etl/processor/config/AppConfiguration.kt | 17 +++- .../processor/config/AppKafkaConfiguration.kt | 8 +- .../processor/config/AppRestConfiguration.kt | 7 +- .../monitoring/ConnectionCheckService.kt | 85 +++++++++++++++++-- .../etl/processor/web/ConfigController.kt | 57 ++++++++++--- src/main/resources/templates/configs.html | 7 +- .../configs/gPasConnectionAvailable.html | 19 +++++ ...le.html => outputConnectionAvailable.html} | 8 +- 8 files changed, 177 insertions(+), 31 deletions(-) create mode 100644 src/main/resources/templates/configs/gPasConnectionAvailable.html rename src/main/resources/templates/configs/{connectionAvailable.html => outputConnectionAvailable.html} (57%) diff --git a/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt b/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt index 8fb9e19..4ca48cd 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt @@ -20,7 +20,7 @@ package dev.dnpm.etl.processor.config import com.fasterxml.jackson.databind.ObjectMapper -import dev.dnpm.etl.processor.monitoring.ReportService +import dev.dnpm.etl.processor.monitoring.* import dev.dnpm.etl.processor.pseudonym.AnonymizingGenerator import dev.dnpm.etl.processor.pseudonym.Generator import dev.dnpm.etl.processor.pseudonym.GpasPseudonymGenerator @@ -44,6 +44,7 @@ import org.springframework.retry.support.RetryTemplateBuilder import org.springframework.scheduling.annotation.EnableScheduling import org.springframework.security.crypto.password.PasswordEncoder import org.springframework.security.provisioning.InMemoryUserDetailsManager +import org.springframework.web.client.RestTemplate import reactor.core.publisher.Sinks import kotlin.time.Duration.Companion.seconds import kotlin.time.toJavaDuration @@ -142,8 +143,18 @@ class AppConfiguration { } @Bean - fun configsUpdateProducer(): Sinks.Many { - return Sinks.many().multicast().directBestEffort() + fun connectionCheckUpdateProducer(): Sinks.Many { + return Sinks.many().multicast().onBackpressureBuffer() + } + + @ConditionalOnProperty(value = ["app.pseudonymize.generator"], havingValue = "GPAS") + @Bean + fun gPasConnectionCheckService( + restTemplate: RestTemplate, + gPasConfigProperties: GPasConfigProperties, + connectionCheckUpdateProducer: Sinks.Many + ): ConnectionCheckService { + return GPasConnectionCheckService(restTemplate, gPasConfigProperties, connectionCheckUpdateProducer) } } diff --git a/src/main/kotlin/dev/dnpm/etl/processor/config/AppKafkaConfiguration.kt b/src/main/kotlin/dev/dnpm/etl/processor/config/AppKafkaConfiguration.kt index 3799762..80c66d2 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/config/AppKafkaConfiguration.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/config/AppKafkaConfiguration.kt @@ -21,6 +21,7 @@ package dev.dnpm.etl.processor.config import com.fasterxml.jackson.databind.ObjectMapper import dev.dnpm.etl.processor.input.KafkaInputListener +import dev.dnpm.etl.processor.monitoring.ConnectionCheckResult import dev.dnpm.etl.processor.monitoring.ConnectionCheckService import dev.dnpm.etl.processor.monitoring.KafkaConnectionCheckService import dev.dnpm.etl.processor.output.KafkaMtbFileSender @@ -105,8 +106,11 @@ class AppKafkaConfiguration { } @Bean - fun connectionCheckService(consumerFactory: ConsumerFactory, configsUpdateProducer: Sinks.Many): ConnectionCheckService { - return KafkaConnectionCheckService(consumerFactory.createConsumer(), configsUpdateProducer) + fun kafkaConnectionCheckService( + consumerFactory: ConsumerFactory, + connectionCheckUpdateProducer: Sinks.Many + ): ConnectionCheckService { + return KafkaConnectionCheckService(consumerFactory.createConsumer(), connectionCheckUpdateProducer) } } \ No newline at end of file diff --git a/src/main/kotlin/dev/dnpm/etl/processor/config/AppRestConfiguration.kt b/src/main/kotlin/dev/dnpm/etl/processor/config/AppRestConfiguration.kt index eea5724..582d530 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/config/AppRestConfiguration.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/config/AppRestConfiguration.kt @@ -19,6 +19,7 @@ package dev.dnpm.etl.processor.config +import dev.dnpm.etl.processor.monitoring.ConnectionCheckResult import dev.dnpm.etl.processor.monitoring.ConnectionCheckService import dev.dnpm.etl.processor.monitoring.RestConnectionCheckService import dev.dnpm.etl.processor.output.MtbFileSender @@ -63,12 +64,12 @@ class AppRestConfiguration { } @Bean - fun connectionCheckService( + fun restConnectionCheckService( restTemplate: RestTemplate, restTargetProperties: RestTargetProperties, - configsUpdateProducer: Sinks.Many + connectionCheckUpdateProducer: Sinks.Many ): ConnectionCheckService { - return RestConnectionCheckService(restTemplate, restTargetProperties, configsUpdateProducer) + return RestConnectionCheckService(restTemplate, restTargetProperties, connectionCheckUpdateProducer) } } diff --git a/src/main/kotlin/dev/dnpm/etl/processor/monitoring/ConnectionCheckService.kt b/src/main/kotlin/dev/dnpm/etl/processor/monitoring/ConnectionCheckService.kt index 54f25b3..81ad922 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/monitoring/ConnectionCheckService.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/monitoring/ConnectionCheckService.kt @@ -20,14 +20,21 @@ package dev.dnpm.etl.processor.monitoring +import dev.dnpm.etl.processor.config.GPasConfigProperties import dev.dnpm.etl.processor.config.RestTargetProperties import jakarta.annotation.PostConstruct import org.apache.kafka.clients.consumer.Consumer import org.apache.kafka.common.errors.TimeoutException import org.springframework.beans.factory.annotation.Qualifier +import org.springframework.http.HttpEntity +import org.springframework.http.HttpHeaders +import org.springframework.http.HttpMethod import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.RequestEntity import org.springframework.scheduling.annotation.Scheduled import org.springframework.web.client.RestTemplate +import org.springframework.web.util.UriComponentsBuilder import reactor.core.publisher.Sinks import kotlin.time.Duration.Companion.seconds import kotlin.time.toJavaDuration @@ -38,11 +45,22 @@ interface ConnectionCheckService { } +interface OutputConnectionCheckService : ConnectionCheckService + +sealed class ConnectionCheckResult { + + abstract val available: Boolean + + data class KafkaConnectionCheckResult(override val available: Boolean) : ConnectionCheckResult() + data class RestConnectionCheckResult(override val available: Boolean) : ConnectionCheckResult() + data class GPasConnectionCheckResult(override val available: Boolean) : ConnectionCheckResult() +} + class KafkaConnectionCheckService( private val consumer: Consumer, - @Qualifier("configsUpdateProducer") - private val configsUpdateProducer: Sinks.Many -) : ConnectionCheckService { + @Qualifier("connectionCheckUpdateProducer") + private val connectionCheckUpdateProducer: Sinks.Many +) : OutputConnectionCheckService { private var connectionAvailable: Boolean = false @@ -55,7 +73,10 @@ class KafkaConnectionCheckService( } catch (e: TimeoutException) { false } - configsUpdateProducer.emitNext(connectionAvailable, Sinks.EmitFailureHandler.FAIL_FAST) + connectionCheckUpdateProducer.emitNext( + ConnectionCheckResult.KafkaConnectionCheckResult(connectionAvailable), + Sinks.EmitFailureHandler.FAIL_FAST + ) } override fun connectionAvailable(): Boolean { @@ -67,9 +88,9 @@ class KafkaConnectionCheckService( class RestConnectionCheckService( private val restTemplate: RestTemplate, private val restTargetProperties: RestTargetProperties, - @Qualifier("configsUpdateProducer") - private val configsUpdateProducer: Sinks.Many -) : ConnectionCheckService { + @Qualifier("connectionCheckUpdateProducer") + private val connectionCheckUpdateProducer: Sinks.Many +) : OutputConnectionCheckService { private var connectionAvailable: Boolean = false @@ -84,7 +105,55 @@ class RestConnectionCheckService( } catch (e: Exception) { false } - configsUpdateProducer.emitNext(connectionAvailable, Sinks.EmitFailureHandler.FAIL_FAST) + connectionCheckUpdateProducer.emitNext( + ConnectionCheckResult.RestConnectionCheckResult(connectionAvailable), + Sinks.EmitFailureHandler.FAIL_FAST + ) + } + + override fun connectionAvailable(): Boolean { + return this.connectionAvailable + } +} + +class GPasConnectionCheckService( + private val restTemplate: RestTemplate, + private val gPasConfigProperties: GPasConfigProperties, + @Qualifier("connectionCheckUpdateProducer") + private val connectionCheckUpdateProducer: Sinks.Many +) : ConnectionCheckService { + + private var connectionAvailable: Boolean = false + + @PostConstruct + @Scheduled(cron = "0 * * * * *") + fun check() { + connectionAvailable = try { + val uri = UriComponentsBuilder.fromUriString( + gPasConfigProperties.uri?.replace("/\$pseudonymizeAllowCreate", "/\$pseudonymize").toString() + ) + .queryParam("target", gPasConfigProperties.target) + .queryParam("original", "???") + .build().toUri() + + val headers = HttpHeaders() + headers.contentType = MediaType.APPLICATION_JSON + if (!gPasConfigProperties.username.isNullOrBlank() && !gPasConfigProperties.password.isNullOrBlank()) { + headers.setBasicAuth(gPasConfigProperties.username, gPasConfigProperties.password) + } + restTemplate.exchange( + uri, + HttpMethod.GET, + HttpEntity(headers), + Void::class.java + ).statusCode == HttpStatus.OK + } catch (e: Exception) { + false + } + connectionCheckUpdateProducer.emitNext( + ConnectionCheckResult.GPasConnectionCheckResult(connectionAvailable), + Sinks.EmitFailureHandler.FAIL_FAST + ) } override fun connectionAvailable(): Boolean { diff --git a/src/main/kotlin/dev/dnpm/etl/processor/web/ConfigController.kt b/src/main/kotlin/dev/dnpm/etl/processor/web/ConfigController.kt index 44ea400..eb9d541 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/web/ConfigController.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/web/ConfigController.kt @@ -19,7 +19,10 @@ package dev.dnpm.etl.processor.web +import dev.dnpm.etl.processor.monitoring.ConnectionCheckResult import dev.dnpm.etl.processor.monitoring.ConnectionCheckService +import dev.dnpm.etl.processor.monitoring.GPasConnectionCheckService +import dev.dnpm.etl.processor.monitoring.OutputConnectionCheckService import dev.dnpm.etl.processor.output.MtbFileSender import dev.dnpm.etl.processor.pseudonym.Generator import dev.dnpm.etl.processor.security.Role @@ -40,22 +43,29 @@ import reactor.core.publisher.Sinks @Controller @RequestMapping(path = ["configs"]) class ConfigController( - @Qualifier("configsUpdateProducer") - private val configsUpdateProducer: Sinks.Many, + @Qualifier("connectionCheckUpdateProducer") + private val connectionCheckUpdateProducer: Sinks.Many, private val transformationService: TransformationService, private val pseudonymGenerator: Generator, private val mtbFileSender: MtbFileSender, - private val connectionCheckService: ConnectionCheckService, + private val connectionCheckServices: List, private val tokenService: TokenService?, private val userRoleService: UserRoleService? ) { @GetMapping fun index(model: Model): String { + val outputConnectionAvailable = + connectionCheckServices.filterIsInstance().first().connectionAvailable() + + val gPasConnectionAvailable = + connectionCheckServices.filterIsInstance().firstOrNull()?.connectionAvailable() + model.addAttribute("pseudonymGenerator", pseudonymGenerator.javaClass.simpleName) model.addAttribute("mtbFileSender", mtbFileSender.javaClass.simpleName) model.addAttribute("mtbFileEndpoint", mtbFileSender.endpoint()) - model.addAttribute("connectionAvailable", connectionCheckService.connectionAvailable()) + model.addAttribute("outputConnectionAvailable", outputConnectionAvailable) + model.addAttribute("gPasConnectionAvailable", gPasConnectionAvailable) model.addAttribute("tokensEnabled", tokenService != null) if (tokenService != null) { model.addAttribute("tokens", tokenService.findAll()) @@ -73,11 +83,14 @@ class ConfigController( return "configs" } - @GetMapping(params = ["connectionAvailable"]) - fun connectionAvailable(model: Model): String { + @GetMapping(params = ["outputConnectionAvailable"]) + fun outputConnectionAvailable(model: Model): String { + val outputConnectionAvailable = + connectionCheckServices.filterIsInstance().first().connectionAvailable() + model.addAttribute("mtbFileSender", mtbFileSender.javaClass.simpleName) model.addAttribute("mtbFileEndpoint", mtbFileSender.endpoint()) - model.addAttribute("connectionAvailable", connectionCheckService.connectionAvailable()) + model.addAttribute("outputConnectionAvailable", outputConnectionAvailable) if (tokenService != null) { model.addAttribute("tokensEnabled", true) model.addAttribute("tokens", tokenService.findAll()) @@ -85,7 +98,25 @@ class ConfigController( model.addAttribute("tokens", listOf()) } - return "configs/connectionAvailable" + return "configs/outputConnectionAvailable" + } + + @GetMapping(params = ["gPasConnectionAvailable"]) + fun gPasConnectionAvailable(model: Model): String { + val gPasConnectionAvailable = + connectionCheckServices.filterIsInstance().firstOrNull()?.connectionAvailable() + + model.addAttribute("mtbFileSender", mtbFileSender.javaClass.simpleName) + model.addAttribute("mtbFileEndpoint", mtbFileSender.endpoint()) + model.addAttribute("gPasConnectionAvailable", gPasConnectionAvailable) + if (tokenService != null) { + model.addAttribute("tokensEnabled", true) + model.addAttribute("tokens", tokenService.findAll()) + } else { + model.addAttribute("tokens", listOf()) + } + + return "configs/gPasConnectionAvailable" } @PostMapping(path = ["tokens"]) @@ -152,9 +183,15 @@ class ConfigController( @GetMapping(path = ["events"], produces = [MediaType.TEXT_EVENT_STREAM_VALUE]) fun events(): Flux> { - return configsUpdateProducer.asFlux().map { + return connectionCheckUpdateProducer.asFlux().map { + val event = when (it) { + is ConnectionCheckResult.KafkaConnectionCheckResult -> "output-connection-check" + is ConnectionCheckResult.RestConnectionCheckResult -> "output-connection-check" + is ConnectionCheckResult.GPasConnectionCheckResult -> "gpas-connection-check" + } + ServerSentEvent.builder() - .event("connection-available").id("none").data("") + .event(event).id("none").data(it) .build() } } diff --git a/src/main/resources/templates/configs.html b/src/main/resources/templates/configs.html index 1ac4a26..d94deb6 100644 --- a/src/main/resources/templates/configs.html +++ b/src/main/resources/templates/configs.html @@ -45,7 +45,12 @@
-
+
+
+
+ +
+
diff --git a/src/main/resources/templates/configs/gPasConnectionAvailable.html b/src/main/resources/templates/configs/gPasConnectionAvailable.html new file mode 100644 index 0000000..6dccc60 --- /dev/null +++ b/src/main/resources/templates/configs/gPasConnectionAvailable.html @@ -0,0 +1,19 @@ + +

🟦 gPAS nicht konfiguriert - Patienten-IDs werden intern anonymisiert

+
+ +

✅⚡ Verbindung zu gPAS

+
+ Die Verbindung ist aktuell + verfügbar. + nicht verfügbar. +
+
+ ETL-Processor + + gPAS + ETL-Processor + + gPAS +
+
\ No newline at end of file diff --git a/src/main/resources/templates/configs/connectionAvailable.html b/src/main/resources/templates/configs/outputConnectionAvailable.html similarity index 57% rename from src/main/resources/templates/configs/connectionAvailable.html rename to src/main/resources/templates/configs/outputConnectionAvailable.html index 6d52d70..699c614 100644 --- a/src/main/resources/templates/configs/connectionAvailable.html +++ b/src/main/resources/templates/configs/outputConnectionAvailable.html @@ -1,12 +1,12 @@ -

✅⚡ Verbindung zum bwHC-Backend

+

✅⚡ Verbindung zum bwHC-Backend

Verbindung über [[ ${mtbFileSender} ]]. Die Verbindung ist aktuell - verfügbar. - nicht verfügbar. + verfügbar. + nicht verfügbar.
ETL-Processor - + bwHC-Backend Kafka-Broker ETL-Processor From 41b87835cac580eb698d63b26e48a37d3120044d Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Wed, 6 Mar 2024 10:02:31 +0100 Subject: [PATCH 3/5] feat: add configuration for deprecated config property --- .../dev/dnpm/etl/processor/config/AppConfiguration.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt b/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt index 4ca48cd..6e1240b 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt @@ -157,5 +157,16 @@ class AppConfiguration { return GPasConnectionCheckService(restTemplate, gPasConfigProperties, connectionCheckUpdateProducer) } + @ConditionalOnProperty(value = ["app.pseudonymizer"], havingValue = "GPAS") + @ConditionalOnMissingBean + @Bean + fun gPasConnectionCheckServiceOnDeprecatedProperty( + restTemplate: RestTemplate, + gPasConfigProperties: GPasConfigProperties, + connectionCheckUpdateProducer: Sinks.Many + ): ConnectionCheckService { + return GPasConnectionCheckService(restTemplate, gPasConfigProperties, connectionCheckUpdateProducer) + } + } From 256d9d4ff03dc270e01d8af779380014db228e7c Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Wed, 6 Mar 2024 10:08:23 +0100 Subject: [PATCH 4/5] chore: change wording --- .../resources/templates/configs/outputConnectionAvailable.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/templates/configs/outputConnectionAvailable.html b/src/main/resources/templates/configs/outputConnectionAvailable.html index 699c614..2b18b75 100644 --- a/src/main/resources/templates/configs/outputConnectionAvailable.html +++ b/src/main/resources/templates/configs/outputConnectionAvailable.html @@ -1,4 +1,4 @@ -

✅⚡ Verbindung zum bwHC-Backend

+

✅⚡ MTB-File Verbindung

Verbindung über [[ ${mtbFileSender} ]]. Die Verbindung ist aktuell verfügbar. From a9c771aa9950c3d088461fcc3261d689c2d9ff17 Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Wed, 6 Mar 2024 10:50:35 +0100 Subject: [PATCH 5/5] test: change tests to mock output connection --- .../dev/dnpm/etl/processor/web/ConfigControllerTest.kt | 8 +++++++- .../dev/dnpm/etl/processor/config/AppConfiguration.kt | 5 +++++ .../dev/dnpm/etl/processor/config/AppRestConfiguration.kt | 5 ----- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/integrationTest/kotlin/dev/dnpm/etl/processor/web/ConfigControllerTest.kt b/src/integrationTest/kotlin/dev/dnpm/etl/processor/web/ConfigControllerTest.kt index 6e6a25e..7fc0121 100644 --- a/src/integrationTest/kotlin/dev/dnpm/etl/processor/web/ConfigControllerTest.kt +++ b/src/integrationTest/kotlin/dev/dnpm/etl/processor/web/ConfigControllerTest.kt @@ -19,11 +19,14 @@ package dev.dnpm.etl.processor.web +import dev.dnpm.etl.processor.config.AppConfiguration import dev.dnpm.etl.processor.config.AppSecurityConfiguration import dev.dnpm.etl.processor.monitoring.ConnectionCheckService +import dev.dnpm.etl.processor.monitoring.RestConnectionCheckService import dev.dnpm.etl.processor.output.MtbFileSender import dev.dnpm.etl.processor.pseudonym.Generator import dev.dnpm.etl.processor.services.RequestProcessor +import dev.dnpm.etl.processor.services.TokenRepository import dev.dnpm.etl.processor.services.TransformationService import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -50,6 +53,7 @@ abstract class MockSink : Sinks.Many @ContextConfiguration( classes = [ ConfigController::class, + AppConfiguration::class, AppSecurityConfiguration::class ] ) @@ -67,7 +71,9 @@ abstract class MockSink : Sinks.Many MtbFileSender::class, ConnectionCheckService::class, RequestProcessor::class, - TransformationService::class + TransformationService::class, + TokenRepository::class, + RestConnectionCheckService::class ) class ConfigControllerTest { diff --git a/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt b/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt index 6e1240b..0ae2c2f 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt @@ -63,6 +63,11 @@ class AppConfiguration { private val logger = LoggerFactory.getLogger(AppConfiguration::class.java) + @Bean + fun restTemplate(): RestTemplate { + return RestTemplate() + } + @ConditionalOnProperty(value = ["app.pseudonymize.generator"], havingValue = "GPAS") @Bean fun gpasPseudonymGenerator(configProperties: GPasConfigProperties, retryTemplate: RetryTemplate): Generator { diff --git a/src/main/kotlin/dev/dnpm/etl/processor/config/AppRestConfiguration.kt b/src/main/kotlin/dev/dnpm/etl/processor/config/AppRestConfiguration.kt index 582d530..fc2676b 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/config/AppRestConfiguration.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/config/AppRestConfiguration.kt @@ -48,11 +48,6 @@ class AppRestConfiguration { private val logger = LoggerFactory.getLogger(AppRestConfiguration::class.java) - @Bean - fun restTemplate(): RestTemplate { - return RestTemplate() - } - @Bean fun restMtbFileSender( restTemplate: RestTemplate,