fix: Request validation in UserService
This commit is contained in:
parent
1eee6b1b48
commit
7e38b5a2e0
9 changed files with 126 additions and 26 deletions
|
@ -4,8 +4,8 @@ import eu.ztsh.wymiana.data.repository.UserRepository;
|
|||
import eu.ztsh.wymiana.exception.UserAlreadyExistsException;
|
||||
import eu.ztsh.wymiana.model.User;
|
||||
import eu.ztsh.wymiana.util.UserMapper;
|
||||
import eu.ztsh.wymiana.validation.InstanceValidator;
|
||||
import eu.ztsh.wymiana.web.model.UserCreateRequest;
|
||||
import jakarta.validation.Valid;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
|
@ -16,8 +16,10 @@ import java.util.Optional;
|
|||
public class UserService {
|
||||
|
||||
private final UserRepository userRepository;
|
||||
private final InstanceValidator validator;
|
||||
|
||||
public User create(@Valid UserCreateRequest request) {
|
||||
public User create(UserCreateRequest request) {
|
||||
validator.validate(request);
|
||||
if (userRepository.findById(request.pesel()).isPresent()) {
|
||||
throw new UserAlreadyExistsException(request);
|
||||
}
|
||||
|
|
|
@ -16,9 +16,12 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
|
|||
@Constraint(validatedBy = AdultValidator.class)
|
||||
@Documented
|
||||
public @interface Adult {
|
||||
String message() default "{jakarta.validation.constraints.Adult.message}";
|
||||
String message() default MESSAGE;
|
||||
|
||||
Class<?>[] groups() default { };
|
||||
|
||||
Class<? extends Payload>[] payload() default { };
|
||||
|
||||
String MESSAGE = "The person has not reached the age of 18";
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
package eu.ztsh.wymiana.validation;
|
||||
|
||||
import jakarta.validation.Validator;
|
||||
|
||||
public class InstanceValidator {
|
||||
|
||||
private final Validator validator;
|
||||
|
||||
public InstanceValidator(Validator validator) {
|
||||
this.validator = validator;
|
||||
}
|
||||
|
||||
public <T> void validate(T t, Class<?>... classes) {
|
||||
var violations = validator.validate(t, classes);
|
||||
if (!violations.isEmpty()) {
|
||||
throw new ValidationFailedException(violations);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
package eu.ztsh.wymiana.validation;
|
||||
|
||||
import jakarta.validation.Validation;
|
||||
import jakarta.validation.ValidatorFactory;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@Configuration
|
||||
public class InstanceValidatorFactory {
|
||||
|
||||
@Bean
|
||||
public InstanceValidator instanceValidator() {
|
||||
try (ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) {
|
||||
return new InstanceValidator(factory.getValidator());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
package eu.ztsh.wymiana.validation;
|
||||
|
||||
import jakarta.validation.ConstraintViolation;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Getter
|
||||
public class ValidationFailedException extends RuntimeException {
|
||||
|
||||
private final transient Set<?> violations;
|
||||
|
||||
public <T> ValidationFailedException(Set<ConstraintViolation<T>> violations) {
|
||||
super("Validation failed: %s".formatted(violations.stream()
|
||||
.map(ConstraintViolation::getMessage).collect(Collectors.joining(System.lineSeparator()))));
|
||||
this.violations = violations;
|
||||
}
|
||||
|
||||
}
|
|
@ -3,7 +3,9 @@ package eu.ztsh.wymiana.web.model;
|
|||
import eu.ztsh.wymiana.validation.Adult;
|
||||
import jakarta.validation.constraints.Min;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Builder;
|
||||
|
||||
@Builder
|
||||
public record UserCreateRequest(
|
||||
@NotNull String name,
|
||||
@NotNull String surname,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue