InstitutionConfigClientImpl.java

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

import fr.avenirsesr.portfolio.common.configuration.domain.model.InstitutionConfigurationElements;
import fr.avenirsesr.portfolio.common.security.infrastructure.adapter.model.AvenirsSecurityHeaders;
import fr.avenirsesr.portfolio.program.domain.port.output.client.InstitutionConfigClient;
import java.util.UUID;
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 InstitutionConfigClientImpl implements InstitutionConfigClient {
  private final WebClient webClient;

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

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

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

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