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; ...@@ -2,6 +2,7 @@ package com.ujaen.tfg.mangaffinity.servicios;
import com.ujaen.tfg.mangaffinity.entidades.BibliotecaPersonal; import com.ujaen.tfg.mangaffinity.entidades.BibliotecaPersonal;
import com.ujaen.tfg.mangaffinity.entidades.Usuario; 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.NombreUsuarioYaRegistrado;
import com.ujaen.tfg.mangaffinity.excepciones.UsuarioNoExiste; import com.ujaen.tfg.mangaffinity.excepciones.UsuarioNoExiste;
import com.ujaen.tfg.mangaffinity.excepciones.UsuarioYaRegistrado; import com.ujaen.tfg.mangaffinity.excepciones.UsuarioYaRegistrado;
...@@ -21,6 +22,8 @@ import java.util.Map; ...@@ -21,6 +22,8 @@ import java.util.Map;
import java.util.Optional; import java.util.Optional;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.transaction.annotation.Transactional;
@Service @Service
public class ServicioUsuarios { public class ServicioUsuarios {
@Autowired @Autowired
...@@ -56,100 +59,85 @@ public class ServicioUsuarios { ...@@ -56,100 +59,85 @@ public class ServicioUsuarios {
} }
/** /**
* Función para crear un Socio en la estructura * @brief Crea un nuevo usuario en el sistema.
* @param usuario usuario que se va a añadir * @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(Usuario usuario) {
public DTOLoginRespuesta crearUsuario(@Valid Usuario usuario) {
usuario.setContrasenia(passwordEncoder.encode(usuario.getContrasenia())); usuario.setContrasenia(passwordEncoder.encode(usuario.getContrasenia()));
if (usuario.getEmail().equalsIgnoreCase(admin.getEmail())) { if (usuario.getEmail().equalsIgnoreCase(admin.getEmail())) throw new UsuarioYaRegistrado();
logger.warn("Intento de registro con correo del admin.");
throw new UsuarioYaRegistrado();
}
if (repositorioUsuario.existePorEmail(usuario.getEmail())) { if (repositorioUsuario.existePorEmail(usuario.getEmail())) throw new UsuarioYaRegistrado();
logger.warn("Intento de registro con un correo ya registrado: " + usuario.getEmail());
throw new UsuarioYaRegistrado();
}
if (repositorioUsuario.existePorNombreUsuario(usuario.getNombreUsuario())) { if (repositorioUsuario.existePorNombreUsuario(usuario.getNombreUsuario())) throw new NombreUsuarioYaCogido();
logger.warn("Intento de registro con un nombre de usuario ya registrado: " + usuario.getNombreUsuario());
throw new NombreUsuarioYaRegistrado();
}
usuario.setBibliotecaPersonal(new BibliotecaPersonal(usuario)); usuario.setBibliotecaPersonal(new BibliotecaPersonal(usuario));
usuario.getBibliotecaPersonal().setUsuario(usuario); usuario.getBibliotecaPersonal().setUsuario(usuario);
repositorioUsuario.guardar(usuario); repositorioUsuario.guardar(usuario);
// Generar el token
String token = jwtUtil.generateToken( String token = jwtUtil.generateToken(
usuario.getId(), usuario.getId(),
usuario.getEmail(), usuario.getEmail(),
usuario.getNombreUsuario(), usuario.getNombreUsuario(),
usuario.getRol() usuario.getRol()
); );
return new DTOLoginRespuesta(token, usuario.getEmail(), usuario.getNombreUsuario()); return new DTOLoginRespuesta(token, usuario.getEmail(), usuario.getNombreUsuario());
} }
/** /**
* Autentica a un usuario y genera un token JWT si las credenciales son correctas. * @brief Autentica a un usuario en el sistema.
* @param email Email del usuario * @param email Correo electrónico del usuario.
* @param contrasenia Contraseña en texto plano * @param contrasenia Contraseña en texto plano.
* @return DTOLoginRespuesta con el token si es válido, o null si falla * @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) { 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()) { Usuario usuario = usuarioOpt.get();
return null;
}
if (!passwordEncoder.matches(contrasenia, usuario.get().getContrasenia())) {
return null;
}
String rol = "USUARIO_REGISTRADO";
if (email.equals(admin.getEmail())) { if (!passwordEncoder.matches(contrasenia, usuario.getContrasenia())) return null;
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) if (email.equals(admin.getEmail()) && !usuario.getRol().equals("ADMIN")) return null;
Map<String, Object> claims = new HashMap<>();
claims.put("email", usuario.get().getEmail());
claims.put("nombreUsuario", usuario.get().getNombreUsuario());
claims.put("rol", rol);
// Generamos el token JWT Map<String, Object> claims = new HashMap<>();
String token = jwtUtil.generateToken(usuario.get().getId(), usuario.get().getEmail(), usuario.get().getNombreUsuario(), usuario.get().getRol()); claims.put("email", usuario.getEmail());
claims.put("nombreUsuario", usuario.getNombreUsuario());
claims.put("rol", usuario.getRol());
return new DTOLoginRespuesta(token, usuario.get().getEmail(), usuario.get().getNombreUsuario()); String token = jwtUtil.generateToken(usuario.getId(), usuario.getEmail(), usuario.getNombreUsuario(), usuario.getRol());
return new DTOLoginRespuesta(token, usuario.getEmail(), usuario.getNombreUsuario());
} }
/**
* @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;
public Usuario buscaUsuario(String email){ return repositorioUsuario.findByEmail(email).orElseThrow(UsuarioNoExiste::new);
if (email.equals(admin.getEmail()))
return admin;
Optional<Usuario> usuario = repositorioUsuario.findByEmail(email);
if(usuario.isPresent())
return usuario.get();
throw new UsuarioNoExiste();
} }
/**
* @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) { public BibliotecaPersonal obtenerBibliotecaDeUsuario(Long usuarioId) {
return repositorioUsuario.findById(usuarioId) return repositorioUsuario.findById(usuarioId)
.map(Usuario::getBibliotecaPersonal) .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