diff --git a/app/src/main/java/com/yapp/growth/kakao/KakaoLoginSdk.kt b/app/src/main/java/com/yapp/growth/kakao/KakaoLoginSdk.kt index 1b3e9866..54dd6427 100644 --- a/app/src/main/java/com/yapp/growth/kakao/KakaoLoginSdk.kt +++ b/app/src/main/java/com/yapp/growth/kakao/KakaoLoginSdk.kt @@ -49,6 +49,19 @@ class KakaoLoginSdk @Inject constructor( awaitLogoutResult.getOrAuthExceptionThrow() } + override suspend fun withdraw() { + val awaitWithdrawResult = suspendCancellableCoroutine> { cont -> + kakaoUserApiClient.unlink { e -> + val withdrawResult = when { + e != null -> Result.failure(e.toAuthException()) + else -> Result.success(Unit) + } + cont.resume(withdrawResult) + } + } + awaitWithdrawResult.getOrAuthExceptionThrow() + } + override suspend fun getAccessToken(): KakaoAccessToken = KakaoAccessToken( kakaoAuthApiClient.tokenManagerProvider.manager.getToken()?.accessToken diff --git a/data/src/main/java/com/yapp/growth/data/api/GrowthApi.kt b/data/src/main/java/com/yapp/growth/data/api/GrowthApi.kt index 433cee63..0b4fcaf8 100644 --- a/data/src/main/java/com/yapp/growth/data/api/GrowthApi.kt +++ b/data/src/main/java/com/yapp/growth/data/api/GrowthApi.kt @@ -79,4 +79,7 @@ interface GrowthApi { @GET("/api/users/info") suspend fun getUserInfo(): UserResponseImpl + + @POST("/api/users/resign-member") + suspend fun deleteUserInfo() } diff --git a/data/src/main/java/com/yapp/growth/data/internal/source/PlanzDataSourceImpl.kt b/data/src/main/java/com/yapp/growth/data/internal/source/PlanzDataSourceImpl.kt index d8f90200..2df0e254 100644 --- a/data/src/main/java/com/yapp/growth/data/internal/source/PlanzDataSourceImpl.kt +++ b/data/src/main/java/com/yapp/growth/data/internal/source/PlanzDataSourceImpl.kt @@ -109,4 +109,9 @@ internal class PlanzDataSourceImpl @Inject constructor( handleApi { retrofitApi.getUserInfo().toUser() } + + override suspend fun deleteUserInfo(): NetworkResult = + handleApi { + retrofitApi.deleteUserInfo() + } } diff --git a/data/src/main/java/com/yapp/growth/data/repository/UserRepositoryImpl.kt b/data/src/main/java/com/yapp/growth/data/repository/UserRepositoryImpl.kt index 7339e163..d3ae829e 100644 --- a/data/src/main/java/com/yapp/growth/data/repository/UserRepositoryImpl.kt +++ b/data/src/main/java/com/yapp/growth/data/repository/UserRepositoryImpl.kt @@ -1,22 +1,17 @@ package com.yapp.growth.data.repository -import com.yapp.growth.data.api.handleApi -import com.yapp.growth.data.response.AccountNotFoundException -import com.yapp.growth.data.response.BadRequestException import com.yapp.growth.data.source.PlanzDataSource import com.yapp.growth.domain.NetworkResult import com.yapp.growth.domain.entity.User -import com.yapp.growth.domain.onError import com.yapp.growth.domain.onSuccess import com.yapp.growth.domain.repository.UserRepository import javax.inject.Inject import javax.inject.Singleton -import kotlin.math.sign @Singleton internal class UserRepositoryImpl @Inject constructor( private val dataSource: PlanzDataSource -): UserRepository { +) : UserRepository { private var cachedUserInfo: User? = null @@ -30,4 +25,7 @@ internal class UserRepositoryImpl @Inject constructor( override suspend fun getCachedUserInfo(): User? = cachedUserInfo + override suspend fun deleteUserInfo(): NetworkResult { + return dataSource.deleteUserInfo() + } } diff --git a/data/src/main/java/com/yapp/growth/data/source/PlanzDataSource.kt b/data/src/main/java/com/yapp/growth/data/source/PlanzDataSource.kt index ed423fd2..f400da17 100644 --- a/data/src/main/java/com/yapp/growth/data/source/PlanzDataSource.kt +++ b/data/src/main/java/com/yapp/growth/data/source/PlanzDataSource.kt @@ -28,4 +28,5 @@ interface PlanzDataSource { suspend fun signUp(): NetworkResult suspend fun getUserInfo(): NetworkResult + suspend fun deleteUserInfo(): NetworkResult } diff --git a/domain/src/main/java/com/yapp/growth/domain/repository/UserRepository.kt b/domain/src/main/java/com/yapp/growth/domain/repository/UserRepository.kt index 0d23a392..28bbdba4 100644 --- a/domain/src/main/java/com/yapp/growth/domain/repository/UserRepository.kt +++ b/domain/src/main/java/com/yapp/growth/domain/repository/UserRepository.kt @@ -7,4 +7,5 @@ interface UserRepository { suspend fun signUp(): NetworkResult suspend fun getUserInfo(): NetworkResult suspend fun getCachedUserInfo(): User? + suspend fun deleteUserInfo(): NetworkResult } diff --git a/domain/src/main/java/com/yapp/growth/domain/usecase/DeleteUserInfoUseCase.kt b/domain/src/main/java/com/yapp/growth/domain/usecase/DeleteUserInfoUseCase.kt new file mode 100644 index 00000000..4c100067 --- /dev/null +++ b/domain/src/main/java/com/yapp/growth/domain/usecase/DeleteUserInfoUseCase.kt @@ -0,0 +1,14 @@ +package com.yapp.growth.domain.usecase + +import com.yapp.growth.domain.NetworkResult +import com.yapp.growth.domain.entity.User +import com.yapp.growth.domain.repository.UserRepository +import javax.inject.Inject + +class DeleteUserInfoUseCase @Inject constructor( + private val repository: UserRepository +) { + suspend operator fun invoke(): NetworkResult { + return repository.deleteUserInfo() + } +} diff --git a/presentation/src/main/java/com/yapp/growth/LoginSdk.kt b/presentation/src/main/java/com/yapp/growth/LoginSdk.kt index 6be84622..ad5ff7a4 100644 --- a/presentation/src/main/java/com/yapp/growth/LoginSdk.kt +++ b/presentation/src/main/java/com/yapp/growth/LoginSdk.kt @@ -18,6 +18,9 @@ interface LoginSdk { @Throws(AuthException::class) suspend fun logout() + @Throws(AuthException::class) + suspend fun withdraw() + @Throws(AuthException::class) suspend fun getAccessToken(): KakaoAccessToken? diff --git a/presentation/src/main/java/com/yapp/growth/presentation/ui/main/myPage/MyPageViewModel.kt b/presentation/src/main/java/com/yapp/growth/presentation/ui/main/myPage/MyPageViewModel.kt index 888d53bf..590103ef 100644 --- a/presentation/src/main/java/com/yapp/growth/presentation/ui/main/myPage/MyPageViewModel.kt +++ b/presentation/src/main/java/com/yapp/growth/presentation/ui/main/myPage/MyPageViewModel.kt @@ -6,6 +6,7 @@ import com.yapp.growth.base.BaseViewModel import com.yapp.growth.domain.onError import com.yapp.growth.domain.onSuccess import com.yapp.growth.domain.runCatching +import com.yapp.growth.domain.usecase.DeleteUserInfoUseCase import com.yapp.growth.domain.usecase.GetUserInfoUseCase import com.yapp.growth.presentation.R import com.yapp.growth.presentation.ui.main.myPage.MyPageContract.LoginState @@ -15,11 +16,13 @@ import com.yapp.growth.presentation.ui.main.myPage.MyPageContract.MyPageViewStat import com.yapp.growth.presentation.util.ResourceProvider import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch +import timber.log.Timber import javax.inject.Inject @HiltViewModel class MyPageViewModel @Inject constructor( private val getUserInfoUseCase: GetUserInfoUseCase, + private val deleteUserInfoUseCase: DeleteUserInfoUseCase, private val resourcesProvider: ResourceProvider, private val kakaoLoginSdk: LoginSdk ) : BaseViewModel(MyPageViewState()) { @@ -53,8 +56,8 @@ class MyPageViewModel @Inject constructor( sendEffect({ MyPageSideEffect.MoveToLogin }) } is MyPageEvent.OnPositiveButtonClicked -> { + withdraw() updateState { copy(isDialogVisible = false) } - // withdraw() } } } @@ -101,6 +104,24 @@ class MyPageViewModel @Inject constructor( } } + private fun withdraw() { + viewModelScope.launch { + deleteUserInfoUseCase.invoke() + .onSuccess { + runCatching { kakaoLoginSdk.withdraw() } + .onSuccess { + sendEffect({ MyPageSideEffect.MoveToLogin }) + } + .onError { + sendEffect({ MyPageSideEffect.ShowToast(resourcesProvider.getString(R.string.my_page_withdraw_error_text)) }) + } + } + .onError { + sendEffect({ MyPageSideEffect.ShowToast(resourcesProvider.getString(R.string.my_page_withdraw_error_text)) }) + } + } + } + private fun fetchUserInfo() { viewModelScope.launch { val cacheInfo = getUserInfoUseCase.getCachedUserInfo() diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index d8ebd066..ca0872b1 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -43,6 +43,7 @@ 다시 생각해볼게요 계정탈퇴 로그아웃에 실패했습니다. 다시 시도해주세요. + 탈퇴 처리에 실패했습니다. 다시 시도해주세요. 개인정보 처리방침