diff --git a/core/data/api/src/main/kotlin/com/ninecraft/booket/core/data/api/repository/AuthRepository.kt b/core/data/api/src/main/kotlin/com/ninecraft/booket/core/data/api/repository/AuthRepository.kt index 91476806..cee763e6 100644 --- a/core/data/api/src/main/kotlin/com/ninecraft/booket/core/data/api/repository/AuthRepository.kt +++ b/core/data/api/src/main/kotlin/com/ninecraft/booket/core/data/api/repository/AuthRepository.kt @@ -8,6 +8,8 @@ interface AuthRepository { suspend fun logout(): Result + suspend fun withdraw(): Result + suspend fun agreeTerms(termsAgreed: Boolean): Result val autoLoginState: Flow diff --git a/core/data/impl/src/main/kotlin/com/ninecraft/booket/core/data/impl/repository/DefaultAuthRepository.kt b/core/data/impl/src/main/kotlin/com/ninecraft/booket/core/data/impl/repository/DefaultAuthRepository.kt index 5ecda13b..24829747 100644 --- a/core/data/impl/src/main/kotlin/com/ninecraft/booket/core/data/impl/repository/DefaultAuthRepository.kt +++ b/core/data/impl/src/main/kotlin/com/ninecraft/booket/core/data/impl/repository/DefaultAuthRepository.kt @@ -31,6 +31,11 @@ internal class DefaultAuthRepository @Inject constructor( clearTokens() } + override suspend fun withdraw() = runSuspendCatching { + service.withdraw() + clearTokens() + } + override suspend fun agreeTerms(termsAgreed: Boolean) = runSuspendCatching { service.agreeTerms(TermsAgreementRequest(termsAgreed)) Unit diff --git a/core/network/src/main/kotlin/com/ninecraft/booket/core/network/service/ReedService.kt b/core/network/src/main/kotlin/com/ninecraft/booket/core/network/service/ReedService.kt index 1f45b52b..f889cccd 100644 --- a/core/network/src/main/kotlin/com/ninecraft/booket/core/network/service/ReedService.kt +++ b/core/network/src/main/kotlin/com/ninecraft/booket/core/network/service/ReedService.kt @@ -17,6 +17,7 @@ import com.ninecraft.booket.core.network.response.RefreshTokenResponse import com.ninecraft.booket.core.network.response.TermsAgreementResponse import com.ninecraft.booket.core.network.response.UserProfileResponse import retrofit2.http.Body +import retrofit2.http.DELETE import retrofit2.http.GET import retrofit2.http.POST import retrofit2.http.PUT @@ -35,10 +36,14 @@ interface ReedService { @POST("api/v1/auth/signout") suspend fun logout() - @PUT("api/v1/auth/terms-agreement") + @DELETE("api/v1/auth/withdraw") + suspend fun withdraw() + + // User endpoints (auth required) + @PUT("api/v1/users/me/terms-agreement") suspend fun agreeTerms(@Body termsAgreementRequest: TermsAgreementRequest): TermsAgreementResponse - @GET("api/v1/auth/me") + @GET("api/v1/users/me") suspend fun getUserProfile(): UserProfileResponse // Book endpoints (auth required) diff --git a/feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/SettingsPresenter.kt b/feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/SettingsPresenter.kt index c3473a43..f9715e19 100644 --- a/feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/SettingsPresenter.kt +++ b/feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/SettingsPresenter.kt @@ -105,7 +105,32 @@ class SettingsPresenter @AssistedInject constructor( } is SettingsUiEvent.Withdraw -> { - // TODO: 회원탈퇴 처리 -> 성공 시 로그인 화면으로 이동 + scope.launch { + try { + isLoading = true + authRepository.withdraw() + .onSuccess { + navigator.resetRoot(LoginScreen) + } + .onFailure { exception -> + val handleErrorMessage = { message: String -> + Logger.e(message) + sideEffect = SettingsSideEffect.ShowToast(message) + } + + handleException( + exception = exception, + onError = handleErrorMessage, + onLoginRequired = { + navigator.resetRoot(LoginScreen) + }, + ) + } + } finally { + isLoading = false + } + } + isWithdrawBottomSheetVisible = false } } }