MongoRefreshTokenService.java
package com.wilzwert.myjobs.infrastructure.persistence.mongo.service;
import com.wilzwert.myjobs.core.domain.model.user.User;
import com.wilzwert.myjobs.infrastructure.security.configuration.JwtProperties;
import com.wilzwert.myjobs.infrastructure.security.model.RefreshToken;
import com.wilzwert.myjobs.infrastructure.persistence.mongo.entity.MongoRefreshToken;
import com.wilzwert.myjobs.infrastructure.security.repository.RefreshTokenRepository;
import com.wilzwert.myjobs.infrastructure.security.service.JwtService;
import com.wilzwert.myjobs.infrastructure.security.service.RefreshTokenService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.time.Instant;
import java.util.Optional;
import java.util.UUID;
/**
* This service handles Refresh Tokens creation, retrieval and verifying
* @author Wilhelm Zwertvaegher
*/
@Service
@Slf4j
public class MongoRefreshTokenService implements RefreshTokenService {
private final JwtService jwtService;
private final RefreshTokenRepository refreshTokenRepository;
private final JwtProperties jwtProperties;
public MongoRefreshTokenService(final RefreshTokenRepository mongoRefreshTokenRepository, final JwtService jwtService, final JwtProperties jwtProperties) {
this.refreshTokenRepository = mongoRefreshTokenRepository;
this.jwtService = jwtService;
this.jwtProperties = jwtProperties;
}
@Override
public Optional<RefreshToken> findByToken(final String token) {
return refreshTokenRepository.findByToken(token);
}
@Override
public RefreshToken createRefreshToken(User user) {
MongoRefreshToken refreshToken = new MongoRefreshToken().setId(UUID.randomUUID()).setUserId(user.getId().value()).setToken(jwtService.generateToken(UUID.randomUUID().toString()));
refreshToken.setExpiresAt(Instant.now().plusMillis(jwtProperties.getRefreshExpirationTime()*1000));
return refreshTokenRepository.save(refreshToken);
}
@Override
public boolean verifyExpiration(RefreshToken refreshToken) {
if (refreshToken.getExpiresAt().compareTo(Instant.now()) < 0) {
refreshTokenRepository.delete(refreshToken);
return false;
}
return true;
}
@Override
public void deleteRefreshToken(RefreshToken refreshToken) {
refreshTokenRepository.delete(refreshToken);
}
}