예제 #1
0
        public void Get(ICollectionRequest req)
        {
            var q       = HttpUtility.ParseQueryString(req.Query);
            var name    = q.Get("name")?.ToLower();
            var country = q.Get("country");

            int.TryParse(q.Get("from"), out int from);
            int.TryParse(q.Get("limit"), out int limit);
            if (from < 0)
            {
                from = 0;
            }
            if (limit <= 0)
            {
                limit = 10;
            }

            // Put a max on the query result size
            if (limit > 50)
            {
                req.InvalidQuery("Limit must be 50 or less.");
                return;
            }

            IEnumerable <Customer> result = null;

            if (String.IsNullOrEmpty(name))
            {
                if (String.IsNullOrEmpty(country))
                {
                    result = customers.Find(Query.All("Name"), from, limit);
                }
                else
                {
                    result = customers.Find(Query.And(Query.All("Name"), Query.Where("Country", v => v.AsString == country)), from, limit);
                }
            }
            else
            if (String.IsNullOrEmpty(country))
            {
                result = customers.Find(Query.StartsWith("Name", name), from, limit);
            }
            else
            {
                result = customers.Find(Query.And(Query.StartsWith("Name", name), Query.Where("Country", v => v.AsString == country)), from, limit);
            }

            // Create a normalized query string with the properties in a set order.
            var normalizedQuery = String.Format("name={0}&country={1}&from={2}&limit={3}", name ?? "", country ?? "", from, limit);

            req.Collection(result.Select(c => new Ref("search.customer." + c.Id)), normalizedQuery);
        }
예제 #2
0
        public async Task <List <T> > GetAllAsync <T, TY>(string path, ICollectionRequest request)
            where T : ExchangeDto
            where TY : IResponse
        {
            var stopwatch = new Stopwatch();
            var total     = 0;
            var count     = 0;

            var returnModels = new List <T>();

            do
            {
                using (var client = new ExchangeHttpClient(ExchangeConfig.RestUrl))
                {
                    stopwatch.Restart();
                    total          += count;
                    request.StartAt = total;

                    var query      = $"?{request.AsDictionary().BuildQueryString()}";
                    var authHeader = await GetHttpAuthHeader(HttpMethod.GET, path, query);

                    var response = await client.GetAsync <TY>($"{path}{query}", authHeader);

                    if (response == null)
                    {
                        throw new NullReferenceException();
                    }

                    var models = response.Select(x => Mapper.Map <T>(x)).ToArray();

                    returnModels.AddRange(models);

                    count = response.Length;

                    if (count < request.Count)
                    {
                        count = 0;
                    }

                    if (stopwatch.Elapsed < TimeSpan.FromSeconds(1.01))
                    {
                        await Task.Delay(TimeSpan.FromSeconds(1.5).Subtract(stopwatch.Elapsed));
                    }
                }
            } while (count > 0);

            return(returnModels);
        }
예제 #3
0
 public void Get(ICollectionRequest req)
 {
     req.Collection(Countries.List);
 }
예제 #4
0
 public void Get(ICollectionRequest request)
 {
     request.Collection(collection);
 }
예제 #5
0
 public void Get(ICollectionRequest request)
 {
     // Pass the entire list of book references
     request.Collection(BookStore.GetBookList());
 }