package com.arcao.trackables.data.service; import com.arcao.geocaching.api.data.Geocache; import com.arcao.trackables.data.api.GeocacheApiService; import com.arcao.trackables.data.persistence.GeocachePersistenceService; import rx.Observable; import javax.inject.Inject; import javax.inject.Singleton; @Singleton public class GeocacheService { private final GeocacheApiService apiService; private final GeocachePersistenceService persistenceService; @Inject public GeocacheService(GeocacheApiService apiService, GeocachePersistenceService persistenceService) { this.apiService = apiService; this.persistenceService = persistenceService; } public Observable<Geocache> getGeocache(String geocacheCode) { return getGeocache(geocacheCode, DataSource.REMOTE_IF_NECESSARY); } public Observable<Geocache> getGeocache(String geocacheCode, DataSource source) { switch (source) { case LOCAL: return persistenceService.getGeocache(geocacheCode); case REMOTE: return apiService.getGeocache(geocacheCode) .flatMap(geocache -> persistenceService.putGeocache(geocacheCode, geocache)); case REFRESH: return apiService.getGeocache(geocacheCode) .flatMap(geocache -> persistenceService.putGeocache(geocacheCode, geocache)) .startWith(persistenceService.getGeocache(geocacheCode)); default: case REMOTE_IF_NECESSARY: return persistenceService.getGeocache(geocacheCode) .switchIfEmpty(Observable.defer(() -> apiService.getGeocache(geocacheCode) .flatMap(geocache -> persistenceService.putGeocache(geocacheCode, geocache)))); } } }