diff --git a/src/main/java/com/whiskels/notifier/infrastructure/config/feign/FeignCrmConfig.java b/src/main/java/com/whiskels/notifier/infrastructure/config/feign/FeignCrmConfig.java new file mode 100644 index 00000000..70b407ae --- /dev/null +++ b/src/main/java/com/whiskels/notifier/infrastructure/config/feign/FeignCrmConfig.java @@ -0,0 +1,21 @@ +package com.whiskels.notifier.infrastructure.config.feign; + +import feign.RequestInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; + +import java.util.Base64; + + +public class FeignCrmConfig { + private static final String USER_ENV_VAR = "API_USER_NAME"; + private static final String PASSWORD_ENV_VAR = "API_USER_PASSWORD"; + + @Bean + public RequestInterceptor requestInterceptor(final Environment environment) { + String auth = STR."\{environment.getProperty(USER_ENV_VAR)}:\{environment.getProperty(PASSWORD_ENV_VAR)}"; + return requestTemplate -> requestTemplate.header(HttpHeaders.AUTHORIZATION, STR."Basic \{Base64.getEncoder().encodeToString(auth.getBytes())}"); + } + +} diff --git a/src/main/java/com/whiskels/notifier/infrastructure/config/feign/FeignProxyConfig.java b/src/main/java/com/whiskels/notifier/infrastructure/config/feign/FeignProxyConfig.java deleted file mode 100644 index e0567679..00000000 --- a/src/main/java/com/whiskels/notifier/infrastructure/config/feign/FeignProxyConfig.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.whiskels.notifier.infrastructure.config.feign; - -import feign.Client; -import okhttp3.Authenticator; -import okhttp3.ConnectionPool; -import okhttp3.Credentials; -import okhttp3.OkHttpClient; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; -import org.springframework.context.annotation.Bean; -import org.springframework.http.HttpHeaders; - -import java.net.InetSocketAddress; -import java.net.Proxy; -import java.util.Base64; -import java.util.concurrent.TimeUnit; - -public class FeignProxyConfig { - @Value("${feign.proxy.max-idle-connections:5}") - private int maxIdleConnections; - @Value("${feign.proxy.keep-alive-duration-minutes:5}") - private int keepAliveDurationMinutes; - - @Bean - @ConditionalOnBean(ProxyPropertiesProvider.class) - public Client proxiedFeignClient(final ProxyPropertiesProvider propertiesProvider) { - return new feign.okhttp.OkHttpClient( - proxiedHttpClient(propertiesProvider, maxIdleConnections, keepAliveDurationMinutes) - ); - } - - private static OkHttpClient proxiedHttpClient(final ProxyPropertiesProvider propertiesProvider, - final int maxIdleConnections, - final int keepAliveDurationMinutes - ) { - String auth = STR."\{propertiesProvider.getProxyUser()}:\{propertiesProvider.getProxyPassword()}"; - Authenticator proxyAuthenticator = (_, response) -> { - String credential = Credentials.basic(propertiesProvider.getProxyUser(), propertiesProvider.getProxyPassword()); - return response.request().newBuilder() - .header(HttpHeaders.PROXY_AUTHORIZATION, credential) - .header(HttpHeaders.AUTHORIZATION, STR."Basic \{Base64.getEncoder().encodeToString(auth.getBytes())}") - .build(); - }; - - return new OkHttpClient.Builder() - .proxy(createProxy(propertiesProvider)) - .proxyAuthenticator(proxyAuthenticator) - .connectionPool(new ConnectionPool(maxIdleConnections, keepAliveDurationMinutes, TimeUnit.MINUTES)) - .build(); - } - - private static Proxy createProxy(ProxyPropertiesProvider propertiesProvider) { - return new Proxy(Proxy.Type.HTTP, new InetSocketAddress(propertiesProvider.getProxyHost(), propertiesProvider.getProxyPort())); - } -} diff --git a/src/main/java/com/whiskels/notifier/infrastructure/config/feign/FixieProxyPropertiesProvider.java b/src/main/java/com/whiskels/notifier/infrastructure/config/feign/FixieProxyPropertiesProvider.java deleted file mode 100644 index ca6305ba..00000000 --- a/src/main/java/com/whiskels/notifier/infrastructure/config/feign/FixieProxyPropertiesProvider.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.whiskels.notifier.infrastructure.config.feign; - -import lombok.Getter; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.core.env.Environment; -import org.springframework.stereotype.Component; - -import java.util.Objects; - -@Getter -@Component -@ConditionalOnProperty(FixieProxyPropertiesProvider.FIXIE_ENV_VAR) -class FixieProxyPropertiesProvider implements ProxyPropertiesProvider { - static final String FIXIE_ENV_VAR = "FIXIE_URL"; - static final String USER_ENV_VAR = "PROXIED_USER_NAME"; - static final String PASSWORD_ENV_VAR = "PROXIED_USER_PASSWORD"; - - private final String proxyUser; - private final String proxyPassword; - private final String proxyHost; - private final int proxyPort; - private final String user; - private final String password; - - public FixieProxyPropertiesProvider(final Environment environment) { - final String fixieUrl = environment.getProperty(FIXIE_ENV_VAR); - Objects.requireNonNull(fixieUrl); - final String[] fixieValues = fixieUrl.split("[/(:\\/@)/]+"); - this.proxyUser = fixieValues[1]; - this.proxyPassword = fixieValues[2]; - this.proxyHost = fixieValues[3]; - this.proxyPort = Integer.parseInt(fixieValues[4]); - this.user = environment.getProperty(USER_ENV_VAR); - this.password = environment.getProperty(PASSWORD_ENV_VAR); - } -} diff --git a/src/main/java/com/whiskels/notifier/infrastructure/config/feign/ProxyPropertiesProvider.java b/src/main/java/com/whiskels/notifier/infrastructure/config/feign/ProxyPropertiesProvider.java deleted file mode 100644 index 45deacce..00000000 --- a/src/main/java/com/whiskels/notifier/infrastructure/config/feign/ProxyPropertiesProvider.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.whiskels.notifier.infrastructure.config.feign; - - -interface ProxyPropertiesProvider { - String getProxyUser(); - - String getProxyPassword(); - - String getProxyHost(); - - int getProxyPort(); - - String getUser(); - - String getPassword(); -} diff --git a/src/main/java/com/whiskels/notifier/reporting/service/customer/debt/fetch/CustomerDebtFeignClient.java b/src/main/java/com/whiskels/notifier/reporting/service/customer/debt/fetch/CustomerDebtFeignClient.java index 5d48eb64..0696d1f3 100644 --- a/src/main/java/com/whiskels/notifier/reporting/service/customer/debt/fetch/CustomerDebtFeignClient.java +++ b/src/main/java/com/whiskels/notifier/reporting/service/customer/debt/fetch/CustomerDebtFeignClient.java @@ -1,6 +1,6 @@ package com.whiskels.notifier.reporting.service.customer.debt.fetch; -import com.whiskels.notifier.infrastructure.config.feign.FeignProxyConfig; +import com.whiskels.notifier.infrastructure.config.feign.FeignCrmConfig; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; @@ -10,7 +10,7 @@ @ConditionalOnProperty(DEBT_URL) -@FeignClient(name = "debtClient", url = "${" + DEBT_URL + "}", configuration = FeignProxyConfig.class) +@FeignClient(name = "debtClient", url = "${" + DEBT_URL + "}", configuration = FeignCrmConfig.class) public interface CustomerDebtFeignClient { String DEBT_URL = "report.parameters.customer-debt.url"; diff --git a/src/main/java/com/whiskels/notifier/reporting/service/customer/payment/fetch/FinOperationFeignClient.java b/src/main/java/com/whiskels/notifier/reporting/service/customer/payment/fetch/FinOperationFeignClient.java index 3197eeb5..12c445be 100644 --- a/src/main/java/com/whiskels/notifier/reporting/service/customer/payment/fetch/FinOperationFeignClient.java +++ b/src/main/java/com/whiskels/notifier/reporting/service/customer/payment/fetch/FinOperationFeignClient.java @@ -1,6 +1,6 @@ package com.whiskels.notifier.reporting.service.customer.payment.fetch; -import com.whiskels.notifier.infrastructure.config.feign.FeignProxyConfig; +import com.whiskels.notifier.infrastructure.config.feign.FeignCrmConfig; import com.whiskels.notifier.reporting.service.customer.payment.domain.FinancialOperation; import feign.RequestInterceptor; import org.springframework.beans.factory.annotation.Value; @@ -30,7 +30,7 @@ public interface FinOperationFeignClient { @RequestMapping(method = GET) List get(); - @Import(FeignProxyConfig.class) + @Import(FeignCrmConfig.class) class FinOperationRequestInterceptorConfig { private static final DateTimeFormatter YEAR_MONTH_DAY_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); diff --git a/src/main/java/com/whiskels/notifier/reporting/service/employee/fetch/EmployeeFeignClient.java b/src/main/java/com/whiskels/notifier/reporting/service/employee/fetch/EmployeeFeignClient.java index 21153d3c..90141358 100644 --- a/src/main/java/com/whiskels/notifier/reporting/service/employee/fetch/EmployeeFeignClient.java +++ b/src/main/java/com/whiskels/notifier/reporting/service/employee/fetch/EmployeeFeignClient.java @@ -1,6 +1,6 @@ package com.whiskels.notifier.reporting.service.employee.fetch; -import com.whiskels.notifier.infrastructure.config.feign.FeignProxyConfig; +import com.whiskels.notifier.infrastructure.config.feign.FeignCrmConfig; import com.whiskels.notifier.reporting.service.employee.domain.Employee; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.openfeign.FeignClient; @@ -13,7 +13,7 @@ @ConditionalOnProperty(EMPLOYEE_URL) -@FeignClient(name = "employeeClient", url = "${" + EMPLOYEE_URL + "}", configuration = FeignProxyConfig.class) +@FeignClient(name = "employeeClient", url = "${" + EMPLOYEE_URL + "}", configuration = FeignCrmConfig.class) public interface EmployeeFeignClient { @RequestMapping(method = GET) diff --git a/src/test/java/com/whiskels/notifier/infrastructure/config/feign/FixieProxyPropertiesProviderTest.java b/src/test/java/com/whiskels/notifier/infrastructure/config/feign/FixieProxyPropertiesProviderTest.java deleted file mode 100644 index af01413d..00000000 --- a/src/test/java/com/whiskels/notifier/infrastructure/config/feign/FixieProxyPropertiesProviderTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.whiskels.notifier.infrastructure.config.feign; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.core.env.Environment; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.when; - -@ExtendWith({MockitoExtension.class}) -public class FixieProxyPropertiesProviderTest { - - @Mock - private Environment environment; - - @Test - @DisplayName("Should correctly initialize via constructor") - void testConstructorSuccess() { - when(environment.getProperty(FixieProxyPropertiesProvider.FIXIE_ENV_VAR)) - .thenReturn("http://user:password@host:8080"); - when(environment.getProperty(FixieProxyPropertiesProvider.USER_ENV_VAR)) - .thenReturn("admin"); - when(environment.getProperty(FixieProxyPropertiesProvider.PASSWORD_ENV_VAR)) - .thenReturn("pw"); - - FixieProxyPropertiesProvider fixieProxyPropertiesProvider = new FixieProxyPropertiesProvider(environment); - - assertEquals("user", fixieProxyPropertiesProvider.getProxyUser()); - assertEquals("password", fixieProxyPropertiesProvider.getProxyPassword()); - assertEquals("host", fixieProxyPropertiesProvider.getProxyHost()); - assertEquals(8080, fixieProxyPropertiesProvider.getProxyPort()); - assertEquals("admin", fixieProxyPropertiesProvider.getUser()); - assertEquals("pw", fixieProxyPropertiesProvider.getPassword()); - } - - @Test - @DisplayName("Should fail to initialize via constructor when env var not present") - void testConstructorFailure() { - when(environment.getProperty(FixieProxyPropertiesProvider.FIXIE_ENV_VAR)).thenReturn(null); - - assertThrows(NullPointerException.class, () -> new FixieProxyPropertiesProvider(environment)); - } -} \ No newline at end of file