public async Task <IActionResult> Index(string id, RegistrationsContentMode mode, CancellationToken cancellationToken)
        {
            var useGz      = mode == RegistrationsContentMode.GZip || mode == RegistrationsContentMode.SemVer2;
            var useSemVer2 = mode == RegistrationsContentMode.SemVer2;

            if (useGz)
            {
                this.Response.Headers.Add(HeaderNames.ContentEncoding, "gzip");
                this.Response.Body = new GZipStream(this.Response.Body, CompressionLevel.Optimal);
            }

            var dbpackage = await this.Database.Packages
                            .Include(x => x.Versions)
                            .ThenInclude(x => x.Dependencies)
                            .Include(x => x.Authors)
                            .Include(x => x.Tags)
                            .FirstOrDefaultAsync(x => x.IdLowercase == id, cancellationToken)
                            .ConfigureAwait(false);

            if (dbpackage == null)
            {
                return(this.NotFound());
            }

            var dbversions = dbpackage.Versions
                             .Where(x => !useSemVer2 ? !x.NuGetVersion.IsSemVer2 : true)
                             .OrderBy(x => x.NuGetVersion)
                             .ToList();

            return(this.Json(this.PrepareIndex(mode, dbpackage, dbversions)));
        }
 private RegistrationsLeafModel PrepareLeaf(RegistrationsContentMode mode, Package dbpackage, PackageVersion dbversion)
 => new RegistrationsLeafModel
 {
     LeafUrl      = this.Url.AbsoluteUrl("Leaf", "RegistrationsBase", this.HttpContext, new { mode, id = dbpackage.IdLowercase, version = dbversion.VersionLowercase }),
     CatalogEntry = new CatalogEntryModel
     {
         CatalogUrl       = this.Url.AbsoluteUrl("Leaf", "RegistrationsBase", this.HttpContext, new { mode, id = dbpackage.IdLowercase, version = dbversion.VersionLowercase }),
         Authors          = dbpackage.AuthorNames,
         DependencyGroups = this.PrepareDependencyGroups(dbversion),
         Deprecation      = null,
         Description      = dbpackage.Description,
         IconUrl          = dbpackage.IconUrl,
         Id                        = dbpackage.Id,
         LicenseUrl                = dbpackage.LicenseUrl,
         LicenseExpression         = null,
         IsListed                  = dbpackage.IsListed,
         MinimumClientVersion      = dbpackage.MinimumClientVersion,
         ProjectUrl                = dbpackage.ProjectUrl,
         PublishedAt               = dbpackage.PublishedAt.Value,
         RequiresLicenseAcceptance = dbpackage.RequiresLicenseAcceptance,
         Summary                   = dbpackage.Summary,
         Tags                      = dbpackage.TagNames,
         Title                     = dbpackage.Title,
         Version                   = dbversion.Version
     },
     IsListed   = dbversion.IsListed,
     ContentUrl = this.Url.AbsoluteUrl("Contents", "PackageBase", this.HttpContext, new
     {
         id       = dbpackage.IdLowercase,
         version  = dbversion.VersionLowercase,
         filename = $"{dbpackage.IdLowercase}.{dbversion.VersionLowercase}"
     }),
     PublishedAt          = dbversion.PublishedAt.Value,
     RegistrationIndexUrl = this.Url.AbsoluteUrl("Index", "RegistrationsBase", this.HttpContext, new { mode, id = dbpackage.IdLowercase })
 };
        public async Task <IActionResult> Page(string id, string minVersion, string maxVersion, RegistrationsContentMode mode, CancellationToken cancellationToken)
        {
            var useGz      = mode == RegistrationsContentMode.GZip || mode == RegistrationsContentMode.SemVer2;
            var useSemVer2 = mode == RegistrationsContentMode.SemVer2;

            if (useGz)
            {
                this.Response.Headers.Add(HeaderNames.ContentEncoding, "gzip");
                this.Response.Body = new GZipStream(this.Response.Body, CompressionLevel.Optimal);
            }

            var dbpackage = await this.Database.Packages
                            .Include(x => x.Versions)
                            .ThenInclude(x => x.Dependencies)
                            .Include(x => x.Authors)
                            .Include(x => x.Tags)
                            .FirstOrDefaultAsync(x => x.IdLowercase == id, cancellationToken)
                            .ConfigureAwait(false);

            if (dbpackage == null)
            {
                return(this.NotFound());
            }

            var nvMin      = NuGetVersion.Parse(minVersion);
            var nvMax      = NuGetVersion.Parse(maxVersion);
            var dbversions = dbpackage.Versions
                             .Where(x => x.NuGetVersionLowercase >= nvMin && x.NuGetVersionLowercase <= nvMax && (!useSemVer2 ? !x.NuGetVersion.IsSemVer2 : true))
                             .OrderBy(x => x.NuGetVersion)
                             .ToList();

            if (dbversions.Count > 64)
            {
                return(this.BadRequest(new { message = "Too wide version range." }));
            }

            return(this.Json(this.PreparePage(mode, dbpackage, dbversions, (minVersion, maxVersion), true)));
        }
 private RegistrationsPageModel PreparePage(RegistrationsContentMode mode, Package dbpackage, IEnumerable <PackageVersion> dbversions, (string min, string max) versionRange, bool inlineVersions)