diff --git a/class.png b/class.png index c1df006..05af90d 100644 --- a/class.png +++ b/class.png Binary files differ diff --git a/class.pu b/class.pu index f8e5a03..672326e 100644 --- a/class.pu +++ b/class.pu @@ -41,6 +41,17 @@ - active : boolean } +class UniqueLoginValidator <> { + - userRepository : SiteUserRepository + + isValid(String, ConstraintValidatorContext) : boolean +} + +class UniqueLogin <> { + message() : String + groups() : Class[] + payload() : Class[] +} + interface SiteUserRepository <> { findByUsername(String) existsByUsername(String) @@ -48,6 +59,8 @@ SecurityConfig *-- UserDetailsServiceImpl UserDetailsServiceImpl *-- SiteUserRepository SecurityController *-- SiteUserRepository +UniqueLoginValidator *-- SiteUserRepository +UniqueLogin .. UniqueLoginValidator SiteUserRepository <|-- SiteUser class City <> { diff --git a/src/main/java/osm/surveyor/task/user/model/SiteUser.java b/src/main/java/osm/surveyor/task/user/model/SiteUser.java index 513cb2c..f7b0905 100644 --- a/src/main/java/osm/surveyor/task/user/model/SiteUser.java +++ b/src/main/java/osm/surveyor/task/user/model/SiteUser.java @@ -10,6 +10,7 @@ import lombok.Getter; import lombok.Setter; +import osm.surveyor.task.user.validator.UniqueLogin; @Getter @Setter @@ -20,6 +21,7 @@ private Long id; @Size(min = 2, max = 20) + @UniqueLogin private String username; @Size(min = 4, max = 255) diff --git a/src/main/java/osm/surveyor/task/user/validator/UniqueLogin.java b/src/main/java/osm/surveyor/task/user/validator/UniqueLogin.java new file mode 100644 index 0000000..3c05159 --- /dev/null +++ b/src/main/java/osm/surveyor/task/user/validator/UniqueLogin.java @@ -0,0 +1,18 @@ +package osm.surveyor.task.user.validator; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import javax.validation.Constraint; +import javax.validation.Payload; + +@Target({ElementType.METHOD, ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Constraint(validatedBy = UniqueLoginValidator.class) +public @interface UniqueLogin { + String message() default "このユーザ名は既に登録されています"; + Class[] groups() default{}; + Class[] payload() default{}; +} diff --git a/src/main/java/osm/surveyor/task/user/validator/UniqueLoginValidator.java b/src/main/java/osm/surveyor/task/user/validator/UniqueLoginValidator.java new file mode 100644 index 0000000..4cf6aa5 --- /dev/null +++ b/src/main/java/osm/surveyor/task/user/validator/UniqueLoginValidator.java @@ -0,0 +1,27 @@ +package osm.surveyor.task.user.validator; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +import org.springframework.beans.factory.annotation.Autowired; + +import osm.surveyor.task.user.repository.SiteUserRepository; + +public class UniqueLoginValidator implements ConstraintValidator { + + private final SiteUserRepository userRepository; + + public UniqueLoginValidator() { + this.userRepository = null; + } + + @Autowired + public UniqueLoginValidator(SiteUserRepository userRepository) { + this.userRepository = userRepository; + } + + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + return userRepository == null || userRepository.findByUsername(value) == null; + } +}