Exemple #1
0
        public async Task <SearchResponse> SearchAsync(
            string query           = null,
            int skip               = 0,
            int take               = 20,
            bool includePrerelease = true,
            bool includeSemVer2    = true,
            string packageType     = null,
            string framework       = null,
            CancellationToken cancellationToken = default)
        {
            var result   = new List <SearchResult>();
            var packages = await SearchImplAsync(
                query,
                skip,
                take,
                includePrerelease,
                includeSemVer2,
                packageType,
                framework,
                cancellationToken);

            foreach (var package in packages)
            {
                var versions = package.OrderByDescending(p => p.Version).ToList();
                var latest   = versions.First();

                result.Add(new SearchResult
                {
                    PackageId            = latest.Id,
                    Version              = latest.Version.ToFullString(),
                    Description          = latest.Description,
                    Authors              = latest.Authors,
                    IconUrl              = latest.IconUrlString,
                    LicenseUrl           = latest.LicenseUrlString,
                    ProjectUrl           = latest.ProjectUrlString,
                    RegistrationIndexUrl = _url.GetRegistrationIndexUrl(latest.Id),
                    Summary              = latest.Summary,
                    Tags           = latest.Tags,
                    Title          = latest.Title,
                    TotalDownloads = versions.Sum(p => p.Downloads),
                    Versions       = versions
                                     .Select(p => new SearchResultVersion
                    {
                        RegistrationLeafUrl = _url.GetRegistrationLeafUrl(p.Id, p.Version),
                        Version             = p.Version.ToFullString(),
                        Downloads           = p.Downloads,
                    })
                                     .ToList()
                });
            }

            return(new SearchResponse
            {
                TotalHits = result.Count,
                Data = result,
                Context = SearchContext.Default(_url.GetPackageMetadataResourceUrl())
            });
        }
Exemple #2
0
        public async Task <SearchResponse> SearchAsync(BaGetSearchRequest request, CancellationToken cancellationToken = default)
        {
            var query      = BuildSeachQuery(request);
            var filter     = BuildSearchFilter(request);
            var parameters = new SearchParameters
            {
                IncludeTotalResultCount = true,
                QueryType = QueryType.Full,
                Skip      = request.Skip,
                Top       = request.Take,
                Filter    = filter
            };

            var response = await _searchClient.Documents.SearchAsync <PackageDocument>(query, parameters, cancellationToken : cancellationToken);

            var results = new List <SearchResult>();

            foreach (var result in response.Results)
            {
                var document = result.Document;
                var versions = new List <SearchResultVersion>();

                if (document.Versions.Length != document.VersionDownloads.Length)
                {
                    throw new InvalidOperationException($"Invalid document {document.Key} with mismatched versions");
                }

                for (var i = 0; i < document.Versions.Length; i++)
                {
                    var downloads = long.Parse(document.VersionDownloads[i]);
                    var version   = NuGetVersion.Parse(document.Versions[i]);
                    var url       = _url.GetRegistrationLeafUrl(document.Id, version);

                    versions.Add(new SearchResultVersion(url, version, downloads));
                }

                results.Add(new SearchResult(
                                document.Id,
                                NuGetVersion.Parse(document.Version),
                                document.Description,
                                document.Authors,
                                document.IconUrl,
                                document.LicenseUrl,
                                document.ProjectUrl,
                                _url.GetRegistrationIndexUrl(document.Id),
                                document.Summary,
                                document.Tags,
                                document.Title,
                                document.TotalDownloads,
                                versions));
            }

            return(new SearchResponse(
                       response.Count.Value,
                       results,
                       SearchContext.Default(_url.GetPackageMetadataResourceUrl())));
        }
        public async Task <SearchResponse> SearchAsync(
            SearchRequest request,
            CancellationToken cancellationToken)
        {
            var result   = new List <SearchResult>();
            var packages = await SearchImplAsync(
                request,
                cancellationToken);

            foreach (var package in packages)
            {
                var versions = package.OrderByDescending(p => p.Version).ToList();
                var latest   = versions.First();
                var iconUrl  = latest.HasEmbeddedIcon
                    ? _url.GetPackageIconDownloadUrl(latest.Id, latest.Version)
                    : latest.IconUrlString;

                result.Add(new SearchResult
                {
                    PackageId            = latest.Id,
                    Version              = latest.Version.ToFullString(),
                    Description          = latest.Description,
                    Authors              = latest.Authors,
                    IconUrl              = iconUrl,
                    LicenseUrl           = latest.LicenseUrlString,
                    ProjectUrl           = latest.ProjectUrlString,
                    RegistrationIndexUrl = _url.GetRegistrationIndexUrl(latest.Id),
                    Summary              = latest.Summary,
                    Tags      = latest.Tags,
                    Title     = latest.Title,
                    Published = new DateTimeOffset(latest.Published, TimeZoneInfo.Local.GetUtcOffset(DateTime.UtcNow)),
#pragma warning disable CS0618
                    TotalDownloads = versions.Sum(p => p.Downloads + p.PackageDownloads.Count),
#pragma warning restore CS0618
                    Versions = versions
                               .Select(p => new SearchResultVersion
                    {
                        RegistrationLeafUrl = _url.GetRegistrationLeafUrl(p.Id, p.Version),
                        Version             = p.Version.ToFullString(),
#pragma warning disable CS0618
                        Downloads = p.PackageDownloads.Count + p.Downloads,
#pragma warning restore CS0618
                    })
                               .ToList()
                });
            }

            return(new SearchResponse
            {
                TotalHits = await SearchCountAsync(request, cancellationToken),
                Data = result,
                Context = SearchContext.Default(_url.GetPackageMetadataResourceUrl())
            });
        }
Exemple #4
0
        public async Task <SearchResponse> SearchAsync(
            string query,
            int skip = 0,
            int take = 20,
            bool includePrerelease = true,
            bool includeSemVer2    = true,
            string packageType     = null,
            string framework       = null,
            CancellationToken cancellationToken = default)
        {
            var result   = new List <SearchResult>();
            var packages = await SearchImplAsync(
                query,
                skip,
                take,
                includePrerelease,
                includeSemVer2,
                packageType,
                framework,
                cancellationToken);

            foreach (var package in packages)
            {
                var versions = package.OrderByDescending(p => p.Version).ToList();
                var latest   = versions.First();

                var versionResults = versions.Select(p => new SearchResultVersion(
                                                         registrationLeafUrl: _url.GetRegistrationLeafUrl(p.Id, p.Version),
                                                         p.Version,
                                                         p.Downloads));

                result.Add(new SearchResult(
                               latest.Id,
                               latest.Version,
                               latest.Description,
                               latest.Authors,
                               latest.IconUrlString,
                               latest.LicenseUrlString,
                               latest.ProjectUrlString,
                               registrationIndexUrl: _url.GetRegistrationIndexUrl(latest.Id),
                               latest.Summary,
                               latest.Tags,
                               latest.Title,
                               versions.Sum(p => p.Downloads),
                               versionResults.ToList()));
            }

            return(new SearchResponse(
                       result.Count,
                       result,
                       SearchContext.Default(_url.GetPackageMetadataResourceUrl())));
        }
Exemple #5
0
        public Task <ServiceIndexResponse> GetAsync(CancellationToken cancellationToken = default)
        {
            var resources = new List <ServiceIndexItem>();

            resources.AddRange(BuildResource("PackagePublish", _url.GetPackagePublishResourceUrl(), "2.0.0"));
            resources.AddRange(BuildResource("SymbolPackagePublish", _url.GetSymbolPublishResourceUrl(), "4.9.0"));
            resources.AddRange(BuildResource("SearchQueryService", _url.GetSearchResourceUrl(), "", "3.0.0-beta", "3.0.0-rc"));
            resources.AddRange(BuildResource("RegistrationsBaseUrl", _url.GetPackageMetadataResourceUrl(), "", "3.0.0-rc", "3.0.0-beta"));
            resources.AddRange(BuildResource("PackageBaseAddress", _url.GetPackageContentResourceUrl(), "3.0.0"));
            resources.AddRange(BuildResource("SearchAutocompleteService", _url.GetAutocompleteResourceUrl(), "", "3.0.0-rc", "3.0.0-beta"));

            var result = new ServiceIndexResponse(new NuGetVersion("3.0.0"), resources);

            return(Task.FromResult(result));
        }
        public SearchResponse BuildSearch(IReadOnlyList <PackageRegistration> packageRegistrations)
        {
            var result = new List <SearchResult>();

            foreach (var packageRegistration in packageRegistrations)
            {
                var versions = packageRegistration.Packages.OrderByDescending(p => p.Version).ToList();
                var latest   = versions.First();
                var iconUrl  = latest.HasEmbeddedIcon
                    ? _url.GetPackageIconDownloadUrl(latest.Id, latest.Version)
                    : latest.IconUrlString;

                result.Add(new SearchResult
                {
                    PackageId            = latest.Id,
                    Version              = latest.Version.ToFullString(),
                    Description          = latest.Description,
                    Authors              = latest.Authors,
                    IconUrl              = iconUrl,
                    LicenseUrl           = latest.LicenseUrlString,
                    ProjectUrl           = latest.ProjectUrlString,
                    RegistrationIndexUrl = _url.GetRegistrationIndexUrl(latest.Id),
                    Summary              = latest.Summary,
                    Tags           = latest.Tags,
                    Title          = latest.Title,
                    TotalDownloads = versions.Sum(p => p.Downloads),
                    Versions       = versions
                                     .Select(p => new SearchResultVersion
                    {
                        RegistrationLeafUrl = _url.GetRegistrationLeafUrl(p.Id, p.Version),
                        Version             = p.Version.ToFullString(),
                        Downloads           = p.Downloads,
                    })
                                     .ToList(),
                });
            }

            return(new SearchResponse
            {
                TotalHits = result.Count,
                Data = result,
                Context = SearchContext.Default(_url.GetPackageMetadataResourceUrl()),
            });
        }
Exemple #7
0
        public async Task <SearchResponse> SearchAsync(BaGetSearchRequest request, CancellationToken cancellationToken)
        {
            var result   = new List <SearchResult>();
            var packages = await SearchImplAsync(request, cancellationToken);

            foreach (var package in packages)
            {
                var versions = package.OrderByDescending(p => p.Version).ToList();
                var latest   = versions.First();

                var versionResults = versions.Select(p => new SearchResultVersion(
                                                         registrationLeafUrl: _url.GetRegistrationLeafUrl(p.Id, p.Version),
                                                         p.Version,
                                                         p.Downloads));

                result.Add(new SearchResult(
                               latest.Id,
                               latest.Version,
                               latest.Description,
                               latest.Authors,
                               latest.IconUrlString,
                               latest.LicenseUrlString,
                               latest.ProjectUrlString,
                               registrationIndexUrl: _url.GetRegistrationIndexUrl(latest.Id),
                               latest.Summary,
                               latest.Tags,
                               latest.Title,
                               versions.Sum(p => p.Downloads),
                               versionResults.ToList()));
            }

            return(new SearchResponse(
                       result.Count,
                       result,
                       SearchContext.Default(_url.GetPackageMetadataResourceUrl())));
        }
Exemple #8
0
        public async Task <SearchResponse> SearchAsync(
            string query,
            int skip = 0,
            int take = 20,
            bool includePrerelease = true,
            bool includeSemVer2    = true,
            string packageType     = null,
            string framework       = null,
            CancellationToken cancellationToken = default)
        {
            var searchText = BuildSeachQuery(query, packageType, framework);
            var filter     = BuildSearchFilter(includePrerelease, includeSemVer2);
            var parameters = new SearchParameters
            {
                IncludeTotalResultCount = true,
                QueryType = QueryType.Full,
                Skip      = skip,
                Top       = take,
                Filter    = filter
            };

            var response = await _searchClient.Documents.SearchAsync <PackageDocument>(searchText, parameters, cancellationToken : cancellationToken);

            var results = new List <SearchResult>();

            foreach (var result in response.Results)
            {
                var document = result.Document;
                var versions = new List <SearchResultVersion>();

                if (document.Versions.Length != document.VersionDownloads.Length)
                {
                    throw new InvalidOperationException($"Invalid document {document.Key} with mismatched versions");
                }

                for (var i = 0; i < document.Versions.Length; i++)
                {
                    var version = NuGetVersion.Parse(document.Versions[i]);

                    versions.Add(new SearchResultVersion
                    {
                        RegistrationLeafUrl = _url.GetRegistrationLeafUrl(document.Id, version),
                        Version             = document.Versions[i],
                        Downloads           = long.Parse(document.VersionDownloads[i]),
                    });
                }

                results.Add(new SearchResult
                {
                    PackageId            = document.Id,
                    Version              = document.Version,
                    Description          = document.Description,
                    Authors              = document.Authors,
                    IconUrl              = document.IconUrl,
                    LicenseUrl           = document.LicenseUrl,
                    ProjectUrl           = document.ProjectUrl,
                    RegistrationIndexUrl = _url.GetRegistrationIndexUrl(document.Id),
                    Summary              = document.Summary,
                    Tags           = document.Tags,
                    Title          = document.Title,
                    TotalDownloads = document.TotalDownloads,
                    Versions       = versions
                });
            }

            return(new SearchResponse
            {
                TotalHits = response.Count.Value,
                Data = results,
                Context = SearchContext.Default(_url.GetPackageMetadataResourceUrl())
            });
        }
Exemple #9
0
        /// <summary>
        /// Perform a search query.
        /// See: https://docs.microsoft.com/en-us/nuget/api/search-query-service-resource#search-for-packages
        /// </summary>
        /// <param name="query">The search query.</param>
        /// <param name="skip">How many results to skip.</param>
        /// <param name="take">How many results to return.</param>
        /// <param name="includePrerelease">Whether pre-release packages should be returned.</param>
        /// <param name="includeSemVer2">Whether packages that require SemVer 2.0.0 compatibility should be returned.</param>
        /// <param name="packageType">The type of packages that should be returned.</param>
        /// <param name="framework">The Target Framework that results should be compatible.</param>
        /// <param name="cancellationToken">A token to cancel the task.</param>
        /// <returns>The search response.</returns>
        public async Task <SearchResponse> SearchAsync(
            string query           = null,
            int skip               = 0,
            int take               = 20,
            bool includePrerelease = true,
            bool includeSemVer2    = true,
            string packageType     = null,
            string framework       = null,
            CancellationToken cancellationToken = default)
        {
            var result = await _upstreamClient.SearchAsync(query, skip, take, includePrerelease, cancellationToken);

            return(new SearchResponse {
                Data = result, TotalHits = result.Count, Context = SearchContext.Default(_url.GetPackageMetadataResourceUrl())
            });
        }