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étodolistaTopdo 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étodolistarTop5Episodiosdo repositório para obter uma lista dos 5 episódios mais bem avaliados da série com oidfornecido..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 objetoEpisodiopara um objetoEpisodioDTO, que é uma representação simplificada do episódio com apenas as propriedades necessárias..collect(Collectors.toList()): Coleta os objetosEpisodioDTOem 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 oidfornecido, 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 oidfornecido.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.