49 lines
1.9 KiB
Kotlin
49 lines
1.9 KiB
Kotlin
package net.halfbinary.scavengerhuntapi.service
|
|
|
|
import net.halfbinary.scavengerhuntapi.config.JwtUtil
|
|
import net.halfbinary.scavengerhuntapi.error.exception.ExpiredRefreshTokenException
|
|
import net.halfbinary.scavengerhuntapi.error.exception.InvalidRefreshTokenException
|
|
import net.halfbinary.scavengerhuntapi.model.RefreshId
|
|
import net.halfbinary.scavengerhuntapi.model.record.RefreshTokenRecord
|
|
import net.halfbinary.scavengerhuntapi.repository.RefreshTokenRepository
|
|
import org.slf4j.LoggerFactory
|
|
import org.springframework.data.repository.findByIdOrNull
|
|
import org.springframework.stereotype.Service
|
|
import java.time.LocalDateTime
|
|
import java.time.temporal.ChronoUnit
|
|
|
|
@Service
|
|
class RefreshTokenService(private val refreshTokenRepository: RefreshTokenRepository, private val jwtUtil: JwtUtil) {
|
|
|
|
companion object {
|
|
private val log = LoggerFactory.getLogger(RefreshTokenService::class.java)
|
|
}
|
|
|
|
fun getAccessToken(tokenId: RefreshId): String {
|
|
return getToken(tokenId)?.let { refreshToken ->
|
|
if (isTokenExpired(refreshToken)) {
|
|
removeToken(tokenId)
|
|
throw ExpiredRefreshTokenException(tokenId)
|
|
} else {
|
|
jwtUtil.generateToken(refreshToken.email)
|
|
}
|
|
}?: throw InvalidRefreshTokenException(tokenId)
|
|
}
|
|
|
|
fun generateRefreshToken(email: String): RefreshId {
|
|
return refreshTokenRepository.save(RefreshTokenRecord(RefreshId.randomUUID(), email, LocalDateTime.now().plus(1, ChronoUnit.MONTHS))).token
|
|
}
|
|
|
|
fun isTokenExpired(token: RefreshTokenRecord): Boolean {
|
|
return token.expiryDateTime.isBefore(LocalDateTime.now())
|
|
}
|
|
|
|
fun getToken(token: RefreshId): RefreshTokenRecord? {
|
|
return refreshTokenRepository.findByIdOrNull(token)
|
|
}
|
|
|
|
fun removeToken(token: RefreshId) {
|
|
log.debug("Removing refresh token: $token")
|
|
refreshTokenRepository.deleteById(token)
|
|
}
|
|
} |