ResourceRepositoryImpl.java
package no.nav.data.team.resource.domain;
import lombok.extern.slf4j.Slf4j;
import no.nav.data.common.storage.domain.GenericStorage;
import no.nav.data.team.cluster.domain.Cluster;
import no.nav.data.team.po.domain.ProductArea;
import no.nav.data.team.team.TeamRepository;
import no.nav.data.team.team.domain.Team;
import org.springframework.context.annotation.Lazy;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.*;
import java.util.stream.Collectors;
import static no.nav.data.common.storage.domain.GenericStorage.getOfType;
@Slf4j
@Repository
public class ResourceRepositoryImpl implements ResourceRepositoryCustom {
private final NamedParameterJdbcTemplate jdbcTemplate;
private final TeamRepository teamRepository;
public ResourceRepositoryImpl(NamedParameterJdbcTemplate jdbcTemplate, @Lazy TeamRepository teamRepository) {
this.jdbcTemplate = jdbcTemplate;
this.teamRepository = teamRepository;
}
@Override
public Membership findByMemberIdent(String memberIdent) {
var resp = jdbcTemplate.queryForList(
"select id from generic_storage where data #>'{members}' @> :member::jsonb and type in ('Team', 'ProductArea', 'Cluster')",
new MapSqlParameterSource().addValue("member", String.format("[{\"navIdent\": \"%s\"}]", memberIdent))
);
var storages = get(resp);
return new Membership(getOfType(storages, Team.class), getOfType(storages, ProductArea.class), getOfType(storages, Cluster.class));
}
@Override
public Map<String, Membership> findAllByMemberIdents(List<String> memberIdents) {
return memberIdents.stream()
.collect(Collectors.toMap(
ident -> ident,
this::findByMemberIdent
));
}
private List<GenericStorage> get(List<Map<String, Object>> resp) {
List<UUID> ids = resp.stream().map(i -> ((UUID) i.values().iterator().next())).collect(Collectors.toList());
return teamRepository.findAllById(ids);
}
public record Membership(List<Team> teams, List<ProductArea> productAreas, List<Cluster> clusters) {
}
}