This commit is contained in:
@@ -7,12 +7,14 @@ import ru.soune.nocopy.dto.*;
|
||||
import ru.soune.nocopy.dto.register.LoginAnswer;
|
||||
import ru.soune.nocopy.dto.register.LoginRequest;
|
||||
import ru.soune.nocopy.entity.user.AuthToken;
|
||||
import ru.soune.nocopy.entity.user.User;
|
||||
import ru.soune.nocopy.exception.NotValidFieldException;
|
||||
import ru.soune.nocopy.repository.UserRepository;
|
||||
import ru.soune.nocopy.service.register.AuthService;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
@@ -25,8 +27,9 @@ public class LoginRequestHandler implements RequestHandler {
|
||||
@Override
|
||||
public BaseResponse handle(BaseRequest request) {
|
||||
LoginRequest loginRequest = objectMapper.convertValue(request.getMessageBody(), LoginRequest.class);
|
||||
User user = userRepository.findByEmail(loginRequest.getEmail());
|
||||
|
||||
if (!userRepository.existsByEmail(loginRequest.getEmail())) {
|
||||
if (user != null) {
|
||||
LoginAnswer loginAnswer = new LoginAnswer();
|
||||
loginAnswer.setFieldErrors(Arrays.asList(Map.of("email", loginRequest.getEmail())));
|
||||
|
||||
@@ -35,6 +38,17 @@ public class LoginRequestHandler implements RequestHandler {
|
||||
MessageCode.AUTH_EMAIL_NOT_FOUND.getDescription(), loginAnswer));
|
||||
}
|
||||
|
||||
if (!user.isActive() && !user.isEmailVerified()) {
|
||||
LoginAnswer loginAnswer = new LoginAnswer();
|
||||
|
||||
loginAnswer.setFieldErrors(Arrays.asList(Map.of(
|
||||
"verified", String.valueOf(user.isEmailVerified()),
|
||||
"isActive", String.valueOf(user.isActive()))));
|
||||
|
||||
return new BaseResponse(request.getMsgId(), MessageCode.USER_NOT_VERIFIED.getCode(),
|
||||
MessageCode.USER_NOT_VERIFIED.getDescription(), loginAnswer);
|
||||
}
|
||||
|
||||
AuthToken authToken = authService.login(loginRequest);
|
||||
|
||||
LoginAnswer loginAnswer = new LoginAnswer();
|
||||
|
||||
@@ -65,6 +65,8 @@ public class RegRequestHandler implements RequestHandler {
|
||||
|
||||
RegAnswer regAnswer = new RegAnswer();
|
||||
regAnswer.setToken(authToken.getToken());
|
||||
regAnswer.setVerified(false);
|
||||
regAnswer.setActive(false);
|
||||
|
||||
return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(),
|
||||
MessageCode.SUCCESS.getDescription(), regAnswer);
|
||||
|
||||
@@ -11,10 +11,14 @@ import ru.soune.nocopy.dto.register.RegAnswer;
|
||||
import ru.soune.nocopy.dto.register.VerifyUserRequest;
|
||||
import ru.soune.nocopy.entity.user.AuthToken;
|
||||
import ru.soune.nocopy.entity.user.EmailVerificationToken;
|
||||
import ru.soune.nocopy.entity.user.User;
|
||||
import ru.soune.nocopy.exception.NotValidFieldException;
|
||||
import ru.soune.nocopy.exception.TokenNotFoundException;
|
||||
import ru.soune.nocopy.exception.UserNotFoundException;
|
||||
import ru.soune.nocopy.repository.AuthTokenRepository;
|
||||
import ru.soune.nocopy.repository.EmailVerificationTokenRepository;
|
||||
import ru.soune.nocopy.repository.UserRepository;
|
||||
import ru.soune.nocopy.service.mail.EmailService;
|
||||
import ru.soune.nocopy.service.register.AuthService;
|
||||
import ru.soune.nocopy.service.user.UserService;
|
||||
|
||||
import java.util.Map;
|
||||
@@ -23,46 +27,92 @@ import java.util.Optional;
|
||||
@Component
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
public class VerifyRegisterUserHandler implements RequestHandler{
|
||||
|
||||
public class VerifyRegisterUserHandler implements RequestHandler {
|
||||
private final ObjectMapper objectMapper;
|
||||
|
||||
private final EmailVerificationTokenRepository emailVerificationTokenRepository;
|
||||
|
||||
private final EmailService emailService;
|
||||
|
||||
private final UserRepository userRepository;
|
||||
|
||||
private final UserService userService;
|
||||
|
||||
private final AuthTokenRepository authTokenRepository;
|
||||
|
||||
private final AuthService authService;
|
||||
|
||||
@Override
|
||||
public BaseResponse handle(BaseRequest request) {
|
||||
VerifyUserRequest verifyUserRequest = objectMapper.convertValue(request.getMessageBody(),
|
||||
VerifyUserRequest.class);
|
||||
VerifyUserRequest verifyUserRequest = objectMapper.convertValue(request.getMessageBody(), VerifyUserRequest.class);
|
||||
|
||||
String verifyToken = verifyUserRequest.getVerifyToken();
|
||||
Long userId = verifyUserRequest.getUserId();
|
||||
|
||||
EmailVerificationToken emailVerificationToken =
|
||||
emailVerificationTokenRepository.findByUserIdAndToken(userId, verifyToken);
|
||||
User user = userRepository.findById(userId)
|
||||
.orElseThrow(() -> new UserNotFoundException("User not found with id: " + userId));
|
||||
|
||||
if (emailVerificationToken == null) {
|
||||
throw new NotValidFieldException("Token was incorrected:" + verifyToken,
|
||||
new BaseResponse(request.getMsgId(), MessageCode.INVALID_TOKEN.getCode(),
|
||||
MessageCode.INVALID_TOKEN.getDescription(), Map.of(
|
||||
"userId", userId,
|
||||
"token", verifyToken)));
|
||||
Optional<AuthToken> userAuthTokens = authTokenRepository.findByUserIdAndIsActive(userId, false);
|
||||
|
||||
AuthToken authToken = userAuthTokens.isEmpty() ? authService.generateAuthToken(user): userAuthTokens.get();
|
||||
|
||||
if (verifyUserRequest.getResend() != null && verifyUserRequest.getResend() == 1) {
|
||||
return handleResend(request, user, authToken);
|
||||
}
|
||||
|
||||
userService.activateAndVerifyUser(userId);
|
||||
emailVerificationTokenRepository.delete(emailVerificationToken);
|
||||
return handleVerify(request, user, authToken, verifyUserRequest.getVerifyToken());
|
||||
}
|
||||
|
||||
Optional<AuthToken> byUserIdAndIsActive = authTokenRepository.findByUserIdAndIsActive(userId, true);
|
||||
AuthToken authToken = byUserIdAndIsActive.orElseThrow(() ->
|
||||
new TokenNotFoundException("Token not found with user id: " + userId));
|
||||
private BaseResponse handleResend(BaseRequest request, User user, AuthToken authToken) {
|
||||
|
||||
EmailVerificationToken token = emailVerificationTokenRepository.findByUserId(user.getId());
|
||||
|
||||
if (token != null && !token.isExpired()) {
|
||||
emailService.sendVerificationEmail(user, token.getToken());
|
||||
|
||||
log.info("Verification token resent for user {}", user.getEmail());
|
||||
return successResponse(request, authToken, "Verification code has been resent", false, false);
|
||||
}
|
||||
|
||||
if (token != null) {
|
||||
emailVerificationTokenRepository.delete(token);
|
||||
}
|
||||
|
||||
EmailVerificationToken newToken = emailService.createEmailVerificationToken(authToken);
|
||||
|
||||
emailService.sendVerificationEmail(user, newToken.getToken());
|
||||
|
||||
log.info("New verification token generated for user {}", user.getEmail());
|
||||
|
||||
return successResponse(request, authToken, "New verification code has been sent",
|
||||
false, false);
|
||||
}
|
||||
|
||||
|
||||
private BaseResponse handleVerify(BaseRequest request, User user, AuthToken authToken, String providedToken) {
|
||||
|
||||
EmailVerificationToken token = emailVerificationTokenRepository.findByUserIdAndToken(user.getId(), providedToken);
|
||||
|
||||
if (token == null || token.isExpired()) {
|
||||
throw new NotValidFieldException("Invalid or expired token",
|
||||
new BaseResponse(request.getMsgId(), MessageCode.INVALID_TOKEN.getCode(),
|
||||
MessageCode.INVALID_TOKEN.getDescription(), Map.of("userId", user.getId())));
|
||||
}
|
||||
|
||||
User updateUser = userService.activateAndVerifyUser(user.getId());
|
||||
emailVerificationTokenRepository.delete(token);
|
||||
|
||||
return successResponse(request, authToken, MessageCode.SUCCESS.getDescription(), updateUser.isActive(),
|
||||
updateUser.isEmailVerified());
|
||||
}
|
||||
|
||||
private BaseResponse successResponse(BaseRequest request, AuthToken authToken, String message, boolean isActive,
|
||||
boolean isVerified) {
|
||||
|
||||
RegAnswer regAnswer = new RegAnswer();
|
||||
regAnswer.setToken(authToken.getToken());
|
||||
regAnswer.setVerified(isVerified);
|
||||
regAnswer.setActive(isActive);
|
||||
|
||||
return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(),
|
||||
MessageCode.SUCCESS.getDescription(), regAnswer);
|
||||
return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), message, regAnswer);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user