コード例 #1
0
        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));
        }
コード例 #2
0
        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()));
        }
コード例 #3
0
        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()));
        }
コード例 #4
0
        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();
        }
コード例 #5
0
        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));
        }
コード例 #6
0
        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);
            }
        }
コード例 #7
0
 public static IObservable <Entity[]> ListAllItems(this IBaseRequestBuilder builder, Action <ICloudOfficeToken> saveToken = null, ICloudOfficeToken cloudOfficeToken = null)
 => builder.ListAllItems <Entity>(cloudOfficeToken, saveToken);
コード例 #8
0
this IObservable <TService> source, Func <IObjectSpace> objectSpaceFactory, Guid currentUserId, Func <TService, ICloudOfficeToken, IObservable <
                                                                                                          (TCloudEvent @event, MapAction mapAction)> > modifiedEventsList, Type localEventType, string tokenType)