From ff21a25d3a827f4534d922338921214793345bb1 Mon Sep 17 00:00:00 2001 From: Pauline Date: Mon, 14 Oct 2024 15:57:39 +0800 Subject: [PATCH] Cache access token in MPClient --- .../radarbase/authorizer/service/MPClient.kt | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/authorizer-app-backend/src/main/java/org/radarbase/authorizer/service/MPClient.kt b/authorizer-app-backend/src/main/java/org/radarbase/authorizer/service/MPClient.kt index 7e77b9d..c6de705 100644 --- a/authorizer-app-backend/src/main/java/org/radarbase/authorizer/service/MPClient.kt +++ b/authorizer-app-backend/src/main/java/org/radarbase/authorizer/service/MPClient.kt @@ -17,6 +17,8 @@ import io.ktor.http.isSuccess import io.ktor.serialization.kotlinx.json.json import jakarta.inject.Singleton import jakarta.ws.rs.core.Context +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json import org.radarbase.authorizer.config.AuthorizerConfig @@ -40,7 +42,12 @@ class MPClient( } } - suspend fun getAccessToken(): String { + private var accessToken: String? = null + private var tokenExpiration: Long = 0 + + private val mutex = Mutex() + + private suspend fun fetchAccessToken(): String { val response: HttpResponse = httpClient.submitForm( url = config.auth.authUrl, @@ -60,7 +67,20 @@ class MPClient( } val tokenResponse = response.body() - return tokenResponse.access_token + accessToken = tokenResponse.access_token + tokenExpiration = System.currentTimeMillis() + (tokenResponse.expires_in * 1000) // Convert seconds to milliseconds + + return accessToken!! + } + + private suspend fun getAccessToken(): String { + mutex.withLock { + return if (accessToken == null || System.currentTimeMillis() >= tokenExpiration) { + fetchAccessToken() + } else { + accessToken!! + } + } } suspend fun requestOrganizations(