Skip to content

Commit dca30bd

Browse files
committed
♻️ 복잡한 콜백 구조 suspend로 변경(GroupList)
1 parent d557117 commit dca30bd

File tree

6 files changed

+53
-38
lines changed

6 files changed

+53
-38
lines changed

data/src/main/java/com/whyranoid/data/group/GroupRepositoryImpl.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.whyranoid.domain.model.GroupNotification
77
import com.whyranoid.domain.model.Rule
88
import com.whyranoid.domain.model.RunningHistory
99
import com.whyranoid.domain.repository.GroupRepository
10+
import kotlinx.coroutines.CoroutineScope
1011
import kotlinx.coroutines.flow.Flow
1112
import javax.inject.Inject
1213

@@ -20,7 +21,7 @@ class GroupRepositoryImpl @Inject constructor(
2021
return userDataSource.getMyGroupList(uid)
2122
}
2223

23-
override fun getMyGroupListFlow(uid: String) = userDataSource.getMyGroupListFlow(uid)
24+
override fun getMyGroupListFlow(uid: String, coroutineScope: CoroutineScope) = userDataSource.getMyGroupListFlow(uid, coroutineScope)
2425

2526
override suspend fun updateGroupInfo(
2627
groupId: String,
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package com.whyranoid.data.user
22

33
import com.whyranoid.domain.model.GroupInfo
4+
import kotlinx.coroutines.CoroutineScope
45
import kotlinx.coroutines.flow.Flow
56

67
interface UserDataSource {
78

89
suspend fun getMyGroupList(uid: String): Result<List<GroupInfo>>
910

10-
fun getMyGroupListFlow(uid: String): Flow<List<GroupInfo>>
11+
fun getMyGroupListFlow(uid: String, coroutineScope: CoroutineScope): Flow<List<GroupInfo>>
1112
}

data/src/main/java/com/whyranoid/data/user/UserDataSourceImpl.kt

Lines changed: 43 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,13 @@ import com.whyranoid.data.model.UserResponse
1111
import com.whyranoid.data.model.toGroupInfo
1212
import com.whyranoid.data.model.toUser
1313
import com.whyranoid.domain.model.GroupInfo
14+
import com.whyranoid.domain.model.User
1415
import com.whyranoid.domain.model.toRule
16+
import kotlinx.coroutines.CoroutineScope
1517
import kotlinx.coroutines.channels.awaitClose
1618
import kotlinx.coroutines.flow.Flow
1719
import kotlinx.coroutines.flow.callbackFlow
20+
import kotlinx.coroutines.launch
1821
import kotlinx.coroutines.tasks.await
1922
import javax.inject.Inject
2023

@@ -62,9 +65,11 @@ class UserDataSourceImpl @Inject constructor(
6265
}
6366
}
6467

65-
// TODO: 콜백을 suspend로 변경
6668
// TODO: 예외처리
67-
override fun getMyGroupListFlow(uid: String): Flow<List<GroupInfo>> = callbackFlow {
69+
override fun getMyGroupListFlow(
70+
uid: String,
71+
coroutineScope: CoroutineScope
72+
): Flow<List<GroupInfo>> = callbackFlow {
6873
db.collection(USERS_COLLECTION)
6974
.document(uid)
7075
.addSnapshotListener { documentSnapshot, _ ->
@@ -74,39 +79,45 @@ class UserDataSourceImpl @Inject constructor(
7479

7580
joinedGroupList?.forEach { groupId ->
7681

77-
db.collection(GROUPS_COLLECTION)
78-
.document(groupId)
79-
.get()
80-
.addOnSuccessListener { documentSnapshot ->
81-
82-
val groupInfoResponse =
83-
documentSnapshot.toObject(GroupInfoResponse::class.java)
84-
85-
groupInfoResponse?.let {
86-
db.collection(USERS_COLLECTION)
87-
.document(it.leaderId)
88-
.get()
89-
.addOnSuccessListener { documentSnapshot ->
90-
val leader =
91-
documentSnapshot.toObject(UserResponse::class.java)
92-
?.toUser()
93-
94-
leader?.let {
95-
val groupInfo = groupInfoResponse.toGroupInfo(
96-
leader = leader,
97-
rules = groupInfoResponse.rules.map {
98-
it.toRule()
99-
}
100-
)
101-
myGroupInfoList.add(groupInfo)
102-
trySend(myGroupInfoList)
103-
}
104-
}
105-
}
106-
}
82+
coroutineScope.launch {
83+
val groupInfo = getGroupInfo(groupId)
84+
myGroupInfoList.add(groupInfo)
85+
trySend(myGroupInfoList)
86+
}
10787
}
10888
}
10989

11090
awaitClose()
11191
}
92+
93+
// TODO : 예외 처리
94+
private suspend fun getGroupInfo(groupId: String): GroupInfo {
95+
val groupInfoResponse = requireNotNull(
96+
db.collection(GROUPS_COLLECTION)
97+
.document(groupId)
98+
.get()
99+
.await()
100+
.toObject(GroupInfoResponse::class.java)
101+
)
102+
103+
val leader = getLeaderInfo(groupInfoResponse.leaderId)
104+
105+
return groupInfoResponse.toGroupInfo(
106+
leader = leader,
107+
rules = groupInfoResponse.rules.map {
108+
it.toRule()
109+
}
110+
)
111+
}
112+
113+
// TODO : 예외 처리
114+
private suspend fun getLeaderInfo(leaderId: String): User {
115+
return requireNotNull(
116+
db.collection(USERS_COLLECTION)
117+
.document(leaderId)
118+
.get()
119+
.await()
120+
.toObject(UserResponse::class.java)?.toUser()
121+
)
122+
}
112123
}

domain/src/main/java/com/whyranoid/domain/repository/GroupRepository.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ import com.whyranoid.domain.model.GroupInfo
44
import com.whyranoid.domain.model.GroupNotification
55
import com.whyranoid.domain.model.Rule
66
import com.whyranoid.domain.model.RunningHistory
7+
import kotlinx.coroutines.CoroutineScope
78
import kotlinx.coroutines.flow.Flow
89

910
interface GroupRepository {
1011

1112
suspend fun getMyGroupList(uid: String): Result<List<GroupInfo>>
1213

13-
fun getMyGroupListFlow(uid: String): Flow<List<GroupInfo>>
14+
fun getMyGroupListFlow(uid: String, coroutineScope: CoroutineScope): Flow<List<GroupInfo>>
1415

1516
// 그룹 정보 수정, 홍보 글 수정
1617
suspend fun updateGroupInfo(

domain/src/main/java/com/whyranoid/domain/usecase/GetMyGroupListUseCase.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@ package com.whyranoid.domain.usecase
33
import com.whyranoid.domain.model.GroupInfo
44
import com.whyranoid.domain.repository.AccountRepository
55
import com.whyranoid.domain.repository.GroupRepository
6+
import kotlinx.coroutines.CoroutineScope
67
import kotlinx.coroutines.flow.Flow
78
import javax.inject.Inject
89

910
class GetMyGroupListUseCase @Inject constructor(
1011
private val groupRepository: GroupRepository,
1112
private val accountRepository: AccountRepository
1213
) {
13-
suspend operator fun invoke(): Flow<List<GroupInfo>> {
14+
suspend operator fun invoke(coroutineScope: CoroutineScope): Flow<List<GroupInfo>> {
1415
val uid = accountRepository.getUid()
15-
return groupRepository.getMyGroupListFlow(uid)
16+
return groupRepository.getMyGroupListFlow(uid, coroutineScope)
1617
}
1718
}

presentation/src/main/java/com/whyranoid/presentation/community/CommunityViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class CommunityViewModel @Inject constructor(
8282

8383
init {
8484
viewModelScope.launch {
85-
getMyGroupListUseCase().onEach { groupInfoList ->
85+
getMyGroupListUseCase(this).onEach { groupInfoList ->
8686
_myGroupList.value = groupInfoList.map { groupInfo ->
8787
groupInfo.toGroupInfoUiModel()
8888
}

0 commit comments

Comments
 (0)