Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.ahmadrd.movieexplorer.core.data
- import com.ahmadrd.movieexplorer.core.data.source.remote.network.ApiResponse
- import kotlinx.coroutines.flow.*
- abstract class NetworkBoundResource<ResultType, RequestType> {
- private var result: Flow<Resource<ResultType>> = flow {
- emit(Resource.Loading())
- val dbSource = loadFromDB().first()
- if (shouldFetch(dbSource)) {
- emit(Resource.Loading())
- when (val apiResponse = createCall().first()) {
- is ApiResponse.Success -> {
- saveCallResult(apiResponse.data)
- emitAll(loadFromDB().map {
- Resource.Success(
- it
- )
- })
- }
- is ApiResponse.Empty -> {
- emitAll(loadFromDB().map { Resource.Success(it) })
- }
- is ApiResponse.Error -> {
- onFetchFailed()
- emit(Resource.Error(apiResponse.errorMessage))
- }
- }
- } else {
- emitAll(loadFromDB().map { Resource.Success(it) })
- }
- }
- protected open fun onFetchFailed() {}
- protected abstract fun loadFromDB(): Flow<ResultType>
- protected abstract fun shouldFetch(data: ResultType?): Boolean
- protected abstract suspend fun createCall(): Flow<ApiResponse<RequestType>>
- protected abstract suspend fun saveCallResult(data: RequestType)
- fun asFlow(): Flow<Resource<ResultType>> = result
- }
Advertisement
Add Comment
Please, Sign In to add comment