Skip to content

Commit 35563e3

Browse files
committed
✨ UserDatasource 추상화
1 parent 0cab66b commit 35563e3

File tree

3 files changed

+120
-104
lines changed

3 files changed

+120
-104
lines changed

data/src/main/java/com/whyranoid/data/di/GroupModule.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import com.whyranoid.data.group.GroupDataSourceImpl
55
import com.whyranoid.data.group.GroupRepositoryImpl
66
import com.whyranoid.data.groupnotification.GroupNotificationDataSource
77
import com.whyranoid.data.groupnotification.GroupNotificationDataSourceImpl
8+
import com.whyranoid.data.user.UserDataSource
9+
import com.whyranoid.data.user.UserDataSourceImpl
810
import com.whyranoid.domain.repository.GroupRepository
911
import dagger.Binds
1012
import dagger.Module
@@ -18,6 +20,9 @@ abstract class GroupModule {
1820
@Binds
1921
abstract fun bindGroupDataSource(groupDataSourceImpl: GroupDataSourceImpl): GroupDataSource
2022

23+
@Binds
24+
abstract fun bindUserDataSource(userDataSourceImpl: UserDataSourceImpl): UserDataSource
25+
2126
@Binds
2227
abstract fun bindGroupNotificationDataSource(groupNotificationDataSourceImpl: GroupNotificationDataSourceImpl): GroupNotificationDataSource
2328

Lines changed: 3 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -1,112 +1,11 @@
11
package com.whyranoid.data.user
22

3-
import com.google.firebase.firestore.FirebaseFirestore
4-
import com.whyranoid.data.constant.CollectionId.GROUPS_COLLECTION
5-
import com.whyranoid.data.constant.CollectionId.USERS_COLLECTION
6-
import com.whyranoid.data.constant.Exceptions.NO_GROUP_EXCEPTION
7-
import com.whyranoid.data.constant.Exceptions.NO_JOINED_GROUP_EXCEPTION
8-
import com.whyranoid.data.constant.Exceptions.NO_USER_EXCEPTION
9-
import com.whyranoid.data.model.GroupInfoResponse
10-
import com.whyranoid.data.model.UserResponse
11-
import com.whyranoid.data.model.toGroupInfo
12-
import com.whyranoid.data.model.toUser
133
import com.whyranoid.domain.model.GroupInfo
14-
import com.whyranoid.domain.model.toRule
15-
import kotlinx.coroutines.channels.awaitClose
164
import kotlinx.coroutines.flow.Flow
17-
import kotlinx.coroutines.flow.callbackFlow
18-
import kotlinx.coroutines.tasks.await
19-
import javax.inject.Inject
205

21-
class UserDataSource @Inject constructor(
22-
private val db: FirebaseFirestore
23-
) {
6+
interface UserDataSource {
247

25-
suspend fun getMyGroupList(uid: String): Result<List<GroupInfo>> {
26-
val myGroupInfoList = mutableListOf<GroupInfo>()
8+
suspend fun getMyGroupList(uid: String): Result<List<GroupInfo>>
279

28-
return runCatching {
29-
val joinedGroupList = db.collection(USERS_COLLECTION)
30-
.document(uid)
31-
.get()
32-
.await()
33-
.toObject(UserResponse::class.java)
34-
?.joinedGroupList ?: throw NO_USER_EXCEPTION
35-
36-
joinedGroupList.forEach { groupId ->
37-
38-
val groupInfoResponse = db.collection(GROUPS_COLLECTION)
39-
.document(groupId)
40-
.get()
41-
.await()
42-
.toObject(GroupInfoResponse::class.java)
43-
?: throw NO_GROUP_EXCEPTION
44-
45-
val leader = db.collection(USERS_COLLECTION)
46-
.document(uid)
47-
.get()
48-
.await()
49-
.toObject(UserResponse::class.java)
50-
?.toUser() ?: throw NO_USER_EXCEPTION
51-
52-
val groupInfo = groupInfoResponse.toGroupInfo(
53-
leader = leader,
54-
rules = groupInfoResponse.rules.map {
55-
it.toRule()
56-
}
57-
)
58-
59-
myGroupInfoList.add(groupInfo)
60-
}
61-
if (myGroupInfoList.size == 0) throw NO_JOINED_GROUP_EXCEPTION else myGroupInfoList
62-
}
63-
}
64-
65-
// TODO: 콜백을 suspend로 변경
66-
// TODO: 예외처리
67-
fun getMyGroupListFlow(uid: String): Flow<List<GroupInfo>> = callbackFlow {
68-
db.collection(USERS_COLLECTION)
69-
.document(uid)
70-
.addSnapshotListener { documentSnapshot, _ ->
71-
val myGroupInfoList = mutableListOf<GroupInfo>()
72-
val joinedGroupList =
73-
documentSnapshot?.toObject(UserResponse::class.java)?.joinedGroupList
74-
75-
joinedGroupList?.forEach { groupId ->
76-
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-
}
107-
}
108-
}
109-
110-
awaitClose()
111-
}
10+
fun getMyGroupListFlow(uid: String): Flow<List<GroupInfo>>
11211
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package com.whyranoid.data.user
2+
3+
import com.google.firebase.firestore.FirebaseFirestore
4+
import com.whyranoid.data.constant.CollectionId.GROUPS_COLLECTION
5+
import com.whyranoid.data.constant.CollectionId.USERS_COLLECTION
6+
import com.whyranoid.data.constant.Exceptions.NO_GROUP_EXCEPTION
7+
import com.whyranoid.data.constant.Exceptions.NO_JOINED_GROUP_EXCEPTION
8+
import com.whyranoid.data.constant.Exceptions.NO_USER_EXCEPTION
9+
import com.whyranoid.data.model.GroupInfoResponse
10+
import com.whyranoid.data.model.UserResponse
11+
import com.whyranoid.data.model.toGroupInfo
12+
import com.whyranoid.data.model.toUser
13+
import com.whyranoid.domain.model.GroupInfo
14+
import com.whyranoid.domain.model.toRule
15+
import kotlinx.coroutines.channels.awaitClose
16+
import kotlinx.coroutines.flow.Flow
17+
import kotlinx.coroutines.flow.callbackFlow
18+
import kotlinx.coroutines.tasks.await
19+
import javax.inject.Inject
20+
21+
class UserDataSourceImpl @Inject constructor(
22+
private val db: FirebaseFirestore
23+
) : UserDataSource {
24+
25+
override suspend fun getMyGroupList(uid: String): Result<List<GroupInfo>> {
26+
val myGroupInfoList = mutableListOf<GroupInfo>()
27+
28+
return runCatching {
29+
val joinedGroupList = db.collection(USERS_COLLECTION)
30+
.document(uid)
31+
.get()
32+
.await()
33+
.toObject(UserResponse::class.java)
34+
?.joinedGroupList ?: throw NO_USER_EXCEPTION
35+
36+
joinedGroupList.forEach { groupId ->
37+
38+
val groupInfoResponse = db.collection(GROUPS_COLLECTION)
39+
.document(groupId)
40+
.get()
41+
.await()
42+
.toObject(GroupInfoResponse::class.java)
43+
?: throw NO_GROUP_EXCEPTION
44+
45+
val leader = db.collection(USERS_COLLECTION)
46+
.document(uid)
47+
.get()
48+
.await()
49+
.toObject(UserResponse::class.java)
50+
?.toUser() ?: throw NO_USER_EXCEPTION
51+
52+
val groupInfo = groupInfoResponse.toGroupInfo(
53+
leader = leader,
54+
rules = groupInfoResponse.rules.map {
55+
it.toRule()
56+
}
57+
)
58+
59+
myGroupInfoList.add(groupInfo)
60+
}
61+
if (myGroupInfoList.size == 0) throw NO_JOINED_GROUP_EXCEPTION else myGroupInfoList
62+
}
63+
}
64+
65+
// TODO: 콜백을 suspend로 변경
66+
// TODO: 예외처리
67+
override fun getMyGroupListFlow(uid: String): Flow<List<GroupInfo>> = callbackFlow {
68+
db.collection(USERS_COLLECTION)
69+
.document(uid)
70+
.addSnapshotListener { documentSnapshot, _ ->
71+
val myGroupInfoList = mutableListOf<GroupInfo>()
72+
val joinedGroupList =
73+
documentSnapshot?.toObject(UserResponse::class.java)?.joinedGroupList
74+
75+
joinedGroupList?.forEach { groupId ->
76+
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+
}
107+
}
108+
}
109+
110+
awaitClose()
111+
}
112+
}

0 commit comments

Comments
 (0)