private PaginatedPropertyList GetPaginatedPropertyList(PropertyListRequest requestParams) { var query = PropertiesQuery(requestParams); var totalItems = query.Count(); // if no limit for page size, then page size will be equal to total items so we return all results. var pageSize = requestParams.PageSize != PropertyListRequest.NoLimitForPageSize ? requestParams.PageSize : totalItems; query = query.Skip(requestParams.CurrentPage * pageSize).Take(pageSize); var propertyDtoList = Mapper.Map <IQueryable <Entity.Models.Property>, List <Dto.Models.Property> >(query); GenerateUserPhotoLinks(propertyDtoList); // If requestParams is not empty, we should have received page info. var paginatedList = new PaginatedPropertyList { Properties = propertyDtoList, CurrentPage = requestParams.CurrentPage, PageSize = pageSize, TotalPages = (int)Math.Ceiling((double)totalItems / pageSize), TotalItems = totalItems }; return(paginatedList); }
public async Task GetProperties() { CurrentPage = 0; var requestParams = new PropertyListRequest { CurrentPage = CurrentPage, PageSize = PageSize, NameFilter = NameFilter, CityFilter = CityFilter, StateFilter = StateFilter, SortColumn = SortColumn, SortAscending = SortAscending, UserIdListFilter = UserIdListFilter, }; var result = await GetPropertiesAsync(requestParams); if (result != null) { Properties.Clear(); foreach (var p in result.Properties) { Properties.Add(p); } LastResult = result; TotalPages = LastResult.TotalPages; OnPropertyListUpdated(result); } }
// #future: If we want to build on this query - make return type IQueryable<> private IQueryable <Entity.Models.Property> PropertiesQuery(PropertyListRequest requestParams = null) { var query = db.Properties.Where(p => p.CompanyId == loggedInUser.CompanyId); /* loggedInUser.Properties.AsQueryable() */ if (requestParams != null) { if (requestParams.UserIdListFilter.Count > 0) { query = query.Where(p => p.Users.Count(u => requestParams.UserIdListFilter.Contains(u.Id)) > 0); } // First apply search filter if (!String.IsNullOrEmpty(requestParams.StateFilter)) { var stateFilter = requestParams.StateFilter.Trim().ToLower(); query = query.Where(p => (!String.IsNullOrEmpty(p.StateProvince) && p.StateProvince.ToLower().Contains(stateFilter))); } if (!String.IsNullOrEmpty(requestParams.CityFilter)) { var cityFilter = requestParams.CityFilter.Trim().ToLower(); query = query.Where(p => (!String.IsNullOrEmpty(p.City) && p.City.ToLower().Contains(cityFilter))); } if (!String.IsNullOrEmpty(requestParams.NameFilter)) { var nameFilter = requestParams.NameFilter.Trim().ToLower(); query = query.Where(p => (!String.IsNullOrEmpty(p.Name) && p.Name.ToLower().Contains(nameFilter))); } // Second apply sorting if (!String.IsNullOrEmpty(requestParams.SortColumn)) { bool asc = requestParams.SortAscending; switch (requestParams.SortColumn) { case PropertyListRequest.NameColumn: query = asc ? query.OrderBy(p => p.Name) : query.OrderByDescending(p => p.Name); break; case PropertyListRequest.CityColumn: query = asc ? query.OrderBy(p => p.City) : query.OrderByDescending(p => p.City); break; case PropertyListRequest.StateColumn: query = asc ? query.OrderBy(p => p.StateProvince) : query.OrderByDescending(p => p.StateProvince); break; } } else { // Skip Needs orderby clause query = query.OrderBy(p => p.Name); } } return(query); }
private async Task <PaginatedPropertyList> GetPropertiesAsync(PropertyListRequest requestParams) { object response = null; using (_dialogService.Loading("Getting properties...")) response = await _propertyTrackerService.GetProperties(requestParams); if (response is PaginatedPropertyList) { return(response as PaginatedPropertyList); } var msg = response is ErrorResult ? (response as ErrorResult).Message : "Failed to retreive properties"; _dialogService.Alert(msg, "Request Failed"); return(null); }
public async Task <object> GetProperties(PropertyListRequest requestParams) { if (!LoggedIn) { Debug.WriteLine("Not logged in"); return(null); } var flurl = PropertiesRequestUrl.SetQueryParams(requestParams); // Flurl seems to skip bool parameters. Add it manually. flurl.SetQueryParam("SortAscending", requestParams.SortAscending ? "true" : "false"); // Flurl doesn't know how to marshal a list into a query string, so we do it ourselves by // emitting the same key for different userid values, so that Web Api query string // parsing will be able to re-create the List<int> flurl.RemoveQueryParam("UserIdListFilter"); string url = flurl; foreach (var userid in requestParams.UserIdListFilter) { url += "&UserIdListFilter=" + userid; } using (var response = await _client.GetAsync(url)) { var content = response.Content != null ? await response.Content.ReadAsStringAsync() : null; if (response.IsSuccessStatusCode == false) { var errorResult = content != null?JsonConvert.DeserializeObject <ErrorResult>(content) : null; Debug.WriteLine("Request failed: " + response.ToString()); return(errorResult); } var parsedObject = JsonConvert.DeserializeObject <PaginatedPropertyList>(content); if (parsedObject == null) { Debug.WriteLine("Could not deserialize json(" + content + ")"); } return(parsedObject); } }
public IHttpActionResult GetProperties([FromUri] PropertyListRequest requestParams) { loggedInUser = GetLoggedInUser(); if (requestParams == null) { return(BadRequest("Property list request parameters are missing")); } var result = new PropertyListRequestValidator().Validate(requestParams); if (!result.IsValid) { return(new ValidatorError("Error validating page request parameters", HttpStatusCode.BadRequest, result, Request)); } // Get properties based on parameters we got var paginatedList = GetPaginatedPropertyList(requestParams); return(Ok(paginatedList)); }