2026-01-20 03:47:51 +07:00
|
|
|
package ru.soune.nocopy.handler;
|
|
|
|
|
|
|
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
2026-01-23 16:09:51 +07:00
|
|
|
import jakarta.mail.MessagingException;
|
2026-01-20 03:47:51 +07:00
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
import ru.soune.nocopy.dto.BaseRequest;
|
|
|
|
|
import ru.soune.nocopy.dto.BaseResponse;
|
|
|
|
|
import ru.soune.nocopy.dto.MessageCode;
|
|
|
|
|
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;
|
2026-01-20 15:12:24 +07:00
|
|
|
import ru.soune.nocopy.entity.user.User;
|
2026-01-20 03:47:51 +07:00
|
|
|
import ru.soune.nocopy.exception.NotValidFieldException;
|
2026-01-20 15:12:24 +07:00
|
|
|
import ru.soune.nocopy.exception.UserNotFoundException;
|
2026-01-20 03:47:51 +07:00
|
|
|
import ru.soune.nocopy.repository.AuthTokenRepository;
|
|
|
|
|
import ru.soune.nocopy.repository.EmailVerificationTokenRepository;
|
2026-01-20 15:12:24 +07:00
|
|
|
import ru.soune.nocopy.repository.UserRepository;
|
|
|
|
|
import ru.soune.nocopy.service.mail.EmailService;
|
|
|
|
|
import ru.soune.nocopy.service.register.AuthService;
|
2026-01-20 03:47:51 +07:00
|
|
|
import ru.soune.nocopy.service.user.UserService;
|
|
|
|
|
|
2026-01-23 16:09:51 +07:00
|
|
|
import java.io.IOException;
|
2026-02-17 20:17:34 +07:00
|
|
|
import java.util.List;
|
2026-01-20 03:47:51 +07:00
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.Optional;
|
|
|
|
|
|
|
|
|
|
@Component
|
|
|
|
|
@Slf4j
|
|
|
|
|
@RequiredArgsConstructor
|
2026-01-20 15:12:24 +07:00
|
|
|
public class VerifyRegisterUserHandler implements RequestHandler {
|
2026-01-20 03:47:51 +07:00
|
|
|
private final ObjectMapper objectMapper;
|
|
|
|
|
|
|
|
|
|
private final EmailVerificationTokenRepository emailVerificationTokenRepository;
|
|
|
|
|
|
2026-01-20 15:12:24 +07:00
|
|
|
private final EmailService emailService;
|
|
|
|
|
|
|
|
|
|
private final UserRepository userRepository;
|
|
|
|
|
|
2026-01-20 03:47:51 +07:00
|
|
|
private final UserService userService;
|
|
|
|
|
|
|
|
|
|
private final AuthTokenRepository authTokenRepository;
|
|
|
|
|
|
2026-01-20 15:12:24 +07:00
|
|
|
private final AuthService authService;
|
|
|
|
|
|
2026-01-20 03:47:51 +07:00
|
|
|
@Override
|
2026-01-23 16:09:51 +07:00
|
|
|
public BaseResponse handle(BaseRequest request) throws MessagingException, IOException {
|
2026-01-20 15:12:24 +07:00
|
|
|
VerifyUserRequest verifyUserRequest = objectMapper.convertValue(request.getMessageBody(), VerifyUserRequest.class);
|
2026-01-20 03:47:51 +07:00
|
|
|
|
|
|
|
|
Long userId = verifyUserRequest.getUserId();
|
|
|
|
|
|
2026-01-20 15:12:24 +07:00
|
|
|
User user = userRepository.findById(userId)
|
|
|
|
|
.orElseThrow(() -> new UserNotFoundException("User not found with id: " + userId));
|
2026-01-20 03:47:51 +07:00
|
|
|
|
2026-02-17 20:17:34 +07:00
|
|
|
List<AuthToken> userAuthTokens = authTokenRepository.findByUserId(userId);
|
2026-01-20 15:12:24 +07:00
|
|
|
|
2026-02-17 20:17:34 +07:00
|
|
|
AuthToken authToken = userAuthTokens.isEmpty() ? authService.generateAuthToken(user): userAuthTokens.getFirst();
|
2026-01-20 15:12:24 +07:00
|
|
|
|
|
|
|
|
if (verifyUserRequest.getResend() != null && verifyUserRequest.getResend() == 1) {
|
|
|
|
|
return handleResend(request, user, authToken);
|
2026-01-20 03:47:51 +07:00
|
|
|
}
|
|
|
|
|
|
2026-01-20 15:12:24 +07:00
|
|
|
return handleVerify(request, user, authToken, verifyUserRequest.getVerifyToken());
|
|
|
|
|
}
|
2026-01-20 03:47:51 +07:00
|
|
|
|
2026-01-23 16:09:51 +07:00
|
|
|
private BaseResponse handleResend(BaseRequest request, User user, AuthToken authToken) throws MessagingException, IOException {
|
2026-01-20 15:12:24 +07:00
|
|
|
|
|
|
|
|
EmailVerificationToken token = emailVerificationTokenRepository.findByUserId(user.getId());
|
|
|
|
|
|
2026-02-25 11:31:08 +07:00
|
|
|
// 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, user.getEmail());
|
|
|
|
|
// }
|
2026-01-20 15:12:24 +07:00
|
|
|
|
|
|
|
|
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",
|
2026-01-23 16:09:51 +07:00
|
|
|
false, false, user.getEmail());
|
2026-01-20 15:12:24 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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());
|
2026-01-23 16:09:51 +07:00
|
|
|
|
2026-01-20 15:12:24 +07:00
|
|
|
emailVerificationTokenRepository.delete(token);
|
|
|
|
|
|
|
|
|
|
return successResponse(request, authToken, MessageCode.SUCCESS.getDescription(), updateUser.isActive(),
|
2026-01-23 16:09:51 +07:00
|
|
|
updateUser.isEmailVerified(), updateUser.getEmail());
|
2026-01-20 15:12:24 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private BaseResponse successResponse(BaseRequest request, AuthToken authToken, String message, boolean isActive,
|
2026-01-23 16:09:51 +07:00
|
|
|
boolean isVerified, String email) {
|
2026-01-20 03:47:51 +07:00
|
|
|
RegAnswer regAnswer = new RegAnswer();
|
|
|
|
|
regAnswer.setToken(authToken.getToken());
|
2026-01-20 15:12:24 +07:00
|
|
|
regAnswer.setVerified(isVerified);
|
|
|
|
|
regAnswer.setActive(isActive);
|
2026-01-23 16:09:51 +07:00
|
|
|
regAnswer.setEmail(email);
|
2026-01-20 03:47:51 +07:00
|
|
|
|
2026-01-20 15:12:24 +07:00
|
|
|
return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), message, regAnswer);
|
2026-01-20 03:47:51 +07:00
|
|
|
}
|
|
|
|
|
}
|