package ru.soune.nocopy.handler; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import ru.soune.nocopy.dto.*; import ru.soune.nocopy.entity.AuthToken; import ru.soune.nocopy.entity.User; import ru.soune.nocopy.exception.NotValidFieldException; import ru.soune.nocopy.repository.AuthTokenRepository; import ru.soune.nocopy.repository.UserRepository; import ru.soune.nocopy.service.auth.AuthService; import java.util.Objects; import java.util.Optional; @Component @RequiredArgsConstructor public class LogoutRequestHandler implements RequestHandler { private final AuthService authService; private final AuthTokenRepository authTokenRepository; private final ObjectMapper objectMapper; private final UserRepository userRepository; @Override public BaseResponse handle(BaseRequest request) { LogoutRequest logoutRequest = objectMapper.convertValue(request.getMessageBody(), LogoutRequest.class); Optional opToken = authTokenRepository.findByToken(logoutRequest.getToken()); Optional user = userRepository.findByEmail(logoutRequest.getEmail()); if (opToken.isEmpty() || user.isEmpty()) { throw new NotValidFieldException("User with email or token not found", new BaseResponse(request.getMsgId(), MessageCode.AUTH_EMAIL_OR_TOKEN_NOT_FOUND.getCode(), MessageCode.AUTH_EMAIL_OR_TOKEN_NOT_FOUND.getDescription(), new LogoutRequest(logoutRequest.getEmail(), logoutRequest.getToken()))); } if (!Objects.equals(opToken.get().getUser().getId(), user.get().getId())) { throw new NotValidFieldException("User token mismatch with user", new BaseResponse(request.getMsgId(), MessageCode.AUTH_TOKEN_MISMATCH.getCode(), MessageCode.AUTH_TOKEN_MISMATCH.getDescription(), new LogoutRequest(logoutRequest.getEmail(), logoutRequest.getToken()))); } authService.logout(logoutRequest.getToken()); return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), MessageCode.SUCCESS.getDescription(), new LogOutAnswer(logoutRequest.getEmail())); } }