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

[Feat/#71] 설정창 / 로그아웃, 회원탈퇴 api 연결 #78

Merged
merged 9 commits into from
Jan 11, 2024
5 changes: 5 additions & 0 deletions core-ui/src/main/java/com/going/ui/extension/EnumUiState.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.going.ui.extension

enum class EnumUiState {
LOADING, SUCCESS, FAILURE
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@ import com.going.data.dto.BaseResponse
import com.going.data.dto.request.SignInRequestDto
import com.going.data.dto.request.SignUpRequestDto
import com.going.data.dto.response.AuthResponseDto
import com.going.data.dto.response.SignInResponseDto

interface AuthDataSource {
suspend fun postSignIn(
Authorization: String,
platform: SignInRequestDto,
): BaseResponse<AuthResponseDto>
): BaseResponse<SignInResponseDto>

suspend fun postSignUp(
Authorization: String,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.going.data.datasource

import com.going.data.dto.NonDataBaseResponse
import com.going.data.dto.response.SignOutResponseDto

interface SettingDataSource {
suspend fun patchSignOut(): SignOutResponseDto

suspend fun deleteWithDraw(): NonDataBaseResponse<Unit>
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ interface TodoDataSource {
suspend fun getTodoListData(
tripId: Long,
category: String,
progress: String
progress: String,
): BaseResponse<List<TodoResponseDto>>

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.going.data.dto.BaseResponse
import com.going.data.dto.request.SignInRequestDto
import com.going.data.dto.request.SignUpRequestDto
import com.going.data.dto.response.AuthResponseDto
import com.going.data.dto.response.SignInResponseDto
import com.going.data.service.AuthService
import javax.inject.Inject

Expand All @@ -14,7 +15,7 @@ class AuthDataSourceImpl @Inject constructor(
override suspend fun postSignIn(
Authorization: String,
platform: SignInRequestDto,
): BaseResponse<AuthResponseDto> =
): BaseResponse<SignInResponseDto> =
authService.postSignin(Authorization, platform)

override suspend fun postSignUp(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.going.data.datasourceImpl

import com.going.data.datasource.SettingDataSource
import com.going.data.dto.NonDataBaseResponse
import com.going.data.dto.response.SignOutResponseDto
import com.going.data.service.SettingService
import javax.inject.Inject
Expand All @@ -9,4 +10,5 @@ class SettingDataSourceImpl @Inject constructor(
private val settingService: SettingService,
) : SettingDataSource {
override suspend fun patchSignOut(): SignOutResponseDto = settingService.patchSignOut()
override suspend fun deleteWithDraw(): NonDataBaseResponse<Unit> = settingService.deleteWithDraw()
}
2 changes: 2 additions & 0 deletions data/src/main/java/com/going/data/dto/BaseResponse.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import kotlinx.serialization.Serializable
data class BaseResponse<T>(
@SerialName("status")
val status: Int,
@SerialName("code")
val code: String,
@SerialName("message")
val message: String,
@SerialName("data")
Expand Down
14 changes: 14 additions & 0 deletions data/src/main/java/com/going/data/dto/NonDataBaseResponse.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.going.data.dto

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

@Serializable
data class NonDataBaseResponse<T>(
@SerialName("status")
val status: Int,
@SerialName("code")
val code: String,
@SerialName("message")
val message: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.going.data.dto.response

import com.going.domain.entity.response.SignInModel
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class SignInResponseDto(
@SerialName("accessToken")
val accessToken: String,
@SerialName("refreshToken")
val refreshToken: String,
@SerialName("isResult")
val isResult: Boolean,
) {
fun toSignInModel() =
SignInModel(accessToken, refreshToken, isResult)
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import com.going.data.dto.request.toSignUpRequestDto
import com.going.domain.entity.request.RequestSignInModel
import com.going.domain.entity.request.RequestSignUpModel
import com.going.domain.entity.response.AuthTokenModel
import com.going.domain.entity.response.SignInModel
import com.going.domain.repository.AuthRepository
import javax.inject.Inject

Expand All @@ -15,12 +16,12 @@ class AuthRepositoryImpl @Inject constructor(
override suspend fun postSignIn(
Authorization: String,
requestSignIpModel: RequestSignInModel,
): Result<AuthTokenModel> =
): Result<SignInModel> =
runCatching {
authDataSource.postSignIn(
Authorization,
requestSignIpModel.toSignInRequestDto(),
).data.toAuthTokenModel()
).data.toSignInModel()
}

override suspend fun postSignUp(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,8 @@ class SettingRepositoryImpl @Inject constructor(
override suspend fun patchSignOut(): Result<SignOutModel> = runCatching {
settingDataSource.patchSignOut().toSignOutModel()
}

override suspend fun deleteWithDraw(): Result<Unit> = runCatching {
settingDataSource.deleteWithDraw()
}
}
3 changes: 2 additions & 1 deletion data/src/main/java/com/going/data/service/AuthService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import com.going.data.dto.BaseResponse
import com.going.data.dto.request.SignInRequestDto
import com.going.data.dto.request.SignUpRequestDto
import com.going.data.dto.response.AuthResponseDto
import com.going.data.dto.response.SignInResponseDto
import retrofit2.http.Body
import retrofit2.http.Header
import retrofit2.http.POST
Expand All @@ -13,7 +14,7 @@ interface AuthService {
suspend fun postSignin(
@Header("Authorization") Authorization: String,
@Body body: SignInRequestDto,
): BaseResponse<AuthResponseDto>
): BaseResponse<SignInResponseDto>

@POST("api/users/signup")
suspend fun postSignUp(
Expand Down
5 changes: 5 additions & 0 deletions data/src/main/java/com/going/data/service/SettingService.kt
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
package com.going.data.service

import com.going.data.dto.NonDataBaseResponse
import com.going.data.dto.response.SignOutResponseDto
import retrofit2.http.DELETE
import retrofit2.http.PATCH

interface SettingService {
@PATCH("api/users/signout")
suspend fun patchSignOut(): SignOutResponseDto

@DELETE("api/users/withdraw")
suspend fun deleteWithDraw(): NonDataBaseResponse<Unit>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.going.domain.entity.response

data class SignInModel(
val accessToken: String,
val refreshToken: String,
val isResult: Boolean,
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@ package com.going.domain.repository
import com.going.domain.entity.request.RequestSignInModel
import com.going.domain.entity.request.RequestSignUpModel
import com.going.domain.entity.response.AuthTokenModel
import com.going.domain.entity.response.SignInModel

interface AuthRepository {
suspend fun postSignIn(
Authorization: String,
data: RequestSignInModel,
): Result<AuthTokenModel>
): Result<SignInModel>

suspend fun postSignUp(
Authorization: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,6 @@ import com.going.domain.entity.response.SignOutModel

interface SettingRepository {
suspend fun patchSignOut(): Result<SignOutModel>

suspend fun deleteWithDraw(): Result<Unit>
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import androidx.lifecycle.lifecycleScope
import com.going.presentation.R
import com.going.presentation.databinding.ActivitySigninBinding
import com.going.presentation.onboarding.signup.OnboardingProfileSettingActivity
import com.going.presentation.setting.SettingActivity
import com.going.presentation.tendencytest.TendencyTestActivity
import com.going.presentation.tendencytest.TendencyTestSplashActivity
import com.going.ui.base.BaseActivity
Expand Down Expand Up @@ -69,7 +70,7 @@ class SignInActivity : BaseActivity<ActivitySigninBinding>(R.layout.activity_sig

private fun navigateToMainScreen() {
// 추후 대시보드 연결시 연결 예정
Intent(this, OnboardingProfileSettingActivity::class.java).apply {
Intent(this, SettingActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
startActivity(this)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,13 +74,16 @@ class SignInViewModel @Inject constructor(
authRepository.postSignIn(accessToken, RequestSignInModel(platform)).onSuccess {
tokenRepository.setTokens(it.accessToken, it.refreshToken)

_postChangeTokenState.value = SignInState.SUCCESS
if (it.isResult) {
_postChangeTokenState.value = SignInState.SUCCESS
} else {
_postChangeTokenState.value = SignInState.TENDENCY
}
}.onFailure {
val errorCode = toErrorCode(it)

_postChangeTokenState.value = when (errorCode) {
SIGN_UP -> SignInState.SIGN_UP
TENDENCY -> SignInState.TENDENCY
else -> SignInState.FAIL
}
}
Expand All @@ -90,6 +93,5 @@ class SignInViewModel @Inject constructor(
companion object {
const val KAKAO = "kakao"
const val SIGN_UP = "e4041"
const val TENDENCY = "e4045"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ import com.going.presentation.R
import com.going.presentation.databinding.ActivitySettingBinding
import com.going.ui.base.BaseActivity
import com.going.ui.extension.setOnSingleClickListener
import dagger.hilt.android.AndroidEntryPoint

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

private var quitDialog: SettingQuitDialogFragment? = null
Expand All @@ -21,30 +23,25 @@ class SettingActivity : BaseActivity<ActivitySettingBinding>(R.layout.activity_s
initLogoutClickListener()
initQuitClickListener()
setVersionCode()

}

private fun initProfileClickListener() {
binding.layoutSettingProfile.setOnSingleClickListener {

}
}

private fun initInquireClickListener() {
binding.layoutSettingInquire.setOnSingleClickListener {

}
}

private fun initPolicyClickListener() {
binding.layoutSettingPolicy.setOnSingleClickListener {

}
}

private fun initAboutDooripClickListener() {
binding.layoutSettingAboutDoorip.setOnSingleClickListener {

}
}

Expand Down Expand Up @@ -83,5 +80,4 @@ class SettingActivity : BaseActivity<ActivitySettingBinding>(R.layout.activity_s
companion object {
private const val VERSION_CODE = "v1.0"
}

}
}
Original file line number Diff line number Diff line change
@@ -1,22 +1,35 @@
package com.going.presentation.setting

import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.View
import android.view.WindowManager
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.flowWithLifecycle
import androidx.lifecycle.lifecycleScope
import com.going.presentation.R
import com.going.presentation.databinding.FragmentSettingLogoutDialogBinding
import com.going.ui.base.BaseDialog
import com.going.ui.extension.EnumUiState
import com.going.ui.extension.setOnSingleClickListener
import com.going.ui.extension.toast
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach

class SettingLogoutDialogFragment :
@AndroidEntryPoint
class SettingLogoutDialogFragment() :
BaseDialog<FragmentSettingLogoutDialogBinding>(R.layout.fragment_setting_logout_dialog) {

private val viewModel by activityViewModels<SettingViewModel>()

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

initNegativeClickListener()
initPositiveClickListener()

observeUserSignOutState()
}

override fun onStart() {
Expand All @@ -31,14 +44,31 @@ class SettingLogoutDialogFragment :

private fun initPositiveClickListener() {
binding.tvDialogPositive.setOnSingleClickListener {
// 로그아웃 버튼 눌렀을 때의 로직
viewModel.signOutKakao()
}
}

private fun observeUserSignOutState() {
viewModel.userSignOutState.flowWithLifecycle(lifecycle).onEach { state ->
when (state) {
EnumUiState.SUCCESS -> restartApp(requireContext())
EnumUiState.FAILURE -> toast(getString(R.string.server_error))
EnumUiState.LOADING -> {}
}
}.launchIn(lifecycleScope)
}

private fun initNegativeClickListener() {
binding.btnDialogNegative.setOnSingleClickListener {
dismiss()
}
}

private fun restartApp(context: Context) {
val packageManager = context.packageManager
val packageName = context.packageName
val componentName = packageManager.getLaunchIntentForPackage(packageName)?.component
context.startActivity(Intent.makeRestartActivityTask(componentName))
Runtime.getRuntime().exit(0)
}
}
Loading