Skip to content

Commit 38fa7a2

Browse files
authored
[Rename] DB schema change (#7923)
* DB schema for package rename. * nit * Handle feedback * Nit
1 parent 14b149f commit 38fa7a2

11 files changed

Lines changed: 296 additions & 0 deletions

File tree

src/NuGet.Services.Entities/NuGet.Services.Entities.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
<Compile Include="PackageLicenseReport.cs" />
7878
<Compile Include="PackageOwnerRequest.cs" />
7979
<Compile Include="PackageRegistration.cs" />
80+
<Compile Include="PackageRename.cs" />
8081
<Compile Include="PackageStatus.cs" />
8182
<Compile Include="PackageType.cs" />
8283
<Compile Include="PackageVulnerability.cs" />

src/NuGet.Services.Entities/PackageRegistration.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public PackageRegistration()
1616
ReservedNamespaces = new HashSet<ReservedNamespace>();
1717
RequiredSigners = new HashSet<User>();
1818
AlternativeOf = new HashSet<PackageDeprecation>();
19+
PackageRenames = new HashSet<PackageRename>();
1920
}
2021

2122
[StringLength(Constants.MaxPackageIdLength)]
@@ -44,5 +45,15 @@ public PackageRegistration()
4445
/// See <see cref="PackageDeprecation.AlternatePackageRegistration"/>.
4546
/// </summary>
4647
public virtual ICollection<PackageDeprecation> AlternativeOf { get; set; }
48+
49+
/// <summary>
50+
/// Gets or sets the list of replacement package registrations.
51+
/// </summary>
52+
public ICollection<PackageRename> PackageRenames { get; set; }
53+
54+
/// <summary>
55+
/// Gets or sets the user-provided custom message for this renamed package registration.
56+
/// </summary>
57+
public string RenamedMessage { get; set; }
4758
}
4859
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
using System.ComponentModel.DataAnnotations.Schema;
6+
7+
namespace NuGet.Services.Entities
8+
{
9+
public class PackageRename : IEntity
10+
{
11+
/// <summary>
12+
/// Gets or sets the primary key for the entity.
13+
/// </summary>
14+
public int Key { get; set; }
15+
16+
/// <summary>
17+
/// Gets or sets the renamed package registration entity key.
18+
/// </summary>
19+
public int FromPackageRegistrationKey { get; set; }
20+
21+
/// <summary>
22+
/// Gets or sets the renamed package registration entity.
23+
/// </summary>
24+
public virtual PackageRegistration FromPackageRegistration { get; set; }
25+
26+
/// <summary>
27+
/// Gets or sets the replacement package registration entity key.
28+
/// </summary>
29+
public int ToPackageRegistrationKey { get; set; }
30+
31+
/// <summary>
32+
/// Gets or sets the replacement package registration entity.
33+
/// </summary>
34+
public virtual PackageRegistration ToPackageRegistration { get; set; }
35+
36+
/// <summary>
37+
/// Gets or sets whether the renamed package's popularity should be transferred to the replacement packages.
38+
/// </summary>
39+
public bool TransferPopularity { get; set; }
40+
41+
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
42+
public DateTime UpdatedOn { get; set; }
43+
}
44+
}

src/NuGetGallery.Core/Entities/EntitiesContext.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ public EntitiesContext(DbConnection connection, bool readOnly)
6969
public DbSet<SymbolPackage> SymbolPackages { get; set; }
7070
public DbSet<PackageVulnerability> Vulnerabilities { get; set; }
7171
public DbSet<VulnerablePackageVersionRange> VulnerableRanges { get; set; }
72+
public DbSet<PackageRename> PackageRenames { get; set; }
7273

7374
/// <summary>
7475
/// User or organization accounts.
@@ -477,6 +478,28 @@ protected override void OnModelCreating(DbModelBuilder modelBuilder)
477478
modelBuilder.Entity<VulnerablePackageVersionRange>()
478479
.HasIndex(pv => new { pv.VulnerabilityKey, pv.PackageId, pv.PackageVersionRange })
479480
.IsUnique();
481+
482+
modelBuilder.Entity<PackageRename>()
483+
.HasKey(r => r.Key)
484+
.HasIndex(r => r.TransferPopularity);
485+
486+
modelBuilder.Entity<PackageRename>()
487+
.HasIndex(r => new { r.FromPackageRegistrationKey, r.ToPackageRegistrationKey})
488+
.IsUnique();
489+
490+
modelBuilder.Entity<PackageRename>()
491+
.HasRequired(r => r.FromPackageRegistration)
492+
.WithMany(rg => rg.PackageRenames)
493+
.HasForeignKey(r => r.FromPackageRegistrationKey)
494+
.WillCascadeOnDelete(true);
495+
496+
// Cascade deletion on the reference key "ToPackageRegistrationKey" will cause the multiple cascade path issue.
497+
// Package registration deletion will delete the related "PackageRename" entities whose "ToPackageRegistrationKey" refers it.
498+
modelBuilder.Entity<PackageRename>()
499+
.HasRequired(r => r.ToPackageRegistration)
500+
.WithMany()
501+
.HasForeignKey(r => r.ToPackageRegistrationKey)
502+
.WillCascadeOnDelete(false);
480503
}
481504
#pragma warning restore 618
482505
}

src/NuGetGallery.Core/Entities/IEntitiesContext.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public interface IEntitiesContext : IReadOnlyEntitiesContext
2121
DbSet<SymbolPackage> SymbolPackages { get; set; }
2222
DbSet<PackageVulnerability> Vulnerabilities { get; set; }
2323
DbSet<VulnerablePackageVersionRange> VulnerableRanges { get; set; }
24+
DbSet<PackageRename> PackageRenames { get; set; }
2425

2526
Task<int> SaveChangesAsync();
2627
void DeleteOnCommit<T>(T entity) where T : class;

src/NuGetGallery/Migrations/202004030548285_AddPackageRename.Designer.cs

Lines changed: 29 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
namespace NuGetGallery.Migrations
2+
{
3+
using System;
4+
using System.Data.Entity.Migrations;
5+
6+
public partial class AddPackageRename : DbMigration
7+
{
8+
public override void Up()
9+
{
10+
CreateTable(
11+
"dbo.PackageRenames",
12+
c => new
13+
{
14+
Key = c.Int(nullable: false, identity: true),
15+
FromPackageRegistrationKey = c.Int(nullable: false),
16+
ToPackageRegistrationKey = c.Int(nullable: false),
17+
TransferPopularity = c.Boolean(nullable: false),
18+
UpdatedOn = c.DateTime(nullable: false, defaultValueSql: "GETUTCDATE()"),
19+
})
20+
.PrimaryKey(t => t.Key)
21+
.ForeignKey("dbo.PackageRegistrations", t => t.FromPackageRegistrationKey, cascadeDelete: true)
22+
.ForeignKey("dbo.PackageRegistrations", t => t.ToPackageRegistrationKey)
23+
.Index(t => new { t.FromPackageRegistrationKey, t.ToPackageRegistrationKey }, unique: true)
24+
.Index(t => t.TransferPopularity);
25+
26+
AddColumn("dbo.PackageRegistrations", "RenamedMessage", c => c.String());
27+
}
28+
29+
public override void Down()
30+
{
31+
DropForeignKey("dbo.PackageRenames", "ToPackageRegistrationKey", "dbo.PackageRegistrations");
32+
DropForeignKey("dbo.PackageRenames", "FromPackageRegistrationKey", "dbo.PackageRegistrations");
33+
DropIndex("dbo.PackageRenames", new[] { "TransferPopularity" });
34+
DropIndex("dbo.PackageRenames", new[] { "FromPackageRegistrationKey", "ToPackageRegistrationKey" });
35+
DropColumn("dbo.PackageRegistrations", "RenamedMessage");
36+
DropTable("dbo.PackageRenames");
37+
}
38+
}
39+
}

src/NuGetGallery/Migrations/202004030548285_AddPackageRename.resx

Lines changed: 126 additions & 0 deletions
Large diffs are not rendered by default.

src/NuGetGallery/NuGetGallery.csproj

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,10 @@
286286
<Compile Include="Migrations\201912051135094_PackageVulnerabilityAdvisoryUrlRenameAndRequired.designer.cs">
287287
<DependentUpon>201912051135094_PackageVulnerabilityAdvisoryUrlRenameAndRequired.cs</DependentUpon>
288288
</Compile>
289+
<Compile Include="Migrations\202004030548285_AddPackageRename.cs" />
290+
<Compile Include="Migrations\202004030548285_AddPackageRename.designer.cs">
291+
<DependentUpon>202004030548285_AddPackageRename.cs</DependentUpon>
292+
</Compile>
289293
<Compile Include="Services\ConfigurationIconFileProvider.cs" />
290294
<Compile Include="Services\IconUrlDeprecationValidationMessage.cs" />
291295
<Compile Include="Services\GravatarProxyResult.cs" />
@@ -1661,6 +1665,9 @@
16611665
<EmbeddedResource Include="Migrations\201912051135094_PackageVulnerabilityAdvisoryUrlRenameAndRequired.resx">
16621666
<DependentUpon>201912051135094_PackageVulnerabilityAdvisoryUrlRenameAndRequired.cs</DependentUpon>
16631667
</EmbeddedResource>
1668+
<EmbeddedResource Include="Migrations\202004030548285_AddPackageRename.resx">
1669+
<DependentUpon>202004030548285_AddPackageRename.cs</DependentUpon>
1670+
</EmbeddedResource>
16641671
<EmbeddedResource Include="OData\QueryAllowed\Data\apiv1packages.json" />
16651672
<EmbeddedResource Include="OData\QueryAllowed\Data\apiv1search.json" />
16661673
<EmbeddedResource Include="OData\QueryAllowed\Data\apiv2getupdates.json" />

src/NuGetGallery/Services/PackageDeleteService.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ UPDATE PackageDeprecations
3333
SET AlternatePackageRegistrationKey = NULL
3434
WHERE AlternatePackageRegistrationKey = @key
3535
36+
DELETE r FROM PackageRenames AS r
37+
WHERE r.[ToPackageRegistrationKey] = @key
38+
3639
DELETE pr FROM PackageRegistrations AS pr
3740
WHERE pr.[Key] = @key
3841
END";

0 commit comments

Comments
 (0)