/// <summary> /// Completes and\or corrects the search request. /// </summary> private ChangesetsListRequestVM NormalizeListRequest(ChangesetsListRequestVM vm) { if (vm == null) { vm = new ChangesetsListRequestVM(); } var orderableFields = new[] { nameof(Changeset.Date), nameof(Changeset.Author) }; if (!orderableFields.Contains(vm.OrderBy)) { vm.OrderBy = orderableFields[0]; } if (vm.Page < 0) { vm.Page = 0; } if (vm.OrderDescending == null) { vm.OrderDescending = true; } return(vm); }
/// <summary> /// Returns the additional filter data. /// </summary> private async Task FillAdditionalDataAsync(ChangesetsListRequestVM request, ChangesetsListVM data) { if (!string.IsNullOrEmpty(request.UserId)) { var user = await _db.Users .Where(x => x.Id == request.UserId) .Select(x => new { x.FirstName, x.LastName }) .FirstOrDefaultAsync(); if (user != null) { data.UserTitle = user.FirstName + " " + user.LastName; } else { request.UserId = null; } } if (request.EntityId != null) { var title = await GetPageTitleAsync() ?? await GetMediaTitleAsync(); if (title != null) { data.EntityTitle = title; } else { request.EntityId = null; } } async Task <string> GetPageTitleAsync() { return(await _db.Pages .Where(x => x.Id == request.EntityId) .Select(x => x.Title) .FirstOrDefaultAsync()); } async Task <string> GetMediaTitleAsync() { var media = await _db.Media .Where(x => x.Id == request.EntityId) .Select(x => new { Title = x.Title }) .FirstOrDefaultAsync(); return(media == null ? null : StringHelper.Coalesce(media.Title, "Медиа")); } }
/// <summary> /// Finds changesets. /// </summary> public async Task <ChangesetsListVM> GetChangesetsAsync(ChangesetsListRequestVM request) { const int PageSize = 20; request = NormalizeListRequest(request); var result = new ChangesetsListVM { Request = request }; await FillAdditionalDataAsync(request, result); var query = _db.Changes .AsNoTracking() .Include(x => x.Author) .Include(x => x.EditedPage) .ThenInclude(x => x.MainPhoto) .Include(x => x.EditedMedia) .Include(x => x.EditedRelation) .AsQueryable(); if (!string.IsNullOrEmpty(request.SearchQuery)) { var search = request.SearchQuery.ToLower(); query = query.Where(x => (x.EditedPage != null && x.EditedPage.Title.ToLower().Contains(search)) || x.EditedMedia != null && x.EditedMedia.Title.ToLower().Contains(search)); } if (request.EntityTypes?.Length > 0) { query = query.Where(x => request.EntityTypes.Contains(x.Type)); } if (request.EntityId != null) { query = query.Where(x => x.EditedPageId == request.EntityId || x.EditedMediaId == request.EntityId || x.EditedRelationId == request.EntityId); } if (!string.IsNullOrEmpty(request.UserId)) { query = query.Where(x => x.Author.Id == request.UserId); } var totalCount = await query.CountAsync(); result.PageCount = (int)Math.Ceiling((double)totalCount / PageSize); var dir = request.OrderDescending.Value; if (request.OrderBy == nameof(Changeset.Author)) { query = query.OrderBy(x => x.Author.UserName, dir); } else { query = query.OrderBy(x => x.Date, dir); } var changesets = await query.Skip(PageSize *request.Page) .Take(PageSize) .ToListAsync(); result.Items = changesets.Select(x => new ChangesetTitleVM { Id = x.Id, Date = x.Date, ChangeType = GetChangeType(x), Author = x.Author.FirstName + " " + x.Author.LastName, EntityId = x.EditedPageId ?? x.EditedMediaId ?? x.EditedRelationId ?? Guid.Empty, EntityType = x.Type, EntityTitle = GetEntityTitle(x), EntityThumbnailUrl = GetEntityThumbnailUrl(x), PageType = GetPageType(x), CanRevert = CanRevert(x) }) .ToList(); return(result); }
public async Task <ActionResult> Index(ChangesetsListRequestVM request) { var vm = await _changes.GetChangesetsAsync(request); return(View(vm)); }