Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Episodios duplicados

Olá Pessoal! Ao consultarmos os Episódios (item 2 do menu) para a mesma série, os registros na tabela episodios são gravados novamente, ou seja os episódios são todos duplicados. Como poderíamos fazer para gravar por cima se o episódio existir, sem criar um repositorio para Episodios, atualizando assim os episódios e não os duplicar? Obs: não temos o repositório para Episodios, os dados são gravados em cascata na Serie(esta tem o repositorio).

obrigado!

private void buscarEpisodioPorSerie(){
        listarSeriesBuscadas();
        System.out.println("Escolha uma série pelo nome:");
        var nomeSerie = leitura.nextLine();

        Optional<Serie> serie = series.stream()
                .filter(s -> s.getTitulo().toLowerCase().contains(nomeSerie.toLowerCase()))
                .findFirst();

        if(serie.isPresent()) {
            var serieEncontrada = serie.get();
            List<DadosTemporada> temporadas = new ArrayList<>();

            for (int i = 1; i <= serieEncontrada.getTotalTemporadas(); i++) {
                var json = consumo.obterDados(ENDERECO + serieEncontrada.getTitulo().replace(" ", "+") + "&season=" + i + API_KEY);
                DadosTemporada dadosTemporada = conversor.obterDados(json, DadosTemporada.class);
                temporadas.add(dadosTemporada);
            }
            temporadas.forEach(System.out::println);

            List<Episodio> episodios = temporadas.stream()
                    .flatMap(d -> d.episodios().stream()
                            .map(e -> new Episodio(d.numero(), e)))
                    .collect(Collectors.toList());
            serieEncontrada.setEpisodios(episodios);
            repositorio.save(serieEncontrada);
        }else{
            System.out.println("Série não encontrada!");
        }
    }
2 respostas
solução!

Oi Flávio, tudo bem?

Você pode ajustar o método buscarEpisodioPorSerie apresentada no curso para incluir uma lógica de verificação antes de salvar os episódios. Um exemplo de código seria:

private void atualizarEpisodios(Serie serie) {
    List<Episodio> episodiosAtualizados = new ArrayList<>();
    for (Episodio episodio : serie.getEpisodios()) {
        Optional<Episodio> episodioSalvo = serie.getEpisodios().stream()
                .filter(e -> e.getTitulo().equals(episodio.getTitulo()))
                .findFirst();

        if (episodioSalvo.isPresent()) {
            // Atualiza o episódio existente
            Episodio episodioAtualizado = episodioSalvo.get();
            episodioAtualizado.setTitulo(episodio.getTitulo());
            episodioAtualizado.setDescricao(episodio.getDescricao());
            episodiosAtualizados.add(episodioAtualizado);
        } else {
            // Adiciona o novo episódio
            episodiosAtualizados.add(episodio);
        }
    }
    serie.setEpisodios(episodiosAtualizados);
    serieRepository.save(serie);
}

É possível ser necessário fazer algumas adaptações no código. No entanto, espero que isso ajude a inspirar na construção do código.

Espero ter ajudado.

Qualquer dúvida, compartilhe no fórum.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Olá Monalisa! tudo bem! Adatptei o seu código no metodo buscarEpisodioPorSerie e funcionou perfeitamente, ficando dessa forma:

    private void buscarEpisodioPorSerie() {
        listarSeriesBuscadas();
        System.out.println("Escolha uma série pelo nome:");
        var nomeSerie = leitura.nextLine();

        Optional<Serie> serie = series.stream()
                .filter(s -> s.getTitulo().toLowerCase().contains(nomeSerie.toLowerCase()))
                .findFirst();

        if (serie.isPresent()) {
            var serieEncontrada = serie.get();
            List<DadosTemporada> temporadas = new ArrayList<>();

            for (int i = 1; i <= serieEncontrada.getTotalTemporadas(); i++) {
                var json = consumo.obterDados(ENDERECO + serieEncontrada.getTitulo().replace(" ", "+") + "&season=" + i + API_KEY);
                DadosTemporada dadosTemporada = conversor.obterDados(json, DadosTemporada.class);
                temporadas.add(dadosTemporada);
            }
            temporadas.forEach(System.out::println);

            List<Episodio> episodios = temporadas.stream()
                    .flatMap(d -> d.episodios().stream()
                            .map(e -> new Episodio(d.numero(), e)))
                    .collect(Collectors.toList());

            List<Episodio> episodiosAtualizados = new ArrayList<>();
            for (Episodio episodio : episodios.stream().toList()) {
                Optional<Episodio> episodioSalvo = serieEncontrada.getEpisodios().stream()
                        .filter(e -> e.getTitulo().equals(episodio.getTitulo()))
                        .findFirst();

                if (episodioSalvo.isPresent()) {
                    Episodio episodioAtualizado = episodioSalvo.get();
                    episodioAtualizado.setTitulo(episodio.getTitulo());
                    episodioAtualizado.setNumeroEpisodio(episodio.getNumeroEpisodio());
                    episodioAtualizado.setAvaliacao(episodio.getAvaliacao());
                    episodioAtualizado.setDataLancamento(episodio.getDataLancamento());
                    episodiosAtualizados.add(episodioAtualizado);
                } else {
                    episodiosAtualizados.add(episodio);
                }
            }
            serieEncontrada.setEpisodios(episodiosAtualizados);
            repositorio.save(serieEncontrada);
        } else {
            System.out.println("Série não encontrada!");
        }
    }

Valeu demais pela ajuda, muito obrigado!