Commit 88e7362f by Rubén Ramírez

feat: [ServicioRecurso]: Añadidas una función obtener las recomendaciones

parent 888dec31
......@@ -2,6 +2,7 @@ package com.ujaen.tfg.mangaffinity.servicios;
import com.ujaen.tfg.mangaffinity.entidades.*;
import com.ujaen.tfg.mangaffinity.excepciones.*;
import com.ujaen.tfg.mangaffinity.repositorios.RepositorioBibliotecaPersonalRecurso;
import com.ujaen.tfg.mangaffinity.repositorios.RepositorioCapitulo;
import com.ujaen.tfg.mangaffinity.repositorios.RepositorioRecurso;
import com.ujaen.tfg.mangaffinity.repositorios.RepositorioUsuario;
......@@ -12,7 +13,8 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Collectors;import java.util.stream.Collectors;
@Service
public class ServicioRecursos {
......@@ -23,6 +25,10 @@ public class ServicioRecursos {
@Autowired
RepositorioCapitulo repositorioCapitulo;
@Autowired
private RepositorioBibliotecaPersonalRecurso repositorioBibliotecaPersonalRecurso;
/**
* @brief Crea un nuevo recurso en el sistema.
* @param recurso Objeto Recurso con los datos a registrar.
......@@ -408,4 +414,48 @@ public class ServicioRecursos {
.sorted(Comparator.comparing(Resena::getFechaPublicacion).reversed())
.collect(Collectors.toList());
}
public List<Recurso> obtenerRecomendacionesParaUsuario(Long usuarioId) {
BibliotecaPersonal biblioteca = repositorioBibliotecaPersonalRecurso
.obtenerBibliotecaPorUsuarioId(usuarioId)
.orElseThrow(UsuarioSinBiblioteca::new);
List<Long> favoritosIds = biblioteca.getFavoritos();
if (favoritosIds.isEmpty()) return Collections.emptyList();
List<Recurso> recursosFavoritos = repositorioRecurso.findAllById(favoritosIds);
// Extraer autores y géneros únicos de los favoritos
Set<String> autores = recursosFavoritos.stream()
.map(Recurso::getAutor)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
Set<Genero> generos = recursosFavoritos.stream()
.flatMap(r -> r.getGeneros().stream())
.collect(Collectors.toSet());
// Obtener recursos ya presentes en la biblioteca (cualquier categoría)
Set<Long> recursosEnBiblioteca = biblioteca.getRecursos().stream()
.map(bpr -> bpr.getRecurso().getId())
.collect(Collectors.toSet());
// Combinar favoritos + biblioteca en un solo conjunto de exclusión
Set<Long> idsAExcluir = new HashSet<>(favoritosIds);
idsAExcluir.addAll(recursosEnBiblioteca);
// Buscar recursos recomendados que NO estén ni en favoritos ni en la biblioteca
List<Recurso> posibles = repositorioRecurso.findAll().stream()
.filter(r -> !idsAExcluir.contains(r.getId()))
.filter(r ->
autores.contains(r.getAutor()) ||
r.getGeneros().stream().anyMatch(generos::contains)
)
.distinct()
.limit(4)
.collect(Collectors.toList());
return posibles;
}
}
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