onirutlA
03/03/2022, 12:15 PMoverride fun findUserByUsername(username: String): Flow<Resource<List<UserEntity>>> =
localDataSource.findUserByUsername(username).map { fromDb ->
when (fromDb) {
is FromDb.Empty -> {
when (val fromNetwork = remoteDataSource.findUsersByUsername(username)) {
is FromNetwork.Error -> Resource.Error(fromNetwork.message)
is FromNetwork.Success -> {
val userCache = fromNetwork.data.map { it.toEntity() }
localDataSource.insertUsers(userCache)
var userFromDb: Resource<List<UserEntity>> = Resource.Loading()
localDataSource.findUserByUsername(username).collect {
userFromDb = when (it) {
is FromDb.Empty -> Resource.Error(it.message)
is FromDb.Success -> Resource.Success(it.data)
}
}
userFromDb
}
}
}
is FromDb.Success -> Resource.Success(fromDb.data)
}
}.onStart {
Resource.Loading<List<UserEntity>>()
}.flowOn(dispatcher)
onirutlA
03/03/2022, 12:23 PMEmmanuel Stanley
03/04/2022, 6:51 AMEmmanuel Stanley
03/04/2022, 6:53 AMSemir Rahic
03/04/2022, 11:51 AMonirutlA
03/07/2022, 3:19 PMoverride fun findUserByUsername(username: String): Flow<Resource<List<UserEntity>>> = flow {
localDataSource.findUserByUsername(username).collect { local ->
if (local.isNullOrEmpty()) {
remoteDataSource.findUsersByUsername(username).collect { remote ->
if (remote.isNullOrEmpty()) emit(Resource.Empty("Data is not found"))
if (remote.isNotEmpty()) {
val caches = remote.map { it.toEntity() }
localDataSource.insertUsers(caches)
localDataSource.findUserByUsername(username).collect {
emit(Resource.Success(it))
}
}
}
}
emit(Resource.Success(local))
}
}.onStart {
emit(Resource.Loading())
}.onEmpty {
emit(Resource.Empty("Data is not found"))
}.catch {
Log.d("repo findUser", "$it")
}.flowOn(dispatcher)
I've implemented it this way while waiting you guys answer this question, so are there any better way than thisEmmanuel Stanley
03/07/2022, 4:04 PMEmmanuel Stanley
03/07/2022, 4:06 PM