package br.gov.servicos.editor.frontend; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.FieldDefaults; import lombok.experimental.Wither; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import java.util.Optional; import java.util.function.Predicate; import java.util.regex.Pattern; import static java.util.Optional.empty; import static java.util.Optional.ofNullable; import static lombok.AccessLevel.PRIVATE; @Slf4j @Component @FieldDefaults(level = PRIVATE, makeFinal = true) public class Siorg { public static final Predicate<String> URL_PREDICATE = Pattern.compile("http://estruturaorganizacional\\.dados\\.gov\\.br/id/unidade-organizacional/\\d+").asPredicate(); RestTemplate restTemplate; @Autowired public Siorg(RestTemplate restTemplate) { this.restTemplate = restTemplate; } @Cacheable(value = "orgaoSiorg", unless = "#result.isPresent()") public Optional<String> nomeDoOrgao(String urlOrgao) { if (URL_PREDICATE.negate().test(urlOrgao)) { log.warn("URL {} não é uma URL para órgão no Siorg", urlOrgao); return empty(); } try { ResponseEntity<ConsultaUnidadeResumida> entity = restTemplate.getForEntity(urlOrgao, ConsultaUnidadeResumida.class); ConsultaUnidadeResumida body = entity.getBody(); if (body.getServico().getCodigoErro() > 0) { log.warn("Erro ao acessar Siorg: {}", body.getServico().getMensagem()); return empty(); } return ofNullable(String.format("%s (%s)", body.getUnidade().getNome(), body.getUnidade().getSigla())); } catch (RestClientException e) { log.warn("Erro ao acessar Siorg", e); return empty(); } } @Data @Wither @NoArgsConstructor @AllArgsConstructor public static class ConsultaUnidadeResumida { Servico servico; Unidade unidade; } @Data @Wither @NoArgsConstructor @AllArgsConstructor public static class Servico { long codigoErro; String mensagem; } @Data @Wither @NoArgsConstructor @AllArgsConstructor public static class Unidade { String codigoUnidade; String nome; String sigla; } }