Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Minha solução

Foram feitos os seguites passos para a solução do desafio:

Código na SerieController:

@GetMapping("{id}/temporadas/top")
public List<EpisodioDTO> obterTemporadasTop(@PathVariable Long id) {
    // Chama o método do serviço para obter a lista dos episódios top da série com o id fornecido
    return serieService.listaTop(id);
}
  • @GetMapping("{id}/temporadas/top"): Define um endpoint REST que responde a requisições HTTP GET para a URL com o formato {id}/temporadas/top. O {id} é um parâmetro de caminho que representa o identificador da série.
  • @PathVariable Long id: O id é extraído da URL e passado como argumento para o método obterTemporadasTop.
  • return serieService.listaTop(id);: Chama o método listaTop do serviço serieService, que retorna uma lista de episódios top da série especificada pelo id.

Código na classe SerieService:

public List<EpisodioDTO> listaTop(Long id) {
    // Obtém a lista dos top 5 episódios da série com o id fornecido
    return repository.listarTop5Episodios(id)
            // Mapeia cada episódio para um DTO (Data Transfer Object) com as propriedades necessárias
            .stream()
            .map(e -> new EpisodioDTO(e.getTemporada(), e.getNumeroEpisodio(), e.getTitulo()))
            // Coleta os resultados em uma lista
            .collect(Collectors.toList());
}
  • return repository.listarTop5Episodios(id): Chama o método listarTop5Episodios do repositório para obter uma lista dos 5 episódios mais bem avaliados da série com o id fornecido.
  • .stream(): Converte a lista de episódios em um fluxo (Stream) para processamento funcional.
  • .map(e -> new EpisodioDTO(e.getTemporada(), e.getNumeroEpisodio(), e.getTitulo())): Mapeia cada objeto Episodio para um objeto EpisodioDTO, que é uma representação simplificada do episódio com apenas as propriedades necessárias.
  • .collect(Collectors.toList()): Coleta os objetos EpisodioDTO em uma lista.

Código na interface SerieRepository:

@Query("SELECT e FROM Serie s JOIN s.episodios e WHERE s.id = :id ORDER BY e.avaliacao DESC LIMIT 5")
List<Episodio> listarTop5Episodios(Long id);
  • @Query("SELECT e FROM Serie s JOIN s.episodios e WHERE s.id = :id ORDER BY e.avaliacao DESC LIMIT 5"): Define uma consulta JPQL para obter episódios da série com o id fornecido, ordenados pela avaliação em ordem decrescente e limitados aos 5 primeiros resultados.
    • SELECT e FROM Serie s JOIN s.episodios e: Seleciona episódios (e) da série (s) e realiza a junção com a lista de episódios (s.episodios).
    • WHERE s.id = :id: Filtra os episódios para incluir apenas aqueles da série com o id fornecido.
    • ORDER BY e.avaliacao DESC: Ordena os episódios pela avaliação (e.avaliacao) em ordem decrescente, ou seja, do mais bem avaliado para o menos avaliado.
    • LIMIT 5: Limita o número de resultados a 5.

Resumo

  1. SerieController: O controlador REST expõe um endpoint para obter os 5 episódios mais bem avaliados de uma série, usando o ID da série fornecido na URL.

  2. SerieService: O serviço usa o repositório para obter os episódios e os converte em DTOs para serem retornados pela API.

  3. SerieRepository: O repositório define uma consulta personalizada para buscar os episódios mais bem avaliados da série, limitada a 5 resultados.

Esses componentes trabalham juntos para permitir a obtenção e exibição dos episódios mais bem avaliados de uma série, organizando a lógica de negócios e o acesso aos dados de forma clara e modular.

1 resposta
solução!

Oi, José! Tudo bem?

Boa! Ótimos códigos, parabéns pela dedicação e elaboração deles! Obrigada também por tê-los compartilhado com a nossa comunidade do fórum, tenho certeza que ajudará muitos colegas! Caso surja alguma dúvida, sinta-se à vontade em comunicar por aqui, estou à disposição e ficarei super feliz em poder ajudar!

Um forte abraço e bons estudos!