48. User registration - Implementation (#4)
This commit is contained in:
@ -9,6 +9,10 @@ public interface UserRepository extends JpaRepository<User, Long> {
|
|||||||
|
|
||||||
Optional<User> findByUsername(String username);
|
Optional<User> findByUsername(String username);
|
||||||
|
|
||||||
Optional<User> findAllByEmail(String email);
|
Optional<User> findByEmail(String email);
|
||||||
|
|
||||||
|
Boolean existsByUsername(String username);
|
||||||
|
|
||||||
|
Boolean existsByEmail(String email);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,21 +1,35 @@
|
|||||||
package net.shyshkin.study.fullstack.supportportal.backend.service;
|
package net.shyshkin.study.fullstack.supportportal.backend.service;
|
||||||
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import net.shyshkin.study.fullstack.supportportal.backend.domain.Role;
|
||||||
import net.shyshkin.study.fullstack.supportportal.backend.domain.User;
|
import net.shyshkin.study.fullstack.supportportal.backend.domain.User;
|
||||||
import net.shyshkin.study.fullstack.supportportal.backend.domain.UserPrincipal;
|
import net.shyshkin.study.fullstack.supportportal.backend.domain.UserPrincipal;
|
||||||
|
import net.shyshkin.study.fullstack.supportportal.backend.exception.domain.EmailExistsException;
|
||||||
|
import net.shyshkin.study.fullstack.supportportal.backend.exception.domain.EmailNotFoundException;
|
||||||
|
import net.shyshkin.study.fullstack.supportportal.backend.exception.domain.UserNotFoundException;
|
||||||
|
import net.shyshkin.study.fullstack.supportportal.backend.exception.domain.UsernameExistsException;
|
||||||
import net.shyshkin.study.fullstack.supportportal.backend.repository.UserRepository;
|
import net.shyshkin.study.fullstack.supportportal.backend.repository.UserRepository;
|
||||||
|
import org.apache.commons.lang3.RandomStringUtils;
|
||||||
import org.springframework.security.core.userdetails.UserDetails;
|
import org.springframework.security.core.userdetails.UserDetails;
|
||||||
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
||||||
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
|
||||||
|
|
||||||
import javax.transaction.Transactional;
|
import javax.transaction.Transactional;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
@Service
|
@Service
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class UserServiceImpl implements UserService {
|
public class UserServiceImpl implements UserService {
|
||||||
|
|
||||||
private final UserRepository userRepository;
|
private final UserRepository userRepository;
|
||||||
|
private final PasswordEncoder passwordEncoder;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
@ -27,4 +41,97 @@ public class UserServiceImpl implements UserService {
|
|||||||
user.setLastLoginDate(LocalDateTime.now());
|
user.setLastLoginDate(LocalDateTime.now());
|
||||||
return new UserPrincipal(user);
|
return new UserPrincipal(user);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public User register(String firstName, String lastName, String username, String email) {
|
||||||
|
|
||||||
|
validateNewUsernameAndEmail(username, email);
|
||||||
|
|
||||||
|
Role defaultRole = Role.ROLE_USER;
|
||||||
|
|
||||||
|
String rawPassword = generatePassword();
|
||||||
|
String encodedPassword = passwordEncoder.encode(rawPassword);
|
||||||
|
log.debug("Raw password: {}. Encoded password: {}", rawPassword, encodedPassword);
|
||||||
|
|
||||||
|
User newUser = User.builder()
|
||||||
|
.email(email)
|
||||||
|
.firstName(firstName)
|
||||||
|
.lastName(lastName)
|
||||||
|
.username(username)
|
||||||
|
.password(encodedPassword)
|
||||||
|
.userId(generateUserId())
|
||||||
|
.isActive(true)
|
||||||
|
.isNotLocked(true)
|
||||||
|
.joinDate(LocalDateTime.now())
|
||||||
|
.profileImageUrl(getTemporaryProfileImageUrl())
|
||||||
|
.lastLoginDate(null)
|
||||||
|
.lastLoginDateDisplay(null)
|
||||||
|
.role(defaultRole.name())
|
||||||
|
.authorities(defaultRole.getAuthorities())
|
||||||
|
.build();
|
||||||
|
return userRepository.save(newUser);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getTemporaryProfileImageUrl() {
|
||||||
|
return ServletUriComponentsBuilder.fromCurrentContextPath().path("/user/image/profile/temp").build().toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String generatePassword() {
|
||||||
|
return RandomStringUtils.randomAscii(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String generateUserId() {
|
||||||
|
return UUID.randomUUID().toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<User> findAll() {
|
||||||
|
return userRepository.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public User findByUsername(String username) {
|
||||||
|
return userRepository
|
||||||
|
.findByUsername(username)
|
||||||
|
.orElseThrow(() -> new UserNotFoundException("User with username `" + username + "` not found"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public User findByEmail(String email) {
|
||||||
|
return userRepository
|
||||||
|
.findByEmail(email)
|
||||||
|
.orElseThrow(() -> new EmailNotFoundException("User with email `" + email + "` not found"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validateNewUsernameAndEmail(String username, String email) {
|
||||||
|
|
||||||
|
if (userRepository.existsByUsername(username))
|
||||||
|
throwUsernameExistsException(username);
|
||||||
|
|
||||||
|
if (userRepository.existsByEmail(email))
|
||||||
|
throwEmailExistsException(email);
|
||||||
|
}
|
||||||
|
|
||||||
|
private User validateUpdateUsernameAndEmail(String currentUsername, String username, String email) {
|
||||||
|
|
||||||
|
Objects.requireNonNull(currentUsername);
|
||||||
|
|
||||||
|
User currentUser = findByUsername(currentUsername);
|
||||||
|
|
||||||
|
if (!Objects.equals(currentUsername, username) && userRepository.existsByUsername(username))
|
||||||
|
throwUsernameExistsException(username);
|
||||||
|
|
||||||
|
if (!Objects.equals(currentUser.getEmail(), email) && userRepository.existsByEmail(email))
|
||||||
|
throwEmailExistsException(email);
|
||||||
|
|
||||||
|
return currentUser;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void throwEmailExistsException(String email) {
|
||||||
|
throw new EmailExistsException("User with email `" + email + "` is already registered");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void throwUsernameExistsException(String username) {
|
||||||
|
throw new UsernameExistsException("Username `" + username + "` is already taken. Please select another one");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user