TraceConfigurationClient.java

package fr.avenirsesr.portfolio.trace.infrastructure.adapter.client;

import fr.avenirsesr.portfolio.common.configuration.domain.model.TraceConfiguration;
import fr.avenirsesr.portfolio.common.security.infrastructure.adapter.model.AvenirsSecurityHeaders;
import fr.avenirsesr.portfolio.trace.domain.port.output.TraceConfigurationPort;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.server.ResponseStatusException;

@Slf4j
@Component
public class TraceConfigurationClient implements TraceConfigurationPort {

  private final WebClient webClient;

  @Value("${avenirs.back-office.api-key}")
  private String apiKey;

  @Value("${avenirs.back-office.trace.config.endpoint}")
  private String traceConfigBackOfficeEndPoint;

  public TraceConfigurationClient(WebClient webClient) {
    this.webClient = webClient;
  }

  @Override
  public TraceConfiguration getTraceConfiguration() {
    try {
      log.debug("Fetching trace configuration from back-office: {}", traceConfigBackOfficeEndPoint);
      return webClient
          .get()
          .uri(traceConfigBackOfficeEndPoint)
          .header(AvenirsSecurityHeaders.API_KEY, apiKey)
          .retrieve()
          .bodyToMono(TraceConfiguration.class)
          .block();
    } catch (Exception e) {
      log.error(
          "Failed to fetch trace configuration from back-office at '{}'. Error: {}",
          traceConfigBackOfficeEndPoint,
          e.getMessage());
      log.debug("Full error details:", e);
      throw new ResponseStatusException(
          HttpStatus.INTERNAL_SERVER_ERROR,
          "Unable to fetch trace configuration from back-office",
          e);
    }
  }
}