public async Task <ActionResult> Allocations([CustomizeValidator(RuleSet = "FilterDto")][FromQuery] AllocationsFilterDto filter) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } var items = await _allocationService.GetAllocations(filter); return(Ok(items)); }
public async Task <PagedResultDto <UserAllocationDto> > GetAllocations(AllocationsFilterDto filterDto) { // Default filter is User Full Name asc Expression <Func <UserAllocation, object> > sortCondition = s => s.User.FullName; // Map filters Expression <Func <UserAllocation, bool> > predicate = s => 1 == 1; predicate = s => (!filterDto.ProjectId.HasValue || s.ProjectId == filterDto.ProjectId.Value) && (!filterDto.UserId.HasValue || s.UserId == filterDto.UserId.Value) && (!filterDto.RoleId.HasValue || s.RoleId == filterDto.RoleId.Value) && (!filterDto.StartDate.HasValue || s.StartDate == filterDto.StartDate.Value) && (!filterDto.EndDate.HasValue || s.EndDate == filterDto.EndDate.Value) && (!filterDto.FilterRule.HasValue || (filterDto.FilterRule.Value == BusinessFilters.ActiveProjects && s.Project.IsActive) || (filterDto.FilterRule.Value == BusinessFilters.NotActiveProjects && !s.Project.IsActive) || (filterDto.FilterRule.Value == BusinessFilters.ActiveUsers && s.User.IsActive) || (filterDto.FilterRule.Value == BusinessFilters.NotActiveUsers && !s.User.IsActive)); // Map sort fields to DB fields switch (filterDto.Sort.ToLower()) { case "employee": sortCondition = s => s.User.FullName; break; case "project": sortCondition = s => s.Project.Name; break; case "role": sortCondition = s => s.Role.Name; break; } // Default dir is Asc since default filter is User Full Name bool sortDesc = string.Equals(filterDto.SortDir, string.Empty, StringComparison.InvariantCultureIgnoreCase) || string.Equals(filterDto.SortDir, "asc", StringComparison.InvariantCultureIgnoreCase) ? false : true; return(new PagedResultDto <UserAllocationDto>() { Page = filterDto.Page, Per = filterDto.Per, Data = Mapper.Map <ICollection <UserAllocationDto> >(await _allocationRepository.GetAllocations(filterDto.Page, filterDto.Per, predicate, sortCondition, sortDesc)), Total = await _allocationRepository.GetAllocationsCount(predicate) }); }