Se manejan las restricciones de los campos en el dto de Usuario y se modifica el controller

parent 0c4aebf4
......@@ -4,10 +4,8 @@ import ec.edu.espe.movilidad.MovilidadWS.Dto.DtoUsuarioConPerfiles;
import ec.edu.espe.movilidad.MovilidadWS.Dto.DtoUzyTPerfil;
import ec.edu.espe.movilidad.MovilidadWS.Dto.DtoUzyTUsuario;
import ec.edu.espe.movilidad.MovilidadWS.Service.UzyTUsuario.IServiceUzyTUsuario;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
import java.util.Set;
......@@ -30,47 +28,42 @@ public class UzyTUsuarioController {
}
@GetMapping("/exampleFindId/{id}")
public ResponseEntity<DtoUzyTUsuario> ListarPorID(@PathVariable Long id) {
return new ResponseEntity<>(serviceUzyTUsuario.ListarPorID(id), HttpStatus.OK);
public DtoUzyTUsuario ListarPorID(@PathVariable Long id) {
return serviceUzyTUsuario.ListarPorID(id);
}
@GetMapping("/getAll")
public ResponseEntity<List<DtoUzyTUsuario>> ListarRegistros() {
return new ResponseEntity<>(serviceUzyTUsuario.ListarRegistros(), HttpStatus.OK);
public List<DtoUzyTUsuario> ListarRegistros() {
return serviceUzyTUsuario.ListarRegistros();
}
@GetMapping("/perfilUsuario/{uzytusuario_id}")
public ResponseEntity<Set<DtoUzyTPerfil>> findPerfilesByUsuarioId(@PathVariable Long uzytusuario_id) {
return new ResponseEntity<>(serviceUzyTUsuario.findPerfilesByUsuarioId(uzytusuario_id), HttpStatus.OK);
public Set<DtoUzyTPerfil> findPerfilesByUsuarioId(@PathVariable Long uzytusuario_id) {
return serviceUzyTUsuario.findPerfilesByUsuarioId(uzytusuario_id);
}
@PostMapping("/asignar_perfil/{uzytusuario_id}/{uzytperfil_id}")
public ResponseEntity<DtoUsuarioConPerfiles> asignarPerfilAUsuario(
public DtoUsuarioConPerfiles asignarPerfilAUsuario(
@PathVariable("uzytusuario_id") Long uzytusuario_id,
@PathVariable("uzytperfil_id") Long uzytperfil_id) {
DtoUsuarioConPerfiles usuarioAsignado = serviceUzyTUsuario.asignarPerfilAUsuario(uzytusuario_id, uzytperfil_id);
if (usuarioAsignado != null) {
return new ResponseEntity<>(usuarioAsignado, HttpStatus.OK);
} else {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
return serviceUzyTUsuario.asignarPerfilAUsuario(uzytusuario_id, uzytperfil_id);
}
@GetMapping("/buscarUsuario")
public ResponseEntity<List<DtoUzyTUsuario>> buscarUsuarios(@RequestParam(required = false) String usuario) {
return new ResponseEntity<>(serviceUzyTUsuario.findByUsuario(usuario), HttpStatus.OK);
public List<DtoUzyTUsuario> buscarUsuarios(@RequestParam(required = false) String usuario) {
return serviceUzyTUsuario.findByUsuario(usuario);
}
@PostMapping("/guardar")
public ResponseEntity<DtoUzyTUsuario> guardar( @Valid @RequestBody DtoUzyTUsuario dtoUzyTUsuario){
return new ResponseEntity<>(serviceUzyTUsuario.guardar(dtoUzyTUsuario), HttpStatus.OK);
public DtoUzyTUsuario guardar(@Valid @RequestBody DtoUzyTUsuario dtoUzyTUsuario) {
return serviceUzyTUsuario.guardar(dtoUzyTUsuario);
}
@PutMapping("/editar/{id}")
public ResponseEntity<DtoUzyTUsuario> editar(@PathVariable Long id, @Valid @RequestBody DtoUzyTUsuario dtoUzyTUsuario) {
return new ResponseEntity<>(serviceUzyTUsuario.editar(id, dtoUzyTUsuario), HttpStatus.OK);
public DtoUzyTUsuario editar(@PathVariable Long id, @Valid @RequestBody DtoUzyTUsuario dtoUzyTUsuario) {
return serviceUzyTUsuario.editar(id, dtoUzyTUsuario);
}
......
package ec.edu.espe.movilidad.MovilidadWS.Dto;
import lombok.Data;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Positive;
import java.util.Date;
import java.util.Set;
@Data
public class DtoUzyTUsuario {
@Positive
private Long uzytusuario_id;
private String uzytusuario_cc;
private String uzytusuario_clave;
private String uzytusuario_nombres;
@NotNull
private String uzytusuario_apellidos;
@Email(message = "El campo 'uzytusuario_email' debe ser una dirección de correo electrónico válida: usuario@example.com")
private String uzytusuario_email;
private Date uzytusuario_fecharegistro;
private String uzytusuario_estado;
......@@ -23,10 +31,12 @@ public class DtoUzyTUsuario {
private String uzytusuario_tratamiento;
private Integer uzytusuario_modificacion;
private String uzytusuario_tipo_user;
@Email(message = "El campo 'uzytusuario_email' debe ser una dirección de correo electrónico válida: usuario@espe.edu.ec")
private String uzytusuario_email_institucional;
private String uzytusuario_telefono_fijo;
private String uzytusuario_telefono_celular;
private String spriden_id;
@Positive
private Integer spriden_pidm;
private String uzytusuario_clave_tmp;
private String spbpers_name_prefix;
......
package ec.edu.espe.movilidad.MovilidadWS.Exceptions.Configuration;
import ec.edu.espe.movilidad.MovilidadWS.Exceptions.ErrorResponse;
import ec.edu.espe.movilidad.MovilidadWS.Exceptions.InvalidArgumentException;
import ec.edu.espe.movilidad.MovilidadWS.Exceptions.ResourceNotFoundException;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.http.HttpStatus;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.ArrayList;
import java.util.List;
import java.util.NoSuchElementException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.http.converter.HttpMessageNotReadableException;
import java.io.IOException;
import java.sql.SQLException;
import java.util.concurrent.TimeoutException;
//Clase para capturar y manejar globalmente las excepciones producidas
@RestControllerAdvice
public class GlobalExceptionHandler {
......@@ -18,10 +35,12 @@ public class GlobalExceptionHandler {
public ResponseEntity<String> handleResourceNotFoundException(ResourceNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
}
@ExceptionHandler(NoSuchElementException.class)
public ResponseEntity<String> handleNoSuchElementException(NoSuchElementException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
}
@ExceptionHandler(InvalidArgumentException.class)
public ResponseEntity<String> handleInvalidArgumentException(InvalidArgumentException ex) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage());
......@@ -34,7 +53,79 @@ public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleGenericException(Exception ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Ha ocurrido un error INTERNO en el servidor: -> "+ ex.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Ha ocurrido un error INTERNO en el servidor: -> " + ex.getMessage());
}
//Se encarga de capturar y manejar las excepciones de validación
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ErrorResponse> handleValidationException(MethodArgumentNotValidException ex) {
List<String> errors = new ArrayList<>(); //Se almacenan los mensajes producidos
for (ObjectError error : ex.getBindingResult().getAllErrors()) { // Se itera todos los errores de la excepcion
if (error instanceof FieldError) {
FieldError fieldError = (FieldError) error;
String errorMessage = fieldError.getField() + ": " + error.getDefaultMessage();
errors.add(errorMessage);
} else {
errors.add(error.getDefaultMessage());
}
}
ErrorResponse errorResponse = new ErrorResponse("Error de validación", errors);
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponse);
}
////Restricción única o una clave foránea que no se cumple al realizar operaciones de persistencia en la base de datos como :@Column(unique = true).
@ExceptionHandler(DataIntegrityViolationException.class)
public ResponseEntity<String> handleDataIntegrityViolationException(DataIntegrityViolationException ex) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
.body("Error de integridad de datos: " + ex.getMessage());
}
//Restricción única o una clave foránea que no se cumple al realizar operaciones de persistencia en la base de datos Como por ejemplo un ID que no se encuentre en la BDD.
@ExceptionHandler(EmptyResultDataAccessException.class)
public ResponseEntity<String> handleEmptyResultDataAccessException(EmptyResultDataAccessException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(ex.getMessage());
}
//Manejar excepcion cuando hay problemas en las consultas o en la conexión con la base de datos.
@ExceptionHandler(SQLException.class)
public ResponseEntity<String> handleSQLException(SQLException ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Error en la base de datos: " + ex.getMessage());
}
//Excepcion cuando el body no se ajusta al formato esperado
@ExceptionHandler(HttpMessageNotReadableException.class)
public ResponseEntity<String> handleHttpMessageNotReadableException(HttpMessageNotReadableException ex) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
.body("Error al leer el cuerpo de la solicitud: " + ex.getMessage());
}
//Maneja errores relacionados con operaciones de entrada/salida (I/O), como cuando se hace una carga de algún archivo
@ExceptionHandler(IOException.class)
public ResponseEntity<String> handleIOException(IOException ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Error de entrada/salida: " + ex.getMessage());
}
//Se maneja la excepcion para se intenta acceder a un objeto nullo
@ExceptionHandler(NullPointerException.class)
public ResponseEntity<String> handleNullPointerException(NullPointerException ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Error de puntero nulo: " + ex.getMessage());
}
//Excepcion cuando no se obtiene el formato numérico
@ExceptionHandler(NumberFormatException.class)
public ResponseEntity<String> handleNumberFormatException(NumberFormatException ex) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
.body("Error al convertir una cadena a número: " + ex.getMessage());
}
//Excepción cuando se sobrepasa el límite de espera de alguna solicitud.
@ExceptionHandler(TimeoutException.class)
public ResponseEntity<String> handleTimeoutException(TimeoutException ex) {
return ResponseEntity.status(HttpStatus.REQUEST_TIMEOUT)
.body("Tiempo de espera agotado: " + ex.getMessage());
}
}
......
package ec.edu.espe.movilidad.MovilidadWS.Exceptions;
import lombok.Data;
import java.util.List;
@Data
public class ErrorResponse {
private String message;
private List<String> errors;
public ErrorResponse(String message, List<String> errors) {
this.message = message;
this.errors = errors;
}
}
......@@ -27,6 +27,8 @@ public class ServiceUzyTUsuario implements IServiceUzyTUsuario {
private final UzyTUsuarioMapper mapper;
private final UzyTPerfilMapper mapperPerfil;
public ServiceUzyTUsuario(DaoUzyTUsuario daoUzyTUsuario, DaoUzyTPerfil daoUzyTPerfil, UzyTUsuarioMapper mapper, UzyTPerfilMapper mapperPerfil) {
this.daoUzyTUsuario = daoUzyTUsuario;
this.daoUzyTPerfil = daoUzyTPerfil;
......@@ -206,12 +208,13 @@ public class ServiceUzyTUsuario implements IServiceUzyTUsuario {
try {
ModelUzyTUsuario usuario = daoUzyTUsuario.findById(uzytusuario_id).orElseThrow(() -> new ResourceNotFoundException("Usuario no encontrado con ID: " + uzytusuario_id));
ModelUzyTPerfil perfil = daoUzyTPerfil.findById(uzytperfil_id).orElseThrow(() -> new ResourceNotFoundException("Perfil no encontrado con ID: " + uzytperfil_id));
ModelUzyTUsuario usuario = daoUzyTUsuario.findById(uzytusuario_id)
.orElseThrow(() -> new ResourceNotFoundException("Usuario no encontrado con ID: " + uzytusuario_id));
ModelUzyTPerfil perfil = daoUzyTPerfil
.findById(uzytperfil_id).orElseThrow(() -> new ResourceNotFoundException("Perfil no encontrado con ID: " + uzytperfil_id));
if (usuario.getUzytperfils().contains(perfil)) {
throw new InvalidArgumentException("El perfil ya está asignado al usuario.");
}
// Aquí asigno el perfil al usuario
usuario.getUzytperfils().add(perfil);
daoUzyTUsuario.save(usuario);
......@@ -233,6 +236,7 @@ public class ServiceUzyTUsuario implements IServiceUzyTUsuario {
}
@Override
public Set<DtoUzyTPerfil> findPerfilesByUsuarioId(Long uzytusuario_id) {
if (uzytusuario_id == null || uzytusuario_id <= 0) {
......
......@@ -17,7 +17,6 @@ spring.jpa.hibernate.ddl-auto=none
spring.datasource.username=UTIC1
spring.datasource.password=D3s4ut1.*123
spring.jpa.properties.hibernate.id.new_generator_mappings=true
#spring.main.scan-packages=ec.edu.espe.movilidad.MovilidadWS.Mapper
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
......@@ -25,8 +24,8 @@ spring.servlet.multipart.enabled=true
spring.servlet.multipart.max-file-size=10MB
logging.level.org.springframework.security= DEBUG
#EntityManager se cierra despus de que se completa la transaccin HTTP. Esto permite un mejor control sobre cundo se accede a la base de datos y cundo se liberan los recursos.
spring.jpa.open-in-view=false
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 to comment