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