[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)); }
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)); }
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 }
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 })); }
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()); }