diff --git a/hd-commons-lib/src/main/java/models/exceptions/StandardError.java b/hd-commons-lib/src/main/java/models/exceptions/StandardError.java index 4ecc561..3065349 100644 --- a/hd-commons-lib/src/main/java/models/exceptions/StandardError.java +++ b/hd-commons-lib/src/main/java/models/exceptions/StandardError.java @@ -3,10 +3,10 @@ package main.java.models.exceptions; import java.time.LocalDateTime; import lombok.Getter; import lombok.Setter; -import lombok.Builder; +import lombok.experimental.SuperBuilder; @Getter -@Builder +@SuperBuilder public class StandardError { private LocalDateTime timestamp; private Integer status; diff --git a/hd-commons-lib/src/main/java/models/exceptions/ValidationException.java b/hd-commons-lib/src/main/java/models/exceptions/ValidationException.java new file mode 100644 index 0000000..7585d67 --- /dev/null +++ b/hd-commons-lib/src/main/java/models/exceptions/ValidationException.java @@ -0,0 +1,26 @@ +package main.java.models.exceptions; + +import java.lang.reflect.Field; +import java.util.List; + +import lombok.experimental.SuperBuilder; +import lombok.Getter; +import lombok.AllArgsConstructor; + +@SuperBuilder +public class ValidationException extends StandardError { + + @Getter + private List errors; + + @Getter + @AllArgsConstructor + private static class FieldError { + private String fieldName; + private String message; + } + + public void addError(final String fieldName, final String message) { + this.errors.add(new FieldError(fieldName, message)); + } +} diff --git a/hd-commons-lib/src/main/java/models/requests/CreateUserRequest.java b/hd-commons-lib/src/main/java/models/requests/CreateUserRequest.java index 91a6981..67eba26 100644 --- a/hd-commons-lib/src/main/java/models/requests/CreateUserRequest.java +++ b/hd-commons-lib/src/main/java/models/requests/CreateUserRequest.java @@ -1,13 +1,22 @@ package main.java.models.requests; import java.util.Set; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; import main.java.models.enums.ProfileEnum; +import io.swagger.v3.oas.annotations.media.Schema; + import lombok.With; @With public record CreateUserRequest( - String name, - String email, - String password, - Set profiles) { + @Schema(description = "Name of the user", example = "John Doe", required = true) @NotEmpty(message = "Name cannot be empty") @Size(min = 3, max = 50, message = "Name must contain between 3 and 50 characters") String name, + + @Schema(description = "Email of the user", example = "rayanvix@gmail.com") @Email(message = "Invalid email format") @NotBlank(message = "Email cannot be blank") @Size(min = 6, max = 50, message = "Email must contain between 6 and 50 characters") String email, + + @Schema(description = "Password of the user", example = "P@ssw0rd!", required = true) @NotEmpty(message = "Password cannot be empty") @Size(min = 6, max = 20, message = "Password must contain between 6 and 20 characters") @NotBlank(message = "Password cannot be blank") String password, + + @Schema(description = "Profiles assigned to the user", example = "[\" ROLE_ADMIN \", \"ROLE_CUSTOMER \" ]", required = true) Set profiles) { } diff --git a/hd-commons-lib/target/classes/main/java/models/exceptions/StandardError$StandardErrorBuilder.class b/hd-commons-lib/target/classes/main/java/models/exceptions/StandardError$StandardErrorBuilder.class index e183b1d..8690c48 100644 Binary files a/hd-commons-lib/target/classes/main/java/models/exceptions/StandardError$StandardErrorBuilder.class and b/hd-commons-lib/target/classes/main/java/models/exceptions/StandardError$StandardErrorBuilder.class differ diff --git a/hd-commons-lib/target/classes/main/java/models/exceptions/StandardError$StandardErrorBuilderImpl.class b/hd-commons-lib/target/classes/main/java/models/exceptions/StandardError$StandardErrorBuilderImpl.class new file mode 100644 index 0000000..e219638 Binary files /dev/null and b/hd-commons-lib/target/classes/main/java/models/exceptions/StandardError$StandardErrorBuilderImpl.class differ diff --git a/hd-commons-lib/target/classes/main/java/models/exceptions/StandardError.class b/hd-commons-lib/target/classes/main/java/models/exceptions/StandardError.class index 4938cfb..244a87a 100644 Binary files a/hd-commons-lib/target/classes/main/java/models/exceptions/StandardError.class and b/hd-commons-lib/target/classes/main/java/models/exceptions/StandardError.class differ diff --git a/hd-commons-lib/target/classes/main/java/models/exceptions/ValidationException$FieldError.class b/hd-commons-lib/target/classes/main/java/models/exceptions/ValidationException$FieldError.class new file mode 100644 index 0000000..64ebeb1 Binary files /dev/null and b/hd-commons-lib/target/classes/main/java/models/exceptions/ValidationException$FieldError.class differ diff --git a/hd-commons-lib/target/classes/main/java/models/exceptions/ValidationException$ValidationExceptionBuilder.class b/hd-commons-lib/target/classes/main/java/models/exceptions/ValidationException$ValidationExceptionBuilder.class new file mode 100644 index 0000000..4928431 Binary files /dev/null and b/hd-commons-lib/target/classes/main/java/models/exceptions/ValidationException$ValidationExceptionBuilder.class differ diff --git a/hd-commons-lib/target/classes/main/java/models/exceptions/ValidationException$ValidationExceptionBuilderImpl.class b/hd-commons-lib/target/classes/main/java/models/exceptions/ValidationException$ValidationExceptionBuilderImpl.class new file mode 100644 index 0000000..f5050f3 Binary files /dev/null and b/hd-commons-lib/target/classes/main/java/models/exceptions/ValidationException$ValidationExceptionBuilderImpl.class differ diff --git a/hd-commons-lib/target/classes/main/java/models/exceptions/ValidationException.class b/hd-commons-lib/target/classes/main/java/models/exceptions/ValidationException.class new file mode 100644 index 0000000..94e0fc2 Binary files /dev/null and b/hd-commons-lib/target/classes/main/java/models/exceptions/ValidationException.class differ diff --git a/hd-commons-lib/target/classes/main/java/models/requests/CreateUserRequest.class b/hd-commons-lib/target/classes/main/java/models/requests/CreateUserRequest.class index b588746..3ac40cc 100644 Binary files a/hd-commons-lib/target/classes/main/java/models/requests/CreateUserRequest.class and b/hd-commons-lib/target/classes/main/java/models/requests/CreateUserRequest.class differ diff --git a/hd-commons-lib/target/hd-commons-lib-1.0.0.jar b/hd-commons-lib/target/hd-commons-lib-1.0.0.jar index fb851e2..693bf9f 100644 Binary files a/hd-commons-lib/target/hd-commons-lib-1.0.0.jar and b/hd-commons-lib/target/hd-commons-lib-1.0.0.jar differ diff --git a/hd-commons-lib/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/hd-commons-lib/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst index 64dc483..ba859b6 100644 --- a/hd-commons-lib/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ b/hd-commons-lib/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -1,6 +1,11 @@ main/java/models/exceptions/ResourceNotFoundException.class +main/java/models/exceptions/ValidationException$ValidationExceptionBuilderImpl.class +main/java/models/exceptions/ValidationException$FieldError.class +main/java/models/exceptions/ValidationException.class main/java/models/exceptions/StandardError$StandardErrorBuilder.class +main/java/models/exceptions/StandardError$StandardErrorBuilderImpl.class main/java/models/responses/UserResponse.class main/java/models/enums/ProfileEnum.class main/java/models/exceptions/StandardError.class +main/java/models/exceptions/ValidationException$ValidationExceptionBuilder.class main/java/models/requests/CreateUserRequest.class diff --git a/hd-commons-lib/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/hd-commons-lib/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst index ea400a5..36e4f10 100644 --- a/hd-commons-lib/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ b/hd-commons-lib/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -1,5 +1,6 @@ /home/dev/projetos/Help Desk 2.0/hd-commons-lib/src/main/java/models/enums/ProfileEnum.java /home/dev/projetos/Help Desk 2.0/hd-commons-lib/src/main/java/models/exceptions/ResourceNotFoundException.java /home/dev/projetos/Help Desk 2.0/hd-commons-lib/src/main/java/models/exceptions/StandardError.java +/home/dev/projetos/Help Desk 2.0/hd-commons-lib/src/main/java/models/exceptions/ValidationException.java /home/dev/projetos/Help Desk 2.0/hd-commons-lib/src/main/java/models/requests/CreateUserRequest.java /home/dev/projetos/Help Desk 2.0/hd-commons-lib/src/main/java/models/responses/UserResponse.java diff --git a/user-service-api/src/main/java/br/com/rayankonecny/userserviceapi/controller/UserController.java b/user-service-api/src/main/java/br/com/rayankonecny/userserviceapi/controller/UserController.java index 4acd78e..53c8789 100644 --- a/user-service-api/src/main/java/br/com/rayankonecny/userserviceapi/controller/UserController.java +++ b/user-service-api/src/main/java/br/com/rayankonecny/userserviceapi/controller/UserController.java @@ -15,7 +15,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; - +import jakarta.validation.Valid; import main.java.models.exceptions.StandardError; import main.java.models.requests.CreateUserRequest; import main.java.models.responses.UserResponse; @@ -41,5 +41,5 @@ public interface UserController { @ApiResponse(responseCode = "500", description = "Internal server error", content = @Content(mediaType = "application/json", schema = @Schema(implementation = StandardError.class))) }) @PostMapping - ResponseEntity save(@RequestBody final CreateUserRequest createUserRequest); + ResponseEntity save(@Valid @RequestBody final CreateUserRequest createUserRequest); } diff --git a/user-service-api/src/main/java/br/com/rayankonecny/userserviceapi/controller/exceptions/ControllerExceptionHandler.java b/user-service-api/src/main/java/br/com/rayankonecny/userserviceapi/controller/exceptions/ControllerExceptionHandler.java index ce850a3..5c01d46 100644 --- a/user-service-api/src/main/java/br/com/rayankonecny/userserviceapi/controller/exceptions/ControllerExceptionHandler.java +++ b/user-service-api/src/main/java/br/com/rayankonecny/userserviceapi/controller/exceptions/ControllerExceptionHandler.java @@ -1,29 +1,57 @@ package br.com.rayankonecny.userserviceapi.controller.exceptions; import org.springframework.http.ResponseEntity; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import jakarta.servlet.http.HttpServletRequest; + +import main.java.models.exceptions.ValidationException; import main.java.models.exceptions.ResourceNotFoundException; import main.java.models.exceptions.StandardError; import static java.time.LocalDateTime.now; import static org.springframework.http.HttpStatus.NOT_FOUND; +import java.util.ArrayList; + @ControllerAdvice public class ControllerExceptionHandler { - @ExceptionHandler(ResourceNotFoundException.class) - ResponseEntity handleNotFoundException(final ResourceNotFoundException ex, final HttpServletRequest request) { - return ResponseEntity.status(NOT_FOUND).body( + @ExceptionHandler(ResourceNotFoundException.class) + ResponseEntity handleNotFoundException(final ResourceNotFoundException ex, + final HttpServletRequest request) { + return ResponseEntity.status(NOT_FOUND).body( - StandardError.builder() - .timestamp(now()) - .status(NOT_FOUND.value()) - .error("Resource Not Found") - .message(ex.getMessage()) - .path(request.getRequestURI()) - .build()); - } + StandardError.builder() + .timestamp(now()) + .status(NOT_FOUND.value()) + .error(NOT_FOUND.getReasonPhrase()) + .message(ex.getMessage()) + .path(request.getRequestURI()) + .build()); + } + + @ExceptionHandler(MethodArgumentNotValidException.class) + ResponseEntity handleMethodArgumentNotValidException( + final MethodArgumentNotValidException ex, + final HttpServletRequest request) { + var error = ValidationException + .builder() + .timestamp(now()) + .status(NOT_FOUND.value()) + .error("Validation Exception") + .message("Exception in validation attributes") + .path(request.getRequestURI()) + .errors(new ArrayList<>()) + .build(); + + for (FieldError fieldError : ex.getBindingResult().getFieldErrors()) { + error.addError(fieldError.getField(), fieldError.getDefaultMessage()); + } + + return ResponseEntity.badRequest().body(error); + } }