Commit e15ce02d by Rubén Ramírez

fix: [RegistraUsuarios]: Corregido el código para registrar un usuario para…

fix: [RegistraUsuarios]: Corregido el código para registrar un usuario para distinguir distintos mensajes para el frontend
parent 02bf53ab
package com.ujaen.tfg.mangaffinity.excepciones;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(UsuarioYaRegistrado.class)
public ResponseEntity<String> handleUsuarioYaRegistrado(UsuarioYaRegistrado ex) {
logger.warn("GlobalExceptionHandler capturó UsuarioYaRegistrado: {}", ex.getMessage());
return ResponseEntity.status(HttpStatus.CONFLICT)
.contentType(org.springframework.http.MediaType.TEXT_PLAIN)
.body("correo");
}
@ExceptionHandler(NombreUsuarioYaRegistrado.class)
public ResponseEntity<String> handleNombreUsuarioYaRegistrado(NombreUsuarioYaRegistrado ex) {
logger.warn("GlobalExceptionHandler capturó NombreUsuarioYaRegistrado: {}", ex.getMessage());
return ResponseEntity.status(HttpStatus.CONFLICT)
.contentType(org.springframework.http.MediaType.TEXT_PLAIN)
.body("nombre de usuario");
}
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleGenericException(Exception ex) {
logger.error("Excepción no controlada en GlobalExceptionHandler: {}", ex.getMessage(), ex);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.contentType(org.springframework.http.MediaType.TEXT_PLAIN)
.body("Error inesperado.");
}
}
package com.ujaen.tfg.mangaffinity.excepciones;
public class NombreUsuarioYaRegistrado extends RuntimeException {
public NombreUsuarioYaRegistrado() {
super("El nombre de usuario ya está en uso.");
}
}
package com.ujaen.tfg.mangaffinity.excepciones; package com.ujaen.tfg.mangaffinity.excepciones;
public class UsuarioYaRegistrado extends RuntimeException { public class UsuarioYaRegistrado extends RuntimeException {
public UsuarioYaRegistrado() {
super("El correo electrónico ya está registrado.");
}
} }
...@@ -58,6 +58,20 @@ public class RepositorioUsuario { ...@@ -58,6 +58,20 @@ public class RepositorioUsuario {
Usuario usuario = em.find(Usuario.class, id); Usuario usuario = em.find(Usuario.class, id);
return Optional.ofNullable(usuario); return Optional.ofNullable(usuario);
} }
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public boolean existePorEmail(String email) {
return !em.createQuery("SELECT u FROM Usuario u WHERE u.email = :email", Usuario.class)
.setParameter("email", email)
.getResultList()
.isEmpty();
}
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public boolean existePorNombreUsuario(String nombreUsuario) {
return !em.createQuery("SELECT u FROM Usuario u WHERE u.nombreUsuario = :nombreUsuario", Usuario.class)
.setParameter("nombreUsuario", nombreUsuario)
.getResultList()
.isEmpty();
}
} }
...@@ -2,6 +2,7 @@ package com.ujaen.tfg.mangaffinity.rest; ...@@ -2,6 +2,7 @@ package com.ujaen.tfg.mangaffinity.rest;
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.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;
import com.ujaen.tfg.mangaffinity.rest.DTO.DTOBibliotecaPersonal; import com.ujaen.tfg.mangaffinity.rest.DTO.DTOBibliotecaPersonal;
...@@ -34,16 +35,21 @@ public class UsuariosController { ...@@ -34,16 +35,21 @@ public class UsuariosController {
public void mapeadoExcepcionConstraintViolationException() {} public void mapeadoExcepcionConstraintViolationException() {}
@PostMapping("/") @PostMapping("/")
public ResponseEntity<DTOUsuario> registrarUsuario(@RequestBody DTOUsuario dtoUsuario) { public ResponseEntity<String> registrarUsuario(@RequestBody DTOUsuario dtoUsuario) {
try { try {
Usuario usuario = mapper.entity(dtoUsuario); Usuario usuario = mapper.entity(dtoUsuario);
servicioUsuarios.crearUsuario(usuario); servicioUsuarios.crearUsuario(usuario);
return ResponseEntity.status(HttpStatus.CREATED).build(); return ResponseEntity.status(HttpStatus.CREATED).build();
} catch (UsuarioYaRegistrado e) { } catch (UsuarioYaRegistrado e) {
return ResponseEntity.status(HttpStatus.CONFLICT).build(); return ResponseEntity.status(HttpStatus.CONFLICT).body("correo");
} catch (NombreUsuarioYaRegistrado e) {
return ResponseEntity.status(HttpStatus.CONFLICT).body("nombre de usuario");
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error inesperado");
} }
} }
@PostMapping("/{email}") @PostMapping("/{email}")
public ResponseEntity<?> iniciarSesion(@PathVariable String email, @RequestBody Map<String, String> clave) { public ResponseEntity<?> iniciarSesion(@PathVariable String email, @RequestBody Map<String, String> clave) {
try { try {
......
...@@ -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.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;
import com.ujaen.tfg.mangaffinity.repositorios.RepositorioUsuario; import com.ujaen.tfg.mangaffinity.repositorios.RepositorioUsuario;
...@@ -18,7 +19,8 @@ import org.springframework.security.crypto.password.PasswordEncoder; ...@@ -18,7 +19,8 @@ import org.springframework.security.crypto.password.PasswordEncoder;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Service @Service
public class ServicioUsuarios { public class ServicioUsuarios {
@Autowired @Autowired
...@@ -57,17 +59,33 @@ public class ServicioUsuarios { ...@@ -57,17 +59,33 @@ public class ServicioUsuarios {
* Función para crear un Socio en la estructura * Función para crear un Socio en la estructura
* @param usuario usuario que se va a añadir * @param usuario usuario que se va a añadir
*/ */
private static final Logger logger = LoggerFactory.getLogger(ServicioUsuarios.class);
public void crearUsuario(@Valid Usuario usuario) { public void 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(); // Evita que se cree otro admin accidentalmente logger.warn("Intento de registro con correo del admin.");
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.existePorNombreUsuario(usuario.getNombreUsuario())) {
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); // Asegurar relación bidireccional usuario.getBibliotecaPersonal().setUsuario(usuario);
repositorioUsuario.guardar(usuario); repositorioUsuario.guardar(usuario);
} }
/** /**
* Autentica a un usuario y genera un token JWT si las credenciales son correctas. * Autentica a un usuario y genera un token JWT si las credenciales son correctas.
* @param email Email del usuario * @param email Email del usuario
......
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