/// <summary> /// Completes and\or corrects the search request. /// </summary> private MediaListRequestVM NormalizeListRequest(MediaListRequestVM vm) { if (vm == null) { vm = new MediaListRequestVM { OrderDescending = true } } ; var orderableFields = new[] { nameof(Media.UploadDate), nameof(Media.Date) }; 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> /// Finds media files. /// </summary> public async Task <MediaListVM> GetMediaAsync(MediaListRequestVM request) { const int PageSize = 20; request = NormalizeListRequest(request); var result = new MediaListVM { Request = request }; await FillAdditionalDataAsync(request, result); var query = _db.Media .Include(x => x.Tags) .Where(x => x.IsDeleted == false); if (!string.IsNullOrEmpty(request.SearchQuery)) { query = query.Where(x => x.Title.ToLower().Contains(request.SearchQuery.ToLower())); } if (request.EntityId != null) { query = query.Where(x => x.Tags.Any(y => y.ObjectId == request.EntityId)); } if (request.Types?.Length > 0) { query = query.Where(x => request.Types.Contains(x.Type)); } var totalCount = await query.CountAsync(); result.PageCount = (int)Math.Ceiling((double)totalCount / PageSize); result.Items = await query.OrderBy(request.OrderBy, request.OrderDescending ?? false) .ProjectTo <MediaThumbnailExtendedVM>(_mapper.ConfigurationProvider) .Skip(PageSize * request.Page) .Take(PageSize) .ToListAsync(); return(result); }
/// <summary> /// Loads extra data for the filter. /// </summary> private async Task FillAdditionalDataAsync(MediaListRequestVM request, MediaListVM data) { if (request.EntityId != null) { var title = await _db.Pages .Where(x => x.Id == request.EntityId) .Select(x => x.Title) .FirstOrDefaultAsync(); if (title != null) { data.EntityTitle = title; } else { request.EntityId = null; } } }
/// <summary> /// Finds media files by a complex request. /// </summary> public async Task <IReadOnlyList <MediaThumbnailVM> > FindAsync(MediaListRequestVM vm) { const int PAGE_SIZE = 100; var query = _db.Media .OrderBy(vm.OrderBy.TryGetOneOf(nameof(Media.Order), nameof(Media.UploadDate), nameof(Media.Date)), vm.OrderDesc) .AsQueryable(); if (!string.IsNullOrEmpty(vm.Folder)) { if (!await _db.Folders.AnyAsync(x => x.Key == vm.Folder)) { throw new OperationException($"Folder '{vm.Folder}' does not exist."); } query = query.Where(x => x.FolderKey == vm.Folder); } return(await query.Skip(Math.Max(0, vm.Page) *PAGE_SIZE) .Take(PAGE_SIZE) .ProjectToType <MediaThumbnailVM>(_mapper.Config) .ToListAsync()); }
public async Task <ActionResult> Index(MediaListRequestVM request) { var vm = await _media.GetMediaAsync(request); return(View(vm)); }