onirutlA
01/10/2022, 3:24 AMoverride fun getUsersSearch(username: String) = flow<Resource<List<UserDTO>>> {
emit(Resource.Loading())
localDataSource.getUserSearch(username).collect { fromDb ->
when (fromDb) {
is FromDb.Success -> {
val dtos = mapNullInputList(fromDb.data) { it.toDto() }
emit(Resource.Success(dtos))
}
is FromDb.Empty -> {
when (val networkState = remoteDataSource.getUserSearch(username)) {
is FromNetwork.Success -> {
val fromNetwork = networkState.body
val cache = mapNullInputList(fromNetwork) { it.toEntity() }
localDataSource.insertUsers(cache)
val dto = mapNullInputList(fromNetwork) { it.toDto() }
emit(Resource.Success(dto))
}
is FromNetwork.Error -> {
emit(Resource.Error(networkState.message))
}
}
}
}
}
}.flowOn(ioDispatcher)
Colton Idle
01/10/2022, 6:02 AMgildor
01/10/2022, 6:13 AMgildor
01/10/2022, 6:13 AMonirutlA
01/10/2022, 6:18 AMonirutlA
01/10/2022, 6:19 AMoverride fun getUsersSearch(username: String) = flow<Resource<List<UserDTO>>> {
emit(Resource.Loading())
localDataSource.getUserSearch(username).collect { fromDb ->
when (fromDb) {
is FromDb.Success -> {
val dtos = mapNullInputList(fromDb.data) { it.toDto() }
emit(Resource.Success(dtos))
}
is FromDb.Empty -> {
when (val networkState = remoteDataSource.getUserSearch(username)) {
is FromNetwork.Success -> {
val fromNetwork = networkState.body
val cache = mapNullInputList(fromNetwork) { it.toEntity() }
localDataSource.insertUsers(cache)
val dto = mapNullInputList(fromNetwork) { it.toDto() }
emit(Resource.Success(dto))
}
is FromNetwork.Error -> {
emit(Resource.Error(networkState.message))
}
}
}
}
}
}.flowOn(ioDispatcher)
gildor
01/10/2022, 6:33 AMgildor
01/10/2022, 6:36 AMlocalDataSource.getUserSearch(username)
.map. { fromDb -> ... }
.onStart { emit(Resource.Loading()) }
It looks more natural for me and also doesn’t require flow builder at allgildor
01/10/2022, 6:37 AMonirutlA
01/10/2022, 6:41 AMonirutlA
01/10/2022, 6:43 AM// LocalDataSource
override suspend fun insertUsers(users: List<UserEntity>) = userDao.insertUsers(users)
// RemoteDataSource
override suspend fun getUserSearch(username: String): FromNetwork<List<UserResponse>> {
return try {
val response = apiService.getUsersSearch(username)
return if (response.isSuccessful)
FromNetwork.Success(body = response.body()?.items!!, message = response.message())
else
FromNetwork.Error(message = response.message())
} catch (t: Throwable) {
FromNetwork.Error(message = t.message)
}
}
onirutlA
01/10/2022, 6:46 AMonirutlA
01/10/2022, 6:47 AMgildor
01/10/2022, 6:48 AMonirutlA
01/10/2022, 6:48 AMgildor
01/10/2022, 6:49 AMonirutlA
01/10/2022, 8:24 AM