package com.arcao.trackables.data.service; import com.arcao.geocaching.api.data.Trackable; import com.arcao.geocaching.api.data.TrackableTravel; import com.arcao.trackables.data.api.TrackableApiService; import com.arcao.trackables.data.persistence.TrackablePersistenceService; import rx.Observable; import javax.inject.Inject; import javax.inject.Singleton; import java.util.List; @Singleton public class TrackableService { private final TrackableApiService apiService; private final TrackablePersistenceService persistenceService; @Inject public TrackableService(TrackableApiService apiService, TrackablePersistenceService persistenceService) { this.apiService = apiService; this.persistenceService = persistenceService; } public Observable<List<Trackable>> getUserTrackables(DataSource source) { switch (source) { case LOCAL: return persistenceService.getUserTrackables(); case REMOTE: return apiService.getUserTrackables() .flatMap(persistenceService::putUserTrackables); case REFRESH: return apiService.getUserTrackables() .flatMap(persistenceService::putUserTrackables) .startWith(persistenceService.getUserTrackables()); default: case REMOTE_IF_NECESSARY: return persistenceService.getUserTrackables() .switchIfEmpty(Observable.defer(() -> apiService.getUserTrackables() .flatMap(persistenceService::putUserTrackables))); } } public Observable<Trackable> getTrackable(String trackableCode, DataSource source) { switch (source) { case LOCAL: return persistenceService.getTrackable(trackableCode); case REMOTE: return apiService.getTrackable(trackableCode) .flatMap(trackable -> persistenceService.putTrackable(trackableCode, trackable)); case REFRESH: return apiService.getTrackable(trackableCode) .flatMap(trackable -> persistenceService.putTrackable(trackableCode, trackable)) .startWith(persistenceService.getTrackable(trackableCode)); default: case REMOTE_IF_NECESSARY: return persistenceService.getTrackable(trackableCode) .switchIfEmpty(Observable.defer(() -> apiService.getTrackable(trackableCode) .flatMap(trackable -> persistenceService.putTrackable(trackableCode, trackable)))); } } public Observable<List<TrackableTravel>> getTrackableTravel(String trackableCode, DataSource source) { switch (source) { case LOCAL: return persistenceService.getTrackableTravelList(trackableCode); case REMOTE: return apiService.getTrackableTravelList(trackableCode) .flatMap(trackableTravelList -> persistenceService.putTrackableTravelList(trackableCode, trackableTravelList)); case REFRESH: return apiService.getTrackableTravelList(trackableCode) .flatMap(trackableTravelList -> persistenceService.putTrackableTravelList(trackableCode, trackableTravelList)) .startWith(persistenceService.getTrackableTravelList(trackableCode)); default: case REMOTE_IF_NECESSARY: return persistenceService.getTrackableTravelList(trackableCode) .switchIfEmpty(Observable.defer(() -> apiService.getTrackableTravelList(trackableCode) .flatMap(trackableTravelList -> persistenceService.putTrackableTravelList(trackableCode, trackableTravelList)))); } } }