1
resposta

[Projeto] Minha solução

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:

  1. Primeiro, busco a série pelo id (Deixei para o Spring fazer essa busca (repositorio.findById(id))) e jogo na variável serieBuscada
  2. Como é um Optional, tenho que fazer um if else
  3. 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
  4. Com isso, consigo reutilizar o método "topEpisodiosPorSerie(serie)" que foi criado em aulas anteriores
  5. 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:

Imagem da resolução do problema

1 resposta

Oi, Lucas! Como vai?

Obrigada por compartilhar seu código com a gente. Parabéns por praticar.

Gostei de como você configurou o endpoint para exibir os top 5 episódios, e o uso de Optional no tratamento do retorno da série ficou bem claro!

Conte com o apoio do Fórum na sua jornada. Abraços e bons estudos!