From a7f25a291ee31bbf9a748d213be274f49dd90f5c Mon Sep 17 00:00:00 2001 From: Sangwook123 Date: Sat, 12 Aug 2023 17:43:53 +0900 Subject: [PATCH 01/13] =?UTF-8?q?[feat]=20#105=20Dto=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/model/remote/response/ResponseLogoutDto.kt | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 app/src/main/java/com/android/go/sopt/winey/data/model/remote/response/ResponseLogoutDto.kt diff --git a/app/src/main/java/com/android/go/sopt/winey/data/model/remote/response/ResponseLogoutDto.kt b/app/src/main/java/com/android/go/sopt/winey/data/model/remote/response/ResponseLogoutDto.kt new file mode 100644 index 00000000..f92eb782 --- /dev/null +++ b/app/src/main/java/com/android/go/sopt/winey/data/model/remote/response/ResponseLogoutDto.kt @@ -0,0 +1,12 @@ +package com.android.go.sopt.winey.data.model.remote.response + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class ResponseLogoutDto( + @SerialName("code") + val code : Int, + @SerialName("message") + val message : String +) From 9b7514e31380088cc0867d2ec2f03335764990ed Mon Sep 17 00:00:00 2001 From: Sangwook123 Date: Sat, 12 Aug 2023 17:44:16 +0900 Subject: [PATCH 02/13] =?UTF-8?q?[feat]=20#105=20Service=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/android/go/sopt/winey/data/service/AuthService.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/com/android/go/sopt/winey/data/service/AuthService.kt b/app/src/main/java/com/android/go/sopt/winey/data/service/AuthService.kt index c64493e7..e24e8726 100644 --- a/app/src/main/java/com/android/go/sopt/winey/data/service/AuthService.kt +++ b/app/src/main/java/com/android/go/sopt/winey/data/service/AuthService.kt @@ -8,10 +8,12 @@ import com.android.go.sopt.winey.data.model.remote.response.ResponseGetRecommend import com.android.go.sopt.winey.data.model.remote.response.ResponseGetUserDto import com.android.go.sopt.winey.data.model.remote.response.ResponseGetWineyFeedListDto import com.android.go.sopt.winey.data.model.remote.response.ResponseLoginDto +import com.android.go.sopt.winey.data.model.remote.response.ResponseLogoutDto import com.android.go.sopt.winey.data.model.remote.response.ResponsePostLikeDto import com.android.go.sopt.winey.data.model.remote.response.ResponsePostWineyFeedDto import com.android.go.sopt.winey.data.model.remote.response.ResponseReIssueTokenDto import com.android.go.sopt.winey.data.model.remote.response.base.BaseResponse +import com.android.go.sopt.winey.domain.entity.Login import okhttp3.MultipartBody import okhttp3.RequestBody import retrofit2.http.Body @@ -77,4 +79,7 @@ interface AuthService { suspend fun postReIssueToken( @Header("refreshToken") refreshToken: String ): BaseResponse + + @POST("auth/sign-out") + suspend fun postLogout(): ResponseLogoutDto } From 569de9f432df300edb14f9a387b3405340f2f489 Mon Sep 17 00:00:00 2001 From: Sangwook123 Date: Sat, 12 Aug 2023 17:44:34 +0900 Subject: [PATCH 03/13] =?UTF-8?q?[feat]=20#105=20DataSource=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/android/go/sopt/winey/data/source/AuthDataSource.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/com/android/go/sopt/winey/data/source/AuthDataSource.kt b/app/src/main/java/com/android/go/sopt/winey/data/source/AuthDataSource.kt index 532fb32a..cc20beaf 100644 --- a/app/src/main/java/com/android/go/sopt/winey/data/source/AuthDataSource.kt +++ b/app/src/main/java/com/android/go/sopt/winey/data/source/AuthDataSource.kt @@ -8,6 +8,7 @@ import com.android.go.sopt.winey.data.model.remote.response.ResponseGetRecommend import com.android.go.sopt.winey.data.model.remote.response.ResponseGetUserDto import com.android.go.sopt.winey.data.model.remote.response.ResponseGetWineyFeedListDto import com.android.go.sopt.winey.data.model.remote.response.ResponseLoginDto +import com.android.go.sopt.winey.data.model.remote.response.ResponseLogoutDto import com.android.go.sopt.winey.data.model.remote.response.ResponsePostLikeDto import com.android.go.sopt.winey.data.model.remote.response.ResponsePostWineyFeedDto import com.android.go.sopt.winey.data.model.remote.response.ResponseReIssueTokenDto @@ -59,4 +60,6 @@ class AuthDataSource @Inject constructor( refreshToken: String ): BaseResponse = authService.postReIssueToken(refreshToken) + + suspend fun postLogout(): ResponseLogoutDto = authService.postLogout() } From d2830fce5e1a43f573fa6dce87885496cb037273 Mon Sep 17 00:00:00 2001 From: Sangwook123 Date: Sat, 12 Aug 2023 17:45:21 +0900 Subject: [PATCH 04/13] =?UTF-8?q?[feat]=20#105=20repository=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../go/sopt/winey/data/repository/AuthRepositoryImpl.kt | 6 ++++++ .../go/sopt/winey/domain/repository/AuthRepository.kt | 3 +++ 2 files changed, 9 insertions(+) diff --git a/app/src/main/java/com/android/go/sopt/winey/data/repository/AuthRepositoryImpl.kt b/app/src/main/java/com/android/go/sopt/winey/data/repository/AuthRepositoryImpl.kt index 22d2f353..9ff118d0 100644 --- a/app/src/main/java/com/android/go/sopt/winey/data/repository/AuthRepositoryImpl.kt +++ b/app/src/main/java/com/android/go/sopt/winey/data/repository/AuthRepositoryImpl.kt @@ -4,6 +4,7 @@ import com.android.go.sopt.winey.data.model.remote.request.RequestCreateGoalDto import com.android.go.sopt.winey.data.model.remote.request.RequestLoginDto import com.android.go.sopt.winey.data.model.remote.request.RequestPostLikeDto import com.android.go.sopt.winey.data.model.remote.response.ResponseLoginDto +import com.android.go.sopt.winey.data.model.remote.response.ResponseLogoutDto import com.android.go.sopt.winey.data.model.remote.response.ResponsePostWineyFeedDto import com.android.go.sopt.winey.data.model.remote.response.ResponseReIssueTokenDto import com.android.go.sopt.winey.data.source.AuthDataSource @@ -79,4 +80,9 @@ class AuthRepositoryImpl @Inject constructor( runCatching { authDataSource.postReIssueToken(refreshToken).data } + + override suspend fun postLogout(): Result = + runCatching { + authDataSource.postLogout() + } } diff --git a/app/src/main/java/com/android/go/sopt/winey/domain/repository/AuthRepository.kt b/app/src/main/java/com/android/go/sopt/winey/domain/repository/AuthRepository.kt index 951abdf3..384dd8f9 100644 --- a/app/src/main/java/com/android/go/sopt/winey/domain/repository/AuthRepository.kt +++ b/app/src/main/java/com/android/go/sopt/winey/domain/repository/AuthRepository.kt @@ -4,6 +4,7 @@ import com.android.go.sopt.winey.data.model.remote.request.RequestCreateGoalDto import com.android.go.sopt.winey.data.model.remote.request.RequestLoginDto import com.android.go.sopt.winey.data.model.remote.request.RequestPostLikeDto import com.android.go.sopt.winey.data.model.remote.response.ResponseLoginDto +import com.android.go.sopt.winey.data.model.remote.response.ResponseLogoutDto import com.android.go.sopt.winey.data.model.remote.response.ResponsePostWineyFeedDto import com.android.go.sopt.winey.data.model.remote.response.ResponseReIssueTokenDto import com.android.go.sopt.winey.domain.entity.Goal @@ -39,4 +40,6 @@ interface AuthRepository { ): Result suspend fun postReIssueToken(refreshToken: String): Result + + suspend fun postLogout(): Result } From d65c358e0f4c64ea77a40ebdecba08d1db9f4785 Mon Sep 17 00:00:00 2001 From: Sangwook123 Date: Sat, 12 Aug 2023 17:47:28 +0900 Subject: [PATCH 05/13] =?UTF-8?q?[feat]=20#105=20logout=20=EC=84=9C?= =?UTF-8?q?=EB=B2=84=ED=86=B5=EC=8B=A0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../winey/presentation/main/MainActivity.kt | 40 +++++++++++++++++++ .../winey/presentation/main/MainViewModel.kt | 28 +++++++++++-- 2 files changed, 65 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt index 69c72cef..533342da 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt @@ -1,17 +1,26 @@ package com.android.go.sopt.winey.presentation.main +import android.content.Intent import android.os.Bundle import androidx.activity.viewModels import androidx.fragment.app.Fragment import androidx.fragment.app.commit import androidx.fragment.app.replace +import androidx.lifecycle.flowWithLifecycle +import androidx.lifecycle.lifecycleScope import com.android.go.sopt.winey.R import com.android.go.sopt.winey.databinding.ActivityMainBinding import com.android.go.sopt.winey.presentation.main.feed.WineyFeedFragment import com.android.go.sopt.winey.presentation.main.mypage.MyPageFragment import com.android.go.sopt.winey.presentation.main.recommend.RecommendFragment +import com.android.go.sopt.winey.presentation.onboarding.LoginActivity import com.android.go.sopt.winey.util.binding.BindingActivity +import com.android.go.sopt.winey.util.context.snackBar +import com.android.go.sopt.winey.util.view.UiState import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import timber.log.Timber @AndroidEntryPoint class MainActivity : BindingActivity(R.layout.activity_main) { @@ -23,6 +32,7 @@ class MainActivity : BindingActivity(R.layout.activity_main navigateTo() initBnvItemSelectedListener() syncBottomNavigationSelection() + setupLogoutState() } private fun initBnvItemSelectedListener() { @@ -52,6 +62,36 @@ class MainActivity : BindingActivity(R.layout.activity_main } } + fun setupLogoutState() { + viewModel.logoutState.flowWithLifecycle(lifecycle).onEach { state -> + when (state) { + is UiState.Loading -> { + + } + + is UiState.Success -> { + navigateToOnBoardingScreen() + Timber.e("로그인 액티비티로 전환") + } + + is UiState.Failure -> { + snackBar(binding.root) { state.msg } + } + + is UiState.Empty -> { + } + } + }.launchIn(lifecycleScope) + } + + private fun navigateToOnBoardingScreen() { + Intent(this@MainActivity, LoginActivity::class.java).apply { + addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) + startActivity(this) + } + finish() + } + inline fun navigateTo() { supportFragmentManager.commit { replace(R.id.fcv_main, T::class.simpleName) diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainViewModel.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainViewModel.kt index 39378ce3..2aa44cb5 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainViewModel.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainViewModel.kt @@ -2,6 +2,7 @@ package com.android.go.sopt.winey.presentation.main import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.android.go.sopt.winey.data.model.remote.response.ResponseLogoutDto import com.android.go.sopt.winey.domain.entity.User import com.android.go.sopt.winey.domain.repository.AuthRepository import com.android.go.sopt.winey.domain.repository.DataStoreRepository @@ -23,9 +24,8 @@ class MainViewModel @Inject constructor( private val _getUserState = MutableStateFlow>(UiState.Loading) val getUserState: StateFlow> = _getUserState.asStateFlow() - init { - getUser() - } + private val _logoutState = MutableStateFlow>(UiState.Empty) + val logoutState: StateFlow> = _logoutState.asStateFlow() fun getUser() { viewModelScope.launch { @@ -40,10 +40,32 @@ class MainViewModel @Inject constructor( .onFailure { t -> if (t is HttpException) { Timber.e("HTTP 실패") + if (t.code().equals(401)) { + } } Timber.e("${t.message}") _getUserState.value = UiState.Failure("${t.message}") } } } + + fun postLogout() { + viewModelScope.launch { + _logoutState.value = UiState.Loading + + authRepository.postLogout() + .onSuccess { response -> + dataStoreRepository.saveAccessToken("", "") + _logoutState.value = UiState.Success(response) + Timber.e("${response.message}") + } + .onFailure { t -> + if (t is HttpException) { + Timber.e("HTTP 실패") + } + Timber.e("${t.message}") + _logoutState.value = UiState.Failure("${t.message}") + } + } + } } From 213890f0d991d1c29d4a693ab5ed307a420d4427 Mon Sep 17 00:00:00 2001 From: Sangwook123 Date: Sat, 12 Aug 2023 17:47:56 +0900 Subject: [PATCH 06/13] =?UTF-8?q?[feat]=20#105=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=95=84=EC=9B=83=20=EB=B2=84=ED=8A=BC=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/winey/presentation/main/mypage/MyPageFragment.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/mypage/MyPageFragment.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/mypage/MyPageFragment.kt index 9c98c8bf..d925ed19 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/mypage/MyPageFragment.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/mypage/MyPageFragment.kt @@ -37,6 +37,7 @@ class MyPageFragment : BindingFragment(R.layout.fragment_ init1On1ButtonClickListener() initLevelHelpButtonClickListener() initToMyFeedButtonClickListener() + initLogoutButtonClickListener() setupGetUserState() viewModel.getUser() } @@ -66,6 +67,12 @@ class MyPageFragment : BindingFragment(R.layout.fragment_ } } + private fun initLogoutButtonClickListener() { + binding.clMypageLogout.setOnClickListener { + viewModel.postLogout() + } + } + private fun setupGetUserState() { viewModel.getUserState.flowWithLifecycle(lifecycle).onEach { state -> From 7574f3188710754ff7a6bc1b428d3352d69c243c Mon Sep 17 00:00:00 2001 From: Sangwook123 Date: Sat, 12 Aug 2023 17:48:22 +0900 Subject: [PATCH 07/13] =?UTF-8?q?[mod]=20#105=20=ED=86=A0=ED=81=B0=20?= =?UTF-8?q?=EC=9E=AC=EB=B0=9C=EA=B8=89=20=EB=A1=9C=EC=A7=81=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../winey/data/interceptor/AuthInterceptor.kt | 16 ++++++++++++---- .../go/sopt/winey/data/service/AuthService.kt | 1 - .../presentation/onboarding/LoginViewModel.kt | 1 + 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/android/go/sopt/winey/data/interceptor/AuthInterceptor.kt b/app/src/main/java/com/android/go/sopt/winey/data/interceptor/AuthInterceptor.kt index 4ff7cea0..c2fddbef 100644 --- a/app/src/main/java/com/android/go/sopt/winey/data/interceptor/AuthInterceptor.kt +++ b/app/src/main/java/com/android/go/sopt/winey/data/interceptor/AuthInterceptor.kt @@ -23,6 +23,7 @@ class AuthInterceptor @Inject constructor( private val dataStoreRepository: DataStoreRepository ) : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { + runBlocking { Timber.e("액세스토큰 : ${getAccessToken()}, 리프레시토큰 : ${getRefreshToken()}") } val originalRequest = chain.request() val headerRequest = originalRequest.newAuthBuilder() @@ -33,6 +34,8 @@ class AuthInterceptor @Inject constructor( when (response.code) { CODE_TOKEN_EXPIRED -> { try { + Timber.e("액세스 토큰 만료, 토큰 재발급 합니다.") + response.close() val refreshTokenRequest = originalRequest.newBuilder().post("".toRequestBody()) .url("$AUTH_BASE_URL/auth/token") .addHeader(REFRESH_TOKEN, runBlocking(Dispatchers.IO) { getRefreshToken() }) @@ -44,8 +47,8 @@ class AuthInterceptor @Inject constructor( val responseToken = json.decodeFromString( refreshTokenResponse.body?.string().toString() ) as BaseResponse - if (responseToken.data != null) { + Timber.e("리프레시 토큰 : ${responseToken.data.refreshToken}") saveAccessToken( responseToken.data.accessToken, responseToken.data.refreshToken @@ -54,10 +57,15 @@ class AuthInterceptor @Inject constructor( refreshTokenResponse.close() val newRequest = originalRequest.newAuthBuilder().build() return chain.proceed(newRequest) + } else { + refreshTokenResponse.close() + Timber.e("리프레시 토큰 : ${refreshTokenResponse.code}") + Timber.e("리프레시 토큰 만료입니다.") + saveAccessToken("", "") + return chain.proceed(headerRequest) } - saveAccessToken("", "") } catch (t: Throwable) { - Timber.e(t) + Timber.e("예외발생 ${t.message}") saveAccessToken("", "") } } @@ -73,7 +81,7 @@ class AuthInterceptor @Inject constructor( } private suspend fun getRefreshToken(): String { - return dataStoreRepository.getAccessToken().first() ?: "" + return dataStoreRepository.getRefreshToken().first() ?: "" } private fun saveAccessToken(accessToken: String, refreshToken: String) = diff --git a/app/src/main/java/com/android/go/sopt/winey/data/service/AuthService.kt b/app/src/main/java/com/android/go/sopt/winey/data/service/AuthService.kt index e24e8726..13255b81 100644 --- a/app/src/main/java/com/android/go/sopt/winey/data/service/AuthService.kt +++ b/app/src/main/java/com/android/go/sopt/winey/data/service/AuthService.kt @@ -13,7 +13,6 @@ import com.android.go.sopt.winey.data.model.remote.response.ResponsePostLikeDto import com.android.go.sopt.winey.data.model.remote.response.ResponsePostWineyFeedDto import com.android.go.sopt.winey.data.model.remote.response.ResponseReIssueTokenDto import com.android.go.sopt.winey.data.model.remote.response.base.BaseResponse -import com.android.go.sopt.winey.domain.entity.Login import okhttp3.MultipartBody import okhttp3.RequestBody import retrofit2.http.Body diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/LoginViewModel.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/LoginViewModel.kt index bff76e53..a9c4df63 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/LoginViewModel.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/onboarding/LoginViewModel.kt @@ -62,6 +62,7 @@ class LoginViewModel @Inject constructor( if (response != null) { saveAccessToken(response.accessToken, response.refreshToken) saveUserId(response.userId) + Timber.e("액세스 : ${response.accessToken} , 리프레시 : ${response.refreshToken}") _loginState.value = UiState.Success(response) } else { Timber.e("response is null") From 15696ac79233df210318848f2b23b6a5ae340b5f Mon Sep 17 00:00:00 2001 From: Sangwook123 Date: Tue, 15 Aug 2023 15:53:02 +0900 Subject: [PATCH 08/13] =?UTF-8?q?[feat]=20#105=20=EB=A6=AC=ED=94=84?= =?UTF-8?q?=EB=A0=88=EC=89=AC=ED=86=A0=ED=81=B0=20=EB=A7=8C=EB=A3=8C?= =?UTF-8?q?=EC=8B=9C,=20=EB=A1=9C=EA=B7=B8=EC=95=84=EC=9B=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../winey/presentation/main/MainActivity.kt | 20 +++++++++++++++++++ .../winey/presentation/main/MainViewModel.kt | 4 +--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt index 6b12444c..3729b4cc 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt @@ -20,6 +20,7 @@ import com.android.go.sopt.winey.util.view.UiState import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach +import retrofit2.HttpException import timber.log.Timber @AndroidEntryPoint @@ -33,6 +34,7 @@ class MainActivity : BindingActivity(R.layout.activity_main initBnvItemSelectedListener() syncBottomNavigationSelection() setupLogoutState() + setupTokenState() } private fun initBnvItemSelectedListener() { @@ -83,6 +85,24 @@ class MainActivity : BindingActivity(R.layout.activity_main }.launchIn(lifecycleScope) } + fun setupTokenState() { + viewModel.getUserState.flowWithLifecycle(lifecycle).onEach { state -> + when (state) { + is UiState.Failure -> { + if (state is HttpException) { + if (state.code() == 401) { + viewModel.postLogout() + } + } + } + + else -> { + + } + } + } + } + private fun navigateToOnBoardingScreen() { Intent(this@MainActivity, LoginActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainViewModel.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainViewModel.kt index 2aa44cb5..70763089 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainViewModel.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainViewModel.kt @@ -39,9 +39,7 @@ class MainViewModel @Inject constructor( } .onFailure { t -> if (t is HttpException) { - Timber.e("HTTP 실패") - if (t.code().equals(401)) { - } + Timber.e("HTTP 실패 ${t.code()}") } Timber.e("${t.message}") _getUserState.value = UiState.Failure("${t.message}") From a6e49a006e30089d8ac20e26e2e79c04de6b70b9 Mon Sep 17 00:00:00 2001 From: Sangwook123 Date: Tue, 15 Aug 2023 15:54:16 +0900 Subject: [PATCH 09/13] =?UTF-8?q?[chore]=20#105=20=ED=86=A0=ED=81=B0=20?= =?UTF-8?q?=EC=9E=AC=EB=B0=9C=EA=B8=89=20=ED=95=A8=EC=88=98=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../winey/data/interceptor/AuthInterceptor.kt | 60 ++++++++++--------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/com/android/go/sopt/winey/data/interceptor/AuthInterceptor.kt b/app/src/main/java/com/android/go/sopt/winey/data/interceptor/AuthInterceptor.kt index c2fddbef..538fcb30 100644 --- a/app/src/main/java/com/android/go/sopt/winey/data/interceptor/AuthInterceptor.kt +++ b/app/src/main/java/com/android/go/sopt/winey/data/interceptor/AuthInterceptor.kt @@ -36,34 +36,7 @@ class AuthInterceptor @Inject constructor( try { Timber.e("액세스 토큰 만료, 토큰 재발급 합니다.") response.close() - val refreshTokenRequest = originalRequest.newBuilder().post("".toRequestBody()) - .url("$AUTH_BASE_URL/auth/token") - .addHeader(REFRESH_TOKEN, runBlocking(Dispatchers.IO) { getRefreshToken() }) - .build() - val refreshTokenResponse = chain.proceed(refreshTokenRequest) - Timber.e("리프레시 토큰 : $refreshTokenResponse") - - if (refreshTokenResponse.isSuccessful) { - val responseToken = json.decodeFromString( - refreshTokenResponse.body?.string().toString() - ) as BaseResponse - if (responseToken.data != null) { - Timber.e("리프레시 토큰 : ${responseToken.data.refreshToken}") - saveAccessToken( - responseToken.data.accessToken, - responseToken.data.refreshToken - ) - } - refreshTokenResponse.close() - val newRequest = originalRequest.newAuthBuilder().build() - return chain.proceed(newRequest) - } else { - refreshTokenResponse.close() - Timber.e("리프레시 토큰 : ${refreshTokenResponse.code}") - Timber.e("리프레시 토큰 만료입니다.") - saveAccessToken("", "") - return chain.proceed(headerRequest) - } + return handleTokenExpired(chain, originalRequest, headerRequest) } catch (t: Throwable) { Timber.e("예외발생 ${t.message}") saveAccessToken("", "") @@ -89,6 +62,37 @@ class AuthInterceptor @Inject constructor( dataStoreRepository.saveAccessToken(accessToken, refreshToken) } + private fun handleTokenExpired(chain: Interceptor.Chain, originalRequest: Request, headerRequest: Request): Response + { + val refreshTokenRequest = originalRequest.newBuilder().post("".toRequestBody()) + .url("$AUTH_BASE_URL/auth/token") + .addHeader(REFRESH_TOKEN, runBlocking(Dispatchers.IO) { getRefreshToken() }) + .build() + val refreshTokenResponse = chain.proceed(refreshTokenRequest) + Timber.e("리프레시 토큰 : $refreshTokenResponse") + + if (refreshTokenResponse.isSuccessful) { + val responseToken = json.decodeFromString( + refreshTokenResponse.body?.string().toString() + ) as BaseResponse + if (responseToken.data != null) { + Timber.e("리프레시 토큰 : ${responseToken.data.refreshToken}") + saveAccessToken( + responseToken.data.accessToken, + responseToken.data.refreshToken + ) + } + refreshTokenResponse.close() + val newRequest = originalRequest.newAuthBuilder().build() + return chain.proceed(newRequest) + } else { + refreshTokenResponse.close() + Timber.e("리프레시 토큰 : ${refreshTokenResponse.code}") + saveAccessToken("", "") + return chain.proceed(headerRequest) + } + } + companion object { private const val HEADER_TOKEN = "accessToken" private const val CODE_TOKEN_EXPIRED = 401 From 629ce82263f2ae6141de7458ae908201f9231c35 Mon Sep 17 00:00:00 2001 From: Sangwook123 Date: Tue, 15 Aug 2023 15:54:56 +0900 Subject: [PATCH 10/13] =?UTF-8?q?[chore]=20#105=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../go/sopt/winey/presentation/splash/SplashActivity.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/splash/SplashActivity.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/splash/SplashActivity.kt index 21f19002..43f0749f 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/splash/SplashActivity.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/splash/SplashActivity.kt @@ -9,7 +9,6 @@ import com.android.go.sopt.winey.databinding.ActivitySplashBinding import com.android.go.sopt.winey.domain.repository.DataStoreRepository import com.android.go.sopt.winey.presentation.main.MainActivity import com.android.go.sopt.winey.presentation.onboarding.login.LoginActivity -import com.android.go.sopt.winey.presentation.onboarding.nickname.NicknameActivity import com.android.go.sopt.winey.util.binding.BindingActivity import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.delay @@ -31,8 +30,7 @@ class SplashActivity : BindingActivity(R.layout.activity_ lifecycleScope.launch { delay(DELAY_TIME) - //checkAutoLogin() - navigateTo() + checkAutoLogin() } } From d9eba304931dda3b1cad9ef76dc11bed3736a316 Mon Sep 17 00:00:00 2001 From: Sangwook123 Date: Tue, 15 Aug 2023 16:12:38 +0900 Subject: [PATCH 11/13] =?UTF-8?q?[chore]=20#105=20ktlint=20=EC=A0=9C?= =?UTF-8?q?=EC=95=88=EC=82=AC=ED=95=AD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../winey/data/interceptor/AuthInterceptor.kt | 53 +++++++++---------- .../remote/response/ResponseLogoutDto.kt | 4 +- .../go/sopt/winey/data/service/AuthService.kt | 1 + .../winey/presentation/main/MainActivity.kt | 2 - 4 files changed, 29 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/com/android/go/sopt/winey/data/interceptor/AuthInterceptor.kt b/app/src/main/java/com/android/go/sopt/winey/data/interceptor/AuthInterceptor.kt index 538fcb30..f7c642a2 100644 --- a/app/src/main/java/com/android/go/sopt/winey/data/interceptor/AuthInterceptor.kt +++ b/app/src/main/java/com/android/go/sopt/winey/data/interceptor/AuthInterceptor.kt @@ -62,36 +62,35 @@ class AuthInterceptor @Inject constructor( dataStoreRepository.saveAccessToken(accessToken, refreshToken) } - private fun handleTokenExpired(chain: Interceptor.Chain, originalRequest: Request, headerRequest: Request): Response - { - val refreshTokenRequest = originalRequest.newBuilder().post("".toRequestBody()) - .url("$AUTH_BASE_URL/auth/token") - .addHeader(REFRESH_TOKEN, runBlocking(Dispatchers.IO) { getRefreshToken() }) - .build() - val refreshTokenResponse = chain.proceed(refreshTokenRequest) - Timber.e("리프레시 토큰 : $refreshTokenResponse") + private fun handleTokenExpired(chain: Interceptor.Chain, originalRequest: Request, headerRequest: Request): Response { + val refreshTokenRequest = originalRequest.newBuilder().post("".toRequestBody()) + .url("$AUTH_BASE_URL/auth/token") + .addHeader(REFRESH_TOKEN, runBlocking(Dispatchers.IO) { getRefreshToken() }) + .build() + val refreshTokenResponse = chain.proceed(refreshTokenRequest) + Timber.e("리프레시 토큰 : $refreshTokenResponse") - if (refreshTokenResponse.isSuccessful) { - val responseToken = json.decodeFromString( - refreshTokenResponse.body?.string().toString() - ) as BaseResponse - if (responseToken.data != null) { - Timber.e("리프레시 토큰 : ${responseToken.data.refreshToken}") - saveAccessToken( - responseToken.data.accessToken, - responseToken.data.refreshToken - ) - } - refreshTokenResponse.close() - val newRequest = originalRequest.newAuthBuilder().build() - return chain.proceed(newRequest) - } else { - refreshTokenResponse.close() - Timber.e("리프레시 토큰 : ${refreshTokenResponse.code}") - saveAccessToken("", "") - return chain.proceed(headerRequest) + if (refreshTokenResponse.isSuccessful) { + val responseToken = json.decodeFromString( + refreshTokenResponse.body?.string().toString() + ) as BaseResponse + if (responseToken.data != null) { + Timber.e("리프레시 토큰 : ${responseToken.data.refreshToken}") + saveAccessToken( + responseToken.data.accessToken, + responseToken.data.refreshToken + ) } + refreshTokenResponse.close() + val newRequest = originalRequest.newAuthBuilder().build() + return chain.proceed(newRequest) + } else { + refreshTokenResponse.close() + Timber.e("리프레시 토큰 : ${refreshTokenResponse.code}") + saveAccessToken("", "") + return chain.proceed(headerRequest) } + } companion object { private const val HEADER_TOKEN = "accessToken" diff --git a/app/src/main/java/com/android/go/sopt/winey/data/model/remote/response/ResponseLogoutDto.kt b/app/src/main/java/com/android/go/sopt/winey/data/model/remote/response/ResponseLogoutDto.kt index f92eb782..aee4de8e 100644 --- a/app/src/main/java/com/android/go/sopt/winey/data/model/remote/response/ResponseLogoutDto.kt +++ b/app/src/main/java/com/android/go/sopt/winey/data/model/remote/response/ResponseLogoutDto.kt @@ -6,7 +6,7 @@ import kotlinx.serialization.Serializable @Serializable data class ResponseLogoutDto( @SerialName("code") - val code : Int, + val code: Int, @SerialName("message") - val message : String + val message: String ) diff --git a/app/src/main/java/com/android/go/sopt/winey/data/service/AuthService.kt b/app/src/main/java/com/android/go/sopt/winey/data/service/AuthService.kt index 2390704d..6baa78c2 100644 --- a/app/src/main/java/com/android/go/sopt/winey/data/service/AuthService.kt +++ b/app/src/main/java/com/android/go/sopt/winey/data/service/AuthService.kt @@ -37,6 +37,7 @@ interface AuthService { @POST("auth/sign-out") suspend fun postLogout(): ResponseLogoutDto + @GET("user/nickname/is-exist") suspend fun getNicknameDuplicateCheck( @Query("nickname") nickname: String diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt index 3729b4cc..d4afb9af 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt @@ -67,7 +67,6 @@ class MainActivity : BindingActivity(R.layout.activity_main viewModel.logoutState.flowWithLifecycle(lifecycle).onEach { state -> when (state) { is UiState.Loading -> { - } is UiState.Success -> { @@ -97,7 +96,6 @@ class MainActivity : BindingActivity(R.layout.activity_main } else -> { - } } } From 5e319efce225edb5101955321211fda5e211a39d Mon Sep 17 00:00:00 2001 From: Sangwook123 Date: Tue, 15 Aug 2023 17:30:54 +0900 Subject: [PATCH 12/13] =?UTF-8?q?[chore]=20#105=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../go/sopt/winey/presentation/main/MainActivity.kt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt index d4afb9af..188e1c4d 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt @@ -70,8 +70,7 @@ class MainActivity : BindingActivity(R.layout.activity_main } is UiState.Success -> { - navigateToOnBoardingScreen() - Timber.e("로그인 액티비티로 전환") + navigateToLoginScreen() } is UiState.Failure -> { @@ -89,7 +88,7 @@ class MainActivity : BindingActivity(R.layout.activity_main when (state) { is UiState.Failure -> { if (state is HttpException) { - if (state.code() == 401) { + if (state.code() == CODE_TOKEN_EXPIRED) { viewModel.postLogout() } } @@ -101,7 +100,7 @@ class MainActivity : BindingActivity(R.layout.activity_main } } - private fun navigateToOnBoardingScreen() { + private fun navigateToLoginScreen() { Intent(this@MainActivity, LoginActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) startActivity(this) @@ -114,4 +113,8 @@ class MainActivity : BindingActivity(R.layout.activity_main replace(R.id.fcv_main, T::class.simpleName) } } + + companion object { + private const val CODE_TOKEN_EXPIRED = 401 + } } From 3bd64327d8fe1b9af9751693a3fe97664b3477a9 Mon Sep 17 00:00:00 2001 From: Sangwook123 Date: Tue, 15 Aug 2023 17:34:58 +0900 Subject: [PATCH 13/13] =?UTF-8?q?[chore]=20#105=20ktlint=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/android/go/sopt/winey/presentation/main/MainActivity.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt index 188e1c4d..b4ddf856 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/MainActivity.kt @@ -21,7 +21,6 @@ import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import retrofit2.HttpException -import timber.log.Timber @AndroidEntryPoint class MainActivity : BindingActivity(R.layout.activity_main) {