package br.gov.servicos.servico;
import br.gov.servicos.v3.schema.AreaDeInteresse;
import br.gov.servicos.v3.schema.OrgaoXML;
import br.gov.servicos.v3.schema.SegmentoDaSociedade;
import br.gov.servicos.v3.schema.ServicoXML;
import org.elasticsearch.index.query.TermFilterBuilder;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import java.util.List;
import static java.lang.Integer.MAX_VALUE;
import static java.util.Collections.singletonList;
import static java.util.stream.Collectors.toList;
import static org.elasticsearch.search.sort.SortOrder.ASC;
public interface ServicoRepository extends ElasticsearchRepository<ServicoXML, String> {
@Cacheable("servicos-por-orgao")
default List<ServicoXML> findByOrgao(OrgaoXML orgao) {
return findAll(new PageRequest(0, MAX_VALUE)).getContent()
.stream()
.filter(s -> s.getOrgao() != null && s.getOrgao().getId().equals(orgao.getId()))
.collect(toList());
}
@Cacheable("servicos-por-area-de-interesse")
default List<ServicoXML> findByAreaDeInteresse(AreaDeInteresse areaDeInteresse) {
return search(new NativeSearchQueryBuilder()
.withFilter(new TermFilterBuilder("areasDeInteresse", singletonList(areaDeInteresse)))
.withSort(new FieldSortBuilder("nome").order(ASC))
.build())
.getContent();
}
@Cacheable("servicos-por-segmento-da-sociedade")
default List<ServicoXML> findBySegmentoDaSociedade(SegmentoDaSociedade segmentoDaSociedade) {
return search(new NativeSearchQueryBuilder()
.withFilter(new TermFilterBuilder("segmentosDaSociedade", singletonList(segmentoDaSociedade)))
.withSort(new FieldSortBuilder("nome").order(ASC))
.build())
.getContent();
}
}