package com.agendaestudantil.excecao; import com.agendaestudantil.dto.RespostaApi; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.server.ResponseStatusException; import java.time.LocalDateTime; import java.util.HashMap; import java.util.Map; @RestControllerAdvice public class ManipuladorExcecaoGlobal { @ExceptionHandler(ExcecaoRecursoNaoEncontrado.class) public ResponseEntity> handleResourceNotFound(ExcecaoRecursoNaoEncontrado ex) { return ResponseEntity.status(HttpStatus.NOT_FOUND) .body(new RespostaApi<>(null, ex.getMessage(), LocalDateTime.now())); } @ExceptionHandler(ExcecaoNegocio.class) public ResponseEntity> handleExcecaoNegocio(ExcecaoNegocio ex) { return ResponseEntity.status(HttpStatus.BAD_REQUEST) .body(new RespostaApi<>(null, ex.getMessage(), LocalDateTime.now())); } @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity>> handleValidationException( MethodArgumentNotValidException ex) { Map errors = new HashMap<>(); for (FieldError error : ex.getBindingResult().getFieldErrors()) { errors.put(error.getField(), error.getDefaultMessage()); } return ResponseEntity.status(HttpStatus.BAD_REQUEST) .body(new RespostaApi<>(errors, "Falha na validação", LocalDateTime.now())); } @ExceptionHandler(ResponseStatusException.class) public ResponseEntity> handleResponseStatusException(ResponseStatusException ex) { return ResponseEntity.status(ex.getStatusCode()) .body(new RespostaApi<>(null, ex.getReason(), LocalDateTime.now())); } @ExceptionHandler(Exception.class) public ResponseEntity> handleGenericException(Exception ex) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new RespostaApi<>(null, "Erro interno no servidor: " + ex.getMessage(), LocalDateTime.now())); } }