diff --git a/src/main/java/com/banesco/infraestructure/web/BaseWebClientBuilder.java b/src/main/java/com/banesco/infraestructure/web/BaseWebClientBuilder.java new file mode 100644 index 0000000..42f9b99 --- /dev/null +++ b/src/main/java/com/banesco/infraestructure/web/BaseWebClientBuilder.java @@ -0,0 +1,111 @@ +package com.banesco.infraestructure.web; + +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.time.Duration; +import java.util.concurrent.CompletableFuture; + +/** + * Clase constructora para crear instancias de WebClient utilizando + * java.net.http.HttpClient + * + * @author [Tu Nombre] + */ +public class BaseWebClientBuilder { + + private String baseUrl; + private Duration connectTimeout; + private Duration responseTimeout; + + /** + * Constructor para inicializar los timeouts con valores predeterminados. + */ + public BaseWebClientBuilder() { + this.connectTimeout = Duration.ofSeconds(10); + this.responseTimeout = Duration.ofSeconds(10); + } + + /** + * Método estático para iniciar la construcción de un BaseWebClientBuilder. + * Permite encadenar llamadas a los métodos de configuración. + * + * @return Una nueva instancia de BaseWebClientBuilder. + */ + public static BaseWebClientBuilder builder() { + return new BaseWebClientBuilder(); + } + + /** + * Configura la URL base para el WebClient. + * + * @param baseUrl La URL base a utilizar. + * @return La instancia actual de BaseWebClientBuilder para encadenar + * llamadas. + */ + public BaseWebClientBuilder baseUrl(String baseUrl) { + this.baseUrl = baseUrl; + return this; + } + + /** + * Configura el timeout de conexión. + * + * @param timeout El timeout de conexión. + * @return La instancia actual de BaseWebClientBuilder para encadenar + * llamadas. + */ + public BaseWebClientBuilder connectTimeout(Duration timeout) { + this.connectTimeout = timeout; + return this; + } + + /** + * Configura el timeout de respuesta. + * + * @param timeout El timeout de respuesta. + * @return La instancia actual de BaseWebClientBuilder para encadenar + * llamadas. + */ + public BaseWebClientBuilder responseTimeout(Duration timeout) { + this.responseTimeout = timeout; + return this; + } + + /** + * Construye y devuelve una instancia de HttpClient con la configuración + * especificada. + * + * @return Una instancia de HttpClient configurada. + */ + public HttpClient build() { + return HttpClient.newBuilder() + .connectTimeout(connectTimeout) + .build(); + } + + /** + * Realiza una petición GET utilizando el HttpClient configurado. + * + * @param httpClient El HttpClient configurado. + * @param path El path de la petición. + * @return Un CompletableFuture que emite la respuesta como String. + * @throws IOException + * @throws InterruptedException + */ + public CompletableFuture get(HttpClient httpClient, String path) { + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(baseUrl + path)) + .header("Content-Type", "application/json") + .header("Accept", "application/json") + .timeout(responseTimeout) + .GET() + .build(); + + return httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenApply(HttpResponse::body); + } + +}