From b4fdeadbcaa2b071bd85eb4c73b51a5a30f071a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EA=B1=B4=ED=9D=AC?= Date: Tue, 22 Jul 2025 15:23:58 +0900 Subject: [PATCH 1/8] =?UTF-8?q?#303=20-=20fix=20:=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=ED=95=A0=EB=95=8C=20=ED=95=98=EB=93=9C=EC=BD=94?= =?UTF-8?q?=EB=94=A9=EB=90=98=EC=96=B4=EC=9E=88=EB=8A=94=20=EA=B0=92?= =?UTF-8?q?=EC=9D=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- feature/login/src/main/java/com/core/login/LoginViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/login/src/main/java/com/core/login/LoginViewModel.kt b/feature/login/src/main/java/com/core/login/LoginViewModel.kt index c9f61420..62521e05 100644 --- a/feature/login/src/main/java/com/core/login/LoginViewModel.kt +++ b/feature/login/src/main/java/com/core/login/LoginViewModel.kt @@ -59,7 +59,7 @@ class LoginViewModel @Inject constructor( fun postLogin(userId: Long) { socialId = "$userId" viewModelScope.launch { - postLoginUseCase("950331") + postLoginUseCase(socialId) .catch { Timber.e("viewModel postLogin error $it") _error.emit(it) From 0b21fe871c2aa2a3e844a91ac928448d73f6e549 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EA=B1=B4=ED=9D=AC?= Date: Tue, 22 Jul 2025 15:52:32 +0900 Subject: [PATCH 2/8] =?UTF-8?q?#303=20-=20refactor=20:=20Flow=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=EC=97=90=EC=84=9C=20Result=EB=A1=9C=20?= =?UTF-8?q?=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 먼저 Repository부터 변경하고 테스트코드 만들고 작업해보자 --- .../repository/LoginRepositoryImpl.kt | 42 ++++++------------- .../dataapi/repository/LoginRepository.kt | 4 +- .../screen/detail/CommunityDetailScreen.kt | 4 +- .../viewmodel/CommunityDetailViewModel.kt | 2 +- 4 files changed, 16 insertions(+), 36 deletions(-) diff --git a/core/data/src/main/java/com/youthtalk/repository/LoginRepositoryImpl.kt b/core/data/src/main/java/com/youthtalk/repository/LoginRepositoryImpl.kt index c156c2c9..bb216ae8 100644 --- a/core/data/src/main/java/com/youthtalk/repository/LoginRepositoryImpl.kt +++ b/core/data/src/main/java/com/youthtalk/repository/LoginRepositoryImpl.kt @@ -4,40 +4,30 @@ import com.core.dataapi.repository.LoginRepository import com.core.datastore.datasource.DataStoreDataSource import com.core.exception.NoDataException import com.youthtalk.data.LoginService -import com.youthtalk.dto.MemberId import com.youthtalk.dto.login.LoginRequest import com.youthtalk.dto.login.SignRequest import com.youthtalk.model.typeenum.toRegion -import com.youthtalk.utils.ErrorUtils.throwableError +import com.youthtalk.utils.ErrorUtils.createResult import javax.inject.Inject import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.flow import timber.log.Timber class LoginRepositoryImpl @Inject constructor( private val loginService: LoginService, private val dataStoreDataSource: DataStoreDataSource ) : LoginRepository { - override fun postLogin(socialId: String): Flow = flow { - Timber.e("LoginRepositoryImpl postLogin start") - runCatching { loginService.postLogin(LoginRequest(socialType = "kakao", socialId = socialId).toRequestBody()) } - .onSuccess { token -> - Timber.e("LoginRepositoryImpl postLogin Success $token") - token.data?.let { data -> - emit(data.memberId) - } ?: throw NoDataException() - } - .onFailure { error -> - Timber.e("LoginRepositoryImpl postLogin error : $error") - throwableError(error) - } + override suspend fun postLogin(socialId: String): Result { + return createResult { + loginService.postLogin(LoginRequest(socialType = "kakao", socialId = socialId).toRequestBody()).data?.memberId ?: throw NoDataException() + }.onFailure { error -> + Timber.e("error : $error") + } } override fun hasToken(): Flow = dataStoreDataSource.hasToken() - override fun postSign(id: String, nickname: String, region: String): Flow = flow { - Timber.e("LoginRepositoryImpl start") - runCatching { + override suspend fun postSign(id: String, nickname: String, region: String): Result { + return createResult { loginService.postSignUp( SignRequest( socialType = "kakao", @@ -45,17 +35,9 @@ class LoginRepositoryImpl @Inject constructor( nickname = nickname, region = region.toRegion().region ).toRequestBody() - ) + ).data ?: throw NoDataException() + }.onFailure { error -> + Timber.e("error : $error") } - .onSuccess { response -> - Timber.e("LoginRepositoryImpl Success $response") - response.data?.let { - emit(it) - } ?: throw NoDataException() - } - .onFailure { error -> - Timber.e("LoginRepositoryImpl error : $error") - throwableError(error) - } } } diff --git a/core/dataApi/src/main/java/com/core/dataapi/repository/LoginRepository.kt b/core/dataApi/src/main/java/com/core/dataapi/repository/LoginRepository.kt index b36db5cf..f205dc62 100644 --- a/core/dataApi/src/main/java/com/core/dataapi/repository/LoginRepository.kt +++ b/core/dataApi/src/main/java/com/core/dataapi/repository/LoginRepository.kt @@ -3,9 +3,9 @@ package com.core.dataapi.repository import kotlinx.coroutines.flow.Flow interface LoginRepository { - fun postLogin(socialId: String): Flow + suspend fun postLogin(socialId: String): Result fun hasToken(): Flow - fun postSign(id: String, nickname: String, region: String): Flow + suspend fun postSign(id: String, nickname: String, region: String): Result } diff --git a/feature/community/src/main/java/com/core/community/screen/detail/CommunityDetailScreen.kt b/feature/community/src/main/java/com/core/community/screen/detail/CommunityDetailScreen.kt index d13654d3..33ae737b 100644 --- a/feature/community/src/main/java/com/core/community/screen/detail/CommunityDetailScreen.kt +++ b/feature/community/src/main/java/com/core/community/screen/detail/CommunityDetailScreen.kt @@ -145,7 +145,7 @@ fun CommunityDetailScreen( is CommunityDetailUiEffect.ShowSnackBarReportFail -> { showSnackBar(it.message.toString()) } - + is CommunityDetailUiEffect.InitError -> { showSnackBar(it.message) onBack() @@ -154,7 +154,6 @@ fun CommunityDetailScreen( showSnackBar(context.getString(R.string.block_user_snackbar_message, it.userName)) onBack() } - } } } @@ -259,7 +258,6 @@ fun CommunityDetailScreen( } ) } - } @OptIn(ExperimentalMaterial3Api::class) diff --git a/feature/community/src/main/java/com/core/community/viewmodel/CommunityDetailViewModel.kt b/feature/community/src/main/java/com/core/community/viewmodel/CommunityDetailViewModel.kt index 35b01adb..47740dd9 100644 --- a/feature/community/src/main/java/com/core/community/viewmodel/CommunityDetailViewModel.kt +++ b/feature/community/src/main/java/com/core/community/viewmodel/CommunityDetailViewModel.kt @@ -227,7 +227,7 @@ class CommunityDetailViewModel @Inject constructor( } } } - + private fun initData(postId: Long) { viewModelScope.launch { combine( From f6cfb252b8247973e142bb905137598989b49f92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EA=B1=B4=ED=9D=AC?= Date: Tue, 22 Jul 2025 23:01:12 +0900 Subject: [PATCH 3/8] =?UTF-8?q?#303=20-=20fix=20:=20CustomException?= =?UTF-8?q?=EC=9D=84=20=EB=8B=A4=20RuntimeException=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit mockito에서 테스트코드를 작성하기 위해서는 언체크드 예외로 변경해야함 --- .../src/main/java/com/core/exception/BadRequestException.kt | 2 +- .../src/main/java/com/core/exception/InvalidValueException.kt | 2 +- .../src/main/java/com/core/exception/NetworkErrorException.kt | 2 +- .../src/main/java/com/core/exception/NoDataException.kt | 2 +- .../src/main/java/com/core/exception/NotFoundResource.kt | 2 +- .../src/main/java/com/core/exception/NotPermissionMethod.kt | 2 +- .../src/main/java/com/core/exception/UnAuthorizedException.kt | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/exception/src/main/java/com/core/exception/BadRequestException.kt b/core/exception/src/main/java/com/core/exception/BadRequestException.kt index 1241c50e..29c38a19 100644 --- a/core/exception/src/main/java/com/core/exception/BadRequestException.kt +++ b/core/exception/src/main/java/com/core/exception/BadRequestException.kt @@ -2,4 +2,4 @@ package com.core.exception class BadRequestException( override val message: String? -): Exception() +): RuntimeException() diff --git a/core/exception/src/main/java/com/core/exception/InvalidValueException.kt b/core/exception/src/main/java/com/core/exception/InvalidValueException.kt index 79dccac1..854e8058 100644 --- a/core/exception/src/main/java/com/core/exception/InvalidValueException.kt +++ b/core/exception/src/main/java/com/core/exception/InvalidValueException.kt @@ -2,7 +2,7 @@ package com.core.exception class InvalidValueException( private val m: String? = "InvalidValueException" -): Exception() { +): RuntimeException() { override val message: String? get() = m } diff --git a/core/exception/src/main/java/com/core/exception/NetworkErrorException.kt b/core/exception/src/main/java/com/core/exception/NetworkErrorException.kt index b7f5c1e7..90c01477 100644 --- a/core/exception/src/main/java/com/core/exception/NetworkErrorException.kt +++ b/core/exception/src/main/java/com/core/exception/NetworkErrorException.kt @@ -2,7 +2,7 @@ package com.core.exception class NetworkErrorException( private val m: String? = "NetworkErrorException" -) : Exception() { +) : RuntimeException() { override val message: String? get() = m } diff --git a/core/exception/src/main/java/com/core/exception/NoDataException.kt b/core/exception/src/main/java/com/core/exception/NoDataException.kt index d2412aad..14b90e6b 100644 --- a/core/exception/src/main/java/com/core/exception/NoDataException.kt +++ b/core/exception/src/main/java/com/core/exception/NoDataException.kt @@ -2,7 +2,7 @@ package com.core.exception class NoDataException( private val m: String? = "NoDataException" -): Exception() { +): RuntimeException() { override val message: String? get() = m } diff --git a/core/exception/src/main/java/com/core/exception/NotFoundResource.kt b/core/exception/src/main/java/com/core/exception/NotFoundResource.kt index 1aabe8e1..362f369e 100644 --- a/core/exception/src/main/java/com/core/exception/NotFoundResource.kt +++ b/core/exception/src/main/java/com/core/exception/NotFoundResource.kt @@ -2,7 +2,7 @@ package com.core.exception class NotFoundResource( private val m: String? = "NotFoundResource" -): Exception() { +): RuntimeException() { override val message: String? get() = m } diff --git a/core/exception/src/main/java/com/core/exception/NotPermissionMethod.kt b/core/exception/src/main/java/com/core/exception/NotPermissionMethod.kt index c037a2b1..34688763 100644 --- a/core/exception/src/main/java/com/core/exception/NotPermissionMethod.kt +++ b/core/exception/src/main/java/com/core/exception/NotPermissionMethod.kt @@ -2,7 +2,7 @@ package com.core.exception class NotPermissionMethod( private val m: String? = "NotPermissionMethod" -): Exception() { +): RuntimeException() { override val message: String? get() = m } diff --git a/core/exception/src/main/java/com/core/exception/UnAuthorizedException.kt b/core/exception/src/main/java/com/core/exception/UnAuthorizedException.kt index c90086ce..e6e943c8 100644 --- a/core/exception/src/main/java/com/core/exception/UnAuthorizedException.kt +++ b/core/exception/src/main/java/com/core/exception/UnAuthorizedException.kt @@ -3,7 +3,7 @@ package com.core.exception //401 에러 Exception class UnAuthorizedException( private val errorMessage : String? = "UnAuthorizedException" -) : Exception() { +) : RuntimeException() { override val message: String? get() = errorMessage } From 7250b54c099ec0f73df0741e9656bf37dd7eedce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EA=B1=B4=ED=9D=AC?= Date: Tue, 22 Jul 2025 23:02:00 +0900 Subject: [PATCH 4/8] =?UTF-8?q?#303=20-=20fix=20:=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=EC=97=90=EC=84=9C=20JsonElement=3F=EB=A5=BC?= =?UTF-8?q?=20=EC=B2=98=EB=A6=AC=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit deoodeFromString에서 받는것은 Json 값이므로 JsonElements?로 받아줘야함 --- core/data/src/main/java/com/youthtalk/utils/ErrorUtils.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/data/src/main/java/com/youthtalk/utils/ErrorUtils.kt b/core/data/src/main/java/com/youthtalk/utils/ErrorUtils.kt index 2d0829bd..2995c3ae 100644 --- a/core/data/src/main/java/com/youthtalk/utils/ErrorUtils.kt +++ b/core/data/src/main/java/com/youthtalk/utils/ErrorUtils.kt @@ -8,6 +8,7 @@ import com.core.exception.NotPermissionMethod import com.core.exception.UnAuthorizedException import com.youthtalk.dto.CommonResponse import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonElement import retrofit2.HttpException import timber.log.Timber @@ -48,7 +49,7 @@ object ErrorUtils { inline fun mapToCustomException(it: HttpException): Exception { val error = it.response()?.errorBody()?.string() ?: throw InvalidValueException(it.message) - val response = Json.decodeFromString>(error) + val response = Json.decodeFromString>(error) return when (it.code()) { 401 -> UnAuthorizedException(response.message) 404 -> NotFoundResource(response.message) From e3d0daee951df426e9c32607d3ecf3770f039cfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EA=B1=B4=ED=9D=AC?= Date: Tue, 22 Jul 2025 23:03:23 +0900 Subject: [PATCH 5/8] =?UTF-8?q?#303=20-=20test=20:=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20repository=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/LoginRepositoryTest.kt | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 core/data/src/test/java/com/youthtalk/repository/LoginRepositoryTest.kt diff --git a/core/data/src/test/java/com/youthtalk/repository/LoginRepositoryTest.kt b/core/data/src/test/java/com/youthtalk/repository/LoginRepositoryTest.kt new file mode 100644 index 00000000..ed8ccfd7 --- /dev/null +++ b/core/data/src/test/java/com/youthtalk/repository/LoginRepositoryTest.kt @@ -0,0 +1,82 @@ +package com.youthtalk.repository + +import com.core.datastore.datasource.DataStoreDataSource +import com.core.exception.UnAuthorizedException +import com.youthtalk.data.LoginService +import com.youthtalk.dto.CommonResponse +import com.youthtalk.dto.MemberId +import com.youthtalk.dto.login.LoginRequest +import com.youthtalk.dto.toResponseBody +import kotlinx.coroutines.runBlocking +import org.junit.Assert +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.InjectMocks +import org.mockito.Mock +import org.mockito.junit.MockitoJUnitRunner +import org.mockito.kotlin.any +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever +import retrofit2.HttpException +import retrofit2.Response + +@RunWith(MockitoJUnitRunner::class) +class LoginRepositoryTest { + + @InjectMocks + private lateinit var sut: LoginRepositoryImpl + + @Mock + private lateinit var loginService: LoginService + + @Mock + private lateinit var dataStoreDataSource: DataStoreDataSource + + @Test + fun givenSocialId_whenLogin_thenReturnsMemberId() { + runBlocking { + // given + val socialId = "88888" + val memberId = 23L + val loginRequest = LoginRequest(socialType = "kakao", socialId = socialId) + + whenever(loginService.postLogin(any())).thenReturn(CommonResponse(200, "요청에 성공하였습니다", "S01", MemberId(memberId))) + + // when + val result = sut.postLogin(socialId).getOrThrow() + + // then + Assert.assertEquals(memberId, result) + verify(loginService).postLogin(any()) + } + } + + @Test + fun givenWrongSocialId_whenLogin_thenThrowsNull() { + runBlocking { + // given + val socialId = "xxxxxx" + val memberId = null + val loginRequest = LoginRequest(socialType = "kakao", socialId = socialId) + + whenever(loginService.postLogin(any())).thenThrow( + HttpException( + Response.error( + 401, + toResponseBody(CommonResponse(401, "회원이 아닙니다.", "F01", memberId)) + ) + ) + ) + + // when + Assert.assertThrows(UnAuthorizedException::class.java) { + runBlocking { + sut.postLogin(socialId).getOrThrow() + } + } + + // then + verify(loginService).postLogin(any()) + } + } +} From 39746b0f41e59c2f4cc80be350baa499d1a9221b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EA=B1=B4=ED=9D=AC?= Date: Tue, 22 Jul 2025 23:25:04 +0900 Subject: [PATCH 6/8] =?UTF-8?q?#303=20-=20test=20:=20=ED=9A=8C=EC=9B=90?= =?UTF-8?q?=EA=B0=80=EC=9E=85=20repository=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/LoginRepositoryTest.kt | 61 ++++++++++++++++++- 1 file changed, 58 insertions(+), 3 deletions(-) diff --git a/core/data/src/test/java/com/youthtalk/repository/LoginRepositoryTest.kt b/core/data/src/test/java/com/youthtalk/repository/LoginRepositoryTest.kt index ed8ccfd7..a968baf9 100644 --- a/core/data/src/test/java/com/youthtalk/repository/LoginRepositoryTest.kt +++ b/core/data/src/test/java/com/youthtalk/repository/LoginRepositoryTest.kt @@ -1,14 +1,18 @@ package com.youthtalk.repository import com.core.datastore.datasource.DataStoreDataSource +import com.core.exception.BadRequestException import com.core.exception.UnAuthorizedException import com.youthtalk.data.LoginService import com.youthtalk.dto.CommonResponse import com.youthtalk.dto.MemberId import com.youthtalk.dto.login.LoginRequest +import com.youthtalk.dto.login.SignRequest import com.youthtalk.dto.toResponseBody import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.test.runTest import org.junit.Assert +import org.junit.Assert.assertEquals import org.junit.Test import org.junit.runner.RunWith import org.mockito.InjectMocks @@ -34,7 +38,7 @@ class LoginRepositoryTest { @Test fun givenSocialId_whenLogin_thenReturnsMemberId() { - runBlocking { + runTest { // given val socialId = "88888" val memberId = 23L @@ -46,14 +50,14 @@ class LoginRepositoryTest { val result = sut.postLogin(socialId).getOrThrow() // then - Assert.assertEquals(memberId, result) + assertEquals(memberId, result) verify(loginService).postLogin(any()) } } @Test fun givenWrongSocialId_whenLogin_thenThrowsNull() { - runBlocking { + runTest { // given val socialId = "xxxxxx" val memberId = null @@ -79,4 +83,55 @@ class LoginRepositoryTest { verify(loginService).postLogin(any()) } } + + @Test + fun givenSignInfo_whenSignUp_thenReturnsMemberId() { + runTest { + val socialId = "666666" + val socialType = "kakao" + val nickname = "압도적도적" + val region = "서울" + val memberId = 23 + + val signUpRequest = SignRequest(socialType, socialId, nickname, region) + whenever(loginService.postSignUp(any())).thenReturn(CommonResponse(200, "요청에 성공하였습니다", "S01", memberId)) + + // when + val result = sut.postSign(socialId, nickname, region).getOrThrow() + + // then + assertEquals(memberId, result) + verify(loginService).postSignUp(any()) + } + } + + @Test + fun givenWrongRegion_whenSignUp_thenThrows400Exception() { + runTest { + val socialId = "666666" + val socialType = "kakao" + val nickname = "압도적도적" + val region = "없는지역" + val memberId = 23 + + whenever(loginService.postSignUp(any())).thenThrow( + HttpException( + Response.error( + 400, + toResponseBody(CommonResponse>(400, "유효하지 않은 값을 입력하였습니다.", "F01", arrayListOf("지역이 유효하지 않습니다."))) + ) + ) + ) + + // when + Assert.assertThrows(BadRequestException::class.java) { + runBlocking { + sut.postSign(socialId, nickname, region).getOrThrow() + } + } + + // then + verify(loginService).postSignUp(any()) + } + } } From 490fa9bd8eca155149b2073aa2e5310695cff51a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EA=B1=B4=ED=9D=AC?= Date: Tue, 22 Jul 2025 23:37:34 +0900 Subject: [PATCH 7/8] =?UTF-8?q?#303=20-=20feat=20:=20ViewModel=EA=B3=BC=20?= =?UTF-8?q?UseCase=EB=8B=A8=EC=97=90=EC=84=9C=EB=8F=84=20Result?= =?UTF-8?q?=EB=A5=BC=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/usercase/user/PostLoginUseCase.kt | 2 +- .../domain/usercase/user/PostSignUseCase.kt | 11 ++++---- .../java/com/core/login/LoginViewModel.kt | 26 ++++++------------- 3 files changed, 15 insertions(+), 24 deletions(-) diff --git a/core/domain/src/main/java/com/core/domain/usercase/user/PostLoginUseCase.kt b/core/domain/src/main/java/com/core/domain/usercase/user/PostLoginUseCase.kt index 45683cb4..ce3a7db6 100644 --- a/core/domain/src/main/java/com/core/domain/usercase/user/PostLoginUseCase.kt +++ b/core/domain/src/main/java/com/core/domain/usercase/user/PostLoginUseCase.kt @@ -6,5 +6,5 @@ import javax.inject.Inject class PostLoginUseCase @Inject constructor( private val loginRepository: LoginRepository ) { - operator fun invoke(socialId: String) = loginRepository.postLogin(socialId) + suspend operator fun invoke(socialId: String) = loginRepository.postLogin(socialId) } diff --git a/core/domain/src/main/java/com/core/domain/usercase/user/PostSignUseCase.kt b/core/domain/src/main/java/com/core/domain/usercase/user/PostSignUseCase.kt index 7a183345..478ad633 100644 --- a/core/domain/src/main/java/com/core/domain/usercase/user/PostSignUseCase.kt +++ b/core/domain/src/main/java/com/core/domain/usercase/user/PostSignUseCase.kt @@ -2,13 +2,14 @@ package com.core.domain.usercase.user import com.core.dataapi.repository.LoginRepository import javax.inject.Inject -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.flow.flatMapMerge class PostSignUseCase @Inject constructor( private val loginRepository: LoginRepository ) { - @OptIn(ExperimentalCoroutinesApi::class) - operator fun invoke(id: String, nickname: String, region: String) = loginRepository.postSign(id, nickname, region) - .flatMapMerge { loginRepository.postLogin(id) } + suspend operator fun invoke(id: String, nickname: String, region: String): Result { + val signResult = loginRepository.postSign(id, nickname, region) + if (signResult.isFailure) return Result.failure(signResult.exceptionOrNull()!!) + + return loginRepository.postLogin(id) + } } diff --git a/feature/login/src/main/java/com/core/login/LoginViewModel.kt b/feature/login/src/main/java/com/core/login/LoginViewModel.kt index 62521e05..b6e53ec3 100644 --- a/feature/login/src/main/java/com/core/login/LoginViewModel.kt +++ b/feature/login/src/main/java/com/core/login/LoginViewModel.kt @@ -15,8 +15,6 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.flow.onCompletion -import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.launch import timber.log.Timber @@ -60,32 +58,24 @@ class LoginViewModel @Inject constructor( socialId = "$userId" viewModelScope.launch { postLoginUseCase(socialId) - .catch { - Timber.e("viewModel postLogin error $it") - _error.emit(it) - } - .collectLatest { + .onSuccess { uiEffect.emit(LoginUiEffect.GoMainActivity) + }.onFailure { + _error.emit(it) } } } fun postSign(nickname: String, region: String) { - Timber.e("postSign Start") viewModelScope.launch { + loading.value = true postSignUseCase(socialId, nickname, region) - .onStart { - loading.value = true - } - .onCompletion { + .onSuccess { loading.value = false - } - .catch { - Timber.e("viewModel sign error $it") - _error.emit(it) - } - .collectLatest { uiEffect.emit(LoginUiEffect.GoMainActivity) + }.onFailure { + loading.value = false + _error.emit(it) } } } From cbd4d1e005b7c94d937c8a2158a9d78f1fb545be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EA=B1=B4=ED=9D=AC?= Date: Wed, 23 Jul 2025 15:42:42 +0900 Subject: [PATCH 8/8] =?UTF-8?q?#303=20-=20style=20:=20=EA=B9=83=ED=97=99?= =?UTF-8?q?=20=EC=95=A1=EC=85=98=EB=B4=87=EC=9D=98=20=20=EC=9A=94=EC=B2=AD?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/LoginRepositoryImpl.kt | 34 ++++++++----------- .../com/core/exception/BadRequestException.kt | 4 +-- .../core/exception/InvalidValueException.kt | 7 +--- .../core/exception/NetworkErrorException.kt | 7 +--- .../com/core/exception/NoDataException.kt | 7 +--- .../com/core/exception/NotFoundResource.kt | 7 +--- .../com/core/exception/NotPermissionMethod.kt | 7 +--- .../core/exception/UnAuthorizedException.kt | 8 +---- 8 files changed, 22 insertions(+), 59 deletions(-) diff --git a/core/data/src/main/java/com/youthtalk/repository/LoginRepositoryImpl.kt b/core/data/src/main/java/com/youthtalk/repository/LoginRepositoryImpl.kt index bb216ae8..295fc9a2 100644 --- a/core/data/src/main/java/com/youthtalk/repository/LoginRepositoryImpl.kt +++ b/core/data/src/main/java/com/youthtalk/repository/LoginRepositoryImpl.kt @@ -16,28 +16,24 @@ class LoginRepositoryImpl @Inject constructor( private val loginService: LoginService, private val dataStoreDataSource: DataStoreDataSource ) : LoginRepository { - override suspend fun postLogin(socialId: String): Result { - return createResult { - loginService.postLogin(LoginRequest(socialType = "kakao", socialId = socialId).toRequestBody()).data?.memberId ?: throw NoDataException() - }.onFailure { error -> - Timber.e("error : $error") - } + override suspend fun postLogin(socialId: String): Result = createResult { + loginService.postLogin(LoginRequest(socialType = "kakao", socialId = socialId).toRequestBody()).data?.memberId ?: throw NoDataException() + }.onFailure { error -> + Timber.e("error : $error") } override fun hasToken(): Flow = dataStoreDataSource.hasToken() - override suspend fun postSign(id: String, nickname: String, region: String): Result { - return createResult { - loginService.postSignUp( - SignRequest( - socialType = "kakao", - socialId = id, - nickname = nickname, - region = region.toRegion().region - ).toRequestBody() - ).data ?: throw NoDataException() - }.onFailure { error -> - Timber.e("error : $error") - } + override suspend fun postSign(id: String, nickname: String, region: String): Result = createResult { + loginService.postSignUp( + SignRequest( + socialType = "kakao", + socialId = id, + nickname = nickname, + region = region.toRegion().region + ).toRequestBody() + ).data ?: throw NoDataException() + }.onFailure { error -> + Timber.e("error : $error") } } diff --git a/core/exception/src/main/java/com/core/exception/BadRequestException.kt b/core/exception/src/main/java/com/core/exception/BadRequestException.kt index 29c38a19..a47b00dd 100644 --- a/core/exception/src/main/java/com/core/exception/BadRequestException.kt +++ b/core/exception/src/main/java/com/core/exception/BadRequestException.kt @@ -1,5 +1,3 @@ package com.core.exception -class BadRequestException( - override val message: String? -): RuntimeException() +class BadRequestException(override val message: String?) : RuntimeException() diff --git a/core/exception/src/main/java/com/core/exception/InvalidValueException.kt b/core/exception/src/main/java/com/core/exception/InvalidValueException.kt index 854e8058..aa9310be 100644 --- a/core/exception/src/main/java/com/core/exception/InvalidValueException.kt +++ b/core/exception/src/main/java/com/core/exception/InvalidValueException.kt @@ -1,8 +1,3 @@ package com.core.exception -class InvalidValueException( - private val m: String? = "InvalidValueException" -): RuntimeException() { - override val message: String? - get() = m -} +class InvalidValueException(override val message: String? = "InvalidValueException") : RuntimeException() diff --git a/core/exception/src/main/java/com/core/exception/NetworkErrorException.kt b/core/exception/src/main/java/com/core/exception/NetworkErrorException.kt index 90c01477..86a8b231 100644 --- a/core/exception/src/main/java/com/core/exception/NetworkErrorException.kt +++ b/core/exception/src/main/java/com/core/exception/NetworkErrorException.kt @@ -1,8 +1,3 @@ package com.core.exception -class NetworkErrorException( - private val m: String? = "NetworkErrorException" -) : RuntimeException() { - override val message: String? - get() = m -} +class NetworkErrorException(override val message: String? = "NetworkErrorException") : RuntimeException() diff --git a/core/exception/src/main/java/com/core/exception/NoDataException.kt b/core/exception/src/main/java/com/core/exception/NoDataException.kt index 14b90e6b..f6e9703c 100644 --- a/core/exception/src/main/java/com/core/exception/NoDataException.kt +++ b/core/exception/src/main/java/com/core/exception/NoDataException.kt @@ -1,8 +1,3 @@ package com.core.exception -class NoDataException( - private val m: String? = "NoDataException" -): RuntimeException() { - override val message: String? - get() = m -} +class NoDataException(override val message: String? = "NoDataException") : RuntimeException() diff --git a/core/exception/src/main/java/com/core/exception/NotFoundResource.kt b/core/exception/src/main/java/com/core/exception/NotFoundResource.kt index 362f369e..0a466196 100644 --- a/core/exception/src/main/java/com/core/exception/NotFoundResource.kt +++ b/core/exception/src/main/java/com/core/exception/NotFoundResource.kt @@ -1,8 +1,3 @@ package com.core.exception -class NotFoundResource( - private val m: String? = "NotFoundResource" -): RuntimeException() { - override val message: String? - get() = m -} +class NotFoundResource(override val message: String? = "NotFoundResource") : RuntimeException() diff --git a/core/exception/src/main/java/com/core/exception/NotPermissionMethod.kt b/core/exception/src/main/java/com/core/exception/NotPermissionMethod.kt index 34688763..4f8cce17 100644 --- a/core/exception/src/main/java/com/core/exception/NotPermissionMethod.kt +++ b/core/exception/src/main/java/com/core/exception/NotPermissionMethod.kt @@ -1,8 +1,3 @@ package com.core.exception -class NotPermissionMethod( - private val m: String? = "NotPermissionMethod" -): RuntimeException() { - override val message: String? - get() = m -} +class NotPermissionMethod(override val message: String? = "NotPermissionMethod") : RuntimeException() diff --git a/core/exception/src/main/java/com/core/exception/UnAuthorizedException.kt b/core/exception/src/main/java/com/core/exception/UnAuthorizedException.kt index e6e943c8..fee912c9 100644 --- a/core/exception/src/main/java/com/core/exception/UnAuthorizedException.kt +++ b/core/exception/src/main/java/com/core/exception/UnAuthorizedException.kt @@ -1,9 +1,3 @@ package com.core.exception -//401 에러 Exception -class UnAuthorizedException( - private val errorMessage : String? = "UnAuthorizedException" -) : RuntimeException() { - override val message: String? - get() = errorMessage -} +class UnAuthorizedException(override val message: String? = "UnAuthorizedException") : RuntimeException()