ProcessCatalogClient.java

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

import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.LoadingCache;
import no.nav.data.common.rest.RestResponsePage;
import no.nav.data.common.utils.MetricUtils;
import no.nav.data.common.web.TraceHeaderFilter;
import no.nav.data.team.integration.process.dto.PcatProcess;
import no.nav.data.team.integration.process.dto.ProcessResponse;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;

import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

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

@Service
public class ProcessCatalogClient {

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

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

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

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

    // Internal

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

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

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

    private static class ProcessPage extends RestResponsePage<PcatProcess> {

    }

}