Compare commits
2 commits
280400ceea
...
619ece9a13
| Author | SHA1 | Date | |
|---|---|---|---|
| 619ece9a13 | |||
| 20e7421603 |
18 changed files with 119 additions and 21 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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<FieldError> 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));
|
||||
}
|
||||
}
|
||||
|
|
@ -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<ProfileEnum> 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<ProfileEnum> profiles) {
|
||||
}
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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<Void> save(@RequestBody final CreateUserRequest createUserRequest);
|
||||
ResponseEntity<Void> save(@Valid @RequestBody final CreateUserRequest createUserRequest);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,29 +1,73 @@
|
|||
package br.com.rayankonecny.userserviceapi.controller.exceptions;
|
||||
|
||||
import org.springframework.dao.DataIntegrityViolationException;
|
||||
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.BAD_REQUEST;
|
||||
import static org.springframework.http.HttpStatus.NOT_FOUND;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
@ControllerAdvice
|
||||
public class ControllerExceptionHandler {
|
||||
|
||||
@ExceptionHandler(ResourceNotFoundException.class)
|
||||
ResponseEntity<StandardError> handleNotFoundException(final ResourceNotFoundException ex, final HttpServletRequest request) {
|
||||
return ResponseEntity.status(NOT_FOUND).body(
|
||||
@ExceptionHandler(ResourceNotFoundException.class)
|
||||
ResponseEntity<StandardError> 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<StandardError> 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);
|
||||
}
|
||||
|
||||
@ExceptionHandler(DataIntegrityViolationException.class)
|
||||
ResponseEntity<StandardError> handleDataIntegrityViolationException(
|
||||
final DataIntegrityViolationException ex, final HttpServletRequest request) {
|
||||
|
||||
return ResponseEntity.badRequest().body(
|
||||
StandardError.builder()
|
||||
.timestamp(now())
|
||||
.status(BAD_REQUEST.value())
|
||||
.error(BAD_REQUEST.getReasonPhrase())
|
||||
.message(ex.getMessage())
|
||||
.path(request.getRequestURI())
|
||||
.build());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,10 +1,13 @@
|
|||
package br.com.rayankonecny.userserviceapi.repository;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import br.com.rayankonecny.userserviceapi.entity.User;
|
||||
import org.springframework.data.mongodb.repository.MongoRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import br.com.rayankonecny.userserviceapi.entity.User;
|
||||
|
||||
@Repository
|
||||
public interface UserRepository extends MongoRepository<User, String> {
|
||||
|
||||
Optional<User> findByEmail(final String email);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package br.com.rayankonecny.userserviceapi.service;
|
||||
|
||||
import org.springframework.dao.DataIntegrityViolationException;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import br.com.rayankonecny.userserviceapi.mapper.UserMapper;
|
||||
|
|
@ -23,7 +24,16 @@ public class UserService {
|
|||
}
|
||||
|
||||
public void save(CreateUserRequest createUserRequest) {
|
||||
verifyIfEmailAlreadyEexists(createUserRequest.email(), null);
|
||||
userRepository.save(userMapper.fromRequest(createUserRequest));
|
||||
}
|
||||
|
||||
private void verifyIfEmailAlreadyEexists(final String email, final String id) {
|
||||
userRepository.findByEmail(email)
|
||||
.filter(user -> !user.getId().equals(id))
|
||||
.ifPresent(user -> {
|
||||
throw new DataIntegrityViolationException("Email [" + email + "] already exists");
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue