Skip to content

Commit

Permalink
Merge pull request #145 from YAPP-Github/feature/issue-126-withdraw
Browse files Browse the repository at this point in the history
 [ISSUE-126] �탈퇴하기 기능 추가
  • Loading branch information
hoyahozz authored Jul 30, 2022
2 parents 552f2d7 + 7d8945e commit 45f9933
Show file tree
Hide file tree
Showing 10 changed files with 67 additions and 7 deletions.
13 changes: 13 additions & 0 deletions app/src/main/java/com/yapp/growth/kakao/KakaoLoginSdk.kt
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,19 @@ class KakaoLoginSdk @Inject constructor(
awaitLogoutResult.getOrAuthExceptionThrow()
}

override suspend fun withdraw() {
val awaitWithdrawResult = suspendCancellableCoroutine<Result<Unit>> { 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
Expand Down
3 changes: 3 additions & 0 deletions data/src/main/java/com/yapp/growth/data/api/GrowthApi.kt
Original file line number Diff line number Diff line change
Expand Up @@ -79,4 +79,7 @@ interface GrowthApi {

@GET("/api/users/info")
suspend fun getUserInfo(): UserResponseImpl

@POST("/api/users/resign-member")
suspend fun deleteUserInfo()
}
Original file line number Diff line number Diff line change
Expand Up @@ -109,4 +109,9 @@ internal class PlanzDataSourceImpl @Inject constructor(
handleApi {
retrofitApi.getUserInfo().toUser()
}

override suspend fun deleteUserInfo(): NetworkResult<Unit> =
handleApi {
retrofitApi.deleteUserInfo()
}
}
Original file line number Diff line number Diff line change
@@ -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

Expand All @@ -30,4 +25,7 @@ internal class UserRepositoryImpl @Inject constructor(

override suspend fun getCachedUserInfo(): User? = cachedUserInfo

override suspend fun deleteUserInfo(): NetworkResult<Unit> {
return dataSource.deleteUserInfo()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,5 @@ interface PlanzDataSource {

suspend fun signUp(): NetworkResult<User>
suspend fun getUserInfo(): NetworkResult<User>
suspend fun deleteUserInfo(): NetworkResult<Unit>
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@ interface UserRepository {
suspend fun signUp(): NetworkResult<User>
suspend fun getUserInfo(): NetworkResult<User>
suspend fun getCachedUserInfo(): User?
suspend fun deleteUserInfo(): NetworkResult<Unit>
}
Original file line number Diff line number Diff line change
@@ -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<Unit> {
return repository.deleteUserInfo()
}
}
3 changes: 3 additions & 0 deletions presentation/src/main/java/com/yapp/growth/LoginSdk.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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?

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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, MyPageSideEffect, MyPageEvent>(MyPageViewState()) {
Expand Down Expand Up @@ -53,8 +56,8 @@ class MyPageViewModel @Inject constructor(
sendEffect({ MyPageSideEffect.MoveToLogin })
}
is MyPageEvent.OnPositiveButtonClicked -> {
withdraw()
updateState { copy(isDialogVisible = false) }
// withdraw()
}
}
}
Expand Down Expand Up @@ -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()
Expand Down
1 change: 1 addition & 0 deletions presentation/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
<string name="my_page_dialog_positive_button_text">다시 생각해볼게요</string>
<string name="my_page_dialog_negative_button_text">계정탈퇴</string>
<string name="my_page_logout_error_text">로그아웃에 실패했습니다. 다시 시도해주세요.</string>
<string name="my_page_withdraw_error_text">탈퇴 처리에 실패했습니다. 다시 시도해주세요.</string>

<string name="privacy_policy_app_bar_text">개인정보 처리방침</string>

Expand Down

0 comments on commit 45f9933

Please sign in to comment.