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); }
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)); }
/// <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); }
/// <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); }
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)); }