Minha resolução:
SerieControlles.java
@GetMapping("/{id}/temporadas/top")
public List<EpisodioDTO> obterTop5EpisodiosSerie(@PathVariable Long id){
return servico.obterTop5EpisodiosSerie(id);
}
Aqui foi feito a definição do endpoint REST para a requisição "/{id}/temporadas/top"
SerieService.java
public List<EpisodioDTO> obterTop5EpisodiosSerie(Long id) {
Optional serieBuscada = repositorio.findById(id);
if(serieBuscada.isPresent()){
Serie serie = (Serie) serieBuscada.get();
return repositorio.topEpisodiosPorSerie(serie).stream()
.map(e -> new EpisodioDTO(e.getTemporada(), e.getNumeroEpisodio(), e.getTitulo()))
.collect(Collectors.toList());
} else {
return null;
}
}
SerieRepository.java
@Query("SELECT e FROM Serie s JOIN s.episodios e WHERE s = :serie ORDER BY e.avaliacao DESC LIMIT 5")
List<Episodio> topEpisodiosPorSerie(Serie serie);
Esse é o método para obter os top 5 episódios da série:
- Primeiro, busco a série pelo id (Deixei para o Spring fazer essa busca (repositorio.findById(id))) e jogo na variável serieBuscada
- Como é um Optional, tenho que fazer um if else
- Se encontrar a série, crio uma variável do tipo Serie chamada de "serie", dando um get na SerieBuscada e uso um cast para ele mudar do tipo Object para Serie
- Com isso, consigo reutilizar o método "topEpisodiosPorSerie(serie)" que foi criado em aulas anteriores
- Em seguida, como tenho que retornar uma List de EpisodioDTO, uso stream, map e collect
Agora temos que fazer aparecer no frontend, para isso, só copiei uma das opções e alterei algumas partes:
series.js
// Função para carregar temporadas
function carregarTemporadas() {
getDados(`/series/${serieId}/temporadas/todas`)
.then((data) => {
const temporadasUnicas = [
...new Set(data.map((temporada) => temporada.temporada)),
];
listaTemporadas.innerHTML = ""; // Limpa as opções existentes
const optionDefault = document.createElement("option");
optionDefault.value = "";
optionDefault.textContent = "Selecione a temporada";
listaTemporadas.appendChild(optionDefault);
temporadasUnicas.forEach((temporada) => {
const option = document.createElement("option");
option.value = temporada;
option.textContent = temporada;
listaTemporadas.appendChild(option);
});
const optionTodos = document.createElement("option");
optionTodos.value = "todas";
optionTodos.textContent = "Todas as temporadas";
listaTemporadas.appendChild(optionTodos);
//PARTE QUE EU CRIEI
const optionTopEpisodios = document.createElement("option");
optionTopEpisodios.value = "top";
optionTopEpisodios.textContent = "Top 5 episódios";
listaTemporadas.appendChild(optionTopEpisodios);
})
//FIM DA PARTE QUE EU CRIEI
.catch((error) => {
console.error("Erro ao obter temporadas:", error);
});
}
Imagem da resolução: