예제 #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 GetProductsList(ProductsPaginatedHandler 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 <ProductEdge> edges = response != null ? response.data.shop().products().edges() : null;

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

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

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

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

                    if (response.data.shop().products().pageInfo().hasNextPage())
                    {
                        List <ProductEdge> productEdges = response.data.shop().products().edges();

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

                    callback((List <Product>)response.data.shop().products(), error, lastCursor);
                }
            }
                );
        }
예제 #3
0
        private void GetConnectionsForProducts(List <Product> products, ProductsHandler callback)
        {
            List <ConnectionQueryInfo> connectionInfos = new List <ConnectionQueryInfo> ()
            {
                new ConnectionQueryInfo(
                    getConnection: (p) => ((Product)p).images(),
                    query: (p, imagesAfter) => {
                    ((ProductQuery)p).images(ic => DefaultQueries.products.ImageConnection(ic),
                                             first: DefaultQueries.MaxPageSize, after: imagesAfter
                                             );
                }
                    ),
                new ConnectionQueryInfo(
                    getConnection: (p) => ((Product)p).variants(),
                    query: (p, variantsAfter) => {
                    ((ProductQuery)p).variants(vc => DefaultQueries.products.ProductVariantConnection(vc, DefaultImageResolutions),
                                               first: DefaultQueries.MaxPageSize, after: variantsAfter
                                               );
                }
                    ),
                new ConnectionQueryInfo(
                    getConnection: (p) => ((Product)p).collections(),
                    query: (p, collectionsAfter) => {
                    ((ProductQuery)p).collections(cc => DefaultQueries.products.CollectionConnection(cc),
                                                  first: DefaultQueries.MaxPageSize, after: collectionsAfter
                                                  );
                }
                    )
            };

            foreach (string alias in DefaultImageResolutions.Keys)
            {
                string currentAlias = alias;

                connectionInfos.Add(new ConnectionQueryInfo(
                                        getConnection: (p) => ((Product)p).images(currentAlias),
                                        query: (p, imagesAfter) => {
                    ((ProductQuery)p).images(ic => DefaultQueries.products.ImageConnection(ic),
                                             first: DefaultQueries.MaxPageSize,
                                             after: imagesAfter,
                                             maxWidth: DefaultImageResolutions[currentAlias],
                                             maxHeight: DefaultImageResolutions[currentAlias],
                                             alias: currentAlias
                                             );
                }
                                        ));
            }

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

            loader.QueryConnectionsOnNodes(nodes, connectionInfos, BuildProductQueryOnNode, (nodesResult, error) => {
                callback(nodesResult.ConvertAll(n => (Product)n), error);
            });
        }
예제 #4
0
        private void GetConnectionsForProducts(List <Product> products, ProductsHandler callback)
        {
            List <ConnectionQueryInfo> connectionInfos = new List <ConnectionQueryInfo> ()
            {
                new ConnectionQueryInfo(
                    getConnection: (p) => ((Product)p).images(),
                    query: (p, imagesAfter) => {
                    ((ProductQuery)p).images(ic => DefaultQueries.products.ImageConnection(ic, DefaultImageResolutions),
                                             first: DefaultQueries.MaxPageSize,
                                             after: imagesAfter
                                             );
                }
                    ),
                new ConnectionQueryInfo(
                    getConnection: (p) => ((Product)p).variants(),
                    query: (p, variantsAfter) => {
                    ((ProductQuery)p).variants(vc => DefaultQueries.products.ProductVariantConnection(vc, DefaultImageResolutions),
                                               first: DefaultQueries.MaxPageSize, after: variantsAfter
                                               );
                }
                    ),
                new ConnectionQueryInfo(
                    getConnection: (p) => ((Product)p).collections(),
                    query: (p, collectionsAfter) => {
                    ((ProductQuery)p).collections(cc => DefaultQueries.products.CollectionConnection(cc),
                                                  first: DefaultQueries.MaxPageSize, after: collectionsAfter
                                                  );
                }
                    )
            };

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

            loader.QueryConnectionsOnNodes(nodes, connectionInfos, BuildProductQueryOnNode, (nodesResult, error) => {
                callback(nodesResult.ConvertAll(n => (Product)n), error);
            });
        }
예제 #5
0
        public void TestConnectionLoader()
        {
            int countRequests = 0;
            ConnectionLoader     ConnectionLoader        = new ConnectionLoader(new QueryLoader(new CollectionTestLoader()));
            List <QueryResponse> responsesToRequestQuery = new List <QueryResponse>();
            QueryResponse        mergedResponse          = null;

            ConnectionLoader.QueryConnection(
                (response) => {
                responsesToRequestQuery.Add(response);

                if (countRequests < CollectionTestQueries.queries.Count)
                {
                    countRequests++;
                    return(CollectionTestQueries.queries[countRequests - 1]);
                }
                else
                {
                    return(null);
                }
            },
                (response) => {
                return(((QueryRoot)response).shop().products());
            },
                (response) => {
                mergedResponse = response;
            }
                );

            Assert.AreEqual(3, responsesToRequestQuery.Count);
            Assert.AreEqual(null, responsesToRequestQuery[0]);
            Assert.AreEqual("Product1", responsesToRequestQuery[1].data.shop().products().edges()[0].node().title());
            Assert.AreEqual("Product2", responsesToRequestQuery[2].data.shop().products().edges()[0].node().title());
            Assert.AreEqual(2, countRequests);
            Assert.AreEqual(2, mergedResponse.data.shop().products().edges().Count);
        }
예제 #6
0
 private void Awake()
 {
     inst = this;
     myScreen.SetActive(true);
 }
예제 #7
0
 public void DisableScreen()
 {
     Debug.Log("disable screen");
     myScreen.SetActive(false);
     inst = null;
 }