[HttpGet("", Name = "GetCustomers")] //  ./api/customers
        public IActionResult GetAll([FromQuery] CustomerListParameters listParameters)
        {
            if (listParameters.Page < 1)
            {
                return(UnprocessableEntity(new ValidationFailedResult("Page must be 1 or greater.")));
            }
            if (listParameters.Take < 1)
            {
                return(UnprocessableEntity(new ValidationFailedResult("Take must be 1 or greater.")));
            }
            if (listParameters.Take > 500)
            {
                return(UnprocessableEntity(new ValidationFailedResult("Take cannot be larger than 500.")));
            }

            var customers = _customerData.GetAll(listParameters);
            var models    = customers.Select(c => new CustomerDisplayViewModel(c));

            var pagination = new PaginationModel
            {
                Previous = CreateCustomersResourceUri(listParameters, -1),
                Next     = CreateCustomersResourceUri(listParameters, 1)
            };

            Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(pagination));

            return(Ok(models));
        }
Пример #2
0
        public IActionResult GetCustomers([FromQuery] CustomerListParameters resourceParameters)
        {
            if (resourceParameters.Page < 1)
            {
                resourceParameters.Page = 1; //0 is default when not specified
            }

            if (resourceParameters.Take == 0)
            {
                resourceParameters.Take = 50; //default when value is not specified.
            }
            else if (resourceParameters.Take > 250)
            {
                _logger.LogError("Get Customers max items exceeded.");
                return(new ValidationFailedResult("A request can only take maximum of 250 items."));
            }

            var customers = _customerData.Get(0, resourceParameters);

            var pagination = new PaginationModel
            {
                Previous = CreateCustomersResourceUri(resourceParameters, -1),
                Next     = CreateCustomersResourceUri(resourceParameters, 1),
                Take     = resourceParameters.Take,
                Page     = resourceParameters.Page
            };

            Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(pagination));


            var models = customers.Select(c => new CustomerDisplayViewModel(c));

            return(Ok(models));
        }
Пример #3
0
        public List <Customer> GetAll(CustomerListParameters listParameters)
        {
            var sortableFields = new string[] { "FIRSTNAME", "LASTNAME", "EMAILADDRESS", "PHONENUMBER", "STATUS", "LASTCONTACTDATE" };
            var orderBy        = listParameters.OrderBy;
            var fields         = (orderBy ?? "").Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

            foreach (var field in fields)
            {
                var x     = field.Trim().ToUpper();
                var parts = x.Split(' ');
                if (parts.Length > 2)
                {
                    throw new ArgumentException("Invalid sort option " + x);
                }
                if (parts.Length > 1 && parts[1].ToUpper() != "DESC" && parts[1].ToUpper() != "ASC")
                {
                    throw new ArgumentException("Invalid sort direction " + x);
                }
                if (!sortableFields.Contains(x))
                {
                    throw new ArgumentException("Invalid sort field " + x);
                }
            } //all sort requested fields are valid.
            if (string.IsNullOrWhiteSpace(orderBy))
            {
                orderBy = "LastName asc, firstname asc";
            }
            IQueryable <Customer> sortedResults = _context.Customers
                                                  .OrderBy(orderBy); //validated above to nothing unexpected, this is OK now

            //  calls can be chained onto sortedResults

            if (!string.IsNullOrWhiteSpace(listParameters.LastName))
            {
                sortedResults = sortedResults
                                .Where(x => x.LastName.ToLowerInvariant() == listParameters.LastName.Trim().ToLowerInvariant());
            } // the query still is not sent to the database after this line.

            if (!string.IsNullOrWhiteSpace(listParameters.Term))
            {
                sortedResults = sortedResults
                                .Where(x => (x.FirstName + " " + x.LastName).Contains(listParameters.Term) ||
                                       x.EmailAddress.Contains(listParameters.Term));
            }

            // TOOD: add more optional where clauses for other filter parameters.

            return(sortedResults
                   .Skip((listParameters.Page - 1) * listParameters.Take)
                   .Take(listParameters.Take)
                   .ToList());
            // once an IQueryable is converted into an IList/List, the SQL query is finalized and sent to the database
        }
Пример #4
0
 private string CreateCustomersResourceUri(CustomerListParameters resourceParameters, int pageAdjust)
 {
     if (resourceParameters.Page + pageAdjust < 1)
     {
         return(null);
     }
     return(_urlHelper.Link("GetCustomers", new
     {
         take = resourceParameters.Take,
         page = resourceParameters.Page + pageAdjust,
         orderBy = resourceParameters.OrderBy,
         lastName = resourceParameters.LastName,
         term = resourceParameters.Term
     }));
 }
        private string CreateCustomersResourceUri(CustomerListParameters listParameters, int pageAdjust)
        {
            if (listParameters.Page + pageAdjust <= 0)
            {
                return(null);
            }

            return(_linkGenerator.GetPathByName(HttpContext, "GetCustomers", values: new
            {
                take = listParameters.Take,
                page = listParameters.Page + pageAdjust,
                orderBy = listParameters.OrderBy,
                lastName = listParameters.LastName,
                term = listParameters.Term
            }));
        }
Пример #6
0
        public List <Customer> Get(int accountId, CustomerListParameters options)
        {
            var sortedResults = context.Customer
                                //TODO: after auth is added .Where(x => x.AccountId == accountId)
                                .ApplySort(options.OrderBy, mappingCustomer);

            if (!string.IsNullOrWhiteSpace(options.LastName))
            {
                sortedResults = sortedResults
                                .Where(x => x.LastName.ToLowerInvariant() == options.LastName.Trim().ToLowerInvariant());
            }
            // add other where clauses when more filters are added.
            if (!string.IsNullOrWhiteSpace(options.Term))
            {
                sortedResults = sortedResults
                                .Where(x => (x.FirstName + " " + x.LastName).ToLowerInvariant().Contains(options.Term.ToLowerInvariant()) ||
                                       x.EmailAddress.ToLowerInvariant().Contains(options.Term.ToLowerInvariant()));
            }

            return(sortedResults.Skip((options.Page - 1) * options.Take)
                   .Take(options.Take)
                   .ToList());
        }