Commit 73943933 by Rubén Ramírez

fix: [ServicioUsuario]: Corregidas algunas funciones en el servicio para la…

fix: [ServicioUsuario]: Corregidas algunas funciones en el servicio para la correcta división de capas
parent 175871fd
......@@ -2,6 +2,7 @@ package com.ujaen.tfg.mangaffinity.servicios;
import com.ujaen.tfg.mangaffinity.entidades.BibliotecaPersonal;
import com.ujaen.tfg.mangaffinity.entidades.Usuario;
import com.ujaen.tfg.mangaffinity.excepciones.NombreUsuarioYaCogido;
import com.ujaen.tfg.mangaffinity.excepciones.NombreUsuarioYaRegistrado;
import com.ujaen.tfg.mangaffinity.excepciones.UsuarioNoExiste;
import com.ujaen.tfg.mangaffinity.excepciones.UsuarioYaRegistrado;
......@@ -21,6 +22,8 @@ import java.util.Map;
import java.util.Optional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.transaction.annotation.Transactional;
@Service
public class ServicioUsuarios {
@Autowired
......@@ -56,100 +59,85 @@ public class ServicioUsuarios {
}
/**
* Función para crear un Socio en la estructura
* @param usuario usuario que se va a añadir
* @brief Crea un nuevo usuario en el sistema.
* @param usuario Datos del nuevo usuario.
* @return DTOLoginRespuesta con el token, email y nombre de usuario.
* @throws UsuarioYaRegistrado Si el email ya está registrado o es del admin.
* @throws NombreUsuarioYaCogido Si el nombre de usuario ya está en uso.
* Encripta la contraseña, asigna una biblioteca personal y genera un token JWT.
*/
private static final Logger logger = LoggerFactory.getLogger(ServicioUsuarios.class);
public DTOLoginRespuesta crearUsuario(@Valid Usuario usuario) {
public DTOLoginRespuesta crearUsuario(Usuario usuario) {
usuario.setContrasenia(passwordEncoder.encode(usuario.getContrasenia()));
if (usuario.getEmail().equalsIgnoreCase(admin.getEmail())) {
logger.warn("Intento de registro con correo del admin.");
throw new UsuarioYaRegistrado();
}
if (usuario.getEmail().equalsIgnoreCase(admin.getEmail())) throw new UsuarioYaRegistrado();
if (repositorioUsuario.existePorEmail(usuario.getEmail())) {
logger.warn("Intento de registro con un correo ya registrado: " + usuario.getEmail());
throw new UsuarioYaRegistrado();
}
if (repositorioUsuario.existePorEmail(usuario.getEmail())) throw new UsuarioYaRegistrado();
if (repositorioUsuario.existePorNombreUsuario(usuario.getNombreUsuario())) {
logger.warn("Intento de registro con un nombre de usuario ya registrado: " + usuario.getNombreUsuario());
throw new NombreUsuarioYaRegistrado();
}
if (repositorioUsuario.existePorNombreUsuario(usuario.getNombreUsuario())) throw new NombreUsuarioYaCogido();
usuario.setBibliotecaPersonal(new BibliotecaPersonal(usuario));
usuario.getBibliotecaPersonal().setUsuario(usuario);
repositorioUsuario.guardar(usuario);
// Generar el token
String token = jwtUtil.generateToken(
usuario.getId(),
usuario.getEmail(),
usuario.getNombreUsuario(),
usuario.getRol()
);
return new DTOLoginRespuesta(token, usuario.getEmail(), usuario.getNombreUsuario());
}
/**
* Autentica a un usuario y genera un token JWT si las credenciales son correctas.
* @param email Email del usuario
* @param contrasenia Contraseña en texto plano
* @return DTOLoginRespuesta con el token si es válido, o null si falla
* @brief Autentica a un usuario en el sistema.
* @param email Correo electrónico del usuario.
* @param contrasenia Contraseña en texto plano.
* @return DTOLoginRespuesta con el token, email y nombre de usuario, o null si falla la autenticación.
* Devuelve null si el usuario no existe, la contraseña es incorrecta o no tiene permisos de administrador.
*/
public DTOLoginRespuesta autenticarUsuario(String email, String contrasenia) {
Optional<Usuario> usuario = repositorioUsuario.findByEmail(email);
Optional<Usuario> usuarioOpt = repositorioUsuario.findByEmail(email);
if (usuarioOpt.isEmpty()) return null;
if (usuario.isEmpty()) {
return null;
}
if (!passwordEncoder.matches(contrasenia, usuario.get().getContrasenia())) {
return null;
}
String rol = "USUARIO_REGISTRADO";
if (email.equals(admin.getEmail())) {
Optional<Usuario> adminDB = repositorioUsuario.findByEmail(email);
if (adminDB.isEmpty() || !passwordEncoder.matches(contrasenia, adminDB.get().getContrasenia())) {
return null;
}
rol = "ADMIN";
}
// Datos adicionales en el token (claims)
Map<String, Object> claims = new HashMap<>();
claims.put("email", usuario.get().getEmail());
claims.put("nombreUsuario", usuario.get().getNombreUsuario());
claims.put("rol", rol);
Usuario usuario = usuarioOpt.get();
// Generamos el token JWT
String token = jwtUtil.generateToken(usuario.get().getId(), usuario.get().getEmail(), usuario.get().getNombreUsuario(), usuario.get().getRol());
if (!passwordEncoder.matches(contrasenia, usuario.getContrasenia())) return null;
return new DTOLoginRespuesta(token, usuario.get().getEmail(), usuario.get().getNombreUsuario());
}
if (email.equals(admin.getEmail()) && !usuario.getRol().equals("ADMIN")) return null;
Map<String, Object> claims = new HashMap<>();
claims.put("email", usuario.getEmail());
claims.put("nombreUsuario", usuario.getNombreUsuario());
claims.put("rol", usuario.getRol());
public Usuario buscaUsuario(String email){
if (email.equals(admin.getEmail()))
return admin;
String token = jwtUtil.generateToken(usuario.getId(), usuario.getEmail(), usuario.getNombreUsuario(), usuario.getRol());
return new DTOLoginRespuesta(token, usuario.getEmail(), usuario.getNombreUsuario());
}
Optional<Usuario> usuario = repositorioUsuario.findByEmail(email);
/**
* @brief Busca un usuario por su correo electrónico.
* @param email Correo electrónico del usuario.
* @return Usuario encontrado.
* @throws UsuarioNoExiste Si el usuario no está registrado.
* Devuelve el usuario administrador si el email coincide con el del admin.
*/
public Usuario buscaUsuario(String email) {
if (email.equals(admin.getEmail())) return admin;
if(usuario.isPresent())
return usuario.get();
throw new UsuarioNoExiste();
return repositorioUsuario.findByEmail(email).orElseThrow(UsuarioNoExiste::new);
}
/**
* @brief Obtiene la biblioteca personal de un usuario.
* @param usuarioId ID del usuario.
* @return BibliotecaPersonal del usuario.
* @throws UsuarioNoExiste Si el usuario no está registrado.
*/
public BibliotecaPersonal obtenerBibliotecaDeUsuario(Long usuarioId) {
return repositorioUsuario.findById(usuarioId)
.map(Usuario::getBibliotecaPersonal)
.orElse(null);
.orElseThrow(UsuarioNoExiste::new);
}
}
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