Commit 1023e0e5 by Rubén Ramírez

feat: [ServicioSeguimiento]: Implementadas las funciones para la red social

parent 2f613095
package com.ujaen.tfg.mangaffinity.servicios;
import com.ujaen.tfg.mangaffinity.entidades.Seguimiento;
import com.ujaen.tfg.mangaffinity.entidades.Usuario;
import com.ujaen.tfg.mangaffinity.excepciones.SeguimientoExiste;
import com.ujaen.tfg.mangaffinity.excepciones.SeguimientoNoExiste;
import com.ujaen.tfg.mangaffinity.excepciones.UsuarioNoExiste;
import com.ujaen.tfg.mangaffinity.repositorios.RepositorioSeguimiento;
import com.ujaen.tfg.mangaffinity.repositorios.RepositorioUsuario;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.stream.Collectors;
/**
* @brief Servicio para gestionar seguimientos entre usuarios.
*/
@Service
public class ServicioSeguimiento {
@Autowired
private RepositorioSeguimiento repositorioSeguimiento;
@Autowired
private RepositorioUsuario repositorioUsuario;
/**
* @param nombreSeguidor nombre de usuario que realiza el seguimiento.
* @param nombreSeguido nombre de usuario que será seguido.
* @throws UsuarioNoExiste si alguno de los dos usuarios no existe.
* @throws SeguimientoExiste si ya existe el seguimiento.
* @brief Permite a un usuario seguir a otro.
*/
@Transactional
public void seguir(String nombreSeguidor, String nombreSeguido) {
if (nombreSeguidor.equals(nombreSeguido)) {
throw new IllegalArgumentException("No puedes seguirte a ti mismo.");
}
Usuario seguidor = repositorioUsuario.findByNombreUsuario(nombreSeguidor)
.orElseThrow(UsuarioNoExiste::new);
Usuario seguido = repositorioUsuario.findByNombreUsuario(nombreSeguido)
.orElseThrow(UsuarioNoExiste::new);
if (repositorioSeguimiento.existe(seguidor, seguido)) {
throw new SeguimientoExiste();
}
Seguimiento seguimiento = new Seguimiento();
seguimiento.setSeguidor(seguidor);
seguimiento.setSeguido(seguido);
repositorioSeguimiento.guardar(seguimiento);
}
/**
* @param nombreSeguidor nombre de usuario que dejará de seguir.
* @param nombreSeguido nombre del usuario seguido.
* @throws UsuarioNoExiste si alguno no existe.
* @throws SeguimientoNoExiste si la relación no existe.
* @brief Permite dejar de seguir a un usuario.
*/
@Transactional
public void dejarDeSeguir(String nombreSeguidor, String nombreSeguido) {
Usuario seguidor = repositorioUsuario.findByNombreUsuario(nombreSeguidor)
.orElseThrow(UsuarioNoExiste::new);
Usuario seguido = repositorioUsuario.findByNombreUsuario(nombreSeguido)
.orElseThrow(UsuarioNoExiste::new);
Seguimiento seguimiento = repositorioSeguimiento.buscar(seguidor, seguido)
.orElseThrow(SeguimientoNoExiste::new);
repositorioSeguimiento.eliminar(seguimiento);
}
/**
* @param nombreSeguidor nombre de usuario que realiza seguimientos.
* @return Lista de usuarios seguidos.
* @throws UsuarioNoExiste si el usuario no existe.
* @brief Obtiene los usuarios que sigue un usuario dado.
*/
@Transactional(readOnly = true)
public List<Usuario> obtenerSeguidos(String nombreSeguidor) {
Usuario seguidor = repositorioUsuario.findByNombreUsuario(nombreSeguidor)
.orElseThrow(UsuarioNoExiste::new);
return repositorioSeguimiento.obtenerSeguidosDe(seguidor).stream()
.map(Seguimiento::getSeguido)
.collect(Collectors.toList());
}
/**
* @brief Obtiene los usuarios que siguen al usuario dado.
* @param nombreUsuario nombre del usuario al que otros siguen.
* @return Lista de usuarios que lo siguen.
* @throws UsuarioNoExiste si el usuario no existe.
*/
@Transactional(readOnly = true)
public List<Usuario> obtenerSeguidores(String nombreUsuario) {
Usuario seguido = repositorioUsuario.findByNombreUsuario(nombreUsuario)
.orElseThrow(UsuarioNoExiste::new);
return repositorioSeguimiento.obtenerSeguidoresDe(seguido).stream()
.map(Seguimiento::getSeguidor)
.collect(Collectors.toList());
}
/**
* @param nombreSeguidor quien realiza el seguimiento.
* @param nombreSeguido quien es seguido.
* @return true si lo sigue, false si no.
* @throws UsuarioNoExiste si no existe alguno de los usuarios.
* @brief Verifica si un usuario sigue a otro.
*/
@Transactional(readOnly = true)
public boolean estaSiguiendo(String nombreSeguidor, String nombreSeguido) {
Usuario seguidor = repositorioUsuario.findByNombreUsuario(nombreSeguidor)
.orElseThrow(UsuarioNoExiste::new);
Usuario seguido = repositorioUsuario.findByNombreUsuario(nombreSeguido)
.orElseThrow(UsuarioNoExiste::new);
return repositorioSeguimiento.existe(seguidor, seguido);
}
}
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