Add method to mark token refreshed

This commit is contained in:
Mikhail Yasnov 2021-07-02 14:43:42 +03:00
parent 915dbe9301
commit dcc35b3b10
5 changed files with 33 additions and 1 deletions

View File

@ -6,5 +6,6 @@ import java.time.ZonedDateTime
data class RefreshToken(
val value: String,
val expiresAt: ZonedDateTime,
val refreshedAt: ZonedDateTime?,
val user: User,
)

View File

@ -25,6 +25,8 @@ class RefreshTokenEntity : AuditableUuidIdEntity() {
lateinit var expiresAt: ZonedDateTime
var refreshedAt: ZonedDateTime? = null
@ManyToOne
@JoinColumn(name = "user_id")
lateinit var user: UserEntity
@ -43,7 +45,7 @@ class RefreshTokenEntity : AuditableUuidIdEntity() {
lateinit var scopes: Set<ScopeEntity>
fun validate(): RefreshTokenEntity = this.apply {
if (expiresAt.isExpired()) {
if (expiresAt.isExpired() || refreshedAt != null) {
throw RefreshTokenExpiredException(value)
}
}

View File

@ -7,5 +7,6 @@ interface RefreshTokenCoreService {
fun get(value: String): RefreshToken
fun create(token: NewRefreshToken): RefreshToken
fun setRefreshed(value: String): RefreshToken
}

View File

@ -52,6 +52,18 @@ class RefreshTokenCoreServiceImpl(
.toDto()
}
@Transactional
override fun setRefreshed(value: String): RefreshToken {
val refreshToken = refreshTokenRepository.findByValueOrThrow(value)
.validate()
.apply {
refreshedAt = ZonedDateTime.now()
}
return refreshTokenRepository.save(refreshToken)
.toDto()
}
private fun getExpirationDate(): ZonedDateTime {
return ZonedDateTime.now().plus(refreshTokenProperties.timeToLive)
}
@ -69,6 +81,7 @@ class RefreshTokenCoreServiceImpl(
return RefreshToken(
value = value,
expiresAt = expiresAt,
refreshedAt = refreshedAt,
user = user.toDto(device)
)
}

View File

@ -0,0 +1,15 @@
databaseChangeLog:
- changeSet:
id: 202107021246__alter_table__refresh_tokens
author: touchin
preConditions:
- onFail: MARK_RAN
tableExists:
tableName: refresh_tokens
changes:
- addColumn:
tableName: refresh_tokens
columns:
- column:
name: refreshed_at
type: TIMESTAMP WITH TIME ZONE