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()) }); }
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()) }); }
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()))); }
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()), }); }
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()))); }
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()) }); }
/// <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()) }); }