コード例 #1
0
        public async Task HandleRequirementAsync_ConditionEvaluationRequest_CategoryDoesNotExists_Succeeded()
        {
            // Arrage
            var categoryServiceMock = CreateCategoryServiceMock();

            categoryServiceMock
            .Setup(x => x.GetByIdsAsync(It.IsAny <string[]>(), It.IsAny <string>(), It.IsAny <string>()))
            .ReturnsAsync(Array.Empty <Category>);

            var authorizationHandler = CreateAuthorizationHandler(null, categoryServiceMock.Object);
            var evaluationRequest    = new AssociationConditionEvaluationRequest
            {
                CategoryIds = new[] { "testCategory1" }
            };

            var context = CreateAuthorizationHandlerContext(
                $"{_permission}",
                $"{_permission}|[{{\"catalogId\":\"testCatalog1\",\"type\":\"SelectedCatalogScope\",\"label\":\"Electronics\",\"scope\":\"testCatalog1\"}}]",
                evaluationRequest);

            // Act
            await authorizationHandler.HandleAsync(context);

            // Assert
            Assert.True(context.HasSucceeded);
        }
コード例 #2
0
 private static void ValidateParameters(AssociationConditionEvaluationRequest conditionRequest)
 {
     if (conditionRequest == null)
     {
         throw new ArgumentNullException(nameof(conditionRequest));
     }
 }
コード例 #3
0
        public async Task <string[]> EvaluateAssociationConditionAsync(AssociationConditionEvaluationRequest conditionRequest)
        {
            _requestBuilder
            .AddOutlineSearch(conditionRequest.CatalogId, conditionRequest.CategoryIds)
            .AddPropertySearch(conditionRequest.PropertyValues)
            .AddKeywordSearch(conditionRequest.Keyword)
            .AddSortInfo(conditionRequest.Sort)
            .WithPaging(conditionRequest.Skip, conditionRequest.Take);

            var searchResult = await _searchProvider.SearchAsync(KnownDocumentTypes.Product, _requestBuilder.Build());

            return(searchResult.Documents.Select(x => x.Id).ToArray());
        }
コード例 #4
0
        public virtual async Task <AssociationConditionEvaluationRequest> GetAssociationConditionAsync(AssociationEvaluationContext context, CatalogProduct product)
        {
            AssociationConditionEvaluationRequest result = null;

            var associationRules = (await _associationSearchService
                                    .SearchAssociationsAsync(new AssociationSearchCriteria
            {
                Groups = new[] { context.Group },
                StoreIds = new[] { context.StoreId },
                Take = int.MaxValue,
                SortInfos = { new SortInfo
                              {
                                  SortColumn = nameof(Association.Priority),
                                  SortDirection = SortDirection.Descending,
                              } },
                IsActive = true,
            }))
                                   .Results;

            var expressionContext = AbstractTypeFactory <AssociationExpressionEvaluationContext> .TryCreateInstance();

            expressionContext.Products.Add(product);

            foreach (var associationRule in associationRules)
            {
                var matchingRule = associationRule.ExpressionTree.Children.OfType <BlockMatchingRules>().FirstOrDefault()
                                   ?? throw new InvalidOperationException($"Matching rules block for \"{associationRule.Name}\" dynamic association rule is missing");

                if (matchingRule.IsSatisfiedBy(expressionContext))
                {
                    var resultRule = associationRule.ExpressionTree.Children.OfType <BlockResultingRules>().FirstOrDefault()
                                     ?? throw new InvalidOperationException($"Resulting rules block for \"{associationRule.Name}\" dynamic association rule is missing");

                    var outputTuningBlock = associationRule.ExpressionTree.Children.OfType <BlockOutputTuning>().FirstOrDefault()
                                            ?? throw new InvalidOperationException($"Output tuning block for \"{associationRule.Name}\" dynamic association rule is missing");

                    result = AbstractTypeFactory <AssociationConditionEvaluationRequest> .TryCreateInstance();

                    result.PropertyValues = resultRule.GetPropertyValues();
                    result.CatalogId      = resultRule.GetCatalogId();
                    result.CategoryIds    = resultRule.GetCategoryIds();
                    result.Sort           = outputTuningBlock.Sort;
                    result.Skip           = context.Skip;
                    result.Take           = Math.Min(Math.Max(outputTuningBlock.OutputLimit - context.Skip, 0), context.Take);

                    break;
                }
            }

            return(result);
        }
コード例 #5
0
        public async Task HandleRequirementAsync_ConditionEvaluationRequest_NotValidCatalogAndValidCategories_Fails()
        {
            // Arrage
            var categoryServiceMock = CreateCategoryServiceMock();

            categoryServiceMock
            .Setup(x => x.GetByIdsAsync(It.IsAny <string[]>(), It.IsAny <string>(), It.IsAny <string>()))
            .ReturnsAsync(new[]
            {
                new Category
                {
                    Id       = "testCategory1",
                    Outlines = new[]
                    {
                        new Outline
                        {
                            Items = new []
                            {
                                new OutlineItem
                                {
                                    Id = "testCatalog1",
                                },
                            }
                        },
                    }
                },
            });

            var authorizationHandler = CreateAuthorizationHandler(null, categoryServiceMock.Object);
            var evaluationRequest    = new AssociationConditionEvaluationRequest
            {
                CatalogId   = "testCatalog2",
                CategoryIds = new[] { "testCategory1" }
            };

            var context = CreateAuthorizationHandlerContext(
                $"{_permission}",
                $"{_permission}|[{{\"catalogId\":\"testCatalog1\",\"type\":\"SelectedCatalogScope\",\"label\":\"Electronics\",\"scope\":\"testCatalog1\"}}]",
                evaluationRequest);

            // Act
            await authorizationHandler.HandleAsync(context);

            // Assert
            Assert.False(context.HasSucceeded);
        }
コード例 #6
0
        public async Task <ActionResult <string[]> > PreviewDynamicAssociations([FromBody] AssociationConditionEvaluationRequest conditionRequest)
        {
            ValidateParameters(conditionRequest);

            var authorizationResult = await _authorizationService.AuthorizeAsync(
                User,
                conditionRequest,
                new AssociationAuthorizationRequirement(CatalogModuleConstants.Security.Permissions.Read)
                );

            if (!authorizationResult.Succeeded)
            {
                return(Unauthorized());
            }

            var result = await _associationConditionEvaluator.EvaluateAssociationConditionAsync(conditionRequest);

            return(Ok(result));
        }