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 { ...@@ -49,9 +49,11 @@ public class Recurso {
private Set<Genero> generos = new HashSet<>(); private Set<Genero> generos = new HashSet<>();
// Relación con Capítulo; un recurso tiene varios capítulos @OneToMany(mappedBy = "recurso", cascade = CascadeType.ALL, orphanRemoval = true)
@OneToMany(mappedBy = "recurso") private List<Capitulo> capitulosManga = new ArrayList<>();
private List<Capitulo> capitulos = 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) { public Recurso(String titulo, String descripcion, LocalDate fechaPublicacion, String autor, String fotoUrl) {
this.titulo = titulo; this.titulo = titulo;
......
...@@ -70,6 +70,9 @@ public class RepositorioRecurso { ...@@ -70,6 +70,9 @@ public class RepositorioRecurso {
@Transactional @Transactional
public void borrarRecurso(Recurso recurso) { public void borrarRecurso(Recurso recurso) {
recurso = em.merge(recurso); recurso = em.merge(recurso);
recurso.getCapitulosManga().clear();
recurso.getCapitulosAnime().clear();
em.flush();
em.remove(recurso); em.remove(recurso);
} }
...@@ -80,8 +83,6 @@ public class RepositorioRecurso { ...@@ -80,8 +83,6 @@ public class RepositorioRecurso {
@Transactional(readOnly = true) @Transactional(readOnly = true)
public List<Recurso> listarRecursos() { public List<Recurso> listarRecursos() {
return em.createQuery("SELECT r FROM Recurso r", Recurso.class) return em.createQuery("SELECT r FROM Recurso r", Recurso.class).getResultList();
.setMaxResults(15)
.getResultList();
} }
} }
\ No newline at end of file
...@@ -47,6 +47,7 @@ public class ServicioSeguridad { ...@@ -47,6 +47,7 @@ public class ServicioSeguridad {
.requestMatchers(HttpMethod.GET, "/recursos/genero/**").permitAll() .requestMatchers(HttpMethod.GET, "/recursos/genero/**").permitAll()
.requestMatchers(HttpMethod.GET, "/recursos/fecha").permitAll() .requestMatchers(HttpMethod.GET, "/recursos/fecha").permitAll()
.requestMatchers(HttpMethod.GET, "/recursos/{id}").permitAll() .requestMatchers(HttpMethod.GET, "/recursos/{id}").permitAll()
.requestMatchers(HttpMethod.GET, "/recursos/generos").permitAll()
.requestMatchers(HttpMethod.GET, "/recursos").permitAll() .requestMatchers(HttpMethod.GET, "/recursos").permitAll()
.requestMatchers(HttpMethod.POST, "/recursos/").hasAuthority("ROLE_ADMIN") .requestMatchers(HttpMethod.POST, "/recursos/").hasAuthority("ROLE_ADMIN")
.requestMatchers(HttpMethod.PUT, "/recursos/{id}").hasAuthority("ROLE_ADMIN") .requestMatchers(HttpMethod.PUT, "/recursos/{id}").hasAuthority("ROLE_ADMIN")
...@@ -58,7 +59,10 @@ public class ServicioSeguridad { ...@@ -58,7 +59,10 @@ public class ServicioSeguridad {
.requestMatchers(HttpMethod.GET, "/biblioteca/{usuarioId}/recursos/categoria/{categoria}").authenticated() .requestMatchers(HttpMethod.GET, "/biblioteca/{usuarioId}/recursos/categoria/{categoria}").authenticated()
.requestMatchers(HttpMethod.DELETE, "/biblioteca/{usuarioId}/recursos/{recursoId}").authenticated() .requestMatchers(HttpMethod.DELETE, "/biblioteca/{usuarioId}/recursos/{recursoId}").authenticated()
.requestMatchers(HttpMethod.PUT, "/biblioteca/{usuarioId}/recursos/{recursoId}/categoria").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 .addFilterBefore(new JwtFilter(jwtUtil), UsernamePasswordAuthenticationFilter.class) // Usar solo JWT
.build(); .build();
......
package com.ujaen.tfg.mangaffinity.servicios; package com.ujaen.tfg.mangaffinity.servicios;
import com.ujaen.tfg.mangaffinity.entidades.Capitulo; import com.ujaen.tfg.mangaffinity.entidades.*;
import com.ujaen.tfg.mangaffinity.entidades.FuenteCapitulo; import com.ujaen.tfg.mangaffinity.excepciones.CapituloNoExiste;
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.excepciones.RecursoNoExiste;
import com.ujaen.tfg.mangaffinity.repositorios.RepositorioCapitulo; import com.ujaen.tfg.mangaffinity.repositorios.RepositorioCapitulo;
import com.ujaen.tfg.mangaffinity.repositorios.RepositorioRecurso; import com.ujaen.tfg.mangaffinity.repositorios.RepositorioRecurso;
...@@ -15,7 +13,11 @@ import org.springframework.transaction.annotation.Transactional; ...@@ -15,7 +13,11 @@ import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service @Service
public class ServicioRecursos { public class ServicioRecursos {
@Autowired @Autowired
...@@ -100,32 +102,120 @@ public class ServicioRecursos { ...@@ -100,32 +102,120 @@ public class ServicioRecursos {
if (recurso == null) { if (recurso == null) {
throw new RecursoNoExiste(); throw new RecursoNoExiste();
} }
List<Capitulo> capitulos = repositorioCapitulo.obtenerCapitulosRecurso(recursoId);
if (capitulos.size() < 4) { List<Capitulo> listaCapitulos = (nuevoCapitulo.getTipo() == TipoRecurso.MANGA)
repositorioCapitulo.crearCapitulo(nuevoCapitulo); ? 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 { } else {
Capitulo penultimo = capitulos.get(2); Capitulo penultimo = listaCapitulos.get(2);
Capitulo ultimo = capitulos.get(3); Capitulo ultimo = listaCapitulos.get(3);
List<FuenteCapitulo> nuevasFuentes = new ArrayList<>(); List<FuenteCapitulo> nuevasFuentes = new ArrayList<>();
for (FuenteCapitulo fuente : ultimo.getFuentes()) { 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.setNumero(ultimo.getNumero());
penultimo.setTitulo(ultimo.getTitulo()); penultimo.setTitulo(ultimo.getTitulo());
penultimo.setTipo(ultimo.getTipo()); penultimo.setTipo(ultimo.getTipo());
penultimo.setFuentes(nuevasFuentes); penultimo.setFuentes(nuevasFuentes);
repositorioCapitulo.borrarCapitulo(ultimo);
repositorioCapitulo.actualizarCapitulo(penultimo); listaCapitulos.remove(ultimo);
repositorioCapitulo.crearCapitulo(nuevoCapitulo); listaCapitulos.add(nuevoCapitulo);
} }
repositorioRecurso.merge(recurso);
} }
@Transactional @Transactional
public List<Capitulo> obtenerCapitulosDeRecurso(Long recursoId) { public List<Capitulo> obtenerCapitulosDeRecurso(Long recursoId) {
List<Capitulo> capitulos = repositorioCapitulo.obtenerCapitulosRecurso(recursoId); List<Capitulo> capitulos = repositorioCapitulo.obtenerCapitulosRecurso(recursoId);
capitulos.forEach(capitulo -> capitulo.getFuentes().size()); capitulos.forEach(capitulo -> capitulo.getFuentes().size());
return capitulos; 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