Skip to content

Commit fae4788

Browse files
committed
Feat: userProfile 단일 조회를 위한 GetUserProfileUseCase 추가
1 parent e5c743e commit fae4788

4 files changed

Lines changed: 37 additions & 17 deletions

File tree

data/src/main/java/com/threegap/bitnagil/data/user/repositoryImpl/UserRepositoryImpl.kt

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,9 @@ class UserRepositoryImpl @Inject constructor(
2323
private val fetchMutex = Mutex()
2424

2525
override fun observeUserProfile(): Flow<Result<UserProfile>> = flow {
26-
if (userLocalDataSource.userProfile.value == null) {
27-
fetchMutex.withLock {
28-
if (userLocalDataSource.userProfile.value == null) {
29-
userRemoteDataSource.fetchUserProfile()
30-
.onSuccess { response ->
31-
userLocalDataSource.saveUserProfile(response.toDomain())
32-
}
33-
.onFailure {
34-
emit(Result.failure(it))
35-
}
36-
}
37-
}
26+
fetchAndCacheIfNeeded().onFailure {
27+
emit(Result.failure(it))
28+
return@flow
3829
}
3930

4031
emitAll(
@@ -44,7 +35,25 @@ class UserRepositoryImpl @Inject constructor(
4435
)
4536
}
4637

38+
override suspend fun getUserProfile(): Result<UserProfile> {
39+
return fetchAndCacheIfNeeded()
40+
}
41+
4742
override fun clearCache() {
4843
userLocalDataSource.clearCache()
4944
}
45+
46+
private suspend fun fetchAndCacheIfNeeded(): Result<UserProfile> {
47+
userLocalDataSource.userProfile.value?.let { return Result.success(it) }
48+
49+
return fetchMutex.withLock {
50+
userLocalDataSource.userProfile.value?.let { return@withLock Result.success(it) }
51+
52+
userRemoteDataSource.fetchUserProfile()
53+
.onSuccess { response ->
54+
userLocalDataSource.saveUserProfile(response.toDomain())
55+
}
56+
.map { it.toDomain() }
57+
}
58+
}
5059
}

domain/src/main/java/com/threegap/bitnagil/domain/user/repository/UserRepository.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ import kotlinx.coroutines.flow.Flow
55

66
interface UserRepository {
77
fun observeUserProfile(): Flow<Result<UserProfile>>
8+
suspend fun getUserProfile(): Result<UserProfile>
89
fun clearCache()
910
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.threegap.bitnagil.domain.user.usecase
2+
3+
import com.threegap.bitnagil.domain.user.model.UserProfile
4+
import com.threegap.bitnagil.domain.user.repository.UserRepository
5+
import javax.inject.Inject
6+
7+
class GetUserProfileUseCase @Inject constructor(
8+
private val userRepository: UserRepository,
9+
) {
10+
suspend operator fun invoke(): Result<UserProfile> = userRepository.getUserProfile()
11+
}

presentation/src/main/java/com/threegap/bitnagil/presentation/screen/onboarding/OnBoardingViewModel.kt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import com.threegap.bitnagil.domain.onboarding.usecase.GetOnBoardingsUseCase
88
import com.threegap.bitnagil.domain.onboarding.usecase.GetRecommendOnBoardingRoutinesUseCase
99
import com.threegap.bitnagil.domain.onboarding.usecase.GetUserOnBoardingUseCase
1010
import com.threegap.bitnagil.domain.onboarding.usecase.RegisterRecommendOnBoardingRoutinesUseCase
11-
import com.threegap.bitnagil.domain.user.usecase.ObserveUserProfileUseCase
11+
import com.threegap.bitnagil.domain.user.usecase.GetUserProfileUseCase
1212
import com.threegap.bitnagil.presentation.screen.onboarding.contract.OnBoardingSideEffect
1313
import com.threegap.bitnagil.presentation.screen.onboarding.contract.OnBoardingState
1414
import com.threegap.bitnagil.presentation.screen.onboarding.model.OnBoardingItemUiModel
@@ -22,7 +22,6 @@ import dagger.assisted.AssistedInject
2222
import dagger.hilt.android.lifecycle.HiltViewModel
2323
import kotlinx.coroutines.Job
2424
import kotlinx.coroutines.async
25-
import kotlinx.coroutines.flow.first
2625
import kotlinx.coroutines.isActive
2726
import org.orbitmvi.orbit.Container
2827
import org.orbitmvi.orbit.ContainerHost
@@ -35,7 +34,7 @@ class OnBoardingViewModel @AssistedInject constructor(
3534
private val getRecommendOnBoardingRoutinesUseCase: GetRecommendOnBoardingRoutinesUseCase,
3635
private val getOnBoardingAbstractUseCase: GetOnBoardingAbstractUseCase,
3736
private val registerRecommendOnBoardingRoutinesUseCase: RegisterRecommendOnBoardingRoutinesUseCase,
38-
private val observeUserProfileUseCase: ObserveUserProfileUseCase,
37+
private val getUserProfileUseCase: GetUserProfileUseCase,
3938
private val getUserOnBoardingUseCase: GetUserOnBoardingUseCase,
4039
@Assisted private val onBoardingArg: OnBoardingScreenArg,
4140
) : ContainerHost<OnBoardingState, OnBoardingSideEffect>, ViewModel() {
@@ -72,7 +71,7 @@ class OnBoardingViewModel @AssistedInject constructor(
7271
}
7372

7473
private fun loadIntro() = intent {
75-
val userName = observeUserProfileUseCase().first().getOrNull()?.nickname ?: "-"
74+
val userName = getUserProfileUseCase().getOrNull()?.nickname ?: "-"
7675

7776
reduce {
7877
OnBoardingState.Idle(
@@ -87,7 +86,7 @@ class OnBoardingViewModel @AssistedInject constructor(
8786
}
8887

8988
private fun loadUserOnBoarding() = intent {
90-
val userName = observeUserProfileUseCase().first().getOrNull()?.nickname ?: "-"
89+
val userName = getUserProfileUseCase().getOrNull()?.nickname ?: "-"
9190
val userOnBoarding = getUserOnBoardingUseCase().fold(
9291
onSuccess = { it },
9392
onFailure = {

0 commit comments

Comments
 (0)