From b93eeafb2668a795a06de330e7114e0f57d35007 Mon Sep 17 00:00:00 2001
From: Martin Vogel <martin.vogel@sinc.de>
Date: Wed, 22 Jun 2022 18:32:27 +0200
Subject: [PATCH] #414 Extend config by dev, prod and test environments

---
 .../fitconnect/client/ClientFactory.java      | 27 ++++++----
 .../dependency/ApplicationConfig.java         | 50 ++++++++++++++++---
 sdk.conf                                      | 20 ++++++--
 3 files changed, 76 insertions(+), 21 deletions(-)

diff --git a/client/src/main/java/de/fitko/fitconnect/client/ClientFactory.java b/client/src/main/java/de/fitko/fitconnect/client/ClientFactory.java
index fa766fb69..6565cc60d 100644
--- a/client/src/main/java/de/fitko/fitconnect/client/ClientFactory.java
+++ b/client/src/main/java/de/fitko/fitconnect/client/ClientFactory.java
@@ -10,7 +10,6 @@ import de.fitko.fitconnect.api.services.crypto.CryptoService;
 import de.fitko.fitconnect.api.services.metadata.MetadataService;
 import de.fitko.fitconnect.api.services.validation.CertificateValidator;
 import de.fitko.fitconnect.api.services.validation.MetadataValidator;
-import de.fitko.fitconnect.dependency.ApplicationConfig;
 import de.fitko.fitconnect.core.SubmissionSender;
 import de.fitko.fitconnect.core.SubmissionSubscriber;
 import de.fitko.fitconnect.core.auth.DefaultOAuthService;
@@ -19,16 +18,22 @@ import de.fitko.fitconnect.core.http.ProxyConfig;
 import de.fitko.fitconnect.core.metadata.MetadataUploadService;
 import de.fitko.fitconnect.core.validation.KeyValidator;
 import de.fitko.fitconnect.core.validation.MetadataSubmissionValidator;
+import de.fitko.fitconnect.dependency.ApplicationConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.web.client.RestTemplate;
 
 import java.io.File;
 
 public class ClientFactory {
 
+    private static final Logger logger = LoggerFactory.getLogger(ClientFactory.class);
+
     public static final String CONFIG_FILENAME = "sdk.conf";
     public static final String CONFIG_CONTEXT = "sdk";
 
-    private ClientFactory() {}
+    private ClientFactory() {
+    }
 
     public static SenderClient.WithDestination senderClient() {
         final ApplicationConfig config = loadConfig();
@@ -41,17 +46,17 @@ public class ClientFactory {
         final ApplicationConfig config = loadConfig();
         final RestTemplate restTemplate = getRestTemplate(config);
         final Subscriber subscriber = getSubscriber(config, restTemplate);
-        return SubscriberClient.builder(subscriber);
+        return SubscriberClient.builder(subscriber, config.getClientId(), config.getClientSecret(), config.getPrivateKey());
     }
 
-    private static Subscriber getSubscriber(ApplicationConfig config, RestTemplate restTemplate) {
+    private static Subscriber getSubscriber(final ApplicationConfig config, final RestTemplate restTemplate) {
         final OAuthService oAuthService = getOAuthService(config, restTemplate);
         final CryptoService cryptoService = getCryptoService();
         final MetadataValidator validator = new MetadataSubmissionValidator();
-        return new SubmissionSubscriber(oAuthService,cryptoService, validator);
+        return new SubmissionSubscriber(oAuthService, cryptoService, validator);
     }
 
-    private static Sender getSender(ApplicationConfig config, RestTemplate restTemplate) {
+    private static Sender getSender(final ApplicationConfig config, final RestTemplate restTemplate) {
         final OAuthService authService = getOAuthService(config, restTemplate);
         final CryptoService cryptoService = getCryptoService();
         final CertificateValidator validator = new KeyValidator();
@@ -63,11 +68,11 @@ public class ClientFactory {
         return new JWECryptoService();
     }
 
-    private static OAuthService getOAuthService(ApplicationConfig config, RestTemplate restTemplate) {
-        return new DefaultOAuthService(restTemplate, config.getAuthTokenUrl());
+    private static OAuthService getOAuthService(final ApplicationConfig config, final RestTemplate restTemplate) {
+        return new DefaultOAuthService(restTemplate, config.getActiveEnvironment().getAuthTokenUrl());
     }
 
-    private static RestTemplate getRestTemplate(ApplicationConfig config) {
+    private static RestTemplate getRestTemplate(final ApplicationConfig config) {
         final ProxyConfig proxyConfig = new ProxyConfig(config.getHttpProxyHost(), config.getHttpProxyPort());
         return proxyConfig.proxyRestTemplate();
     }
@@ -75,6 +80,8 @@ public class ClientFactory {
     private static ApplicationConfig loadConfig() {
         final Config configFile = ConfigFactory.parseFile(new File(CONFIG_FILENAME));
         final Config sdkConfig = ConfigFactory.load(configFile).getConfig(CONFIG_CONTEXT);
-        return ConfigBeanFactory.create(sdkConfig, ApplicationConfig.class);
+        final ApplicationConfig applicationConfig = ConfigBeanFactory.create(sdkConfig, ApplicationConfig.class);
+        logger.info("Using sdk environment config {} with {}", applicationConfig.getMode(), applicationConfig);
+        return applicationConfig;
     }
 }
diff --git a/dependency/src/main/java/de/fitko/fitconnect/dependency/ApplicationConfig.java b/dependency/src/main/java/de/fitko/fitconnect/dependency/ApplicationConfig.java
index 5904e9537..dcd890189 100644
--- a/dependency/src/main/java/de/fitko/fitconnect/dependency/ApplicationConfig.java
+++ b/dependency/src/main/java/de/fitko/fitconnect/dependency/ApplicationConfig.java
@@ -1,36 +1,70 @@
 package de.fitko.fitconnect.dependency;
 
+import de.fitko.fitconnect.core.SubmissionSender;
 import lombok.Getter;
+import lombok.NoArgsConstructor;
 import lombok.Setter;
 import lombok.ToString;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
-import java.util.List;
 import java.util.Properties;
 
 @Getter
 @Setter
 @ToString
 public class ApplicationConfig {
-
+    
     private String httpProxyHost;
     private Integer httpProxyPort;
 
-    private String authTokenUrl;
-    private List<String> apiUrls;
-
     private String clientId;
     private String clientSecret;
+    private String privateKey;
+
+    private Environments environments;
 
+    private String mode;
+
+    public Environment getActiveEnvironment() {
+        switch (mode) {
+            case "PROD":
+                return environments.prod;
+            case "TEST":
+                return environments.test;
+            default:
+                return environments.dev;
+        }
+    }
 
     public Properties getAsProperties() {
-        var props = new Properties();
+        final var props = new Properties();
         props.put("httpProxyHost", getHttpProxyHost());
         props.put("httpProxyPort", getHttpProxyPort());
-        props.put("authTokenUrl", getAuthTokenUrl());
-        props.put("apiUrls", String.join(",",getApiUrls()));
         props.put("clientId", clientId);
         props.put("clientSecret", clientSecret);
+        props.put("privateKey", privateKey);
+        //props.put("environment", getActiveEnvironment(mode, environments));
         return props;
     }
+
+
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor
+    static public class Environments {
+        private Environment dev;
+        private Environment prod;
+        private Environment test;
+    }
+
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor
+    static public class Environment {
+        private String authTokenUrl;
+    }
 }
 
diff --git a/sdk.conf b/sdk.conf
index 50dacfca5..d1f7c0af3 100644
--- a/sdk.conf
+++ b/sdk.conf
@@ -3,10 +3,24 @@ sdk {
 
   clientId: "781f6213-0f0f-4a79-9372-e7187ffda98b"
   clientSecret: "PnzR8Vbmhpv_VwTkT34wponqXWK8WBm-LADlryYdV4o"
+  privateKey: "123"
 
   httpProxyHost: ""
-  httpProxyPort: "0"
+  httpProxyPort: 0
 
-  apiUrls: ["http://test.url1", "http://test.url2", "http://test.url3"]
-  authTokenUrl: "https://auth-testing.fit-connect.fitko.dev/token"
+  # Mode which environment should be active DEV, PROD or TEST
+  mode: "DEV"
+
+  environments {
+    dev {
+        authTokenUrl: "https://auth-testing.fit-connect.fitko.dev/token"
+        # apiUrls: ["http://test.url1", "http://test.url2", "http://test.url3"]
+    }
+    prod {
+         authTokenUrl: "https://auth-prod.fit-connect.fitko.dev/token"
+    }
+    test {
+        authTokenUrl: "https://auth-test.fit-connect.fitko.dev/token"
+    }
+  }
 }
-- 
GitLab