public void TestSearchCatalogObjects()
        {
            var request = new SearchCatalogObjectsRequest();

            request.Query = new CatalogQuery(
                PrefixQuery: new CatalogQueryPrefix(AttributeName: "name", AttributePrefix: "Sm")
                );
            request.IncludeDeletedObjects = false;
            request.IncludeRelatedObjects = true;
            var response = instance.SearchCatalogObjects(request);

            Assert.AreEqual(2, response.Objects.Count);
            var obj1 = response.Objects[0];

            Assert.AreEqual(TypeEnum.ITEMVARIATION, obj1.Type);
            Assert.AreEqual("Small", obj1.ItemVariationData.Name);
            Assert.IsFalse(obj1.IsDeleted.Value);
            var obj2 = response.Objects[1];

            Assert.AreEqual(TypeEnum.ITEMVARIATION, obj2.Type);
            Assert.AreEqual("Small", obj2.ItemVariationData.Name);
            Assert.IsFalse(obj2.IsDeleted.Value);

            Assert.Less(0, response.RelatedObjects.Count);
        }
예제 #2
0
        private IObservable <Unit> SyncCategories(string beginTime, ISourceCache <SSBakery.Models.CatalogCategory, string> categoryCache)
        {
            var catalogApi  = new CatalogApi();
            var objectTypes = new List <SearchCatalogObjectsRequest.ObjectTypesEnum> {
                SearchCatalogObjectsRequest.ObjectTypesEnum.CATEGORY
            };
            //var beginTime = "2018-08-02T15:00:00Z";
            var request = new SearchCatalogObjectsRequest(ObjectTypes: objectTypes, IncludeDeletedObjects: true, BeginTime: beginTime);

            IObservable <CatalogObject> resultStream = catalogApi
                                                       .SearchCatalogObjectsAsync(request)
                                                       .ToObservable()
                                                       .Where(x => x.Objects != null)
                                                       .SelectMany(x => x.Objects);

            IObservable <Unit> deletedCategories = resultStream
                                                   .Where(x => x.IsDeleted.Value && categoryCache.Lookup(x.Id).HasValue)
                                                   .SelectMany(x => _categoryRepo.Delete(x.Id));

            IObservable <Unit> addedOrModifiedCategories = resultStream
                                                           .Where(x => !x.IsDeleted.Value)
                                                           .Select(x => UpdateCategoryCache(x, categoryCache))
                                                           .SelectMany(category => _categoryRepo.Upsert(category));

            return(Observable.Merge(deletedCategories, addedOrModifiedCategories));
        }
예제 #3
0
        /// <summary>
        ///	Returns Square items which were updated or created after specified date
        /// </summary>
        /// <param name="date"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public async Task <IEnumerable <SquareItem> > GetChangedItemsAfterAsync(DateTime date, CancellationToken cancellationToken)
        {
            var items = new List <SquareItem>();
            var mark  = Mark.CreateNew();

            if (cancellationToken.IsCancellationRequested)
            {
                var exceptionDetails = CreateMethodCallInfo(url: SquareEndPoint.SearchCatalogUrl, mark: mark, additionalInfo: this.AdditionalLogInfo());
                var squareException  = new SquareException(string.Format("{0}. Search changed items request was cancelled", exceptionDetails));
                SquareLogger.LogTraceException(squareException);
                throw squareException;
            }

            string paginationCursor = null;

            do
            {
                var request = new SearchCatalogObjectsRequest
                {
                    IncludeDeletedObjects = false,
                    IncludeRelatedObjects = true,
                    Cursor      = paginationCursor,
                    ObjectTypes = new string[] { ItemsExtensions.ItemCatalogObjectType }.ToList(),
                    BeginTime = date.ToUniversalTime().FromUtcToRFC3339()
                };

                var response = await base.ThrottleRequest(SquareEndPoint.SearchCatalogUrl, request.ToJson(), mark, (token) =>
                {
                    return(this._catalogApi.SearchCatalogObjectsAsync(request));
                }, cancellationToken).ConfigureAwait(false);

                var errors = response.Errors;
                if (errors != null && errors.Any())
                {
                    var methodCallInfo  = CreateMethodCallInfo(SquareEndPoint.SearchCatalogUrl, mark, additionalInfo: this.AdditionalLogInfo(), errors: errors.ToJson());
                    var squareException = new SquareException(string.Format("{0}. Search items catalog returned errors", methodCallInfo));
                    SquareLogger.LogTraceException(squareException);
                    throw squareException;
                }

                if (response.Objects != null)
                {
                    foreach (var obj in response.Objects)
                    {
                        items.AddRange(obj.ToSvItems());
                    }
                }

                paginationCursor = response.Cursor;
            }while(!string.IsNullOrWhiteSpace(paginationCursor));

            return(items);
        }
예제 #4
0
        /// <summary>
        ///	Returns Square item variation with specified sku
        /// </summary>
        /// <param name="sku">Sku</param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public async Task <SquareItem> GetItemBySkuAsync(string sku, CancellationToken cancellationToken)
        {
            Condition.Requires(sku, "sku").IsNotNullOrWhiteSpace();

            var mark = Mark.CreateNew();

            if (cancellationToken.IsCancellationRequested)
            {
                var exceptionDetails = CreateMethodCallInfo(url: SquareEndPoint.SearchCatalogUrl, mark: mark, additionalInfo: this.AdditionalLogInfo());
                var squareException  = new SquareException(string.Format("{0}. Search item by sku request was cancelled", exceptionDetails));
                SquareLogger.LogTraceException(squareException);
                throw squareException;
            }

            var request = new SearchCatalogObjectsRequest
            {
                IncludeDeletedObjects = false,
                IncludeRelatedObjects = true,
                ObjectTypes           = new string[] { ItemsExtensions.ItemVariationCatalogObjectType }.ToList(),
                Query = new CatalogQuery()
                {
                    ExactQuery = new CatalogQueryExact("sku", sku)
                }
            };

            var response = await base.ThrottleRequest(SquareEndPoint.SearchCatalogUrl, request.ToJson(), mark, (token) =>
            {
                return(this._catalogApi.SearchCatalogObjectsAsync(request));
            }, cancellationToken).ConfigureAwait(false);

            var errors = response.Errors;

            if (errors != null && errors.Any())
            {
                var methodCallInfo  = CreateMethodCallInfo(SquareEndPoint.SearchCatalogUrl, mark, additionalInfo: this.AdditionalLogInfo(), errors: errors.ToJson());
                var squareException = new SquareException(string.Format("{0}. Search items catalog returned errors", methodCallInfo));
                SquareLogger.LogTraceException(squareException);
                throw squareException;
            }

            var catalogItem = response.Objects?.FirstOrDefault(o => o.ItemVariationData != null);

            if (catalogItem != null)
            {
                var item = catalogItem.ToSvItems().First();
                var itemsWithQuantity = await this.FillItemsQuantities(new SquareItem[] { item }.ToList(), cancellationToken).ConfigureAwait(false);

                return(itemsWithQuantity.FirstOrDefault());
            }

            return(null);
        }
예제 #5
0
        private IObservable <Unit> SyncItems(string beginTime)
        {
            var catalogApi  = new CatalogApi();
            var objectTypes = new List <SearchCatalogObjectsRequest.ObjectTypesEnum> {
                SearchCatalogObjectsRequest.ObjectTypesEnum.ITEM
            };
            var request = new SearchCatalogObjectsRequest(ObjectTypes: objectTypes, BeginTime: beginTime);

            IObservable <CatalogObject> resultStream = catalogApi
                                                       .SearchCatalogObjectsAsync(request)
                                                       .ToObservable()
                                                       .Where(x => x.Objects != null)
                                                       .SelectMany(x => x.Objects);

            IObservable <Unit> deletedItems = resultStream
                                              .Where(x => x.IsDeleted.Value && x.ItemData.CategoryId != null)
                                              .GroupBy(x => x.ItemData.CategoryId)
                                              .SelectMany(
                group =>
            {
                return(group
                       .Select(catalogObject => catalogObject.Id)
                       .SelectMany(itemId => _itemRepoFactory.Create(group.Key).Delete(itemId)));
            });

            IObservable <Unit> addedOrModifiedItems = resultStream
                                                      .Where(x => !x.IsDeleted.Value && x.ItemData.CategoryId != null)
                                                      .Select(MapDtoToItem)
                                                      .GroupBy(x => x.CategoryId)
                                                      .SelectMany(
                x =>
            {
                return(x
                       .SelectMany(item => _itemRepoFactory.Create(x.Key).Upsert(item)));
            });

            return(Observable.Merge(deletedItems, addedOrModifiedItems));
        }