Пример #1
0
        /// <summary>
        /// Suggests pages of specified types.
        /// </summary>
        public async Task <IReadOnlyList <PageTitleExtendedVM> > SuggestPagesAsync(
            PickRequestVM <PageType> request,
            Func <IReadOnlyList <Guid>, IReadOnlyList <Guid> > extraFilter = null
            )
        {
            var search = await _elastic.SearchAutocompleteAsync(request.Query, request.Types, 100);

            var ids = (IReadOnlyList <Guid>)search.Select(x => x.Id).ToList();

            if (extraFilter != null)
            {
                ids = extraFilter(ids);
            }

            var pages = await _db.Pages
                        .Where(x => ids.Contains(x.Id))
                        .ProjectTo <PageTitleExtendedVM>(_mapper.ConfigurationProvider)
                        .ToDictionaryAsync(x => x.Id, x => x);

            // URL is global for easier usage in JSON
            foreach (var page in pages.Values)
            {
                page.MainPhotoPath = GetFullThumbnailPath(page);
            }

            return(ids.Select(x => pages[x]).ToList());
        }
Пример #2
0
        /// <summary>
        /// Returns the pickable media.
        /// </summary>
        public async Task <IReadOnlyList <MediaThumbnailVM> > GetPickableMediaAsync(PickRequestVM <MediaType> request)
        {
            var q = _db.Media.AsNoTracking();

            if (!string.IsNullOrEmpty(request.Query))
            {
                var queryLower = request.Query.ToLower();
                q = q.Where(x => x.Title.ToLower().Contains(queryLower));
            }

            if (request.Types?.Length > 0)
            {
                q = q.Where(x => request.Types.Contains(x.Type));
            }

            var count  = Math.Clamp(request.Count ?? 100, 1, 100);
            var offset = Math.Max(request.Offset ?? 0, 0);

            var media = await q.OrderByDescending(x => x.UploadDate)
                        .Skip(offset)
                        .Take(count)
                        .ToListAsync();

            var vms = media.Select(x => MediaPresenterService.GetMediaThumbnail(x, MediaSize.Small)).ToList();

            foreach (var vm in vms)
            {
                vm.ThumbnailUrl = _url.Content(vm.ThumbnailUrl);
            }

            return(vms);
        }
Пример #3
0
        /// <summary>
        /// Suggests pages for the relations editor.
        /// </summary>
        public async Task <IReadOnlyList <PageTitleExtendedVM> > SuggestRelationPagesAsync(RelationSuggestQueryVM request)
        {
            if (request == null)
            {
                return(null);
            }

            var subRequest = new PickRequestVM <PageType> {
                Query = request.Query, Types = request.Types
            };

            if (request.DestinationId == null && request.SourceId == null)
            {
                return(await SuggestPagesAsync(subRequest));
            }

            var queryRoot = _db.Relations
                            .Where(x => x.IsDeleted == false);

            var idQuery = request.DestinationId != null
                ? queryRoot.Where(x => x.DestinationId == request.DestinationId)
                          .Select(x => x.SourceId)
                : queryRoot.Where(x => x.SourceId == request.SourceId)
                          .Select(x => x.DestinationId);

            var existingIds = await idQuery.ToHashSetAsync();

            var selfId = request.DestinationId ?? request.SourceId ?? Guid.Empty;

            existingIds.Add(selfId);

            return(await SuggestPagesAsync(
                       new PickRequestVM <PageType> {
                Query = request.Query, Types = request.Types
            },
                       ids => ids.Where(id => !existingIds.Contains(id)).ToList()
                       ));
        }
Пример #4
0
        /// <summary>
        /// Returns the pickable pages.
        /// </summary>
        public async Task <IReadOnlyList <PageTitleExtendedVM> > GetPickablePagesAsync(PickRequestVM <PageType> request)
        {
            var q = _db.Pages.AsQueryable();

            if (!string.IsNullOrEmpty(request.Query))
            {
                var queryLower = request.Query.ToLower();
                q = q.Where(x => x.Aliases.Any(y => y.Title.ToLower().Contains(queryLower)));
            }

            if (request.Types?.Length > 0)
            {
                q = q.Where(x => request.Types.Contains(x.Type));
            }

            var count  = Math.Clamp(request.Count ?? 100, 1, 100);
            var offset = Math.Max(request.Offset ?? 0, 0);

            var vms = await q.OrderBy(x => x.Title)
                      .Skip(offset)
                      .Take(count)
                      .ProjectTo <PageTitleExtendedVM>(_mapper.ConfigurationProvider)
                      .ToListAsync();

            foreach (var vm in vms)
            {
                vm.MainPhotoPath = GetFullThumbnailPath(vm);
            }

            return(vms);
        }
Пример #5
0
        public async Task <ActionResult> PickMedia([FromQuery] PickRequestVM <MediaType> vm)
        {
            var media = await _suggest.GetPickableMediaAsync(vm);

            return(Json(media));
        }
Пример #6
0
        public async Task <ActionResult> SuggestPages([FromQuery] PickRequestVM <PageType> vm)
        {
            var pages = await _suggest.SuggestPagesAsync(vm);

            return(Json(pages));
        }