コード例 #1
0
        private async Task <object> ResolveOrdersConnectionAsync(IMediator mediator, IResolveConnectionContext <object> context)
        {
            var query = context.ExtractQuery <SearchOrderQuery>();

            context.CopyArgumentsToUserContext();
            var allCurrencies = await _currencyService.GetAllCurrenciesAsync();

            //Store all currencies in the user context for future resolve in the schema types
            context.SetCurrencies(allCurrencies, query.CultureName);

            var authorizationResult = await _authorizationService.AuthorizeAsync(context.GetCurrentPrincipal(), query, new CanAccessOrderAuthorizationRequirement());

            if (!authorizationResult.Succeeded)
            {
                throw new AuthorizationError($"Access denied");
            }

            var response = await mediator.Send(query);

            foreach (var customerOrderAggregate in response.Results)
            {
                context.SetExpandedObjectGraph(customerOrderAggregate);
            }

            return(new PagedConnection <CustomerOrderAggregate>(response.Results, query.Skip, query.Take, response.TotalCount));
        }
コード例 #2
0
        private async Task <object> ResolveConnectionAsync(IMediator mediator, IResolveConnectionContext <object> context)
        {
            var first = context.First;
            var skip  = Convert.ToInt32(context.After ?? 0.ToString());

            var query = context.GetCartQuery <SearchCartQuery>();

            query.Skip          = skip;
            query.Take          = first ?? context.PageSize ?? 10;
            query.Sort          = context.GetArgument <string>("sort");
            query.Filter        = context.GetArgument <string>("filter");
            query.IncludeFields = context.SubFields.Values.GetAllNodesPaths().ToArray();

            context.CopyArgumentsToUserContext();

            var authorizationResult = await _authorizationService.AuthorizeAsync(context.GetCurrentPrincipal(), query, new CanAccessCartAuthorizationRequirement());

            if (!authorizationResult.Succeeded)
            {
                throw new ExecutionError($"Access denied");
            }

            var response = await mediator.Send(query);

            foreach (var cartAggregate in response.Results)
            {
                context.SetExpandedObjectGraph(cartAggregate);
            }
            return(new PagedConnection <CartAggregate>(response.Results, skip, Convert.ToInt32(context.After ?? 0.ToString()), response.TotalCount));
        }
コード例 #3
0
        private async Task <object> ResolveCkAttributesQuery(IResolveConnectionContext <object> arg)
        {
            Logger.Debug("GraphQL query handling of contruction kit attributes started");

            var graphQlUserContext = (GraphQLUserContext)arg.UserContext;

            using var session = await graphQlUserContext.TenantContext.Repository.StartSessionAsync();

            session.StartTransaction();

            int?offset = arg.GetOffset();
            DataQueryOperation dataQueryOperation = arg.GetDataQueryOperation();

            arg.TryGetArgument(Statics.AttributeIdArg, out string key);
            arg.TryGetArgument(Statics.AttributeIdsArg, new List <string>(), out IEnumerable <string> keys);

            var keysList = keys.ToList();

            if (!keysList.Any() && key != null)
            {
                keysList.Add(key);
            }

            var resultSet =
                await graphQlUserContext.TenantContext.Repository.GetCkAttributesAsync(session, keysList, dataQueryOperation, offset, arg.First);

            await session.CommitTransactionAsync();

            Logger.Debug("GraphQL query handling returning data for contruction kit attributes");
            return(ConnectionUtils.ToConnection(resultSet.Result.Select(CkAttributeDtoType.CreateCkAttributeDto), arg,
                                                resultSet.TotalCount > 0 ? offset.GetValueOrDefault(0) : 0, (int)resultSet.TotalCount));
        }
コード例 #4
0
        private async Task <object> ConnectionResolver(IResolveConnectionContext <object> connectionContext)
        {
            IEnumerable <TSource> list = await QueryAsync(connectionContext);

            // ReSharper disable once PossibleInvalidOperationException
            return(await connectionContext.GetConnectionAsync(list, _pageLimit.Value));
        }
コード例 #5
0
        private async Task <object> ResolveRtEntitiesQuery(IResolveConnectionContext <RtEntityDto> ctx)
        {
            var graphQlContext = (GraphQLUserContext)ctx.UserContext;

            using var session = await graphQlContext.TenantContext.Repository.StartSessionAsync();

            session.StartTransaction();

            var ckId            = (string)ctx.FieldDefinition.Metadata[Statics.CkId];
            var roleId          = (string)ctx.FieldDefinition.Metadata[Statics.RoleId];
            var graphDirections = (GraphDirections)ctx.FieldDefinition.Metadata[Statics.GraphDirection];

            int?offset = ctx.GetOffset();
            DataQueryOperation dataQueryOperation = ctx.GetDataQueryOperation();

            if (ctx.Source.RtId != null)
            {
                var resultSet = await graphQlContext.TenantContext.Repository.GetRtAssociationTargetsAsync(session,
                                                                                                           ctx.Source.RtId.Value.ToObjectId(), roleId, ckId,
                                                                                                           graphDirections, dataQueryOperation, offset, ctx.First);

                return(ConnectionUtils.ToConnection(resultSet.Result.Select(RtEntityDtoType.CreateRtEntityDto), ctx,
                                                    resultSet.TotalCount > 0 ? offset.GetValueOrDefault(0) : 0, (int)resultSet.TotalCount));
            }

            await session.CommitTransactionAsync();

            return(ConnectionUtils.ToConnection(new RtEntityDto[] { }, ctx, 0, 0));
        }
コード例 #6
0
        private async Task <object> ResolveConnectionAsync(IResolveConnectionContext <object> context)
        {
            var first = context.First;
            var skip  = Convert.ToInt32(context.After ?? 0.ToString());

            var response = await _mediator.Send(new GetRecommendationsRequest
            {
                Skip     = skip,
                Take     = first ?? 20,
                Scenario = context.GetArgument <string>("scenario"),
                ItemId   = context.GetArgument <string>("itemId"),
                UserId   = context.GetArgument <string>("userId")
            });

            var result = new Connection <ProductRecommendation>()
            {
                Edges = response.Products.Select((x, index) =>
                                                 new Edge <ProductRecommendation>()
                {
                    Cursor = (skip + index).ToString(),
                    Node   = x,
                })
                        .ToList(),
                PageInfo = new PageInfo()
                {
                    HasNextPage     = response.TotalCount > (skip + first),
                    HasPreviousPage = skip > 0,
                    StartCursor     = skip.ToString(),
                    EndCursor       = Math.Min(response.TotalCount, (int)(skip + first)).ToString()
                },
                TotalCount = response.TotalCount,
            };

            return(result);
        }
コード例 #7
0
 public static ArraySliceMetrics <TSource> Create <TSource, TParent>(
     IList <TSource> slice,
     IResolveConnectionContext <TParent> context,
     bool strictCheck = true
     )
 {
     return(new ArraySliceMetrics <TSource>(slice, context.First, context.After, context.Last, context.Before, strictCheck));
 }
コード例 #8
0
        public static Connection <TSource> ToConnection <TSource, TParent>(
            IEnumerable <TSource> items,
            IResolveConnectionContext <TParent> context,
            bool strictCheck = true
            )
        {
            var list = items.ToList();

            return(ToConnection(list, context, sliceStartIndex: 0, totalCount: list.Count, strictCheck: true));
        }
コード例 #9
0
 public static ConnectionArguments GetConnectionArguments <T>(this IResolveConnectionContext <T> ctx)
 {
     return(new ConnectionArguments
     {
         First = ctx.First,
         After = ctx.After,
         Last = ctx.Last,
         Before = ctx.Before,
     });
 }
コード例 #10
0
        private async Task <object> ResolveGenericRtEntitiesQuery(IResolveConnectionContext <object> arg)
        {
            Logger.Debug("GraphQL query handling for generic runtime entity started");

            var graphQlUserContext = (GraphQLUserContext)arg.UserContext;
            var ckId = arg.GetArgument <string>(Statics.CkIdArg);

            using var session = await graphQlUserContext.TenantContext.Repository.StartSessionAsync();

            session.StartTransaction();

            int?offset = arg.GetOffset();
            DataQueryOperation dataQueryOperation = arg.GetDataQueryOperation();

            arg.TryGetArgument(Statics.RtIdArg, out OspObjectId? key);
            arg.TryGetArgument(Statics.RtIdsArg, new List <ObjectId>(), out IEnumerable <ObjectId> keys);

            var keysList = keys.ToList();

            if (keysList.Any())
            {
                var resultSetIds =
                    await graphQlUserContext.TenantContext.Repository.GetRtEntitiesByIdAsync(session, ckId, keysList, dataQueryOperation,
                                                                                             offset, arg.First);

                Logger.Debug("GraphQL query handling returning data by keys");
                return(ConnectionUtils.ToConnection(resultSetIds.Result.Select(RtEntityDtoType.CreateRtEntityDto), arg,
                                                    resultSetIds.TotalCount > 0 ? offset.GetValueOrDefault(0) : 0, (int)resultSetIds.TotalCount));
            }

            if (key.HasValue)
            {
                var result = await graphQlUserContext.TenantContext.Repository.GetRtEntityAsync(session, new RtEntityId(ckId, key.Value));

                var resultList = new List <RtEntityDto>();
                if (result != null)
                {
                    resultList.Add(RtEntityDtoType.CreateRtEntityDto(result));
                }

                Logger.Debug("GraphQL query handling returning data by key");
                return(ConnectionUtils.ToConnection(resultList, arg));
            }

            var resultSet =
                await graphQlUserContext.TenantContext.Repository.GetRtEntitiesByTypeAsync(session, ckId, dataQueryOperation, offset,
                                                                                           arg.First);

            await session.CommitTransactionAsync();

            Logger.Debug("GraphQL query handling returning data");
            return(ConnectionUtils.ToConnection(resultSet.Result.Select(RtEntityDtoType.CreateRtEntityDto), arg,
                                                resultSet.TotalCount > 0 ? offset.GetValueOrDefault(0) : 0, (int)resultSet.TotalCount));
        }
コード例 #11
0
        internal static int?GetOffset <TEntity>(this IResolveConnectionContext <TEntity> ctx)
        {
            int?offset = null;

            if (!string.IsNullOrEmpty(ctx.After))
            {
                offset = ConnectionUtils.CursorToOffset(ctx.After) + 1;
            }

            return(offset);
        }
コード例 #12
0
    public static Connection <U> GetPagedResults <T, U>(this IResolveConnectionContext <T> context, StarWarsData data, List <string> ids) where U : StarWarsCharacter
    {
        List <string> idList;
        List <U>      list;
        string        cursor;
        string        endCursor;
        var           pageSize = context.PageSize ?? 20;

        if (context.IsUnidirectional || context.After != null || context.Before == null)
        {
            if (context.After != null)
            {
                idList = ids
                         .SkipWhile(x => !Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(x)).Equals(context.After))
                         .Take(context.First ?? pageSize).ToList();
            }
            else
            {
                idList = ids
                         .Take(context.First ?? pageSize).ToList();
            }
        }
        else
        {
            if (context.Before != null)
            {
                idList = ids.Reverse <string>()
                         .SkipWhile(x => !Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(x)).Equals(context.Before))
                         .Take(context.Last ?? pageSize).ToList();
            }
            else
            {
                idList = ids.Reverse <string>()
                         .Take(context.Last ?? pageSize).ToList();
            }
        }

        list      = data.GetCharactersAsync(idList).Result as List <U> ?? throw new InvalidOperationException($"GetCharactersAsync method should return list of '{typeof(U).Name}' items.");
        cursor    = list.Count > 0 ? list.Last().Cursor : null;
        endCursor = ids.Count > 0 ? Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(ids.Last())) : null;

        return(new Connection <U>
        {
            Edges = list.Select(x => new Edge <U> {
                Cursor = x.Cursor, Node = x
            }).ToList(),
            TotalCount = list.Count,
            PageInfo = new PageInfo
            {
                EndCursor = endCursor,
                HasNextPage = endCursor != null && cursor != endCursor,
            }
        });
    }
コード例 #13
0
        private async Task <object> ResolveConnectionAsync(IMediator mediator, IResolveConnectionContext <OrganizationAggregate> context)
        {
            var first = context.First;
            var skip  = Convert.ToInt32(context.After ?? 0.ToString());

            var response = await mediator.Send(new SearchOrganizationMembersQuery
            {
                OrganizationId = context.Source.Organization.Id,
                Take           = first ?? 20,
                Skip           = skip,
                SearchPhrase   = context.GetArgument <string>("searchPhrase")
            });

            return(new PagedConnection <ContactAggregate>(response.Results.Select(x => new ContactAggregate(x as Contact)), skip, Convert.ToInt32(context.After ?? 0.ToString()), response.TotalCount));
        }
コード例 #14
0
        /// <summary>
        /// Factory method to create an <see cref="SliceMetrics{TSource}"/>
        /// </summary>
        public static SliceMetrics <TSource> Create <TSource>(
            IQueryable <TSource> source,
            IResolveConnectionContext context
            )
        {
            var totalCount = source.Count();
            var edges      = context.EdgesToReturn(totalCount);
            var nodes      = source.Skip(edges.StartOffset).Take(edges.Count);

            return(new(
                       source : nodes.ToList(),
                       edges,
                       totalCount
                       ));
        }
コード例 #15
0
        /// <summary>
        /// Calculates an <see cref="EdgeRange"/> object based on the current
        /// <see cref="IResolveConnectionContext"/> and the provided edge items count
        /// </summary>
        /// <param name="context"></param>
        /// <param name="edgeCount"></param>
        /// <returns></returns>
        public static EdgeRange EdgesToReturn(
            this IResolveConnectionContext context,
            int edgeCount
            )
        {
            var first = (!context.First.HasValue && !context.Last.HasValue)
                ? (context.PageSize ?? edgeCount)
                : default(int?);

            return(RelayPagination.CalculateEdgeRange(
                       edgeCount,
                       first ?? context.First,
                       context.After,
                       context.Last,
                       context.Before
                       ));
        }
コード例 #16
0
        /// <summary>
        /// Gets Connection.
        /// </summary>
        /// <typeparam name="T">T item.</typeparam>
        /// <param name="context">Connection context.</param>
        /// <param name="enumerable">An IEnumerable of T items.</param>
        /// <param name="defaultPageLimit">Default page limit.</param>
        /// <returns></returns>
        public static async Task <Connection <T> > GetConnectionAsync <T>(this IResolveConnectionContext <object> context, IEnumerable <T> enumerable, int defaultPageLimit = 10)
        {
            // Ref: https://graphql.org/learn/pagination/

            var list = enumerable.ToList();

            var total = list.Count;
            int skip  = 0;
            int take  = defaultPageLimit;

            var edges = list.Select(TransformToEdge).ToList();

            if (!string.IsNullOrEmpty(context.After))
            {
                skip = GetIndex(context.After) + 1;
            }

            if (context.First.HasValue)
            {
                take = context.First.Value;
            }

            var hasNextPage = total > skip + take;

            var filtered = edges.Skip(skip).Take(take).ToList();

            var first = filtered.FirstOrDefault().GetCursor();

            var connection = new Connection <T>
            {
                TotalCount = total,
                Edges      = filtered,
                PageInfo   = new PageInfo
                {
                    StartCursor     = first,
                    EndCursor       = filtered.LastOrDefault().GetCursor(),
                    HasNextPage     = hasNextPage,
                    HasPreviousPage = GetIndex(first) > 0
                }
            };

            return(await Task.FromResult(connection));
        }
コード例 #17
0
        public static Connection <TSource> ToConnection <TSource, TParent>(
            IEnumerable <TSource> slice,
            IResolveConnectionContext <TParent> context,
            int sliceStartIndex,
            int totalCount,
            bool strictCheck = true
            )
        {
            var sliceList = slice as IList <TSource> ?? slice.ToList();

            var metrics = ArraySliceMetrics.Create(
                sliceList,
                context,
                sliceStartIndex,
                totalCount,
                strictCheck
                );

            var edges = metrics.Slice.Select((item, i) => new Edge <TSource>
            {
                Node   = item,
                Cursor = OffsetToCursor(metrics.StartOffset + i)
            })
                        .ToList();

            var firstEdge = edges.FirstOrDefault();
            var lastEdge  = edges.LastOrDefault();

            return(new Connection <TSource>
            {
                Edges = edges,
                TotalCount = totalCount,
                PageInfo = new PageInfo
                {
                    StartCursor = firstEdge?.Cursor,
                    EndCursor = lastEdge?.Cursor,
                    HasPreviousPage = metrics.HasPrevious,
                    HasNextPage = metrics.HasNext,
                }
            });
        }
コード例 #18
0
        private async Task <object> ResolveOrdersConnectionAsync(IMediator mediator, IResolveConnectionContext <object> context)
        {
            var first = context.First;
            var skip  = Convert.ToInt32(context.After ?? 0.ToString());

            var request = new SearchOrderQuery
            {
                Skip        = skip,
                Take        = first ?? context.PageSize ?? 10,
                Filter      = context.GetArgument <string>("filter"),
                Sort        = context.GetArgument <string>("sort"),
                CultureName = context.GetArgument <string>(nameof(Currency.CultureName).ToCamelCase()),
                CustomerId  = context.GetArgumentOrValue <string>("userId")
            };

            context.CopyArgumentsToUserContext();
            var allCurrencies = await _currencyService.GetAllCurrenciesAsync();

            //Store all currencies in the user context for future resolve in the schema types
            context.SetCurrencies(allCurrencies, request.CultureName);


            var authorizationResult = await _authorizationService.AuthorizeAsync(context.GetCurrentPrincipal(), request, new CanAccessOrderAuthorizationRequirement());

            if (!authorizationResult.Succeeded)
            {
                throw new ExecutionError($"Access denied");
            }

            var response = await mediator.Send(request);

            foreach (var customerOrderAggregate in response.Results)
            {
                context.SetExpandedObjectGraph(customerOrderAggregate);
            }

            return(new PagedConnection <CustomerOrderAggregate>(response.Results, skip, Convert.ToInt32(context.After ?? 0.ToString()), response.TotalCount));
        }
コード例 #19
0
        private object ResolveAttributes(IResolveConnectionContext <CkEntityDto> ctx)
        {
            var graphQlContext = (GraphQLUserContext)ctx.UserContext;

            ctx.TryGetArgument(Statics.AttributeNamesFilterArg, out IEnumerable <string> filterAttributeNames);

            var entityCacheItem = graphQlContext.TenantContext.CkCache.GetEntityCacheItem(ctx.Source.CkId);

            IEnumerable <AttributeCacheItem> resultList;

            if (filterAttributeNames == null)
            {
                resultList = entityCacheItem.Attributes.Values;
            }
            else
            {
                resultList =
                    entityCacheItem.Attributes.Values.Where(a =>
                                                            filterAttributeNames.Contains(StringExtensions.ToCamelCase(a.AttributeName)));
            }

            return(ConnectionUtils.ToConnection(resultList.Select(CreateCkEntityAttributeDto), ctx));
        }
コード例 #20
0
        public IResult <IQueryable <Brewery> > ResolveNearbyBreweries(IResolveConnectionContext context)
        {
            var latitude  = GetLatitude(context);
            var longitude = GetLongitude(context);

            if (latitude.HasValue && longitude.HasValue)
            {
                var id     = GetBreweryId(context);
                var within = context.GetArgument("within", 25);

                return(_breweryConductor
                       .FindAllByLocation(
                           latitude.Value,
                           longitude.Value,
                           within)
                       .Filter(b => id == null || b.Id != id.Value)
                       .Include(
                           nameof(Brewery.BreweryTags),
                           context.ContainsField("tag_list")));
            }

            return(new Result <IQueryable <Brewery> >(Enumerable.Empty <Brewery>().AsQueryable()));
        }
コード例 #21
0
        private object ResolveAttributes(IResolveConnectionContext <RtEntityDto> ctx)
        {
            var graphQlContext = (GraphQLUserContext)ctx.UserContext;

            var filterAttributeNames = ctx.GetArgument <IEnumerable <string> >(Statics.AttributeNamesFilterArg);

            var entityCacheItem = graphQlContext.TenantContext.CkCache.GetEntityCacheItem(ctx.Source.CkId);

            IEnumerable <AttributeCacheItem> resultList;

            if (filterAttributeNames == null)
            {
                resultList = entityCacheItem.Attributes.Values;
            }
            else
            {
                resultList =
                    entityCacheItem.Attributes.Values.Where(a =>
                                                            filterAttributeNames.Contains(a.AttributeName.ToCamelCase()));
            }

            return(ConnectionUtils.ToConnection(resultList.Select(item => CreateRtEntityAttributeDto((RtEntity)ctx.Source.UserContext, item)),
                                                ctx));
        }
コード例 #22
0
        /// <summary>
        /// From the connection context, <see cref="IResolveConnectionContext"/>,
        /// it creates a <see cref="Connection{TSource}"/> based on the given <see cref="IEnumerable{TSource}"/>
        /// </summary>
        /// <typeparam name="TSource"></typeparam>
        /// <param name="context"></param>
        /// <param name="items"></param>
        /// <param name="totalCount"></param>
        /// <returns></returns>
        public static Connection <TSource> ToConnection <TSource>(
            this IResolveConnectionContext context,
            IEnumerable <TSource> items,
            int?totalCount = null
            )
        {
            var metrics = SliceMetrics.Create(
                items,
                context,
                totalCount
                );

            var edges = metrics.Slice
                        .Select((item, i) => new Edge <TSource>
            {
                Node   = item,
                Cursor = ConnectionUtils.OffsetToCursor(metrics.StartIndex + i)
            })
                        .ToList();

            var firstEdge = edges.FirstOrDefault();
            var lastEdge  = edges.LastOrDefault();

            return(new Connection <TSource>
            {
                Edges = edges,
                TotalCount = metrics.TotalCount,
                PageInfo = new PageInfo
                {
                    StartCursor = firstEdge?.Cursor,
                    EndCursor = lastEdge?.Cursor,
                    HasPreviousPage = metrics.HasPrevious,
                    HasNextPage = metrics.HasNext,
                }
            });
        }
コード例 #23
0
        private static async Task <object> ResolvePropertiesConnectionAsync(IMediator mediator, IResolveConnectionContext <object> context)
        {
            var first = context.First;

            var skip = Convert.ToInt32(context.After ?? 0.ToString());

            var query = new SearchPropertiesQuery
            {
                Skip = skip,
                Take = first ?? context.PageSize ?? 10,

                CatalogId = (string)context.UserContext["catalog"],
                Types     = context.GetArgument <object[]>("types"),
                Filter    = context.GetArgument <string>("filter")
            };

            var response = await mediator.Send(query);

            return(new PagedConnection <Property>(response.Result.Results, query.Skip, query.Take, response.Result.TotalCount));
        }
コード例 #24
0
        private static async Task <object> ResolveConnectionAsync(IMediator madiator, IResolveConnectionContext <ExpProduct> context)
        {
            var first    = context.First;
            var skip     = Convert.ToInt32(context.After ?? 0.ToString());
            var criteria = new ProductAssociationSearchCriteria
            {
                Skip = skip,
                Take = first ?? context.PageSize ?? 10,
                // We control the resulting product structure  by passing IncludeFields, and to prevent forced reduction of already loaded fields, you need to pass ItemResponseGroup.Full
                // in any case, the object will be loaded from the index, and the response group will not affect overall performance
                ResponseGroup = ItemResponseGroup.Full.ToString(),
                Keyword       = context.GetArgument <string>("query"),
                Group         = context.GetArgument <string>("group"),
                ObjectIds     = new[] { context.Source.CatalogProduct.Id }
            };
            var response = await madiator.Send(new SearchProductAssociationsRequest { Criteria = criteria });

            return(new Connection <ProductAssociation>()
            {
                Edges = response.Result.Results
                        .Select((x, index) =>
                                new Edge <ProductAssociation>()
                {
                    Cursor = (skip + index).ToString(),
                    Node = x,
                })
                        .ToList(),
                PageInfo = new PageInfo()
                {
                    HasNextPage = response.Result.TotalCount > (skip + first),
                    HasPreviousPage = skip > 0,
                    StartCursor = skip.ToString(),
                    EndCursor = Math.Min(response.Result.TotalCount, (int)(skip + first)).ToString()
                },
                TotalCount = response.Result.TotalCount,
            });
        }
コード例 #25
0
 public ScopedResolveConnectionContextAdapter(IResolveConnectionContext <TSource> baseContext, IServiceProvider serviceProvider)
 {
     _baseContext    = baseContext ?? throw new ArgumentNullException(nameof(baseContext));
     RequestServices = serviceProvider;
 }
コード例 #26
0
        private static async Task <object> ResolveConnectionAsync(IMediator mediator, IResolveConnectionContext <DynamicProperty> context)
        {
            int.TryParse(context.After, out var skip);

            var query = context.GetDynamicPropertiesQuery <SearchDynamicPropertyDictionaryItemQuery>();

            query.PropertyId = context.Source.Id;
            query.Skip       = skip;
            query.Take       = context.First ?? context.PageSize ?? 10;
            query.Sort       = context.GetArgument <string>("sort");
            query.Filter     = context.GetArgument <string>("filter");

            context.CopyArgumentsToUserContext();

            var response = await mediator.Send(query);

            return(new PagedConnection <DynamicPropertyDictionaryItem>(response.Results, query.Skip, query.Take, response.TotalCount));
        }
コード例 #27
0
        private static async Task <object> ResolveConnectionAsync(IMediator mediator, IResolveConnectionContext <object> context)
        {
            var first         = context.First;
            var skip          = Convert.ToInt32(context.After ?? 0.ToString());
            var includeFields = context.SubFields.Values.GetAllNodesPaths().Select(x => x.TrimStart("items.")).ToArray();
            var request       = new SearchProductRequest
            {
                Skip          = skip,
                Take          = first ?? context.PageSize ?? 10,
                Query         = context.GetArgument <string>("query"),
                Filter        = context.GetArgument <string>("filter"),
                Facet         = context.GetArgument <string>("facet"),
                Fuzzy         = context.GetArgument <bool>("fuzzy"),
                Sort          = context.GetArgument <string>("sort"),
                IncludeFields = includeFields.ToArray(),
            };

            var response = await mediator.Send(request);


            return(new ProductsConnection <ExpProduct>()
            {
                Edges = response.Results
                        .Select((x, index) =>
                                new Edge <ExpProduct>()
                {
                    Cursor = (skip + index).ToString(),
                    Node = x,
                })
                        .ToList(),
                PageInfo = new PageInfo()
                {
                    HasNextPage = response.TotalCount > (skip + first),
                    HasPreviousPage = skip > 0,
                    StartCursor = skip.ToString(),
                    EndCursor = Math.Min(response.TotalCount, (int)(skip + first)).ToString()
                },
                TotalCount = response.TotalCount,
                Facets = response.Facets
            });
        }
コード例 #28
0
        private static async Task <object> ResolveConnectionAsync(IMediator mediator, IResolveConnectionContext <Property> context)
        {
            var first = context.First;

            int.TryParse(context.After, out var skip);

            var query = new SearchPropertyDictionaryItemQuery
            {
                Skip        = skip,
                Take        = first ?? context.PageSize ?? 10,
                PropertyIds = new[] { context.Source.Id }
            };

            var response = await mediator.Send(query);

            return(new PagedConnection <PropertyDictionaryItem>(response.Result.Results, query.Skip, query.Take, response.Result.TotalCount));
        }
コード例 #29
0
        private static async Task <object> ResolveProductsConnectionAsync(IMediator mediator, IResolveConnectionContext <object> context)
        {
            var first         = context.First;
            var skip          = Convert.ToInt32(context.After ?? 0.ToString());
            var includeFields = context.SubFields.Values.GetAllNodesPaths();

            //PT-5371: Need to be able get entire query from context and read all arguments to the query properties
            var query = context.GetCatalogQuery <SearchProductQuery>();

            query.IncludeFields = includeFields;

            var productIds = context.GetArgument <List <string> >("productIds");

            if (productIds.IsNullOrEmpty())
            {
                query.Skip       = skip;
                query.Take       = first ?? context.PageSize ?? 10;
                query.Query      = context.GetArgument <string>("query");
                query.Filter     = context.GetArgument <string>("filter");
                query.Facet      = context.GetArgument <string>("facet");
                query.Fuzzy      = context.GetArgument <bool>("fuzzy");
                query.FuzzyLevel = context.GetArgument <int?>("fuzzyLevel");
                query.Sort       = context.GetArgument <string>("sort");
            }
            else
            {
                query.ObjectIds = productIds.ToArray();
                query.Take      = productIds.Count;
            }

            var response = await mediator.Send(query);

            var currencyCode = context.GetArgumentOrValue <string>("currencyCode");

            if (string.IsNullOrWhiteSpace(currencyCode))
            {
                context.SetCurrency(response.Currency);
            }

            return(new ProductsConnection <ExpProduct>(response.Results, query.Skip, query.Take, response.TotalCount)
            {
                Facets = response.Facets
            });
        }
コード例 #30
0
        private static async Task <object> ResolveCategoriesConnectionAsync(IMediator mediator, IResolveConnectionContext <object> context)
        {
            var first         = context.First;
            var skip          = Convert.ToInt32(context.After ?? 0.ToString());
            var includeFields = context.SubFields.Values.GetAllNodesPaths().Select(x => x.Replace("items.", "")).ToArray();

            var query = context.GetCatalogQuery <SearchCategoryQuery>();

            var categoryIds = context.GetArgument <List <string> >("categoryIds");

            query.IncludeFields = includeFields;

            if (categoryIds.IsNullOrEmpty())
            {
                query.Skip       = skip;
                query.Take       = first ?? context.PageSize ?? 10;
                query.Query      = context.GetArgument <string>("query");
                query.Filter     = context.GetArgument <string>("filter");
                query.Facet      = context.GetArgument <string>("facet");
                query.Fuzzy      = context.GetArgument <bool>("fuzzy");
                query.FuzzyLevel = context.GetArgument <int?>("fuzzyLevel");
                query.Sort       = context.GetArgument <string>("sort");
            }
            else
            {
                query.ObjectIds = categoryIds.ToArray();
                query.Take      = categoryIds.Count;
            }

            var response = await mediator.Send(query);

            return(new PagedConnection <ExpCategory>(response.Results, query.Skip, query.Take, response.TotalCount));
        }