Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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;
                }
            }
        }
Пример #4
0
        /// <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());
        }
Пример #5
0
        public async Task <ActionResult> Index(MediaListRequestVM request)
        {
            var vm = await _media.GetMediaAsync(request);

            return(View(vm));
        }