package br.gov.servicos.busca;
import br.gov.servicos.cms.PaginaEstatica;
import lombok.experimental.FieldDefaults;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.servlet.ModelAndView;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static java.lang.String.format;
import static java.util.Optional.ofNullable;
import static java.util.stream.Collectors.joining;
import static lombok.AccessLevel.PRIVATE;
import static org.springframework.http.HttpStatus.MOVED_PERMANENTLY;
import static org.springframework.http.HttpStatus.OK;
@Controller
@FieldDefaults(level = PRIVATE, makeFinal = true)
class BuscaController {
BuscadorConteudo buscador;
@Autowired
BuscaController(BuscadorConteudo buscador) {
this.buscador = buscador;
}
@RequestMapping("/busca")
ModelAndView busca(@RequestParam(required = true) String q,
@RequestParam(required = false, defaultValue = "1") Integer pagina) {
Map<String, Object> model = new HashMap<>();
model.put("termo", q);
model.put("resultados", buscador.busca(ofNullable(q), pagina - 1));
return new ModelAndView("resultados-busca", model);
}
@ResponseStatus(MOVED_PERMANENTLY)
@RequestMapping("/search")
String search(@RequestParam(value = "SearchableText", required = true) String q) {
return format("redirect:/busca?q=%s", ofNullable(q).orElse(""));
}
@RequestMapping(value = "/sugestao", produces = "application/json")
@ResponseStatus(OK)
@ResponseBody
String sugestao(@RequestParam(required = true) String q) {
List<PaginaEstatica> listaServico = buscador.buscaSemelhante(ofNullable(q));
return format("[\"%s\", %s]",
q,
listaServico.stream()
.map(PaginaEstatica::getNome)
.limit(7)
.collect(joining("\",\"", "[\"", "\"]")));
}
@RequestMapping(value = "/opensearch.xml", produces = MediaType.APPLICATION_XML_VALUE)
ModelAndView openSearch() {
return new ModelAndView("opensearch");
}
}