Commit 945fe127 by Rubén Ramírez

fix: [Repositorio]: Corregidos los repositorios debido a la incorrecta división por capas

parent fe6625d5
...@@ -3,15 +3,13 @@ package com.ujaen.tfg.mangaffinity.repositorios; ...@@ -3,15 +3,13 @@ package com.ujaen.tfg.mangaffinity.repositorios;
import com.ujaen.tfg.mangaffinity.entidades.Capitulo; import com.ujaen.tfg.mangaffinity.entidades.Capitulo;
import com.ujaen.tfg.mangaffinity.entidades.FuenteCapitulo; import com.ujaen.tfg.mangaffinity.entidades.FuenteCapitulo;
import com.ujaen.tfg.mangaffinity.entidades.TipoRecurso; import com.ujaen.tfg.mangaffinity.entidades.TipoRecurso;
import com.ujaen.tfg.mangaffinity.servicios.ServicioRecursos;
import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext; import jakarta.persistence.PersistenceContext;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.slf4j.Logger; import java.util.Optional;
import org.slf4j.LoggerFactory;
@Repository @Repository
@Transactional @Transactional
...@@ -33,75 +31,26 @@ public class RepositorioCapitulo { ...@@ -33,75 +31,26 @@ public class RepositorioCapitulo {
.getResultList(); .getResultList();
} }
public void actualizarCapitulo(Capitulo capituloModificado) { @Transactional
Capitulo capitulo = em.find(Capitulo.class, capituloModificado.getId()); public void actualizarCapitulo(Capitulo capitulo) {
em.merge(capitulo);
if (capitulo != null) {
capitulo.setNumero(capituloModificado.getNumero());
capitulo.setTitulo(capituloModificado.getTitulo());
capitulo.setTipo(capituloModificado.getTipo());
capitulo.setActivo(capituloModificado.getActivo());
List<FuenteCapitulo> fuentesActuales = new ArrayList<>(capitulo.getFuentes());
for (FuenteCapitulo fuenteExistente : fuentesActuales) {
boolean sigueExistiendo = capituloModificado.getFuentes().stream()
.anyMatch(f -> f.getNombreFuente().equals(fuenteExistente.getNombreFuente()));
if (!sigueExistiendo) {
capitulo.getFuentes().remove(fuenteExistente);
em.remove(em.contains(fuenteExistente) ? fuenteExistente : em.merge(fuenteExistente));
}
}
for (FuenteCapitulo nuevaFuente : capituloModificado.getFuentes()) {
boolean existe = fuentesActuales.stream()
.anyMatch(f -> f.getNombreFuente().equals(nuevaFuente.getNombreFuente()));
if (!existe) {
nuevaFuente.setCapitulo(capitulo);
em.persist(nuevaFuente);
capitulo.getFuentes().add(nuevaFuente);
}
}
em.merge(capitulo);
em.flush();
}
} }
public void eliminarFuente(FuenteCapitulo fuente) { public void eliminarFuente(FuenteCapitulo fuente) {
FuenteCapitulo fuenteEncontrada = em.find(FuenteCapitulo.class, fuente.getId()); em.remove(em.contains(fuente) ? fuente : em.merge(fuente));
if (fuenteEncontrada != null) {
em.remove(fuenteEncontrada);
}
} }
@Transactional @Transactional
public void borrarCapitulo(Capitulo capitulo) { public void borrarCapitulo(Capitulo capitulo) {
capitulo = em.merge(capitulo); em.remove(em.contains(capitulo) ? capitulo : em.merge(capitulo));
List<FuenteCapitulo> fuentes = em.createQuery(
"SELECT f FROM FuenteCapitulo f WHERE f.capitulo = :capitulo", FuenteCapitulo.class)
.setParameter("capitulo", capitulo)
.getResultList();
for (FuenteCapitulo fuente : fuentes) {
em.remove(fuente);
}
em.flush();
em.remove(capitulo);
} }
public void actualizarFuente(FuenteCapitulo fuente) { public void actualizarFuente(FuenteCapitulo fuente) {
FuenteCapitulo existente = em.find(FuenteCapitulo.class, fuente.getId()); em.merge(fuente);
if (existente != null) {
existente.setUrlFuente(fuente.getUrlFuente());
em.merge(existente);
}
em.flush();
} }
public void agregarFuente(FuenteCapitulo fuente) { public void agregarFuente(FuenteCapitulo fuente) {
em.persist(fuente); em.persist(fuente);
em.flush();
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
...@@ -115,13 +64,13 @@ public class RepositorioCapitulo { ...@@ -115,13 +64,13 @@ public class RepositorioCapitulo {
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
public Capitulo buscarPorId(Long id) { public Optional<Capitulo> buscarPorId(Long id) {
return em.find(Capitulo.class, id); return Optional.ofNullable(em.find(Capitulo.class, id));
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
public FuenteCapitulo buscarFuentePorId(Long id) { public Optional<FuenteCapitulo> buscarFuentePorId(Long id) {
return em.find(FuenteCapitulo.class, id); return Optional.ofNullable(em.find(FuenteCapitulo.class, id));
} }
@Transactional @Transactional
...@@ -131,4 +80,5 @@ public class RepositorioCapitulo { ...@@ -131,4 +80,5 @@ public class RepositorioCapitulo {
em.remove(fuente); em.remove(fuente);
} }
} }
} }
...@@ -8,6 +8,7 @@ import org.springframework.stereotype.Repository; ...@@ -8,6 +8,7 @@ import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.List; import java.util.List;
import java.util.Optional;
@Repository @Repository
@Transactional @Transactional
...@@ -20,57 +21,57 @@ public class RepositorioRecurso { ...@@ -20,57 +21,57 @@ public class RepositorioRecurso {
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
public Recurso buscarPorId(Long id) { public Optional<Recurso> buscarPorId(Long id) {
return em.find(Recurso.class, id); return Optional.ofNullable(em.find(Recurso.class, id));
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
public List<Recurso> buscarPorTitulo(String titulo) { public List<Recurso> buscarPorTitulo(String titulo, int maxResults) {
return em.createQuery( return em.createQuery(
"SELECT r FROM Recurso r WHERE LOWER(r.titulo) LIKE LOWER(:titulo)", "SELECT r FROM Recurso r WHERE LOWER(r.titulo) LIKE LOWER(:titulo)",
Recurso.class) Recurso.class)
.setParameter("titulo", "%" + titulo + "%") .setParameter("titulo", "%" + titulo + "%")
.setMaxResults(maxResults) // Limita la cantidad de resultados
.getResultList(); .getResultList();
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
public List<Recurso> buscarPorAutor(String autor) { public List<Recurso> buscarPorAutor(String autor, int maxResults) {
return em.createQuery( return em.createQuery(
"SELECT r FROM Recurso r WHERE LOWER(r.autor) LIKE LOWER(:autor)", "SELECT r FROM Recurso r WHERE LOWER(r.autor) LIKE LOWER(:autor)",
Recurso.class) Recurso.class)
.setParameter("autor", "%" + autor + "%") .setParameter("autor", "%" + autor + "%")
.setMaxResults(maxResults) // Limita la cantidad de resultados
.getResultList(); .getResultList();
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
public List<Recurso> buscarPorGenero(Genero genero) { public List<Recurso> buscarPorGenero(Genero genero) {
return em.createQuery( return em.createQuery(
"SELECT r FROM Recurso r JOIN r.generos g WHERE g = :genero", "SELECT DISTINCT r FROM Recurso r JOIN FETCH r.generos g WHERE g = :genero",
Recurso.class) Recurso.class)
.setParameter("genero", genero) .setParameter("genero", genero)
.getResultList(); .getResultList();
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
public List<Recurso> buscarPorRangoFechas(LocalDate fechaInicio, LocalDate fechaFin) { public List<Recurso> buscarPorRangoFechas(LocalDate fechaInicio, LocalDate fechaFin, int maxResults) {
return em.createQuery( return em.createQuery(
"SELECT r FROM Recurso r WHERE r.fechaPublicacion BETWEEN :inicio AND :fin", "SELECT r FROM Recurso r WHERE r.fechaPublicacion BETWEEN :inicio AND :fin ORDER BY r.fechaPublicacion ASC",
Recurso.class) Recurso.class)
.setParameter("inicio", fechaInicio) .setParameter("inicio", fechaInicio)
.setParameter("fin", fechaFin) .setParameter("fin", fechaFin)
.setMaxResults(maxResults) // Limita la cantidad de resultados
.getResultList(); .getResultList();
} }
public Recurso merge(Recurso recurso) { public Recurso actualiza(Recurso recurso) {
return em.merge(recurso); return em.merge(recurso);
} }
@Transactional @Transactional
public void borrarRecurso(Recurso recurso) { public void borrarRecurso(Recurso recurso) {
recurso = em.merge(recurso); recurso = em.contains(recurso) ? recurso : em.merge(recurso);
recurso.getCapitulosManga().clear();
recurso.getCapitulosAnime().clear();
em.flush();
em.remove(recurso); em.remove(recurso);
} }
...@@ -83,4 +84,17 @@ public class RepositorioRecurso { ...@@ -83,4 +84,17 @@ public class RepositorioRecurso {
public List<Recurso> listarRecursos() { public List<Recurso> listarRecursos() {
return em.createQuery("SELECT r FROM Recurso r", Recurso.class).getResultList(); return em.createQuery("SELECT r FROM Recurso r", Recurso.class).getResultList();
} }
@Transactional(readOnly = true)
public boolean existeRecurso(String titulo, String autor, LocalDate fechaPublicacion) {
Long count = em.createQuery(
"SELECT COUNT(r) FROM Recurso r WHERE LOWER(r.titulo) = LOWER(:titulo) " +
"AND r.autor = :autor AND r.fechaPublicacion = :fecha",
Long.class)
.setParameter("titulo", titulo)
.setParameter("autor", autor)
.setParameter("fecha", fechaPublicacion)
.getSingleResult();
return count > 0;
}
} }
\ No newline at end of file
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