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
: Oid
é extraído da URL e passado como argumento para o métodoobterTemporadasTop
.return serieService.listaTop(id);
: Chama o métodolistaTop
do serviçoserieService
, que retorna uma lista de episódios top da série especificada peloid
.
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étodolistarTop5Episodios
do repositório para obter uma lista dos 5 episódios mais bem avaliados da série com oid
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 objetoEpisodio
para um objetoEpisodioDTO
, que é uma representação simplificada do episódio com apenas as propriedades necessárias..collect(Collectors.toList())
: Coleta os objetosEpisodioDTO
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 oid
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 oid
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
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.SerieService
: O serviço usa o repositório para obter os episódios e os converte em DTOs para serem retornados pela API.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.