public ITrackingCollection <IRemoteRepositoryModel> GetRepositories(ITrackingCollection <IRemoteRepositoryModel> collection) { var keyobs = GetUserFromCache() .Select(user => string.Format(CultureInfo.InvariantCulture, "{0}|{1}", CacheIndex.RepoPrefix, user.Login)); var source = Observable.Defer(() => keyobs .SelectMany(key => hostCache.GetAndFetchLatestFromIndex(key, () => apiClient.GetRepositories() .Select(RepositoryCacheItem.Create), item => { // this could blow up due to the collection being disposed somewhere else try { collection.RemoveItem(Create(item)); } catch (ObjectDisposedException) { } }, TimeSpan.FromMinutes(5), TimeSpan.FromDays(1)) ) .Select(Create) ); collection.Listen(source); return(collection); }
/// <summary> /// Gets a collection of Pull Requests. If you want to refresh existing data, pass a collection in /// </summary> /// <param name="repo"></param> /// <param name="collection"></param> /// <returns></returns> public ITrackingCollection <IPullRequestModel> GetPullRequests(ILocalRepositoryModel repo, ITrackingCollection <IPullRequestModel> collection) { // Since the api to list pull requests returns all the data for each pr, cache each pr in its own entry // and also cache an index that contains all the keys for each pr. This way we can fetch prs in bulk // but also individually without duplicating information. We store things in a custom observable collection // that checks whether an item is being updated (coming from the live stream after being retrieved from cache) // and replaces it instead of appending, so items get refreshed in-place as they come in. var keyobs = GetUserFromCache() .Select(user => string.Format(CultureInfo.InvariantCulture, "{0}|{1}:{2}", CacheIndex.PRPrefix, user.Login, repo.Name)); var source = Observable.Defer(() => keyobs .SelectMany(key => hostCache.GetAndFetchLatestFromIndex(key, () => apiClient.GetPullRequestsForRepository(repo.CloneUrl.Owner, repo.CloneUrl.RepositoryName) .Select(PullRequestCacheItem.Create), item => { // this could blow up due to the collection being disposed somewhere else try { collection.RemoveItem(Create(item)); } catch (ObjectDisposedException) { } }, TimeSpan.Zero, TimeSpan.FromDays(7)) ) .Select(Create) ); collection.Listen(source); return(collection); }
public ITrackingCollection<IRemoteRepositoryModel> GetRepositories(ITrackingCollection<IRemoteRepositoryModel> collection) { var keyobs = GetUserFromCache() .Select(user => string.Format(CultureInfo.InvariantCulture, "{0}|{1}", CacheIndex.RepoPrefix, user.Login)); var source = Observable.Defer(() => keyobs .SelectMany(key => hostCache.GetAndFetchLatestFromIndex(key, () => apiClient.GetRepositories() .Select(RepositoryCacheItem.Create), item => { // this could blow up due to the collection being disposed somewhere else try { collection.RemoveItem(Create(item)); } catch (ObjectDisposedException) { } }, TimeSpan.FromMinutes(5), TimeSpan.FromDays(1)) ) .Select(Create) ); collection.Listen(source); return collection; }
/// <summary> /// Gets a collection of Pull Requests. If you want to refresh existing data, pass a collection in /// </summary> /// <param name="repo"></param> /// <param name="collection"></param> /// <returns></returns> public ITrackingCollection<IPullRequestModel> GetPullRequests(ILocalRepositoryModel repo, ITrackingCollection<IPullRequestModel> collection) { // Since the api to list pull requests returns all the data for each pr, cache each pr in its own entry // and also cache an index that contains all the keys for each pr. This way we can fetch prs in bulk // but also individually without duplicating information. We store things in a custom observable collection // that checks whether an item is being updated (coming from the live stream after being retrieved from cache) // and replaces it instead of appending, so items get refreshed in-place as they come in. var keyobs = GetUserFromCache() .Select(user => string.Format(CultureInfo.InvariantCulture, "{0}|{1}:{2}", CacheIndex.PRPrefix, user.Login, repo.Name)); var source = Observable.Defer(() => keyobs .SelectMany(key => hostCache.GetAndFetchLatestFromIndex(key, () => apiClient.GetPullRequestsForRepository(repo.CloneUrl.Owner, repo.CloneUrl.RepositoryName) .Select(PullRequestCacheItem.Create), item => { // this could blow up due to the collection being disposed somewhere else try { collection.RemoveItem(Create(item)); } catch (ObjectDisposedException) { } }, TimeSpan.Zero, TimeSpan.FromDays(7)) ) .Select(Create) ); collection.Listen(source); return collection; }