From 51abedf6187fd14cda7a0339a15defef596ec040 Mon Sep 17 00:00:00 2001 From: tgyuuAn Date: Sun, 9 Feb 2025 02:35:16 +0900 Subject: [PATCH] =?UTF-8?q?[PC-000]=20=ED=86=A0=ED=81=B0=20health=20Check?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../puzzle/data/repository/AuthRepositoryImpl.kt | 2 ++ .../data/fake/source/auth/FakeAuthDataSource.kt | 4 ++++ .../puzzle/domain/repository/AuthRepository.kt | 2 ++ .../main/java/com/puzzle/network/api/PieceApi.kt | 3 +++ .../network/interceptor/PieceInterceptor.kt | 2 ++ .../puzzle/network/source/auth/AuthDataSource.kt | 1 + .../network/source/auth/AuthDataSourceImpl.kt | 2 ++ .../java/com/puzzle/presentation/MainViewModel.kt | 15 ++++++++++++++- 8 files changed, 30 insertions(+), 1 deletion(-) diff --git a/core/data/src/main/java/com/puzzle/data/repository/AuthRepositoryImpl.kt b/core/data/src/main/java/com/puzzle/data/repository/AuthRepositoryImpl.kt index 5e348954..513ed335 100644 --- a/core/data/src/main/java/com/puzzle/data/repository/AuthRepositoryImpl.kt +++ b/core/data/src/main/java/com/puzzle/data/repository/AuthRepositoryImpl.kt @@ -48,6 +48,8 @@ class AuthRepositoryImpl @Inject constructor( } } + override suspend fun checkTokenHealth(): Result = authDataSource.checkTokenHealth() + override suspend fun requestAuthCode(phoneNumber: String): Result = authDataSource.requestAuthCode(phoneNumber) diff --git a/core/data/src/test/java/com/puzzle/data/fake/source/auth/FakeAuthDataSource.kt b/core/data/src/test/java/com/puzzle/data/fake/source/auth/FakeAuthDataSource.kt index f9ab742f..57088a5b 100644 --- a/core/data/src/test/java/com/puzzle/data/fake/source/auth/FakeAuthDataSource.kt +++ b/core/data/src/test/java/com/puzzle/data/fake/source/auth/FakeAuthDataSource.kt @@ -26,4 +26,8 @@ class FakeAuthDataSource : AuthDataSource { ): Result { return Result.success(verifyResponse) } + + override suspend fun checkTokenHealth(): Result { + return Result.success(Unit) + } } diff --git a/core/domain/src/main/java/com/puzzle/domain/repository/AuthRepository.kt b/core/domain/src/main/java/com/puzzle/domain/repository/AuthRepository.kt index 3cb72b3c..1726508f 100644 --- a/core/domain/src/main/java/com/puzzle/domain/repository/AuthRepository.kt +++ b/core/domain/src/main/java/com/puzzle/domain/repository/AuthRepository.kt @@ -15,4 +15,6 @@ interface AuthRepository { ): Result suspend fun logout(): Result + + suspend fun checkTokenHealth(): Result } diff --git a/core/network/src/main/java/com/puzzle/network/api/PieceApi.kt b/core/network/src/main/java/com/puzzle/network/api/PieceApi.kt index c7350997..e0001a3a 100644 --- a/core/network/src/main/java/com/puzzle/network/api/PieceApi.kt +++ b/core/network/src/main/java/com/puzzle/network/api/PieceApi.kt @@ -40,6 +40,9 @@ interface PieceApi { @GET("/api/valueTalks") suspend fun loadValueTalks(): Result> + @GET("/api/login/token/health-check") + suspend fun checkTokenHealth(): Result> + @POST("/api/auth/refresh") suspend fun refreshToken(@Body refreshTokenRequest: RefreshTokenRequest): Result> diff --git a/core/network/src/main/java/com/puzzle/network/interceptor/PieceInterceptor.kt b/core/network/src/main/java/com/puzzle/network/interceptor/PieceInterceptor.kt index 66129cf7..8a9f49f0 100644 --- a/core/network/src/main/java/com/puzzle/network/interceptor/PieceInterceptor.kt +++ b/core/network/src/main/java/com/puzzle/network/interceptor/PieceInterceptor.kt @@ -26,6 +26,8 @@ class PieceInterceptor @Inject constructor( private fun isAccessTokenUsed(request: Request): Boolean { return when (request.url.encodedPath) { "/api/common/health" -> false + "/api/login/token/refresh" -> false + "/api/login/token/health-check" -> false "/api/login/oauth" -> false "/api/terms" -> false "/api/valueTalks" -> false diff --git a/core/network/src/main/java/com/puzzle/network/source/auth/AuthDataSource.kt b/core/network/src/main/java/com/puzzle/network/source/auth/AuthDataSource.kt index 06bf9918..16116fcf 100644 --- a/core/network/src/main/java/com/puzzle/network/source/auth/AuthDataSource.kt +++ b/core/network/src/main/java/com/puzzle/network/source/auth/AuthDataSource.kt @@ -8,4 +8,5 @@ interface AuthDataSource { suspend fun loginOauth(provider: OAuthProvider, token: String): Result suspend fun requestAuthCode(phoneNumber: String): Result suspend fun verifyAuthCode(phoneNumber: String, code: String): Result + suspend fun checkTokenHealth(): Result } diff --git a/core/network/src/main/java/com/puzzle/network/source/auth/AuthDataSourceImpl.kt b/core/network/src/main/java/com/puzzle/network/source/auth/AuthDataSourceImpl.kt index c14b15e5..e184bbb4 100644 --- a/core/network/src/main/java/com/puzzle/network/source/auth/AuthDataSourceImpl.kt +++ b/core/network/src/main/java/com/puzzle/network/source/auth/AuthDataSourceImpl.kt @@ -40,4 +40,6 @@ class AuthDataSourceImpl @Inject constructor( code = code, ) ).unwrapData() + + override suspend fun checkTokenHealth(): Result = pieceApi.checkTokenHealth().unwrapData() } diff --git a/presentation/src/main/java/com/puzzle/presentation/MainViewModel.kt b/presentation/src/main/java/com/puzzle/presentation/MainViewModel.kt index 25a86952..939b6a96 100644 --- a/presentation/src/main/java/com/puzzle/presentation/MainViewModel.kt +++ b/presentation/src/main/java/com/puzzle/presentation/MainViewModel.kt @@ -6,9 +6,11 @@ import androidx.lifecycle.viewModelScope import com.puzzle.common.event.EventHelper import com.puzzle.domain.model.error.ErrorHelper import com.puzzle.domain.model.error.HttpResponseException +import com.puzzle.domain.model.user.UserRole.NONE import com.puzzle.domain.model.user.UserRole.PENDING import com.puzzle.domain.model.user.UserRole.REGISTER import com.puzzle.domain.model.user.UserRole.USER +import com.puzzle.domain.repository.AuthRepository import com.puzzle.domain.repository.ProfileRepository import com.puzzle.domain.repository.TermsRepository import com.puzzle.domain.repository.UserRepository @@ -16,6 +18,7 @@ import com.puzzle.navigation.AuthGraphDest import com.puzzle.navigation.MatchingGraphDest import com.puzzle.navigation.NavigationEvent import com.puzzle.navigation.NavigationHelper +import com.puzzle.navigation.OnboardingRoute import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.async import kotlinx.coroutines.flow.MutableStateFlow @@ -26,6 +29,7 @@ import javax.inject.Inject @HiltViewModel class MainViewModel @Inject constructor( + private val authRepository: AuthRepository, private val termsRepository: TermsRepository, private val userRepository: UserRepository, private val profileRepository: ProfileRepository, @@ -83,6 +87,10 @@ class MainViewModel @Inject constructor( } private fun checkRedirection() = viewModelScope.launch { + // 토큰이 만료 되었을경우 종료 + authRepository.checkTokenHealth().onFailure { return@launch } + + // 토큰이 만료되지 않을경우 UserRole에 따라 화면 분기 val userRole = async { userRepository.getUserRole() } .await() .getOrElse { return@launch } @@ -106,7 +114,12 @@ class MainViewModel @Inject constructor( ) } - else -> Unit + NONE -> navigationHelper.navigate( + NavigationEvent.NavigateTo( + route = OnboardingRoute, + popUpTo = AuthGraphDest.LoginRoute, + ) + ) } }.also { _isInitialized.value = true } }