Compare commits

..

No commits in common. "619ece9a137146975f12837edfb8f621014c0e9e" and "280400ceea950f1195675a5ad8b56f40511f7c54" have entirely different histories.

18 changed files with 21 additions and 119 deletions

View file

@ -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;

View file

@ -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));
}
}

View file

@ -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) {
} }

View file

@ -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

View file

@ -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

View file

@ -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);
} }

View file

@ -1,73 +1,29 @@
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()) .message(ex.getMessage())
.path(request.getRequestURI()) .path(request.getRequestURI())
.build()); .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());
}
} }

View file

@ -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);
} }

View file

@ -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");
});
}
} }