Compare commits
No commits in common. "619ece9a137146975f12837edfb8f621014c0e9e" and "280400ceea950f1195675a5ad8b56f40511f7c54" have entirely different histories.
619ece9a13
...
280400ceea
18 changed files with 21 additions and 119 deletions
|
|
@ -3,10 +3,10 @@ package main.java.models.exceptions;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import lombok.experimental.SuperBuilder;
|
import lombok.Builder;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@SuperBuilder
|
@Builder
|
||||||
public class StandardError {
|
public class StandardError {
|
||||||
private LocalDateTime timestamp;
|
private LocalDateTime timestamp;
|
||||||
private Integer status;
|
private Integer status;
|
||||||
|
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
||||||
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,22 +1,13 @@
|
||||||
package main.java.models.requests;
|
package main.java.models.requests;
|
||||||
|
|
||||||
import java.util.Set;
|
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 main.java.models.enums.ProfileEnum;
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
|
||||||
|
|
||||||
import lombok.With;
|
import lombok.With;
|
||||||
|
|
||||||
@With
|
@With
|
||||||
public record CreateUserRequest(
|
public record CreateUserRequest(
|
||||||
@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,
|
String name,
|
||||||
|
String email,
|
||||||
@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,
|
String password,
|
||||||
|
Set<ProfileEnum> profiles) {
|
||||||
@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,11 +1,6 @@
|
||||||
main/java/models/exceptions/ResourceNotFoundException.class
|
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$StandardErrorBuilder.class
|
||||||
main/java/models/exceptions/StandardError$StandardErrorBuilderImpl.class
|
|
||||||
main/java/models/responses/UserResponse.class
|
main/java/models/responses/UserResponse.class
|
||||||
main/java/models/enums/ProfileEnum.class
|
main/java/models/enums/ProfileEnum.class
|
||||||
main/java/models/exceptions/StandardError.class
|
main/java/models/exceptions/StandardError.class
|
||||||
main/java/models/exceptions/ValidationException$ValidationExceptionBuilder.class
|
|
||||||
main/java/models/requests/CreateUserRequest.class
|
main/java/models/requests/CreateUserRequest.class
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
/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/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/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/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/requests/CreateUserRequest.java
|
||||||
/home/dev/projetos/Help Desk 2.0/hd-commons-lib/src/main/java/models/responses/UserResponse.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.ApiResponse;
|
||||||
import io.swagger.v3.oas.annotations.responses.ApiResponses;
|
import io.swagger.v3.oas.annotations.responses.ApiResponses;
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
import jakarta.validation.Valid;
|
|
||||||
import main.java.models.exceptions.StandardError;
|
import main.java.models.exceptions.StandardError;
|
||||||
import main.java.models.requests.CreateUserRequest;
|
import main.java.models.requests.CreateUserRequest;
|
||||||
import main.java.models.responses.UserResponse;
|
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)))
|
@ApiResponse(responseCode = "500", description = "Internal server error", content = @Content(mediaType = "application/json", schema = @Schema(implementation = StandardError.class)))
|
||||||
})
|
})
|
||||||
@PostMapping
|
@PostMapping
|
||||||
ResponseEntity<Void> save(@Valid @RequestBody final CreateUserRequest createUserRequest);
|
ResponseEntity<Void> save(@RequestBody final CreateUserRequest createUserRequest);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,71 +1,27 @@
|
||||||
package br.com.rayankonecny.userserviceapi.controller.exceptions;
|
package br.com.rayankonecny.userserviceapi.controller.exceptions;
|
||||||
|
|
||||||
import org.springframework.dao.DataIntegrityViolationException;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
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.ControllerAdvice;
|
||||||
import org.springframework.web.bind.annotation.ExceptionHandler;
|
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||||
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
import main.java.models.exceptions.ValidationException;
|
|
||||||
import main.java.models.exceptions.ResourceNotFoundException;
|
import main.java.models.exceptions.ResourceNotFoundException;
|
||||||
import main.java.models.exceptions.StandardError;
|
import main.java.models.exceptions.StandardError;
|
||||||
|
|
||||||
import static java.time.LocalDateTime.now;
|
import static java.time.LocalDateTime.now;
|
||||||
import static org.springframework.http.HttpStatus.BAD_REQUEST;
|
|
||||||
import static org.springframework.http.HttpStatus.NOT_FOUND;
|
import static org.springframework.http.HttpStatus.NOT_FOUND;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
@ControllerAdvice
|
@ControllerAdvice
|
||||||
public class ControllerExceptionHandler {
|
public class ControllerExceptionHandler {
|
||||||
|
|
||||||
@ExceptionHandler(ResourceNotFoundException.class)
|
@ExceptionHandler(ResourceNotFoundException.class)
|
||||||
ResponseEntity<StandardError> handleNotFoundException(final ResourceNotFoundException ex,
|
ResponseEntity<StandardError> handleNotFoundException(final ResourceNotFoundException ex, final HttpServletRequest request) {
|
||||||
final HttpServletRequest request) {
|
|
||||||
return ResponseEntity.status(NOT_FOUND).body(
|
return ResponseEntity.status(NOT_FOUND).body(
|
||||||
|
|
||||||
StandardError.builder()
|
StandardError.builder()
|
||||||
.timestamp(now())
|
.timestamp(now())
|
||||||
.status(NOT_FOUND.value())
|
.status(NOT_FOUND.value())
|
||||||
.error(NOT_FOUND.getReasonPhrase())
|
.error("Resource Not Found")
|
||||||
.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())
|
.message(ex.getMessage())
|
||||||
.path(request.getRequestURI())
|
.path(request.getRequestURI())
|
||||||
.build());
|
.build());
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,10 @@
|
||||||
package br.com.rayankonecny.userserviceapi.repository;
|
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.data.mongodb.repository.MongoRepository;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
import br.com.rayankonecny.userserviceapi.entity.User;
|
||||||
|
|
||||||
@Repository
|
@Repository
|
||||||
public interface UserRepository extends MongoRepository<User, String> {
|
public interface UserRepository extends MongoRepository<User, String> {
|
||||||
|
|
||||||
Optional<User> findByEmail(final String email);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package br.com.rayankonecny.userserviceapi.service;
|
package br.com.rayankonecny.userserviceapi.service;
|
||||||
|
|
||||||
import org.springframework.dao.DataIntegrityViolationException;
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import br.com.rayankonecny.userserviceapi.mapper.UserMapper;
|
import br.com.rayankonecny.userserviceapi.mapper.UserMapper;
|
||||||
|
|
@ -24,16 +23,7 @@ public class UserService {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void save(CreateUserRequest createUserRequest) {
|
public void save(CreateUserRequest createUserRequest) {
|
||||||
verifyIfEmailAlreadyEexists(createUserRequest.email(), null);
|
|
||||||
userRepository.save(userMapper.fromRequest(createUserRequest));
|
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