From c1621681703b8c0ba8adf61cb013a8d2f977b056 Mon Sep 17 00:00:00 2001 From: JSPark <48265129+pknujsp@users.noreply.github.com> Date: Mon, 11 Mar 2024 17:37:43 +0900 Subject: [PATCH] =?UTF-8?q?#219=20UserRepository=EB=82=B4=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EB=B0=98=ED=99=98=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?flow=EC=A0=9C=EA=B1=B0,=20=EA=B5=AC=ED=98=84=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EA=B3=B5=EB=9E=80=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 --- .../com/android/mediproject/MainViewModel.kt | 1 - .../data/session/AccountSessionRepository.kt | 2 + .../session/AccountSessionRepositoryImpl.kt | 2 + .../core/data/user/UserRepository.kt | 7 +- .../core/data/user/UserRepositoryImpl.kt | 31 +++------ .../core/domain/EditUserAccountUseCase.kt | 65 ++++++------------ .../core/domain/GetAccountStateUseCase.kt | 18 ----- .../core/domain/GetTokenUseCase.kt | 17 ----- .../mediproject/core/domain/GetUserUseCase.kt | 2 +- .../mediproject/core/domain/SignUseCase.kt | 23 ------- .../ChangePasswordParameter.kt | 30 +-------- .../datasource/user/UserDataSourceImpl.kt | 7 +- .../test/repositories/FakeUserRepository.kt | 9 +-- feature/comments/build.gradle.kts | 1 + .../MedicineCommentsViewModel.kt | 7 +- .../FavoriteMedicineViewModel.kt | 10 ++- .../FavoriteMedicineMoreViewModel.kt | 28 ++++---- .../feature/intro/LoginFragment.kt | 19 +++--- .../feature/intro/LoginViewModel.kt | 67 ++++++++++--------- .../feature/intro/SignUpViewModel.kt | 1 - .../feature/intro/LoginViewModelTest.kt | 9 ++- .../feature/intro/SignUpViewModelTest.kt | 2 - .../feature/mypage/MyPageViewModel.kt | 2 - 23 files changed, 111 insertions(+), 249 deletions(-) delete mode 100644 core/domain/src/main/java/com/android/mediproject/core/domain/GetAccountStateUseCase.kt delete mode 100644 core/domain/src/main/java/com/android/mediproject/core/domain/GetTokenUseCase.kt delete mode 100644 core/domain/src/main/java/com/android/mediproject/core/domain/SignUseCase.kt diff --git a/app/src/main/java/com/android/mediproject/MainViewModel.kt b/app/src/main/java/com/android/mediproject/MainViewModel.kt index 75ce23128..d7c46f2fb 100644 --- a/app/src/main/java/com/android/mediproject/MainViewModel.kt +++ b/app/src/main/java/com/android/mediproject/MainViewModel.kt @@ -6,7 +6,6 @@ import androidx.annotation.ArrayRes import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.android.mediproject.core.common.viewmodel.asEventFlow -import com.android.mediproject.core.domain.GetAccountStateUseCase import com.android.mediproject.core.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch diff --git a/core/data/src/main/java/com/android/mediproject/core/data/session/AccountSessionRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/session/AccountSessionRepository.kt index 49e3d5c91..0c5e04b50 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/session/AccountSessionRepository.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/session/AccountSessionRepository.kt @@ -1,8 +1,10 @@ package com.android.mediproject.core.data.session import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUserSession +import kotlinx.coroutines.flow.Flow interface AccountSessionRepository { + val lastSavedEmail: Flow val session: CognitoUserSession? val signedIn: Boolean suspend fun updateSession(session: CognitoUserSession?) diff --git a/core/data/src/main/java/com/android/mediproject/core/data/session/AccountSessionRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/session/AccountSessionRepositoryImpl.kt index 7b538d8be..3666cc5c8 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/session/AccountSessionRepositoryImpl.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/session/AccountSessionRepositoryImpl.kt @@ -2,10 +2,12 @@ package com.android.mediproject.core.data.session import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUserSession import com.android.mediproject.core.datastore.AppDataStore +import kotlinx.coroutines.flow.distinctUntilChanged class AccountSessionRepositoryImpl( private val appDataStore: AppDataStore, ) : AccountSessionRepository { + override val lastSavedEmail = appDataStore.userEmail.distinctUntilChanged() private var mutableSession: CognitoUserSession? = null override val session: CognitoUserSession? get() = mutableSession diff --git a/core/data/src/main/java/com/android/mediproject/core/data/user/UserRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/user/UserRepository.kt index 581e33156..6e3b83767 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/user/UserRepository.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/user/UserRepository.kt @@ -5,10 +5,9 @@ import com.android.mediproject.core.model.requestparameters.ChangePasswordParame import com.android.mediproject.core.model.user.remote.ChangeNicknameResponse import com.android.mediproject.core.model.user.remote.ChangePasswordResponse import com.android.mediproject.core.model.user.remote.WithdrawalResponse -import kotlinx.coroutines.flow.Flow interface UserRepository { - suspend fun changeNickname(changeNicknameParameter: ChangeNicknameParameter): Flow> - suspend fun changePassword(changePasswordParameter: ChangePasswordParameter): Flow> - suspend fun withdrawal(): Flow> + suspend fun changeNickname(changeNicknameParameter: ChangeNicknameParameter): Result + suspend fun changePassword(changePasswordParameter: ChangePasswordParameter): Result + suspend fun withdrawal(): Result } diff --git a/core/data/src/main/java/com/android/mediproject/core/data/user/UserRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/user/UserRepositoryImpl.kt index f3c85f2f4..0536799a8 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/user/UserRepositoryImpl.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/user/UserRepositoryImpl.kt @@ -1,39 +1,24 @@ package com.android.mediproject.core.data.user -import android.util.Log import com.android.mediproject.core.model.requestparameters.ChangeNicknameParameter import com.android.mediproject.core.model.requestparameters.ChangePasswordParameter import com.android.mediproject.core.model.user.remote.ChangeNicknameResponse import com.android.mediproject.core.model.user.remote.ChangePasswordResponse import com.android.mediproject.core.model.user.remote.WithdrawalResponse import com.android.mediproject.core.network.datasource.user.UserDataSource -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.channelFlow -import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.flow.map import javax.inject.Inject class UserRepositoryImpl @Inject constructor(private val userDataSource: UserDataSource) : UserRepository { - override suspend fun changeNickname(changeNicknameParameter: ChangeNicknameParameter): Flow> = - channelFlow { - userDataSource.changeNickname(changeNicknameParameter).map { result -> - result.fold(onSuccess = { Result.success(it) }, onFailure = { Result.failure(it) }) - }.collectLatest { trySend(it) } - } + override suspend fun withdrawal(): Result { + TODO("Not yet implemented") + } - override suspend fun changePassword(changePasswordParameter: ChangePasswordParameter): Flow> = - channelFlow { - userDataSource.changePassword(changePasswordParameter).map { result -> - result.fold(onSuccess = { Result.success(it) }, onFailure = { Result.failure(it) }) - }.collectLatest { trySend(it) } - } + override suspend fun changeNickname(changeNicknameParameter: ChangeNicknameParameter): Result { + TODO("Not yet implemented") + } - override suspend fun withdrawal(): Flow> = channelFlow { - Log.d("wap", "UserRepository : withdrawal()") - userDataSource.withdrawal().map { result -> - Log.d("wap", "UserRepository : withdrawal()$result") - result.fold(onSuccess = { Result.success(it) }, onFailure = { Result.failure(it) }) - }.collectLatest { trySend(it) } + override suspend fun changePassword(changePasswordParameter: ChangePasswordParameter): Result { + TODO("Not yet implemented") } } diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/EditUserAccountUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/EditUserAccountUseCase.kt index ecab33eef..2b1c4d2f9 100644 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/EditUserAccountUseCase.kt +++ b/core/domain/src/main/java/com/android/mediproject/core/domain/EditUserAccountUseCase.kt @@ -1,64 +1,39 @@ package com.android.mediproject.core.domain -import android.util.Log import com.android.mediproject.core.data.sign.SignRepository import com.android.mediproject.core.data.user.UserRepository import com.android.mediproject.core.datastore.AppDataStore import com.android.mediproject.core.model.requestparameters.ChangeNicknameParameter import com.android.mediproject.core.model.requestparameters.ChangePasswordParameter -import kotlinx.coroutines.flow.channelFlow -import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.flow.map import javax.inject.Inject class EditUserAccountUseCase @Inject constructor( private val appDataStore: AppDataStore, private val userRepository: UserRepository, - private val getUserInfoRepository: UserInfoRepository, private val signRepository: SignRepository, ) { - suspend fun changeNickname(changeNicknameParameter: ChangeNicknameParameter) = channelFlow { - userRepository.changeNickname(changeNicknameParameter).map { result -> - result.fold( - onSuccess = { - appDataStore.saveNickName(changeNicknameParameter.newNickname) - Result.success(it) - }, - onFailure = { Result.failure(it) }, - ) - }.collectLatest { trySend(it) } - } + suspend fun changeNickname(changeNicknameParameter: ChangeNicknameParameter) = userRepository.changeNickname(changeNicknameParameter).fold( + onSuccess = { + appDataStore.saveNickName(changeNicknameParameter.newNickname) + Result.success(it) + }, + onFailure = { Result.failure(it) }, + ) - suspend fun changePassword(changePasswordParameter: ChangePasswordParameter) = channelFlow { - val email = - (getUserInfoRepository.myAccountInfo.value as AccountState.SignedIn).email.toCharArray() - userRepository.changePassword( - changePasswordParameter.apply { - this.email = email - }, - ).map { result -> - result.fold( - onSuccess = { - Result.success(it) - }, - onFailure = { Result.failure(it) }, - ) - }.collectLatest { trySend(it) } - } + suspend fun changePassword(changePasswordParameter: ChangePasswordParameter) = userRepository.changePassword( + changePasswordParameter, + ).fold( + onSuccess = { + Result.success(it) + }, + onFailure = { Result.failure(it) }, + ) - suspend fun withdrawal() = channelFlow { - Log.d("wap", "UserUseCase : withdrawal()") - userRepository.withdrawal().map { result -> - Log.d("wap", "UserUseCase : withdrawal()$result") - result.fold( - onSuccess = { - signRepository.signOut() - appDataStore.clearMyAccountInfo() - Result.success(it) - }, - onFailure = { Result.failure(it) }, - ) - }.collectLatest { trySend(it) } + suspend fun withdrawal() { + userRepository.withdrawal() + signRepository.signOut() + appDataStore.clearMyAccountInfo() } + } diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/GetAccountStateUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/GetAccountStateUseCase.kt deleted file mode 100644 index d182b3c83..000000000 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/GetAccountStateUseCase.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.android.mediproject.core.domain - -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.channelFlow -import kotlinx.coroutines.flow.collectLatest -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -class GetAccountStateUseCase @Inject constructor(private val userInfoRepository: UserInfoRepository) { - operator fun invoke(): Flow = channelFlow { - userInfoRepository.myAccountInfo.collectLatest { - trySend(it) - } - } - - suspend fun loadAccountState() = userInfoRepository.loadAccountState() -} diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/GetTokenUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/GetTokenUseCase.kt deleted file mode 100644 index 7d24d5ac4..000000000 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/GetTokenUseCase.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.android.mediproject.core.domain - -import com.android.mediproject.core.data.session.AccountSessionRepository -import com.android.mediproject.core.model.token.CurrentTokens -import com.android.mediproject.core.model.token.TokenState -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.channelFlow -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -class GetTokenUseCase @Inject constructor(private val accountSessionRepository: AccountSessionRepository) { - - operator fun invoke(): Flow> = channelFlow { - trySend(TokenState.Empty) - } -} diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/GetUserUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/GetUserUseCase.kt index ad14523bf..b30947407 100644 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/GetUserUseCase.kt +++ b/core/domain/src/main/java/com/android/mediproject/core/domain/GetUserUseCase.kt @@ -12,7 +12,7 @@ class GetUserUseCase @Inject constructor(private val appDataStore: AppDataStore) suspend operator fun invoke(): Flow = channelFlow { appDataStore.nickName.collect { nickName -> Log.d("wap", nickName) - trySend(UserEntity(nickName = nickName)) + // trySend(UserEntity(nickName = nickName)) } } } diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/SignUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/SignUseCase.kt deleted file mode 100644 index fcbdac172..000000000 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/SignUseCase.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.android.mediproject.core.domain - -import com.android.mediproject.core.data.sign.SignRepository -import com.android.mediproject.core.model.sign.LoginParameter -import com.android.mediproject.core.model.sign.SignUpParameter -import kotlinx.coroutines.flow.map -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -class SignUseCase @Inject constructor( - private val signRepository: SignRepository, private val userInfoRepository: UserInfoRepository, -) { - suspend fun login(loginParameter: LoginParameter) = signRepository.login(loginParameter) - - suspend fun signUp(signUpParameter: SignUpParameter): Result = signRepository.signUp(signUpParameter) - - suspend fun signOut() = signRepository.signOut() - - val savedEmail = userInfoRepository.myAccountInfo.map { - if (it is AccountState.SignedIn) it.email else "" - } -} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/requestparameters/ChangePasswordParameter.kt b/core/model/src/main/java/com/android/mediproject/core/model/requestparameters/ChangePasswordParameter.kt index 995d46a93..7f6c34702 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/requestparameters/ChangePasswordParameter.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/requestparameters/ChangePasswordParameter.kt @@ -1,29 +1,5 @@ package com.android.mediproject.core.model.requestparameters -import kotlinx.serialization.Serializable - -@Serializable -data class ChangePasswordParameter( - val newPassword: CharArray -) { - - var email: CharArray = CharArray(0) - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as ChangePasswordParameter - - if (!newPassword.contentEquals(other.newPassword)) return false - if (!email.contentEquals(other.email)) return false - - return true - } - - override fun hashCode(): Int { - var result = newPassword.contentHashCode() - result = 31 * result + email.contentHashCode() - return result - } - -} +class ChangePasswordParameter( + val newPassword: ByteArray, +) diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/user/UserDataSourceImpl.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/user/UserDataSourceImpl.kt index d6ee6de95..2a5979d5e 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/user/UserDataSourceImpl.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/user/UserDataSourceImpl.kt @@ -11,7 +11,6 @@ import com.android.mediproject.core.network.module.AwsNetworkApi import com.android.mediproject.core.network.onResponse import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.channelFlow -import java.lang.ref.WeakReference import javax.inject.Inject class UserDataSourceImpl @Inject constructor( @@ -25,9 +24,9 @@ class UserDataSourceImpl @Inject constructor( } override suspend fun changePassword(changePasswordParameter: ChangePasswordParameter): Flow> = channelFlow { - val password = WeakReference(aesCoder.encodePassword(changePasswordParameter.email, changePasswordParameter.newPassword)).get()!! - awsNetworkApi.changePassword(ChangePasswordParameter(password.toCharArray())).onResponse() - .fold(onSuccess = { Result.success(it) }, onFailure = { Result.failure(it) }).also { trySend(it) } + /* val password = WeakReference(aesCoder.encodePassword(changePasswordParameter.email, changePasswordParameter.newPassword)).get()!! + awsNetworkApi.changePassword(ChangePasswordParameter(password.toCharArray())).onResponse() + .fold(onSuccess = { Result.success(it) }, onFailure = { Result.failure(it) }).also { trySend(it) }*/ } diff --git a/core/test/src/main/java/com/android/mediproject/core/test/repositories/FakeUserRepository.kt b/core/test/src/main/java/com/android/mediproject/core/test/repositories/FakeUserRepository.kt index 0403ae57d..307345a02 100644 --- a/core/test/src/main/java/com/android/mediproject/core/test/repositories/FakeUserRepository.kt +++ b/core/test/src/main/java/com/android/mediproject/core/test/repositories/FakeUserRepository.kt @@ -1,12 +1,6 @@ package com.android.mediproject.core.test.repositories -import com.android.mediproject.core.model.user.remote.UserResponse -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.channelFlow - +/* class FakeUserInfoRepository : UserInfoRepository { private val _myAccountInfo = MutableStateFlow(AccountState.Unknown) override val myAccountInfo: StateFlow @@ -23,3 +17,4 @@ class FakeUserInfoRepository : UserInfoRepository { } } +*/ diff --git a/feature/comments/build.gradle.kts b/feature/comments/build.gradle.kts index fd2db9c98..6671f4575 100644 --- a/feature/comments/build.gradle.kts +++ b/feature/comments/build.gradle.kts @@ -18,6 +18,7 @@ dependencies { implementation(project(":core:common")) implementation(project(":core:model")) implementation(project(":core:domain")) + implementation(project(":core:data")) implementation(libs.bundles.glides) kapt(libs.bundles.glides.kapt) diff --git a/feature/comments/src/main/java/com/android/mediproject/feature/comments/commentsofamedicine/MedicineCommentsViewModel.kt b/feature/comments/src/main/java/com/android/mediproject/feature/comments/commentsofamedicine/MedicineCommentsViewModel.kt index dafe8837f..e1bb7bd90 100644 --- a/feature/comments/src/main/java/com/android/mediproject/feature/comments/commentsofamedicine/MedicineCommentsViewModel.kt +++ b/feature/comments/src/main/java/com/android/mediproject/feature/comments/commentsofamedicine/MedicineCommentsViewModel.kt @@ -8,14 +8,12 @@ import com.android.mediproject.core.common.bindingadapter.ISendText import com.android.mediproject.core.common.network.Dispatcher import com.android.mediproject.core.common.network.MediDispatchers import com.android.mediproject.core.domain.EditCommentUseCase -import com.android.mediproject.core.domain.GetAccountStateUseCase import com.android.mediproject.core.domain.GetCommentsUseCase import com.android.mediproject.core.model.comments.BaseComment import com.android.mediproject.core.model.comments.Comment import com.android.mediproject.core.model.navargs.MedicineBasicInfoArgs import com.android.mediproject.core.model.requestparameters.EditCommentParameter import com.android.mediproject.core.model.requestparameters.NewCommentParameter -import com.android.mediproject.core.model.user.onSignedIn import com.android.mediproject.core.ui.base.BaseViewModel import com.android.mediproject.feature.comments.commentsofamedicine.CommentActionState.None import com.android.mediproject.feature.comments.commentsofamedicine.CommentActionState.OnClickEditComment @@ -51,7 +49,7 @@ import javax.inject.Inject class MedicineCommentsViewModel @Inject constructor( private val getCommentsUseCase: GetCommentsUseCase, private val editCommentUseCase: EditCommentUseCase, - private val getAccountStateUseCase: GetAccountStateUseCase, + private val accountSessionRepository: AccountSessionRepository, @Dispatcher(MediDispatchers.IO) private val ioDispatcher: CoroutineDispatcher, ) : BaseViewModel(), ISendText { @@ -64,9 +62,6 @@ class MedicineCommentsViewModel @Inject constructor( private val _myId = MutableStateFlow(NONE_USER_ID) private val myId = _myId.asStateFlow() - private val _accountState = MutableStateFlow(AccountState.SignedOut) - private val accountState = _accountState.asStateFlow() - private val _replyId = MutableStateFlow(NONE_REPLY_ID) private val replyId = _replyId.asStateFlow() diff --git a/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/FavoriteMedicineViewModel.kt b/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/FavoriteMedicineViewModel.kt index d318ddcec..f1bee48b8 100644 --- a/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/FavoriteMedicineViewModel.kt +++ b/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/FavoriteMedicineViewModel.kt @@ -5,7 +5,6 @@ import com.android.mediproject.core.common.viewmodel.MutableEventFlow import com.android.mediproject.core.common.viewmodel.UiState import com.android.mediproject.core.common.viewmodel.asEventFlow import com.android.mediproject.core.domain.GetFavoriteMedicineUseCase -import com.android.mediproject.core.domain.GetTokenUseCase import com.android.mediproject.core.model.favoritemedicine.FavoriteMedicine import com.android.mediproject.core.model.token.CurrentTokens import com.android.mediproject.core.model.token.TokenState @@ -20,7 +19,6 @@ import javax.inject.Inject @HiltViewModel class FavoriteMedicineViewModel @Inject constructor( - private val getTokenUseCase: GetTokenUseCase, private val getFavoriteMedicineUseCase: GetFavoriteMedicineUseCase, ) : BaseViewModel() { @@ -32,7 +30,7 @@ class FavoriteMedicineViewModel @Inject constructor( fun navigateToFavoriteMeidcineMore() = event(FavoriteMedicineEvent.NavigateToFavoriteMedicineMore) sealed class FavoriteMedicineEvent { - object NavigateToFavoriteMedicineMore : FavoriteMedicineEvent() + data object NavigateToFavoriteMedicineMore : FavoriteMedicineEvent() } private val _favoriteMedicineList = MutableStateFlow>>(UiState.Initial) @@ -46,9 +44,9 @@ class FavoriteMedicineViewModel @Inject constructor( val token get() = _token.asSharedFlow() fun loadTokens() = viewModelScope.launch { - getTokenUseCase().collect { - _token.emit(it) - } + /* getTokenUseCase().collect { + _token.emit(it) + }*/ } fun loadFavoriteMedicines() { diff --git a/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/favoritemedicinemore/FavoriteMedicineMoreViewModel.kt b/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/favoritemedicinemore/FavoriteMedicineMoreViewModel.kt index ab36d30aa..41ec22df0 100644 --- a/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/favoritemedicinemore/FavoriteMedicineMoreViewModel.kt +++ b/feature/favoritemedicine/src/main/java/com/android/mediproject/feature/favoritemedicine/favoritemedicinemore/FavoriteMedicineMoreViewModel.kt @@ -3,7 +3,6 @@ package com.android.mediproject.feature.favoritemedicine.favoritemedicinemore import androidx.lifecycle.viewModelScope import com.android.mediproject.core.common.viewmodel.UiState import com.android.mediproject.core.domain.GetFavoriteMedicineUseCase -import com.android.mediproject.core.domain.GetTokenUseCase import com.android.mediproject.core.model.favoritemedicine.FavoriteMedicineMoreInfo import com.android.mediproject.core.model.token.CurrentTokens import com.android.mediproject.core.model.token.TokenState @@ -18,7 +17,6 @@ import javax.inject.Inject @HiltViewModel class FavoriteMedicineMoreViewModel @Inject constructor( - private val getTokenUseCase: GetTokenUseCase, private val getFavoriteMedicineUseCase: GetFavoriteMedicineUseCase, ) : BaseViewModel() { @@ -33,20 +31,18 @@ class FavoriteMedicineMoreViewModel @Inject constructor( val token get() = _token.asSharedFlow() fun loadTokens() = viewModelScope.launch { - getTokenUseCase().collect { - _token.emit(it) - } + /* getTokenUseCase().collect { + _token.emit(it) + }*/ } - fun loadFavoriteMedicines() = - viewModelScope.launch { - setFavoriteMedicineListUiState(UiState.Loading) - getFavoriteMedicineUseCase.getFavoriteMedicineMoreList() - .collect { result -> - result.fold( - onSuccess = { setFavoriteMedicineListUiState(UiState.Success(it)) }, - onFailure = { setFavoriteMedicineListUiState(UiState.Error("즐겨찾기를 불러오는 데 실패하였습니다.")) }, - ) - } - } + fun loadFavoriteMedicines() = viewModelScope.launch { + setFavoriteMedicineListUiState(UiState.Loading) + getFavoriteMedicineUseCase.getFavoriteMedicineMoreList().collect { result -> + result.fold( + onSuccess = { setFavoriteMedicineListUiState(UiState.Success(it)) }, + onFailure = { setFavoriteMedicineListUiState(UiState.Error("즐겨찾기를 불러오는 데 실패하였습니다.")) }, + ) + } + } } diff --git a/feature/intro/src/main/java/com/android/mediproject/feature/intro/LoginFragment.kt b/feature/intro/src/main/java/com/android/mediproject/feature/intro/LoginFragment.kt index 2eb120d2f..3602011f0 100644 --- a/feature/intro/src/main/java/com/android/mediproject/feature/intro/LoginFragment.kt +++ b/feature/intro/src/main/java/com/android/mediproject/feature/intro/LoginFragment.kt @@ -80,13 +80,13 @@ class LoginFragment : BaseFragment(Fragmen navigateWithNavDirections(LoginFragmentDirections.actionLoginFragmentToSignUpFragment()) } - private fun handleSignInState(loginState: LoginViewModel.LoginState) { - when (loginState) { - is LoginViewModel.LoginState.Logining -> showLoadingDialog() - is LoginViewModel.LoginState.LoginSuccess -> loginSuccess() - is LoginViewModel.LoginState.LoginFailed -> loginFailed() - is LoginViewModel.LoginState.RegexError -> regexError() - is LoginViewModel.LoginState.Initial -> initial() + private fun handleSignInState(loginUiState: LoginViewModel.LoginUiState) { + when (loginUiState) { + is LoginViewModel.LoginUiState.Logining -> showLoadingDialog() + is LoginViewModel.LoginUiState.LoginSuccess -> loginSuccess() + is LoginViewModel.LoginUiState.LoginFailed -> loginFailed() + is LoginViewModel.LoginUiState.RegexError -> regexError() + is LoginViewModel.LoginUiState.Initial -> initial() } } @@ -140,11 +140,11 @@ class LoginFragment : BaseFragment(Fragmen private fun initial() { } - private fun callSavedEmail(savedEmail: CharArray) { + private fun callSavedEmail(savedEmail: String) { if (savedEmail.isNotEmpty()) { binding.apply { rememberEmailCB.isChecked = true - loginEmail.inputData.setText(savedEmail, 0, savedEmail.size) + loginEmail.inputData.setText(savedEmail) } } } @@ -183,5 +183,4 @@ class LoginFragment : BaseFragment(Fragmen mainScope.cancel() super.onDestroyView() } - } diff --git a/feature/intro/src/main/java/com/android/mediproject/feature/intro/LoginViewModel.kt b/feature/intro/src/main/java/com/android/mediproject/feature/intro/LoginViewModel.kt index 509bf7778..da6fb5a50 100644 --- a/feature/intro/src/main/java/com/android/mediproject/feature/intro/LoginViewModel.kt +++ b/feature/intro/src/main/java/com/android/mediproject/feature/intro/LoginViewModel.kt @@ -7,7 +7,9 @@ import com.android.mediproject.core.common.util.isEmailValid import com.android.mediproject.core.common.util.isPasswordValid import com.android.mediproject.core.common.viewmodel.MutableEventFlow import com.android.mediproject.core.common.viewmodel.asEventFlow -import com.android.mediproject.core.domain.SignUseCase +import com.android.mediproject.core.data.session.AccountSessionRepository +import com.android.mediproject.core.data.sign.LoginState +import com.android.mediproject.core.data.sign.SignRepository import com.android.mediproject.core.model.navargs.TOHOME import com.android.mediproject.core.model.sign.LoginParameter import com.android.mediproject.core.ui.base.BaseViewModel @@ -17,9 +19,6 @@ import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.emptyFlow -import kotlinx.coroutines.flow.flatMapLatest -import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -27,29 +26,27 @@ import javax.inject.Inject @HiltViewModel class LoginViewModel @Inject constructor( - private val signUseCase: SignUseCase, + private val signRepository: SignRepository, + private val accountSessionRepository: AccountSessionRepository, @Dispatcher(MediDispatchers.Default) private val defaultDispatcher: CoroutineDispatcher, ) : BaseViewModel() { - val savedEmail = signUseCase.savedEmail.flatMapLatest { - if (it.isEmpty()) emptyFlow() - else flowOf(it.toCharArray()) - }.stateIn(viewModelScope, started = SharingStarted.Eagerly, initialValue = CharArray(0)) + val savedEmail = accountSessionRepository.lastSavedEmail.stateIn(viewModelScope, SharingStarted.Eagerly, "") - private val _loginState = MutableStateFlow(LoginState.Initial) - val loginState = _loginState.asStateFlow() + private val _loginUiState = MutableStateFlow(LoginUiState.Initial) + val loginState = _loginUiState.asStateFlow() - private fun setLoginState(state: LoginState) { - _loginState.value = state + private fun setLoginState(state: LoginUiState) { + _loginUiState.value = state } - sealed class LoginState { - data object Initial : LoginState() - data object Logining : LoginState() - data object NotVerified : LoginState() - data object RegexError : LoginState() - data object LoginSuccess : LoginState() - data class LoginFailed(val message: String) : LoginState() + sealed class LoginUiState { + data object Initial : LoginUiState() + data object Logining : LoginUiState() + data object NotVerified : LoginUiState() + data object RegexError : LoginUiState() + data object LoginSuccess : LoginUiState() + data class LoginFailed(val message: String) : LoginUiState() } private val _callBackMoveFlag = MutableStateFlow(TOHOME) @@ -103,19 +100,27 @@ class LoginViewModel @Inject constructor( loginFailed() } viewModelScope.launch(exceptionHandler) { - setLoginState(LoginState.Logining) + setLoginState(LoginUiState.Logining) val pw = password.trim().toByteArray() val result = withContext(defaultDispatcher) { - signUseCase.login(LoginParameter(email, pw, isEmailSaved)) + signRepository.login(LoginParameter(email, pw, isEmailSaved)) } - if (result.isSuccess) { - loginSuccess() - pw.fill(0) - } else { - loginFailed() - }/*clearEmailAndPassword(emailCharArray, passwordCharArray)*/ + when (result) { + is LoginState.Success -> { + loginSuccess() + pw.fill(0) + } + + is LoginState.NotVerified -> { + setLoginState(LoginUiState.NotVerified) + } + + else -> { + loginFailed() + } + } } } @@ -134,14 +139,14 @@ class LoginViewModel @Inject constructor( private fun initPassword(password: String): ByteArray = password.trim().toByteArray() private fun loginFailed() { - setLoginState(LoginState.LoginFailed("로그인 실패")) + setLoginState(LoginUiState.LoginFailed("로그인 실패")) } private fun loginSuccess() { - setLoginState(LoginState.LoginSuccess) + setLoginState(LoginUiState.LoginSuccess) } private fun loginFailedWithRegexError() { - setLoginState(LoginState.RegexError) + setLoginState(LoginUiState.RegexError) } } diff --git a/feature/intro/src/main/java/com/android/mediproject/feature/intro/SignUpViewModel.kt b/feature/intro/src/main/java/com/android/mediproject/feature/intro/SignUpViewModel.kt index d1960b9ca..63c0b822f 100644 --- a/feature/intro/src/main/java/com/android/mediproject/feature/intro/SignUpViewModel.kt +++ b/feature/intro/src/main/java/com/android/mediproject/feature/intro/SignUpViewModel.kt @@ -7,7 +7,6 @@ import com.android.mediproject.core.common.util.isEmailValid import com.android.mediproject.core.common.util.isPasswordValid import com.android.mediproject.core.common.viewmodel.MutableEventFlow import com.android.mediproject.core.common.viewmodel.asEventFlow -import com.android.mediproject.core.domain.SignUseCase import com.android.mediproject.core.model.navargs.TOHOME import com.android.mediproject.core.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel diff --git a/feature/intro/src/test/java/com/android/mediproject/feature/intro/LoginViewModelTest.kt b/feature/intro/src/test/java/com/android/mediproject/feature/intro/LoginViewModelTest.kt index c926ef580..c1a2147ab 100644 --- a/feature/intro/src/test/java/com/android/mediproject/feature/intro/LoginViewModelTest.kt +++ b/feature/intro/src/test/java/com/android/mediproject/feature/intro/LoginViewModelTest.kt @@ -1,7 +1,6 @@ package com.android.mediproject.feature.intro -import com.android.mediproject.core.domain.SignUseCase import com.android.mediproject.core.test.MainCoroutineRule import com.android.mediproject.core.test.repositories.FakeSignRepository import com.android.mediproject.core.test.repositories.FakeUserInfoRepository @@ -43,7 +42,7 @@ class LoginViewModelTest { //then val actual = viewModel.loginState.value - val expected = LoginViewModel.LoginState.RegexError + val expected = LoginViewModel.LoginUiState.RegexError assertThat(actual).isEqualTo(expected) } @@ -62,7 +61,7 @@ class LoginViewModelTest { //then val actual = viewModel.loginState.value - val expected = LoginViewModel.LoginState.RegexError + val expected = LoginViewModel.LoginUiState.RegexError assertThat(actual).isEqualTo(expected) } @@ -81,7 +80,7 @@ class LoginViewModelTest { //then val actual = viewModel.loginState.value - val expected = LoginViewModel.LoginState.RegexError + val expected = LoginViewModel.LoginUiState.RegexError assertThat(actual).isEqualTo(expected) } @@ -100,7 +99,7 @@ class LoginViewModelTest { //then val actual = viewModel.loginState.value - val expected = LoginViewModel.LoginState.LoginSuccess + val expected = LoginViewModel.LoginUiState.LoginSuccess assertThat(actual).isEqualTo(expected) } } diff --git a/feature/intro/src/test/java/com/android/mediproject/feature/intro/SignUpViewModelTest.kt b/feature/intro/src/test/java/com/android/mediproject/feature/intro/SignUpViewModelTest.kt index 8a8b542e2..525384b69 100644 --- a/feature/intro/src/test/java/com/android/mediproject/feature/intro/SignUpViewModelTest.kt +++ b/feature/intro/src/test/java/com/android/mediproject/feature/intro/SignUpViewModelTest.kt @@ -1,9 +1,7 @@ package com.android.mediproject.feature.intro -import com.android.mediproject.core.domain.SignUseCase import com.android.mediproject.core.test.repositories.FakeSignRepository import com.android.mediproject.core.test.repositories.FakeUserInfoRepository -import com.google.common.truth.Truth.assertThat import com.android.mediproject.core.test.MainCoroutineRule import kotlinx.coroutines.test.UnconfinedTestDispatcher import org.junit.Assert.assertThat diff --git a/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageViewModel.kt b/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageViewModel.kt index ce3c61c4e..6a568f40f 100644 --- a/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageViewModel.kt +++ b/feature/mypage/src/main/java/com/android/mediproject/feature/mypage/MyPageViewModel.kt @@ -7,8 +7,6 @@ import com.android.mediproject.core.common.network.MediDispatchers import com.android.mediproject.core.common.viewmodel.UiState import com.android.mediproject.core.common.viewmodel.asEventFlow import com.android.mediproject.core.domain.GetCommentsUseCase -import com.android.mediproject.core.domain.GetTokenUseCase -import com.android.mediproject.core.domain.SignUseCase import com.android.mediproject.core.domain.GetUserUseCase import com.android.mediproject.core.model.comments.MyCommentsListResponse import com.android.mediproject.core.model.token.CurrentTokens