Пример #1
0
        /// <summary>
        /// Generates a query to receive a page of <c>collections</c> from a Shopify store. The generated query will query the following on collections:
        ///     - id
        ///     - title
        ///     - description
        ///     - descriptionHtml
        ///     - updatedAt
        ///     - image
        ///         - altText
        ///         - src
        ///     - products
        ///         - id
        ///
        /// Note that <c>shop.collections</c> is a Connection (GraphQL paginated data structure). <see ref="ShopifyClient.collections">collections </see>
        /// </summary>
        /// <param name="callback">callback that will receive responses from server</param>
        /// <param name="first">can be used to limit how many products are returned. For instance 10 would return only 10 collections</param>
        /// <param name="after">
        /// is used to load subsequent pages. Basically it's a cursor variable to define what page to load next. For example, when used with <c>first: 10</c> and <c>after: "abc"</c>, only the first 10
        /// collections would be loaded after cursor <c>"abc"</c>. If no <c>after</c> is passed the first page of collections will be loaded.
        /// </param>
        /// \code
        /// // Example that queries all collections on a shop
        /// ShopifyBuy.Client().collections((collections, error) => {
        ///     Debug.Log(collections[0].title());
        ///     Debug.Log(collections.Count);
        /// });
        /// \endcode
        public void collections(CollectionsPaginatedHandler callback, int?first = null, string after = null)
        {
            if (first == null)
            {
                first = DefaultQueries.MaxCollectionsPageSize;
            }

            GetCollectionsList((collections, error, afterGetProductsList) => {
                // Short circuit if we have an error.
                if (error != null)
                {
                    callback(null, error, null);
                    return;
                }

                List <ConnectionQueryInfo> connectionInfos = new List <ConnectionQueryInfo> ()
                {
                    new ConnectionQueryInfo(
                        getConnection: (c) => ((Collection)c).products(),
                        query: (c, productsAfter) => {
                        ((CollectionQuery)c).products(pc => DefaultQueries.collections.ProductConnection(pc),
                                                      first: DefaultQueries.MaxPageSize, after: productsAfter
                                                      );
                    }
                        )
                };

                ConnectionLoader loader = new ConnectionLoader(Loader);
                List <Node> nodes       = collections.ConvertAll(p => (Node)p);

                loader.QueryConnectionsOnNodes(nodes, connectionInfos, BuildCollectionQueryOnNode, (nodesResult, responseError) => {
                    callback(nodesResult.ConvertAll(n => (Collection)n), responseError, afterGetProductsList);
                });
            }, first: first, after: after);
        }
Пример #2
0
        private void GetCollectionsList(CollectionsPaginatedHandler callback, int?first = null, string after = null)
        {
            ConnectionLoader loader = new ConnectionLoader(Loader);
            int countToLoad         = first == null ? int.MaxValue : (int)first;

            loader.QueryConnection(
                (response) => {
                QueryRootQuery query = null;

                List <CollectionEdge> edges = response != null ? response.data.shop().collections().edges() : null;

                if (edges != null)
                {
                    countToLoad -= edges.Count;
                }

                if (response == null || (countToLoad > 0 && response.data.shop().collections().pageInfo().hasNextPage()))
                {
                    query = new QueryRootQuery();

                    query = new QueryRootQuery();
                    DefaultQueries.collections.ShopCollections(
                        query: query,
                        first: countToLoad > DefaultQueries.MaxPageSize ? DefaultQueries.MaxPageSize : countToLoad,
                        after: edges != null ? edges[edges.Count - 1].cursor() : after,
                        imageResolutions: DefaultImageResolutions
                        );
                }

                return(query);
            },
                (response) => {
                return(((QueryRoot)response).shop().collections());
            },
                (response) => {
                var error = (ShopifyError)response;
                if (error != null)
                {
                    callback(null, error, null);
                }
                else
                {
                    string lastCursor = null;

                    if (response.data.shop().collections().pageInfo().hasNextPage())
                    {
                        List <CollectionEdge> collectionEdges = response.data.shop().collections().edges();

                        lastCursor = collectionEdges[collectionEdges.Count - 1].cursor();
                    }

                    callback((List <Collection>)response.data.shop().collections(), error, lastCursor);
                }
            }
                );
        }