ProcessCatalogClient.java

  1. package no.nav.data.team.integration.process;

  2. import com.github.benmanes.caffeine.cache.Caffeine;
  3. import com.github.benmanes.caffeine.cache.LoadingCache;
  4. import no.nav.data.common.rest.RestResponsePage;
  5. import no.nav.data.common.utils.MetricUtils;
  6. import no.nav.data.common.web.TraceHeaderFilter;
  7. import no.nav.data.team.integration.process.dto.PcatProcess;
  8. import no.nav.data.team.integration.process.dto.ProcessResponse;
  9. import org.springframework.stereotype.Service;
  10. import org.springframework.web.reactive.function.client.WebClient;

  11. import java.time.Duration;
  12. import java.util.ArrayList;
  13. import java.util.List;
  14. import java.util.UUID;

  15. import static no.nav.data.common.utils.StreamUtils.convert;

  16. @Service
  17. public class ProcessCatalogClient {

  18.     private final WebClient client;
  19.     private final LoadingCache<UUID, List<PcatProcess>> processTeamCache;

  20.     public ProcessCatalogClient(WebClient.Builder webClientBuilder, PcatProperties properties) {
  21.         this.client = webClientBuilder
  22.                 .baseUrl(properties.getBaseUrl())
  23.                 .filter(new TraceHeaderFilter(true))
  24.                 .build();

  25.         this.processTeamCache = MetricUtils.register("pcatProcessTeamCache",
  26.                 Caffeine.newBuilder().recordStats()
  27.                         .expireAfterWrite(Duration.ofMinutes(10))
  28.                         .maximumSize(100).build(this::findProcessesForTeam));
  29.     }

  30.     public List<ProcessResponse> getProcessesForTeam(UUID id) {
  31.         return convert(processTeamCache.get(id), PcatProcess::convertToResponse);
  32.     }

  33.     // Internal

  34.     private List<PcatProcess> findProcessesForTeam(UUID teamId) {
  35.         return getAll("/process?productTeam={teamId}", teamId, ProcessPage.class);
  36.     }

  37.     private <T extends RestResponsePage<R>, R> List<R> getAll(String url, UUID id, Class<T> type) {
  38.         List<R> items = new ArrayList<>();
  39.         T page = null;
  40.         while (page == null || (page.getPages() - 1 > page.getPageNumber())) {
  41.             page = get(url, id, page == null ? 0 : page.getPageNumber() + 1, type);
  42.             items.addAll(page.getContent());
  43.         }
  44.         return items;
  45.     }

  46.     private <T> T get(String url, UUID id, long page, Class<T> type) {
  47.         return client.get()
  48.                 .uri(url + "&pageSize=250&pageNumber={pageNumber}", id, page)
  49.                 .retrieve()
  50.                 .bodyToMono(type).block();
  51.     }

  52.     private static class ProcessPage extends RestResponsePage<PcatProcess> {

  53.     }

  54. }