public async Task <RegistrationLeafResponse> GetRegistrationLeafOrNullAsync( string id, NuGetVersion version, CancellationToken cancellationToken = default) { // Allow read-through caching to happen if it is configured. await _mirror.MirrorAsync(id, version, cancellationToken); var package = await _packages.FindOrNullAsync(id, version, includeUnlisted : true, cancellationToken); if (package == null) { return(null); } return(new BaGetRegistrationLeafResponse { Type = RegistrationLeafResponse.DefaultType, Listed = package.Listed, Downloads = package.Downloads, Published = package.Published, RegistrationLeafUrl = _url.GetRegistrationLeafUrl(id, version), PackageContentUrl = _url.GetPackageDownloadUrl(id, version), RegistrationIndexUrl = _url.GetRegistrationIndexUrl(id) }); }
public virtual RegistrationLeafResponse BuildLeaf(Package package) { var id = package.Id; var version = package.Version; return(new RegistrationLeafResponse { Type = RegistrationLeafResponse.DefaultType, Listed = package.Listed, Published = package.Published, RegistrationLeafUrl = _url.GetRegistrationLeafUrl(id, version), PackageContentUrl = _url.GetPackageDownloadUrl(id, version), RegistrationIndexUrl = _url.GetRegistrationIndexUrl(id) }); }
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()))); }
private SearchResult ToSearchResult(IReadOnlyList <PackageEntity> packages) { NuGetVersion latestVersion = null; PackageEntity latest = null; var versions = new List <SearchResultVersion>(); long totalDownloads = 0; foreach (var package in packages) { var version = NuGetVersion.Parse(package.OriginalVersion); totalDownloads += package.Downloads; versions.Add(new SearchResultVersion { RegistrationLeafUrl = _url.GetRegistrationLeafUrl(package.Id, version), Version = package.NormalizedVersion, Downloads = package.Downloads, }); if (latestVersion == null || version > latestVersion) { latest = package; latestVersion = version; } } var iconUrl = latest.HasEmbeddedIcon ? _url.GetPackageIconDownloadUrl(latest.Id, latestVersion) : latest.IconUrl; return(new SearchResult { PackageId = latest.Id, Version = latest.NormalizedVersion, Description = latest.Description, Authors = JsonConvert.DeserializeObject <string[]>(latest.Authors), IconUrl = iconUrl, LicenseUrl = latest.LicenseUrl, ProjectUrl = latest.ProjectUrl, RegistrationIndexUrl = _url.GetRegistrationIndexUrl(latest.Id), Summary = latest.Summary, Tags = JsonConvert.DeserializeObject <string[]>(latest.Tags), Title = latest.Title, TotalDownloads = totalDownloads, Versions = versions, }); }
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()) }); }