Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#74 [feat] 회원 탈퇴 서버통신 #78

Merged
merged 9 commits into from
Jan 17, 2024
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.sopetit.softie.data.repositoryImpl

import com.sopetit.softie.data.source.AuthDataSource
import com.sopetit.softie.domain.repository.AuthRepository
import javax.inject.Inject

class AuthRepositoryImpl @Inject constructor(
private val authDataSource: AuthDataSource
) : AuthRepository {

override suspend fun deleteAuth(): Result<Unit> = runCatching { authDataSource.deleteAuth() }
}
10 changes: 10 additions & 0 deletions app/src/main/java/com/sopetit/softie/data/service/AuthService.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.sopetit.softie.data.service

import com.sopetit.softie.data.entity.BaseResponse
import retrofit2.http.DELETE

interface AuthService {

@DELETE("/api/v1/auth")
suspend fun deleteAuth(): BaseResponse<Unit>
}
12 changes: 12 additions & 0 deletions app/src/main/java/com/sopetit/softie/data/source/AuthDataSource.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.sopetit.softie.data.source

import com.sopetit.softie.data.entity.BaseResponse
import com.sopetit.softie.data.service.AuthService
import javax.inject.Inject

class AuthDataSource @Inject constructor(
private val authService: AuthService
) {

suspend fun deleteAuth(): BaseResponse<Unit> = authService.deleteAuth()
}
8 changes: 8 additions & 0 deletions app/src/main/java/com/sopetit/softie/di/RepositoryModule.kt
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package com.sopetit.softie.di

import com.sopetit.softie.data.repositoryImpl.AuthRepositoryImpl
import com.sopetit.softie.data.repositoryImpl.DailyRoutineRepositoryImpl
import com.sopetit.softie.data.repositoryImpl.DollRepositoryImpl
import com.sopetit.softie.data.repositoryImpl.HappinessRoutineRepositoryImpl
import com.sopetit.softie.data.repositoryImpl.MemberRepositoryImpl
import com.sopetit.softie.domain.repository.AuthRepository
import com.sopetit.softie.domain.repository.DailyRoutineRepository
import com.sopetit.softie.domain.repository.DollRepository
import com.sopetit.softie.domain.repository.HappinessRoutineRepository
Expand Down Expand Up @@ -40,4 +42,10 @@ abstract class RepositoryModule {
abstract fun bindToHappinessRoutineRepository(
happinessRoutineRepositoryImpl: HappinessRoutineRepositoryImpl
): HappinessRoutineRepository

@Binds
@Singleton
abstract fun bindToAuthRepository(
authRepositoryImpl: AuthRepositoryImpl
): AuthRepository
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.sopetit.softie.di

import com.sopetit.softie.data.service.AuthService
import com.sopetit.softie.data.service.DailyRoutineService
import com.sopetit.softie.data.service.DollService
import com.sopetit.softie.data.service.HappinessRoutineService
Expand Down Expand Up @@ -28,4 +29,8 @@ object RetrofitServiceModule {
@Provides
fun providesDollService(@RetrofitModule.SoftieType retrofit: Retrofit): DollService =
retrofit.create(DollService::class.java)

@Provides
fun providesAuthService(@RetrofitModule.SoftieType retrofit: Retrofit): AuthService =
retrofit.create(AuthService::class.java)
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
package com.sopetit.softie.domain.repository

interface AuthRepository
interface AuthRepository {

suspend fun deleteAuth(): Result<Unit>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.sopetit.softie.domain.usecase.auth

import com.sopetit.softie.domain.repository.AuthRepository
import javax.inject.Inject

class DeleteAuthUseCase @Inject constructor(
private val authRepository: AuthRepository
) {

suspend operator fun invoke() = authRepository.deleteAuth()
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ import com.sopetit.softie.R
import com.sopetit.softie.databinding.ActivitySettingBinding
import com.sopetit.softie.util.binding.BindingActivity
import com.sopetit.softie.util.setStatusBarColorFromResource
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class SettingActivity : BindingActivity<ActivitySettingBinding>(R.layout.activity_setting) {

private val viewModel by viewModels<SettingViewModel>()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,47 @@
package com.sopetit.softie.ui.setting

import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.os.Bundle
import android.text.SpannableStringBuilder
import android.text.Spanned
import android.text.style.ForegroundColorSpan
import android.view.View
import androidx.core.content.ContextCompat
import androidx.lifecycle.ViewModelProvider
import com.sopetit.softie.R
import com.sopetit.softie.databinding.FragmentSettingUserExitBinding
import com.sopetit.softie.ui.main.LoginActivity
import com.sopetit.softie.ui.onboarding.OnboardingViewModel.Companion.BROWN
import com.sopetit.softie.ui.onboarding.OnboardingViewModel.Companion.GRAY
import com.sopetit.softie.ui.onboarding.OnboardingViewModel.Companion.RED
import com.sopetit.softie.ui.onboarding.OnboardingViewModel.Companion.WHITE
import com.sopetit.softie.util.binding.BindingFragment
import dagger.hilt.android.AndroidEntryPoint
import timber.log.Timber

@AndroidEntryPoint
class SettingUserExitFragment :
BindingFragment<FragmentSettingUserExitBinding>(R.layout.fragment_setting_user_exit) {

private lateinit var viewModel: SettingViewModel
private lateinit var sharedPreferences: SharedPreferences

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

viewModel = ViewModelProvider(requireActivity()).get(SettingViewModel::class.java)
binding.viewModel = viewModel

sharedPreferences =
this.requireActivity().getSharedPreferences("user", Context.MODE_PRIVATE)
val bearType = sharedPreferences.getString("bearType", BROWN)
Comment on lines +37 to +39
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

제가 다음 pr때 관련 UseCase 만들어 두겠습니다~!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

네엡


initSetBear(bearType)
initSetSpeechText()
initSetClickBackBtn()
initSetClickExitBtn()
}

private fun initSetSpeechText() {
Expand All @@ -37,8 +61,17 @@ class SettingUserExitFragment :
}
}

private fun initSetBear() {
// TODO bear type 받아서 bear 이미지 띄우기
private fun initSetBear(bearType: String?) {
when (bearType) {
BROWN -> setBearImage(R.drawable.ic_bear_brown_crying)
GRAY -> setBearImage(R.drawable.ic_bear_gray_crying)
RED -> setBearImage(R.drawable.ic_bear_red_crying)
WHITE -> setBearImage(R.drawable.ic_bear_panda_crying)
}
}

private fun setBearImage(image: Int) {
binding.ivUserExitBear.setImageResource(image)
}

private fun initSetClickBackBtn() {
Expand All @@ -49,7 +82,19 @@ class SettingUserExitFragment :

private fun initSetClickExitBtn() {
binding.btnUserExitExit.setOnClickListener {
// TODO 회원탈퇴 로직 추가
viewModel.setDeleteAuth()

deleteAuth()
}
}

private fun deleteAuth() {
val intent = Intent(requireActivity(), LoginActivity::class.java)
viewModel.isDeleteAuthResponse.observe(viewLifecycleOwner) { deleteSuccess ->
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

viewLifecycleOwner.. 아직 쓰면서도 정확히 어떤 기능을 하는지 잘 모르겠네요

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저두요ㅣ..ㅠ

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fragment에서 livedata를 옵저빙할 때 viewLifecycleOwner를 사용하면 fragment의 생명주기를 따르기 때문에 this에서 옵저버가 여러개 생기는 이슈를 방지하고 메모리 누수를 방지할 수 있습니다!

if (deleteSuccess) {
Timber.d("setting -> 멤버 탈퇴 성공")
startActivity(intent)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,40 @@ package com.sopetit.softie.ui.setting
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.sopetit.softie.domain.usecase.auth.DeleteAuthUseCase
import com.sopetit.softie.ui.setting.SettingActivity.Companion.SETTING_INIT
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import timber.log.Timber
import javax.inject.Inject

class SettingViewModel : ViewModel() {
@HiltViewModel
class SettingViewModel @Inject constructor(
private val deleteAuthUseCase: DeleteAuthUseCase
) : ViewModel() {

private val _settingFragment: MutableLiveData<String> = MutableLiveData(SETTING_INIT)
val settingFragment: LiveData<String>
get() = _settingFragment

private val _isDeleteAuthResponse: MutableLiveData<Boolean> = MutableLiveData()
val isDeleteAuthResponse: LiveData<Boolean>
get() = _isDeleteAuthResponse

fun setSettingFragment(clickFragment: String) {
_settingFragment.value = clickFragment
}

fun setDeleteAuth() {
viewModelScope.launch {
deleteAuthUseCase.invoke()
.onSuccess {
_isDeleteAuthResponse.value = true
}.onFailure { throwable ->
_isDeleteAuthResponse.value = false
Timber.e("서버 통신 실패 -> ${throwable.message}")
}
}
}
}