Commit 98238240 by Rubén Ramírez

feat: [Capitulo]: Añadidos métodos para obtener y trabajar con capítulos

parent 1f435592
......@@ -49,9 +49,11 @@ public class Recurso {
private Set<Genero> generos = new HashSet<>();
// Relación con Capítulo; un recurso tiene varios capítulos
@OneToMany(mappedBy = "recurso")
private List<Capitulo> capitulos = new ArrayList<>();
@OneToMany(mappedBy = "recurso", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Capitulo> capitulosManga = new ArrayList<>();
@OneToMany(mappedBy = "recurso", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Capitulo> capitulosAnime = new ArrayList<>();
public Recurso(String titulo, String descripcion, LocalDate fechaPublicacion, String autor, String fotoUrl) {
this.titulo = titulo;
......
......@@ -70,6 +70,9 @@ public class RepositorioRecurso {
@Transactional
public void borrarRecurso(Recurso recurso) {
recurso = em.merge(recurso);
recurso.getCapitulosManga().clear();
recurso.getCapitulosAnime().clear();
em.flush();
em.remove(recurso);
}
......@@ -80,8 +83,6 @@ public class RepositorioRecurso {
@Transactional(readOnly = true)
public List<Recurso> listarRecursos() {
return em.createQuery("SELECT r FROM Recurso r", Recurso.class)
.setMaxResults(15)
.getResultList();
return em.createQuery("SELECT r FROM Recurso r", Recurso.class).getResultList();
}
}
\ No newline at end of file
......@@ -47,6 +47,7 @@ public class ServicioSeguridad {
.requestMatchers(HttpMethod.GET, "/recursos/genero/**").permitAll()
.requestMatchers(HttpMethod.GET, "/recursos/fecha").permitAll()
.requestMatchers(HttpMethod.GET, "/recursos/{id}").permitAll()
.requestMatchers(HttpMethod.GET, "/recursos/generos").permitAll()
.requestMatchers(HttpMethod.GET, "/recursos").permitAll()
.requestMatchers(HttpMethod.POST, "/recursos/").hasAuthority("ROLE_ADMIN")
.requestMatchers(HttpMethod.PUT, "/recursos/{id}").hasAuthority("ROLE_ADMIN")
......@@ -58,7 +59,10 @@ public class ServicioSeguridad {
.requestMatchers(HttpMethod.GET, "/biblioteca/{usuarioId}/recursos/categoria/{categoria}").authenticated()
.requestMatchers(HttpMethod.DELETE, "/biblioteca/{usuarioId}/recursos/{recursoId}").authenticated()
.requestMatchers(HttpMethod.PUT, "/biblioteca/{usuarioId}/recursos/{recursoId}/categoria").authenticated()
.anyRequest().authenticated() // Todo lo demás requiere autenticación
.requestMatchers(HttpMethod.GET, "/recursos/{recursoId}/capitulos/{capituloId}").permitAll()
.requestMatchers(HttpMethod.PUT, "/recursos/{recursoId}/capitulos/{capituloId}").hasAuthority("ROLE_ADMIN")
.anyRequest().authenticated()
)
.addFilterBefore(new JwtFilter(jwtUtil), UsernamePasswordAuthenticationFilter.class) // Usar solo JWT
.build();
......
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.entidades.*;
import com.ujaen.tfg.mangaffinity.excepciones.CapituloNoExiste;
import com.ujaen.tfg.mangaffinity.excepciones.RecursoNoExiste;
import com.ujaen.tfg.mangaffinity.repositorios.RepositorioCapitulo;
import com.ujaen.tfg.mangaffinity.repositorios.RepositorioRecurso;
......@@ -15,7 +13,11 @@ import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
public class ServicioRecursos {
@Autowired
......@@ -100,32 +102,120 @@ public class ServicioRecursos {
if (recurso == null) {
throw new RecursoNoExiste();
}
List<Capitulo> capitulos = repositorioCapitulo.obtenerCapitulosRecurso(recursoId);
if (capitulos.size() < 4) {
repositorioCapitulo.crearCapitulo(nuevoCapitulo);
List<Capitulo> listaCapitulos = (nuevoCapitulo.getTipo() == TipoRecurso.MANGA)
? recurso.getCapitulosManga()
: recurso.getCapitulosAnime();
// Asociar fuentes al capítulo
for (FuenteCapitulo fuente : nuevoCapitulo.getFuentes()) {
fuente.setCapitulo(nuevoCapitulo);
}
if (listaCapitulos.size() < 4) {
listaCapitulos.add(nuevoCapitulo);
} else {
Capitulo penultimo = capitulos.get(2);
Capitulo ultimo = capitulos.get(3);
Capitulo penultimo = listaCapitulos.get(2);
Capitulo ultimo = listaCapitulos.get(3);
List<FuenteCapitulo> nuevasFuentes = new ArrayList<>();
for (FuenteCapitulo fuente : ultimo.getFuentes()) {
nuevasFuentes.add(new FuenteCapitulo(fuente.getNombreFuente(), fuente.getUrlFuente()));
FuenteCapitulo nuevaFuente = new FuenteCapitulo(null, fuente.getNombreFuente(), fuente.getUrlFuente(), penultimo);
nuevasFuentes.add(nuevaFuente);
}
penultimo.setNumero(ultimo.getNumero());
penultimo.setTitulo(ultimo.getTitulo());
penultimo.setTipo(ultimo.getTipo());
penultimo.setFuentes(nuevasFuentes);
repositorioCapitulo.borrarCapitulo(ultimo);
repositorioCapitulo.actualizarCapitulo(penultimo);
repositorioCapitulo.crearCapitulo(nuevoCapitulo);
listaCapitulos.remove(ultimo);
listaCapitulos.add(nuevoCapitulo);
}
repositorioRecurso.merge(recurso);
}
@Transactional
public List<Capitulo> obtenerCapitulosDeRecurso(Long recursoId) {
List<Capitulo> capitulos = repositorioCapitulo.obtenerCapitulosRecurso(recursoId);
capitulos.forEach(capitulo -> capitulo.getFuentes().size());
return capitulos;
}
public List<String> obtenerGeneros() {
return Arrays.stream(Genero.values())
.map(Enum::name)
.collect(Collectors.toList());
}
@Transactional
public void modificarCapitulo(Capitulo capituloModificado) {
Capitulo capitulo = repositorioCapitulo.buscarPorId(capituloModificado.getId());
if (capitulo == null) {
throw new CapituloNoExiste();
}
// Asegurar que el capítulo pertenece a un recurso antes de modificarlo
if (capitulo.getRecurso() == null) {
throw new IllegalStateException("El capítulo no está asociado a ningún recurso.");
}
// Modificar solo si los valores no son nulos o inválidos
if (capituloModificado.getNumero() > 0) {
capitulo.setNumero(capituloModificado.getNumero());
}
if (capituloModificado.getTitulo() != null && !capituloModificado.getTitulo().isBlank()) {
capitulo.setTitulo(capituloModificado.getTitulo());
}
if (capituloModificado.getTipo() != null) {
capitulo.setTipo(capituloModificado.getTipo());
}
if (capituloModificado.getFuentes() != null) {
// Crear un mapa con las fuentes existentes para facilitar la comparación
Map<Long, FuenteCapitulo> fuentesExistentes = capitulo.getFuentes().stream()
.collect(Collectors.toMap(FuenteCapitulo::getId, f -> f));
List<FuenteCapitulo> nuevasFuentes = new ArrayList<>();
for (FuenteCapitulo fuenteNueva : capituloModificado.getFuentes()) {
if (fuenteNueva.getId() != null && fuentesExistentes.containsKey(fuenteNueva.getId())) {
// Si la fuente ya existe, actualizamos su información
FuenteCapitulo fuenteExistente = fuentesExistentes.get(fuenteNueva.getId());
fuenteExistente.setNombreFuente(fuenteNueva.getNombreFuente());
fuenteExistente.setUrlFuente(fuenteNueva.getUrlFuente());
nuevasFuentes.add(fuenteExistente);
} else {
// Si la fuente es nueva, la agregamos correctamente
fuenteNueva.setCapitulo(capitulo);
nuevasFuentes.add(fuenteNueva);
}
}
// Remover las fuentes que no están en la nueva lista
capitulo.getFuentes().clear();
capitulo.getFuentes().addAll(nuevasFuentes);
}
repositorioCapitulo.actualizarCapitulo(capitulo);
}
@Transactional(readOnly = true)
public Capitulo buscarCapituloPorId(Long id) {
Capitulo capitulo = repositorioCapitulo.buscarPorId(id);
if (capitulo == null) {
throw new CapituloNoExiste();
}
return capitulo;
}
}
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