Commit 446aa6b4 by Rubén Ramírez

feat: [ServicioRecursos]: Añadida una función para añadir capítulos nuevos, ya…

feat: [ServicioRecursos]: Añadida una función para añadir capítulos nuevos, ya que es necesaria para la función de obtener los capítulos
parent c454ea35
package com.ujaen.tfg.mangaffinity.repositorios;
import com.ujaen.tfg.mangaffinity.entidades.Capitulo;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Repository
@Transactional
public class RepositorioCapitulo {
@PersistenceContext
private EntityManager em;
public void crearCapitulo(Capitulo capitulo) {
em.persist(capitulo);
}
@Transactional(readOnly = true)
public List<Capitulo> obtenerCapitulosRecurso(Long recursoId) {
return em.createQuery(
"SELECT c FROM Capitulo c WHERE c.recurso.id = :recursoId ORDER BY c.numero ASC",
Capitulo.class)
.setParameter("recursoId", recursoId)
.getResultList();
}
@Transactional
public Capitulo actualizarCapitulo(Capitulo capitulo) {
return em.merge(capitulo);
}
@Transactional
public void borrarCapitulo(Capitulo capitulo) {
capitulo = em.merge(capitulo);
em.remove(capitulo);
}
}
package com.ujaen.tfg.mangaffinity.servicios;
import com.ujaen.tfg.mangaffinity.entidades.Capitulo;
import com.ujaen.tfg.mangaffinity.entidades.FuenteCapitulo;
import com.ujaen.tfg.mangaffinity.entidades.Genero;
import com.ujaen.tfg.mangaffinity.entidades.Recurso;
import com.ujaen.tfg.mangaffinity.excepciones.RecursoNoExiste;
import com.ujaen.tfg.mangaffinity.repositorios.RepositorioCapitulo;
import com.ujaen.tfg.mangaffinity.repositorios.RepositorioRecurso;
import com.ujaen.tfg.mangaffinity.util.UtilString;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
@Service
public class ServicioRecursos {
@Autowired
RepositorioRecurso repositorioRecurso;
@Autowired
RepositorioCapitulo repositorioCapitulo;
public void crearRecurso(@Valid Recurso recurso) {
repositorioRecurso.crear(recurso);
}
......@@ -88,4 +94,35 @@ public class ServicioRecursos {
return repositorioRecurso.listarRecursos();
}
@Transactional
public void anadirCapitulo(Long recursoId, Capitulo nuevoCapitulo) {
Recurso recurso = repositorioRecurso.buscarPorId(recursoId);
if (recurso == null) {
throw new RecursoNoExiste();
}
List<Capitulo> capitulos = repositorioCapitulo.obtenerCapitulosRecurso(recursoId);
if (capitulos.size() < 4) {
repositorioCapitulo.crearCapitulo(nuevoCapitulo);
} else {
Capitulo penultimo = capitulos.get(2);
Capitulo ultimo = capitulos.get(3);
List<FuenteCapitulo> nuevasFuentes = new ArrayList<>();
for (FuenteCapitulo fuente : ultimo.getFuentes()) {
nuevasFuentes.add(new FuenteCapitulo(fuente.getNombreFuente(), fuente.getUrlFuente()));
}
penultimo.setNumero(ultimo.getNumero());
penultimo.setTitulo(ultimo.getTitulo());
penultimo.setTipo(ultimo.getTipo());
penultimo.setFuentes(nuevasFuentes);
repositorioCapitulo.borrarCapitulo(ultimo);
repositorioCapitulo.actualizarCapitulo(penultimo);
repositorioCapitulo.crearCapitulo(nuevoCapitulo);
}
}
}
......@@ -2,18 +2,23 @@ package com.ujaen.tfg.mangaffinity.servicios;
import com.ujaen.tfg.mangaffinity.MangAffinityApplication;
import com.ujaen.tfg.mangaffinity.config.JpaTestConfig;
import com.ujaen.tfg.mangaffinity.entidades.Capitulo;
import com.ujaen.tfg.mangaffinity.entidades.Genero;
import com.ujaen.tfg.mangaffinity.entidades.Recurso;
import com.ujaen.tfg.mangaffinity.entidades.TipoRecurso;
import com.ujaen.tfg.mangaffinity.excepciones.RecursoNoExiste;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ActiveProfiles;
import com.ujaen.tfg.mangaffinity.entidades.*;
import java.time.LocalDate;
import java.util.List;
import java.util.Arrays;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
@SpringBootTest(classes = {MangAffinityApplication.class, JpaTestConfig.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("test")
......@@ -23,6 +28,9 @@ public class TestServicioRecursos {
@Autowired
private ServicioRecursos servicioRecursos;
@Test
@DirtiesContext
void testCrearRecurso() {
......@@ -224,4 +232,46 @@ public class TestServicioRecursos {
}
}
@Test
@DirtiesContext
void testAnadirCapitulo() {
// Creo recurso inicial
Recurso recurso = new Recurso("Manga Ejemplo", "Sinopsis", LocalDate.now(), "Autor X");
servicioRecursos.crearRecurso(recurso);
List<Recurso> recursos = servicioRecursos.buscarRecursoPorTitulo("Manga Ejemplo");
assertThat(recursos).isNotEmpty();
Recurso recursoGuardado = recursos.getFirst();
Long recursoId = recursoGuardado.getId();
assertThat(recursoId).isNotNull();
// Añado 4 capítulos al recurso
servicioRecursos.anadirCapitulo(recursoId, new Capitulo(1, "Capítulo 1", TipoRecurso.MANGA, Arrays.asList(new FuenteCapitulo("Crunchyroll", "https://crunchyroll.com/cap1")), recursoGuardado));
servicioRecursos.anadirCapitulo(recursoId, new Capitulo(2, "Capítulo 2", TipoRecurso.MANGA, Arrays.asList(new FuenteCapitulo("AnimeFLV", "https://animeflv.com/cap2")), recursoGuardado));
servicioRecursos.anadirCapitulo(recursoId, new Capitulo(3, "Capítulo 3", TipoRecurso.MANGA, Arrays.asList(new FuenteCapitulo("MangaPlus", "https://mangaplus.com/cap3")), recursoGuardado));
servicioRecursos.anadirCapitulo(recursoId, new Capitulo(4, "Capítulo 4", TipoRecurso.MANGA, Arrays.asList(new FuenteCapitulo("Jkanime", "https://jkanime.com/cap4")), recursoGuardado));
// Obtengo los capítulos guardados
List<Capitulo> capitulos = servicioRecursos.obtenerCapitulosDeRecurso(recursoId);
assertThat(capitulos).hasSize(4);
// Añado un nuevo capítulo, cambio de posiciones
servicioRecursos.anadirCapitulo(recursoId, new Capitulo(5, "Capítulo 5", TipoRecurso.MANGA, Arrays.asList(new FuenteCapitulo("Netflix", "https://netflix.com/cap5")), recursoGuardado));
// Obtengo de nuevo los capítulos y verifico que el 3 fue reemplazado
List<Capitulo> capitulosActualizados = servicioRecursos.obtenerCapitulosDeRecurso(recursoId);
assertThat(capitulosActualizados).hasSize(4);
// Verifico que los 2 primeros se mantienen
assertThat(capitulosActualizados.get(0).getNumero()).isEqualTo(1);
assertThat(capitulosActualizados.get(1).getNumero()).isEqualTo(2);
// Verifico que el nuevo capítulo ha reemplazado al tercero
assertThat(capitulosActualizados.get(2).getNumero()).isEqualTo(4); // Capítulo 4 pasa a la posición del 3
assertThat(capitulosActualizados.get(3).getNumero()).isEqualTo(5); // Nuevo capítulo
// Intento añadir un capítulo a un recurso inexistente
assertThrows(RecursoNoExiste.class, () -> servicioRecursos.anadirCapitulo(9999L, new Capitulo(6, "Capítulo 6", TipoRecurso.MANGA, Arrays.asList(new FuenteCapitulo("Hulu", "https://hulu.com/cap6")), recursoGuardado)));
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment