package space.luminic.budgerapp.services import kotlinx.coroutines.reactor.awaitSingle import org.springframework.cache.annotation.CacheEvict import org.springframework.stereotype.Service import reactor.core.publisher.Mono import space.luminic.budgerapp.models.Token import space.luminic.budgerapp.models.TokenStatus import space.luminic.budgerapp.repos.TokenRepo import java.time.LocalDateTime @Service class TokenService(private val tokenRepository: TokenRepo) { @CacheEvict("tokens", allEntries = true) suspend fun saveToken(token: String, username: String, expiresAt: LocalDateTime): Token { val newToken = Token( token = token, username = username, issuedAt = LocalDateTime.now(), expiresAt = expiresAt ) return tokenRepository.save(newToken).awaitSingle() } fun getToken(token: String): Mono { return tokenRepository.findByToken(token) } fun revokeToken(token: String) { val tokenDetail = tokenRepository.findByToken(token).block()!! val updatedToken = tokenDetail.copy(status = TokenStatus.REVOKED) tokenRepository.save(updatedToken).block() } @CacheEvict("tokens", allEntries = true) fun deleteExpiredTokens() { tokenRepository.deleteByExpiresAtBefore(LocalDateTime.now()) } }