Files
no-copy/src/main/java/ru/soune/nocopy/handler/VerifyRegisterUserHandler.java
T

110 lines
4.3 KiB
Java
Raw Normal View History

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.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.EmailVerificationTokenRepository;
2026-01-20 15:12:24 +07:00
import ru.soune.nocopy.repository.UserRepository;
import ru.soune.nocopy.service.mail.EmailService;
2026-01-20 03:47:51 +07:00
import ru.soune.nocopy.service.user.UserService;
2026-05-29 18:17:04 +07:00
import ru.soune.nocopy.util.JwtUtil;
2026-01-20 03:47:51 +07:00
2026-01-23 16:09:51 +07:00
import java.io.IOException;
2026-01-20 03:47:51 +07:00
import java.util.Map;
@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;
2026-05-29 18:17:04 +07:00
private final JwtUtil jwtUtil;
2026-01-20 15:12:24 +07:00
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-01-20 15:12:24 +07:00
if (verifyUserRequest.getResend() != null && verifyUserRequest.getResend() == 1) {
2026-05-29 18:17:04 +07:00
return handleResend(request, user);
2026-01-20 03:47:51 +07:00
}
2026-05-29 18:17:04 +07:00
String authToken = jwtUtil.generateToken(user.getId(), user.getEmail());
2026-01-20 15:12:24 +07:00
return handleVerify(request, user, authToken, verifyUserRequest.getVerifyToken());
}
2026-01-20 03:47:51 +07:00
2026-05-29 18:17:04 +07:00
private BaseResponse handleResend(BaseRequest request, User user) throws MessagingException, IOException {
2026-01-20 15:12:24 +07:00
EmailVerificationToken token = emailVerificationTokenRepository.findByUserId(user.getId());
if (token != null) {
emailVerificationTokenRepository.delete(token);
}
2026-05-29 18:17:04 +07:00
EmailVerificationToken newToken = emailService.createEmailVerificationToken(user);
2026-01-20 15:12:24 +07:00
emailService.sendVerificationEmail(user, newToken.getToken());
log.info("New verification token generated for user {}", user.getEmail());
2026-05-29 18:17:04 +07:00
String authToken = jwtUtil.generateToken(user.getId(), user.getEmail());
2026-01-20 15:12:24 +07:00
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
}
2026-05-29 18:17:04 +07:00
private BaseResponse handleVerify(BaseRequest request, User user, String authToken, String providedToken) {
2026-01-20 15:12:24 +07:00
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
}
2026-05-29 18:17:04 +07:00
private BaseResponse successResponse(BaseRequest request, String 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();
2026-05-29 18:17:04 +07:00
regAnswer.setToken(authToken);
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
}
}