public static IObservable <TEntity[]> ListAllItems <TEntity>(this IBaseRequestBuilder builder, ICloudOfficeToken cloudOfficeToken = null, Action <ICloudOfficeToken> saveToken = null, Func <TEntity, bool> filter = null) where TEntity : Entity { var request = (IBaseRequest)builder.CallMethod("Request"); return(request.ListAllItems(cloudOfficeToken, saveToken, filter)); }
public static IObservable <TEntity[]> ListAllItems <TEntity>(this IEnumerable <TEntity> page, ICloudOfficeToken cloudOfficeToken = null, Action <ICloudOfficeToken> saveToken = null, Func <TEntity, bool> filter = null) where TEntity : Entity { filter ??= (_ => true); var methodInfo = page.GetType().GetProperty("NextPageRequest")?.PropertyType.Methods(Flags.InstancePublic, "GetAsync").First(); if (methodInfo == null) { throw new NotSupportedException($"Pagination not supported for {page.GetType().FullName}"); } var nextPageRequestDelegate = page.GetType().DelegateForGetPropertyValue("NextPageRequest"); page.AdditionalData().SaveToken(cloudOfficeToken, saveToken); var invokeNextPage = Observable.FromAsync(() => methodInfo.InvokeAsync(nextPageRequestDelegate(page))) .Select(entities => { page = (IEnumerable <TEntity>)entities; entities.AdditionalData().SaveToken(cloudOfficeToken, saveToken); return(entities); }) .Select(o => ((IEnumerable)o).Cast <TEntity>().ToArray()); return(Observable.While(() => nextPageRequestDelegate(page) != null, invokeNextPage).StartWith(page.ToArray()) .Select(entities => entities.Where(filter).ToArray()) .SwitchIfEmpty(Enumerable.Empty <TEntity>().ToArray().ReturnObservable())); }
public static IObservable <TEntity[]> ListAllItems <TEntity>(this IBaseRequest request, ICloudOfficeToken cloudOfficeToken = null, Action <ICloudOfficeToken> saveToken = null, Func <TEntity, bool> filter = null) where TEntity : Entity { filter ??= (_ => true); var methodInfo = request.GetType().Methods(Flags.InstancePublic, "GetAsync").First(); return(Observable.FromAsync(() => methodInfo.InvokeAsync(request)).Cast <IEnumerable <TEntity> >() .SelectMany(entities => entities.ListAllItems(cloudOfficeToken, saveToken, filter).ToEnumerable().ToArray().ToObservable())); }
public static void SaveToken(this ICloudOfficeToken store, Func <IObjectSpace> objectSpaceFactory) { using var space = objectSpaceFactory(); var storage = (ICloudOfficeToken)(space.GetObject(store) ?? space.CreateObject(store.GetType())); storage.Token = store.Token; storage.TokenType = store.TokenType; storage.EntityName = store.EntityName; space.CommitChanges(); }
public static IObservable <TResponse[]> List <TResponse, TMaxResult>(this IClientServiceRequest <TResponse> request, TMaxResult maxResults, ICloudOfficeToken cloudOfficeToken = null, Action <ICloudOfficeToken> saveToken = null, Func <GoogleApiException, bool> repeat = null) { request.SetPropertyValue("MaxResults", maxResults); repeat ??= (exception => exception.HttpStatusCode == HttpStatusCode.Gone); if (cloudOfficeToken != null) { request.SetPropertyValue("SyncToken", cloudOfficeToken.Token); } var allEvents = Observable.FromAsync(() => request.ExecuteAsync()) .Catch <TResponse, GoogleApiException>(e => { if (cloudOfficeToken != null) { cloudOfficeToken.Token = null; } return(repeat(e) ? request.List(maxResults, cloudOfficeToken, saveToken, repeat).SelectMany(responses => responses) : Observable.Throw <TResponse>(e)); }) .Do(_ => request.SetPropertyValue("PageToken", _.GetPropertyValue("NextPageToken"))) .Repeat().TakeUntil(_ => request.GetPropertyValue("PageToken") == null) .Finally(() => saveToken?.Invoke(cloudOfficeToken)) .Publish().RefCount(); if (cloudOfficeToken != null) { allEvents = allEvents.Where(_ => _.GetPropertyValue("NextSyncToken") != null).LastOrDefaultAsync().Do(_ => { if (_ != null) { cloudOfficeToken.Token = $"{_.GetPropertyValue("NextSyncToken")}"; } }).IgnoreElements().Merge(allEvents); } return(allEvents.BufferUntilCompleted().Select(responses => responses)); }
private static void SaveToken(this IDictionary <string, object> additionalData, ICloudOfficeToken cloudOfficeToken, Action <ICloudOfficeToken> saveToken) { if (cloudOfficeToken != null) { if (additionalData.ContainsKey("@odata.deltaLink")) { cloudOfficeToken.Token = HttpUtility .ParseQueryString(new Uri(additionalData["@odata.deltaLink"].ToString()).Query).Get("$deltatoken"); cloudOfficeToken.TokenType = "deltatoken"; } else if (additionalData.ContainsKey("@odata.nextLink")) { cloudOfficeToken.Token = HttpUtility.ParseQueryString(new Uri(additionalData["@odata.nextLink"].ToString()).Query) .Get("$skiptoken"); cloudOfficeToken.TokenType = "skiptoken"; } saveToken?.Invoke(cloudOfficeToken); } }
public static IObservable <Entity[]> ListAllItems(this IBaseRequestBuilder builder, Action <ICloudOfficeToken> saveToken = null, ICloudOfficeToken cloudOfficeToken = null) => builder.ListAllItems <Entity>(cloudOfficeToken, saveToken);
this IObservable <TService> source, Func <IObjectSpace> objectSpaceFactory, Guid currentUserId, Func <TService, ICloudOfficeToken, IObservable < (TCloudEvent @event, MapAction mapAction)> > modifiedEventsList, Type localEventType, string tokenType)