Skip to content

Commit

Permalink
Merge pull request #58 from Team-Motivoo/feat/#48-logout-withdraw-api…
Browse files Browse the repository at this point in the history
…-connection

[feat] 로그아웃, 회원탈퇴 api 연동
  • Loading branch information
l2zh committed Jan 17, 2024
2 parents 78c61be + ad0da39 commit 2cd2267
Show file tree
Hide file tree
Showing 17 changed files with 211 additions and 53 deletions.
17 changes: 0 additions & 17 deletions .idea/deploymentTargetDropDown.xml

This file was deleted.

2 changes: 1 addition & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

<application
android:name=".MotivooApplication"
android:allowBackup="true"
android:allowBackup="false"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,6 @@ class MotivooStorageImpl @Inject constructor(@ApplicationContext context: Contex
get() = pref.getInt(STEP_COUNT, 0)
set(value) = pref.edit { putInt(STEP_COUNT, value) }

override var nickName: String
get() = pref.getString(NAME, "") ?: ""
set(value) = pref.edit { putString(NAME, value) }

override var userId: Long
set(value) = pref.edit { putLong(USER_ID, value) }
get() = pref.getLong(USER_ID, 0L)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package sopt.motivoo.data.datasource.remote

import sopt.motivoo.data.model.request.auth.RequestLoginDto
import sopt.motivoo.data.model.response.auth.ResponseLoginDto
import sopt.motivoo.data.model.response.auth.ResponseLogoutDto
import sopt.motivoo.data.model.response.auth.ResponseWithDrawDto
import sopt.motivoo.data.service.AuthService
import javax.inject.Inject

Expand All @@ -12,4 +14,10 @@ class AuthDataSource @Inject constructor(
requestLogin: RequestLoginDto
): ResponseLoginDto =
authService.postLogin(requestLogin)

suspend fun postLogout(): ResponseLogoutDto =
authService.postLogout()

suspend fun deleteWithDraw(): ResponseWithDrawDto =
authService.deleteWithDraw()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package sopt.motivoo.data.model.response.auth

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class ResponseLogoutDto(
@SerialName("code")
val code: Int,
@SerialName("message")
val message: String,
@SerialName("success")
val success: Boolean
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package sopt.motivoo.data.model.response.auth

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class ResponseWithDrawDto(
@SerialName("code")
val code: Int,
@SerialName("message")
val message: String,
@SerialName("success")
val success: Boolean
)
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package sopt.motivoo.data.repository

import sopt.motivoo.data.datasource.remote.AuthDataSource
import sopt.motivoo.data.model.request.auth.RequestLoginDto
import sopt.motivoo.data.model.response.auth.ResponseLogoutDto
import sopt.motivoo.data.model.response.auth.ResponseWithDrawDto
import sopt.motivoo.domain.entity.auth.LoginInfo
import sopt.motivoo.domain.repository.AuthRepository
import javax.inject.Inject
Expand All @@ -12,4 +14,10 @@ class AuthRepositoryImpl @Inject constructor(

override suspend fun postLogin(requestLoginDto: RequestLoginDto): Result<LoginInfo> =
runCatching { authDataSource.postLogin(requestLoginDto).toLoginInfo() }

override suspend fun postLogout(): Result<ResponseLogoutDto> =
runCatching { authDataSource.postLogout() }

override suspend fun deleteWithDraw(): Result<ResponseWithDrawDto> =
runCatching { authDataSource.deleteWithDraw() }
}
9 changes: 9 additions & 0 deletions app/src/main/java/sopt/motivoo/data/service/AuthService.kt
Original file line number Diff line number Diff line change
@@ -1,13 +1,22 @@
package sopt.motivoo.data.service

import retrofit2.http.Body
import retrofit2.http.DELETE
import retrofit2.http.POST
import sopt.motivoo.data.model.request.auth.RequestLoginDto
import sopt.motivoo.data.model.response.auth.ResponseLoginDto
import sopt.motivoo.data.model.response.auth.ResponseLogoutDto
import sopt.motivoo.data.model.response.auth.ResponseWithDrawDto

interface AuthService {
@POST("oauth/login")
suspend fun postLogin(
@Body requestLoginDto: RequestLoginDto,
): ResponseLoginDto

@POST("oauth/logout")
suspend fun postLogout(): ResponseLogoutDto

@DELETE("withdraw")
suspend fun deleteWithDraw(): ResponseWithDrawDto
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package sopt.motivoo.domain.entity

interface MotivooStorage {
var nickName: String
var stepCount: Int
var accessToken: String
var refreshToken: String
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,15 @@ package sopt.motivoo.domain.repository

import retrofit2.http.Body
import sopt.motivoo.data.model.request.auth.RequestLoginDto
import sopt.motivoo.data.model.response.auth.ResponseLogoutDto
import sopt.motivoo.data.model.response.auth.ResponseWithDrawDto
import sopt.motivoo.domain.entity.auth.LoginInfo

interface AuthRepository {

suspend fun postLogin(@Body requestLoginDto: RequestLoginDto): Result<LoginInfo>

suspend fun postLogout(): Result<ResponseLogoutDto>

suspend fun deleteWithDraw(): Result<ResponseWithDrawDto>
}
53 changes: 45 additions & 8 deletions app/src/main/java/sopt/motivoo/presentation/MyLogoutFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,33 +2,70 @@ package sopt.motivoo.presentation

import android.os.Bundle
import android.view.View
import androidx.fragment.app.viewModels
import androidx.lifecycle.flowWithLifecycle
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavOptions
import androidx.navigation.fragment.findNavController
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import sopt.motivoo.R
import sopt.motivoo.data.service.KakaoAuthService
import sopt.motivoo.databinding.FragmentMypageLogoutBinding
import sopt.motivoo.presentation.auth.AuthViewModel
import sopt.motivoo.util.UiState
import sopt.motivoo.util.binding.BindingDialogFragment
import sopt.motivoo.util.extension.setOnSingleClickListener
import sopt.motivoo.util.findStartDestination
import javax.inject.Inject

@AndroidEntryPoint
class MyLogoutFragment :
BindingDialogFragment<FragmentMypageLogoutBinding>(R.layout.fragment_mypage_logout) {

private val authViewModel by viewModels<AuthViewModel>()

@Inject
lateinit var kakaoAuthService: KakaoAuthService

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setLayoutSizeRatio(widthPercent = 1f, heightPercent = 1f)
clickButtons()
}

private fun clickButtons() {
binding.tvMyLogoutBtn.setOnClickListener {
navigateToLogin()
binding.tvMyLogoutBtn.setOnSingleClickListener {
kakaoAuthService.logoutKakao(authViewModel::postLogout)
collectData()
}

binding.tvMyLogoutCancelBtn.setOnClickListener {
navigateMyInfo()
binding.tvMyLogoutCancelBtn.setOnSingleClickListener {
findNavController().popBackStack()
}
}

private fun navigateToLogin() {
findNavController().navigate(R.id.action_myLogout_to_loginFragment)
private fun collectData() {
authViewModel.logoutState.flowWithLifecycle(lifecycle).onEach { uiState ->
when (uiState) {
is UiState.Success -> {
authViewModel.resetLogoutState()
navigateToLogin()
}

else -> Unit
}
}.launchIn(lifecycleScope)
}

private fun navigateMyInfo() {
findNavController().navigate(R.id.action_myLogout_to_myInfoFragment)
private fun navigateToLogin() {
val navController = findNavController()
val startDestinationId = navController.findStartDestination().id
val navOptions = NavOptions.Builder()
.setPopUpTo(startDestinationId, true)
.build()

navController.navigate(R.id.action_myLogout_to_loginFragment, null, navOptions)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,33 +2,61 @@ package sopt.motivoo.presentation

import android.os.Bundle
import android.view.View
import androidx.fragment.app.viewModels
import androidx.lifecycle.flowWithLifecycle
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import sopt.motivoo.R
import sopt.motivoo.data.service.KakaoAuthService
import sopt.motivoo.databinding.FragmentMypageServiceOutBinding
import sopt.motivoo.presentation.auth.AuthViewModel
import sopt.motivoo.util.UiState
import sopt.motivoo.util.binding.BindingDialogFragment
import javax.inject.Inject

@AndroidEntryPoint
class MyServiceOutFragment :
BindingDialogFragment<FragmentMypageServiceOutBinding>(R.layout.fragment_mypage_service_out) {

private val authViewModel by viewModels<AuthViewModel>()

@Inject
lateinit var kakaoAuthService: KakaoAuthService

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setLayoutSizeRatio(widthPercent = 1f, heightPercent = 1f)
clickButtons()
}

private fun clickButtons() {
binding.tvMyServiceOutBtn.setOnClickListener {
navigateToLogin()
kakaoAuthService.logoutKakao(authViewModel::withDraw)
collectData()
}

binding.tvMyServiceOutCancelBtn.setOnClickListener {
navigateMyInfo()
findNavController().popBackStack()
}
}

private fun navigateToLogin() {
findNavController().navigate(R.id.action_myServiceOut_to_loginFragment)
private fun collectData() {
authViewModel.withDrawState.flowWithLifecycle(lifecycle).onEach { uiState ->
when (uiState) {
is UiState.Success -> {
authViewModel.resetWithDrawState()
navigateToLogin()
}

else -> Unit
}
}.launchIn(lifecycleScope)
}

private fun navigateMyInfo() {
findNavController().navigate(R.id.action_myServiceOut_to_myInfoFragment)
private fun navigateToLogin() {
findNavController().navigate(R.id.action_myServiceOut_to_loginFragment)
}
}
40 changes: 35 additions & 5 deletions app/src/main/java/sopt/motivoo/presentation/auth/AuthViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,24 @@ class AuthViewModel @Inject constructor(
private val _loginState = MutableStateFlow<UiState<Boolean>>(UiState.Loading)
val loginState get() = _loginState.asStateFlow()

private fun setAutoLogin() {
motivooStorage.isUserLoggedIn = true
}
private val _logoutState = MutableStateFlow<UiState<Boolean>>(UiState.Loading)
val logoutState get() = _logoutState.asStateFlow()

private val _withDrawState = MutableStateFlow<UiState<Boolean>>(UiState.Loading)
val withDrawState get() = _withDrawState.asStateFlow()

fun resetLoginState() {
_loginState.value = UiState.Loading
}

fun resetLogoutState() {
_logoutState.value = UiState.Loading
}

fun resetWithDrawState() {
_withDrawState.value = UiState.Loading
}

fun postLogin(
platformToken: String,
) {
Expand All @@ -51,11 +61,31 @@ class AuthViewModel @Inject constructor(

private fun handleLoginSuccess(signUpResponse: LoginInfo) {
motivooStorage.userId = signUpResponse.id
motivooStorage.nickName = signUpResponse.nickName
motivooStorage.accessToken = BEARER_PREFIX + signUpResponse.accessToken
motivooStorage.refreshToken = BEARER_PREFIX + signUpResponse.refreshToken
_loginState.value = UiState.Success(true)
setAutoLogin()
}

fun postLogout() {
viewModelScope.launch {
authRepository.postLogout()
.onSuccess {
_logoutState.value = UiState.Success(true)
}.onFailure { throwable ->
_logoutState.value = UiState.Failure(throwable.message.toString())
}
}
}

fun withDraw() {
viewModelScope.launch {
authRepository.deleteWithDraw()
.onSuccess {
_withDrawState.value = UiState.Success(true)
}.onFailure { throwable ->
_withDrawState.value = UiState.Failure(throwable.message.toString())
}
}
}

companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,33 @@ class TermsOfUseFragment :
goToBack()
clickDoneButton()
setupCheckAllListener()
goToTermsWebFragment()
}

private fun goToTermsWebFragment() {
binding.tvTermsOfUseLink.setOnSingleClickListener {
val action = TermsOfUseFragmentDirections
.actionTermsOfUseFragmentToWebViewFragment("https://gayeong04.notion.site/82b7d6d8cc3f4091aa0a3b41bbfc6c62?pvs=4")
findNavController().navigate(action)
}

binding.tvTermsGetInfoLink.setOnSingleClickListener {
val action = TermsOfUseFragmentDirections
.actionTermsOfUseFragmentToWebViewFragment("https://gayeong04.notion.site/e85e6a92bcce43bbac61c0de4e79cd14?pvs=4")
findNavController().navigate(action)
}

binding.tvTermsUseInfoLink.setOnSingleClickListener {
val action = TermsOfUseFragmentDirections
.actionTermsOfUseFragmentToWebViewFragment("https://gayeong04.notion.site/df1e215e4b2248d28a913ea27788a777?pvs=4")
findNavController().navigate(action)
}
}

private fun clickDoneButton() {
binding.btnTermsOfUseDone.setOnSingleClickListener {
findNavController().navigate(R.id.action_termsOfUseFragment_to_startMotivooFragment)
motivooStorage.isUserLoggedIn = true
}
}

Expand Down
Loading

0 comments on commit 2cd2267

Please sign in to comment.