public async Task <IActionResult> SearchSmartIssue([FromBody] SearchSmartIssueFormModel searchIssueForm) { return(Ok(GetRequestResult(await _issueService.SearchSmartIssueAsync(HttpContext.GetUser(), searchIssueForm)))); }
public async Task <SearchIssueViewModel> SearchSmartIssueAsync(User user, SearchSmartIssueFormModel searchIssueForm) { try { var queryable = _context.Issues.Include(c => c.EquipmentIssueSubscriptions).Include(c => c.IssueDetails).Include(c => c.User).Where(c => c.IsActive.HasValue && c.IsActive.Value && c.AnswerCounts > 0).AsQueryable(); if (!string.IsNullOrEmpty(searchIssueForm.SearchContent)) { var searchContents = searchIssueForm.SearchContent.Split(" "); foreach (var item in searchContents) { queryable = queryable.Where(q => EF.Functions.Like(q.Title, $"%{item}%")); } } if (searchIssueForm.FilterType.HasValue) { if (searchIssueForm.FilterType.Value == FilterType.AcceptedAnswer) { queryable = queryable.Where(q => q.IssueDetails.Any(c => c.IsCorrectAnswer)); } else if (searchIssueForm.FilterType.Value == FilterType.NoAcceptedAnswer) { queryable = queryable.Where(q => q.IssueDetails.All(c => !c.IsCorrectAnswer)); } else if (searchIssueForm.FilterType.Value == FilterType.NoAnswers) { queryable = queryable.Where(q => q.AnswerCounts > 1); } } if (searchIssueForm.SortType.HasValue) { if (searchIssueForm.SortType.Value == SortType.Newest) { queryable = queryable.OrderByDescending(q => q.CreationDate); } else if (searchIssueForm.SortType.Value == SortType.MostLikes) { queryable = queryable.OrderByDescending(q => q.IssueDetails.Sum(x => x.Likes)); } else if (searchIssueForm.SortType.Value == SortType.RecentActivity) { queryable = queryable.OrderByDescending(q => q.IssueDetails.OrderByDescending(c => c.LastUpdateDate)); } } if (!user.IsAdmin()) { var userEqu = await _context.EquipmentUserSubscriptions.Where(c => c.UserId == user.Id).Select(c => c.EquipmentId).ToListAsync(); queryable = queryable.Where(c => c.EquipmentIssueSubscriptions.Any(x => userEqu.Contains(x.EquipmentId))); } if (searchIssueForm.EquipmentIds.Count > 0) { queryable = queryable.Where(c => c.EquipmentIssueSubscriptions.Any(x => searchIssueForm.EquipmentIds.Contains(x.EquipmentId))); } var response = await queryable.Skip((searchIssueForm.PageIndex - 1) *searchIssueForm.PageSize).Take(searchIssueForm.PageSize).ToListAsync(); var count = await queryable.CountAsync(); var searchViewModel = new SearchIssueViewModel(); searchViewModel.searchIssueViewModel = response.Select(resp => new IssueViewModel() { Id = resp.Id, AnswerCount = resp.AnswerCounts, CreationDate = resp.CreationDate, Description = resp.Description, Equipments = resp.EquipmentIssueSubscriptions.Select(x => new EquipmentViewModel() { Description = x.Equipment.Description, EquipmentName = x.Equipment.EquipmentName, Id = x.EquipmentId }).ToList(), IsActive = resp.IsActive, IssueType = resp.IssueType, LastUpdateDate = resp.LastUpdateDate, Title = resp.Title, SumLikes = resp.IssueDetails.Sum(c => c.Likes), UserId = resp.UserId, UserName = resp.User.Username, FileId = resp.FileId }).ToList(); searchViewModel.PageIndex = searchIssueForm.PageIndex; searchViewModel.PageSize = searchIssueForm.PageSize; searchViewModel.TotalCount = count; return(searchViewModel); } catch (Exception ex) { throw new ExperienceManagementGlobalException(IssueServiceErrors.SearchIssuesError, ex); } }