From b22e721c8c6d8a1eeb6aeae0f0e46745a3925943 Mon Sep 17 00:00:00 2001 From: shishirh Date: Thu, 13 Jul 2017 15:10:18 -0700 Subject: [PATCH 1/8] DB changes for prefix reservation --- .../Entities/PackageRegistration.cs | 3 + .../Entities/ReservedPrefix.cs | 29 ++++ src/NuGetGallery.Core/Entities/User.cs | 3 + .../NuGetGallery.Core.csproj | 1 + ...707131923337_PrefixReservation.Designer.cs | 29 ++++ .../201707131923337_PrefixReservation.cs | 67 ++++++++++ .../201707131923337_PrefixReservation.resx | 126 ++++++++++++++++++ src/NuGetGallery/NuGetGallery.csproj | 7 + 8 files changed, 265 insertions(+) create mode 100644 src/NuGetGallery.Core/Entities/ReservedPrefix.cs create mode 100644 src/NuGetGallery/Migrations/201707131923337_PrefixReservation.Designer.cs create mode 100644 src/NuGetGallery/Migrations/201707131923337_PrefixReservation.cs create mode 100644 src/NuGetGallery/Migrations/201707131923337_PrefixReservation.resx diff --git a/src/NuGetGallery.Core/Entities/PackageRegistration.cs b/src/NuGetGallery.Core/Entities/PackageRegistration.cs index fd14509d42..4860dd7e1e 100644 --- a/src/NuGetGallery.Core/Entities/PackageRegistration.cs +++ b/src/NuGetGallery.Core/Entities/PackageRegistration.cs @@ -13,6 +13,7 @@ public PackageRegistration() { Owners = new HashSet(); Packages = new HashSet(); + ReservedPrefixes = new HashSet(); } [StringLength(CoreConstants.MaxPackageIdLength)] @@ -20,8 +21,10 @@ public PackageRegistration() public string Id { get; set; } public int DownloadCount { get; set; } + public bool Verified { get; set; } public virtual ICollection Owners { get; set; } public virtual ICollection Packages { get; set; } + public virtual ICollection ReservedPrefixes { get; set; } public int Key { get; set; } } } \ No newline at end of file diff --git a/src/NuGetGallery.Core/Entities/ReservedPrefix.cs b/src/NuGetGallery.Core/Entities/ReservedPrefix.cs new file mode 100644 index 0000000000..297a692dab --- /dev/null +++ b/src/NuGetGallery.Core/Entities/ReservedPrefix.cs @@ -0,0 +1,29 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; + +namespace NuGetGallery +{ + public class ReservedPrefix : IEntity + { + public ReservedPrefix(string pattern, bool isPublicNamespace) + { + PackageRegistrations = new HashSet(); + ReservedPrefixOwners = new HashSet(); + Pattern = pattern; + IsPublicNamespace = isPublicNamespace; + } + + [StringLength(CoreConstants.MaxPackageIdLength)] + [Required] + public string Pattern { get; set; } + public bool IsPublicNamespace { get; set; } + public virtual ICollection PackageRegistrations { get; set; } + public virtual ICollection ReservedPrefixOwners { get; set; } + + [Key] + public int Key { get; set; } + } +} \ No newline at end of file diff --git a/src/NuGetGallery.Core/Entities/User.cs b/src/NuGetGallery.Core/Entities/User.cs index 37886a8cf3..68763b68a6 100644 --- a/src/NuGetGallery.Core/Entities/User.cs +++ b/src/NuGetGallery.Core/Entities/User.cs @@ -19,6 +19,7 @@ public User(string username) { Credentials = new List(); SecurityPolicies = new List(); + ReservedPrefixes = new HashSet(); Roles = new List(); Username = username; } @@ -37,6 +38,8 @@ public User(string username) public virtual ICollection Roles { get; set; } public bool EmailAllowed { get; set; } + public bool Verified { get; set; } + public virtual ICollection ReservedPrefixes { get; set; } [DefaultValue(true)] public bool NotifyPackagePushed { get; set; } diff --git a/src/NuGetGallery.Core/NuGetGallery.Core.csproj b/src/NuGetGallery.Core/NuGetGallery.Core.csproj index b54fe187c1..348675fcee 100644 --- a/src/NuGetGallery.Core/NuGetGallery.Core.csproj +++ b/src/NuGetGallery.Core/NuGetGallery.Core.csproj @@ -172,6 +172,7 @@ + diff --git a/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.Designer.cs b/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.Designer.cs new file mode 100644 index 0000000000..3c09d20bc6 --- /dev/null +++ b/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.Designer.cs @@ -0,0 +1,29 @@ +// +namespace NuGetGallery.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")] + public sealed partial class PrefixReservation : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(PrefixReservation)); + + string IMigrationMetadata.Id + { + get { return "201707131923337_PrefixReservation"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.cs b/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.cs new file mode 100644 index 0000000000..a9b91479c2 --- /dev/null +++ b/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.cs @@ -0,0 +1,67 @@ +namespace NuGetGallery.Migrations +{ + using System; + using System.Data.Entity.Migrations; + + public partial class PrefixReservation : DbMigration + { + public override void Up() + { + CreateTable( + "dbo.ReservedPrefixes", + c => new + { + Key = c.Int(nullable: false, identity: true), + Pattern = c.String(nullable: false, maxLength: 128), + IsPublicNamespace = c.Boolean(nullable: false), + }) + .PrimaryKey(t => t.Key); + + CreateTable( + "dbo.PackageRegistrationReservedPrefixes", + c => new + { + PackageRegistration_Key = c.Int(nullable: false), + ReservedPrefix_Key = c.Int(nullable: false), + }) + .PrimaryKey(t => new { t.PackageRegistration_Key, t.ReservedPrefix_Key }) + .ForeignKey("dbo.PackageRegistrations", t => t.PackageRegistration_Key, cascadeDelete: true) + .ForeignKey("dbo.ReservedPrefixes", t => t.ReservedPrefix_Key, cascadeDelete: true) + .Index(t => t.PackageRegistration_Key) + .Index(t => t.ReservedPrefix_Key); + + CreateTable( + "dbo.ReservedPrefixUsers", + c => new + { + ReservedPrefix_Key = c.Int(nullable: false), + User_Key = c.Int(nullable: false), + }) + .PrimaryKey(t => new { t.ReservedPrefix_Key, t.User_Key }) + .ForeignKey("dbo.ReservedPrefixes", t => t.ReservedPrefix_Key, cascadeDelete: true) + .ForeignKey("dbo.Users", t => t.User_Key, cascadeDelete: true) + .Index(t => t.ReservedPrefix_Key) + .Index(t => t.User_Key); + + AddColumn("dbo.Users", "Verified", c => c.Boolean(nullable: false)); + AddColumn("dbo.PackageRegistrations", "Verified", c => c.Boolean(nullable: false)); + } + + public override void Down() + { + DropForeignKey("dbo.ReservedPrefixUsers", "User_Key", "dbo.Users"); + DropForeignKey("dbo.ReservedPrefixUsers", "ReservedPrefix_Key", "dbo.ReservedPrefixes"); + DropForeignKey("dbo.PackageRegistrationReservedPrefixes", "ReservedPrefix_Key", "dbo.ReservedPrefixes"); + DropForeignKey("dbo.PackageRegistrationReservedPrefixes", "PackageRegistration_Key", "dbo.PackageRegistrations"); + DropIndex("dbo.ReservedPrefixUsers", new[] { "User_Key" }); + DropIndex("dbo.ReservedPrefixUsers", new[] { "ReservedPrefix_Key" }); + DropIndex("dbo.PackageRegistrationReservedPrefixes", new[] { "ReservedPrefix_Key" }); + DropIndex("dbo.PackageRegistrationReservedPrefixes", new[] { "PackageRegistration_Key" }); + DropColumn("dbo.PackageRegistrations", "Verified"); + DropColumn("dbo.Users", "Verified"); + DropTable("dbo.ReservedPrefixUsers"); + DropTable("dbo.PackageRegistrationReservedPrefixes"); + DropTable("dbo.ReservedPrefixes"); + } + } +} diff --git a/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.resx b/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.resx new file mode 100644 index 0000000000..5e93813def --- /dev/null +++ b/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + H4sIAAAAAAAEAO1dbW/cOJL+fsD9h0Z/ulvMuuPM7GA3sHfhcZLZ4PKGdGZx3wylRdvaUUs9kjqx93C/7D7cT7q/cKRe+VLFF4mSur2NAIFbJItk8WGRLFYV/+9//vfiLw/bePGVZHmUJpfL87NnywVJNmkYJXeXy31x+/s/Lv/y53/9l4tX4fZh8bcm3/csHy2Z5JfL+6LYvVit8s092Qb52TbaZGme3hZnm3S7CsJ09fzZsz+tzs9XhJJYUlqLxcWnfVJEW1L+oD+v02RDdsU+iN+lIYnz+jtNWZdUF++DLcl3wYZcLt/vfybFz0Eck+xxubiKo4C2YU3i2+UiSJK0CArawhe/5GRdZGlyt97RD0H8+XFHaL7bIM5J3fIXXXbbTjx7zjqx6go2pDb7vEi3jgTPv6+5spKL9+LtsuUa5dsryt/ikfW65N3l8jojIUkYK5YLuboX13HGsorMPeuKfLcQE9KMfNeCgWKG/ftucb2Pi31GLhOyLzJW6OP+Sxxt/oM8fk5/Jcllso9jvpG0mTRN+EA/fczSHcmKx0/ktm46zbRcrMSCK7lkW44vVHXqTVJ8/3xJuxDHwZeYtCjgGLAuaJd+JgnJgoKEH4OiIBkdxDdl/wu1eqkyirbMokI9EVa2oUCxSyfgcvEueHhLkrvi/nL54w/LxevogYTNh5roL0lEpystU2R74lzp34J4r6v1+R9+HKPalyTfZNGuwvrgyvV1dYM4ckV0vjD0NPW8pD8+UyHXC3nX6Xa3L4np63z1sIsykqt1WhQrG/A52vyac8BlMNOXfRvkBQU80E+p3Pvga3RXViJRWG/oT1rpJxKXyfl9tKtk+FmZdMMLq9dZuv2Uxk0xLu3mc5DdkYK2I0UyrNN9tnFoGJvHYLM4mlWerlVSUltn0yg5vWk036aLVSevtVK87KG1AC9zn2S3cdbW4zNYgq/3X/5ONoVG0NA/PQiaqzhOv5HwamOQn7a1mbqJzhd+ng6dzPK8QWd7r4lTzVrLecMyn6aNYQXZBlF8FYZ08clHX1l/oSeS5DbKtiSctl4KhCTYTr8tq3pZTfOm8p9SOi+CxH2LR7LoNhpO531aRLePH4PNr8Ed+bjP74eTLLt5XQ1ttRths0bDbQbqwaP6Mcjzb2kWfiI5KWaqsduAse2T6/at3mn+UmxcS7LN22vKdNqf9C5KelDgSl+n9BjvuGRarCXwztBhCybvC7Etmm3T3lFZQzEPt6uk2OXoWiUkKMubmAqtbboWMSBlX6nYzsgtBSfcMjHTjfjzwzcq+YX2WmRXOGtTxpXbjLKG1XWyxOfyK8zkKsmVw2uy2Wd0HfyY0vU80jRIyPioYBPJonASywdxz3rXU8rXGmTWux++0GkXpBeGP6WhTq/gZ7vPwARrmAzHEdJJ574r9FRHms9pPx0aOn8bpoHzlof4TZezm7VgBkW8wLlcJU3V9SFrCyRL1JWnlwQRJbq1DBGLnaSIaXtYFtBMsvPnfxzjmPEmr3jcXq84iwsU1fU54RO5i/Ki2unCayiQ8Ubd3nTQt8mvzAirQs4bFXBDNc1GTBZFLpu3XoIA4KC1NADKnkSC6dJiemnwMv2WxGkQ9jnW+dI5oJNNM72gya3OKjyXMpk0WV0X95qUfcO7AvqmN/msGt9mHuWcOYoEt+kWKvaHSDhXqXaSZKbNjTJwgy9artPdYxbd3Y9/LpnjTtfuctxP/+h0JkFO3qcF0anT/VTmcYF59cB4GsQ1un7J4tFb/9cgv7+K79IsKu63utX5mafKpjfLeLNJkylY+SZ/S2dGPlg70dBZF6yQN2pkS+X3c7+N80S0NL7YhZPLJFbvqzACqzWUjDYkyaeZoVFI6uo+kV2aDcbX2yC525d7Anwm+pjt5WaAv1CbZExr2fk6ouiM/kE4gcwuNR1ZRX8yReEUw/yJ/LZnRk/1UF9tmO1okPTQXijKzu02yMZX6H4O7sZfbD9HRawFrpcb8nqjO/kF+fs02wYxRW3orQUmZTqT32/JVwLYCVlJwFLJNvqwC/Jvitn4lm7rh1sCvMnpIS6rNqNDab2OmSRMSHi1L+7TbHyetxW+JDuS0HNRdWE4Va21HC9N3Eev9V2UXMcRPfqZ590PPuZdn4uvlxRHfTCJqkFaIOHaj5s2j6LoaJIwnUab7qqdEeGmaZuYUW0gn462Usjk2lRBLGkbK+S8aZUySqPBfJjiH87sqvCvy7F9sLYLLIOm5Xwy1mAhT892/pVKZnpa1WOjyvSoaa6UA2uxnK1no8ULhrGUpjb3Q4qG1bEntTzWTEsxozot+XR0WgqZnK1c9js2I0j4OqO/v6XZr9oWt7k0cFHyYMxWM3oz128Iytf6/HeUocOt9GtKlVh31SdXpU5aZauz62BN8nu9dW/PPZNJNAzdSCAzStloDEFvu9w/uiK4K3lC8TQo9nJbbHXQX+/IZnSlQgXvdn3wX9+g+em0mcZmKrjjHjJdJb2n24wVCp8m7TSTVmfE76q4JL/tCacA7dcgG53RSBdP1+l2y1mrTjDTa8g7HEW7EoazaJMR22EiuXualox3lrZqvrzJ9yDDekqvk9watNX1ZVSmsSVy1P24Tzgr7Y8yPYdAlulpXPHKypzAOs0i6ycyB12T8yLY7gYv1J+ziPgwfymv47OMaReexDXiVDc10xmOTWnENZXZzoSmHJOaE0xoAneyXfB+IHe5bUG2tOCNjC8tdEkc0US3adqWedNI13c0rhuWuthpzzLnnmWyLcppwT8t+KcF/7TgT2ms6Mnc/YAM+L0a17pZffuzNfa4S3O3M0F2RJg5iq/tWkMf2bHxyaYmetu3sS+umzaWctqxHbMVgbOp9RzWCk42TNhtKGjoNGTCcHfHbrOmLXiaOkd8R9/PTg2R5rhBWy+EMtr2cVRo5hMSD8qEiy3qPcOTgXF6xMhlvSClxg5zCnUqFj3BbYIbJQNmR7KyWO+/+Ay77jnU/BgT1XfUPijAoC66X6/pfL0vkfmasDOa7VsNXZnTBD6o9eJdkNA9A7JkcMN202XkIpsC6WqEeSiT10A1fA2QrwWUrm2m4ogxZKK0ezy3uVIXO00Xgwa9G7bByx7gZjOY5tWejXkRbegAPtaNHeyNmmzifeglZPYYKmY8hjK/cviax0o0Zd1k9+3tJc7VG7CY0n5Nbkwq6YoMklG1XFmToihH31JGicVOMsowz8hDAQb+8DTnXNVPZbA4dvNTxrhx00DxZU/jPv168p58K4dgMKF6DCn+/NDj30m4pkCd5OqSdgB+oKD3XVHDX53+jp8DN10BRYcH5sP0eHBm94iIwqha90Ipp++MlN2qT3IZHzdPVSgFdw9AVuokvazCVHxI3GcXTOmnRw9CK8gneVNKVk1Fd0nAcDBB1Zp4GjUbdbO6ynTD5VVmspwFm71KvjGiy9aVQNt9OIehtb2O7ld5nm6isoXNgMtvg4ldfpWEC9NDYRVO2ofGKFaoKIl27L2O4vFy+TuFjxqi7SGnI8q/WyZSPl/K4udDUnFnUb3JRhfrIN8EoYo9yp9Q/EIlFsmqeugKz7YxUVKo4i1KNtEuiA3tl8rZCkbWsLYKOaVxVS0MA2JTt/TYntqKtjKJbSYuXaw4iOmRBz/+gCHF8BJEBxfxrRV7KOofkeAqqHTUIuFnZ2fnCu1eiNI2YwpYaRlt0wDhmZRZkCU+14ENOPIulH6gvYocrC0A6NxQ3Qt5ID+mQBzYeZuKucdqZsEZpKSqA95jA40XgRAIqtnsRZqmMku59jt5W+HKmzaKiqGNamw2hQsTTUU0xovSoCau0CizEeHLFPMR4YBN1bwh35xTUgwOYhpqOOze3ACE45coreLjA42KRIhLU8IR4scxYRJxqjfAwBTSQsGDpH93Xi1MLv1Yhd6XDjhohlPrFYvCkbklGyZOLEOGTG9tRyac5toBPKbpLrjDGlAE+8Yq4KmCXDhjFI5zejzQhNo/ISKhwTk6IGp1K7gTtFcIuihUPGlTsOqnho+rDuUgzrWyq5hhjFG/MQVErfu7M47QGMjHI82QLkyISGSgjkmmCc6BlpgxSLbhoJxHYaxpxAyYOkpBJzrPmc7loJPc7NoCoVW4WKw8WEfVE0D8mVJPAHHimGSb6jRnGHuNB50y/pyjoLOc00SUN6JflXc9pqmNtDeJ+R79nlewzyXRj1OUw89RGAbY8KCv033MuGLe8IpGD7QPgaaWbxNCVcsVB9Gv2K8eDJKVZ5xdcIK/6TzqTSP6KjRXrZjHnwpZpCs1xXBFa1EW4qBTV5wrHP2+lnOaxtoJuEm7NQejBgGj9M732TnI01TXNq3bqdht2efbjQk6v9UprVF6G41oOjDFImAYrMPfunAmfFpUSvkgNOK2kjoUyoSPBn1Iw6dAHTIYR4A2yNUZRYbW75nDHe/w6AA8ncf0aEudhS+jocGaohru9DiBOnhFznhM6Td3rbs2yXS2HtijO0+AzsY2M1J3EtZM+JFOwHqf6P6TbQh4QTZNCFeQGTb1y8EE5jzowk6GhpOmweNQkYWiJ7DzwVbvs3jw+ySbXkyor9EOnk07BN/gg8Gu7FrqginUz3RUJGOeqkcJaKQzc+EaGVGb5kAe63OiXHG1NGAM97sErJcrv2ZnHKM+m8eCXawDE+IVGyebJoiuzgeATtvLHtTL1hKb4AWfsZbeVzQoPyoHX8rDgnKQZI1TJfsakZx9Jw9Q0BM6KeqYAXntqC13hdFdk0LRTuXLRedVDCicFJ6IhEp/VYhG7TVsKF7H+1RKV5PcUJh3n4OIiO51BmLKZYxKT74MMFAEzosQVfBcb0daQ86WRPtUCEao8YeyIyc+34vR5L1b7OgKBuQaypLlvxNxM1lbgsw6VEOtMre1I1WZYGm52dq42VGs7KFQapUtkR2p1nZEQ4+zTTHNwCq4rzrtylsjC0Ei3BfALIMudgyUuVM1KCt5nYkdKc3slfUcBoJiIDOIoBwhzW5g+T2vZmzFU4uthGBrqFY4VAu0RI5bMKXVh49zseCy8QsRGgtDWObRaBhtX7oFT9kcWcS/4MgIC7C8JRX7asEHOOoCwAyL8AxCV/QBGrj+SGuxhjv6kAwcyXpvMJg5YuAAgCmayAJCy+HYAqYWa0gAndbysUfnIZ13bSoBcEKTG+8TXgjiEbwr0rBMQ35E0DR3Bu3+CGUW7AwPdUFxh1fZYsUKxYtdpdM22xsjxJ0dzg3cRxvsCuil3ZcvoHO1Skzsii8OYc9ro6yycR2GumlwHlb7K2+ezZw0uAujVYzGznZDZMlN0Mja3FPZ1No/L2Ujawuo9+eh+HgryjrcqRXqD+jWqnajPgOZ+QM6so7PFmyHpOSx6wC2L+rFjbF3ROLB0QIhWqdBqBuY26DKGe6Aa+YO5ik4KlzEN+uMPLIDDei/5ok7E8FHep0M3xII+cyrOJ998JZAIIbDpe6DL9YAT2Sh7DF4BkG9wn2D1J7xOhozv3BvoFGnmGluWU4q02yyg8xE0wd2arE8lMH3IsZzk3I/4vtgplyNjAobvTeFJSv1XhjGHqN+GL5Zi3pecBWpPBjMahunC4DTzr4aQv9dvDUcuu9cx9haqVrljaikAMcNVZkkum64K6NEZw2emVXbvHQUfBAM7rXRo0Ppgs6nQ+KHekNgYI/OjWMEUMhOAwCPtH4FQvsxzwI7LbSW1JgsAB/tAvhgtHgXe6Czeec5Itz26Fiis3Ifjy/Svla8NUa5pCtl7KKmsIaDVlsuB0t4x+V0IPJ0+zGz6TUKFN3+qxfydPstw0D033YhD4ig2y0LW2Bo96O3BlbxIF1amrdXevvf8Xb++qdL7NioNUs1dhYzTPXNVMwUdTzeqg9IoPzUG0BCfUNNIKE7hvqa28wx1OhxdC5ZnDq1dnia3licNN1Z5Pl02byn0ZrbtWkXq/XmnmyD+sPFimbZkF2xD+J3aUjivEl4F+x2zPKiK1l/Wax3wYYJ69+vl4uHbZzkl8v7oti9WK3yknR+to02WZqnt8XZJt2ugjBdPX/27E+r8/PVtqKx2gj8lo0D25qKNGOaYzGVPWkVktdRVr4xFXwJmPnSdbhVssnGhYgVR1Obaj+ojl5j2NGUYX/XNv7Cm0WoTUbHx9e0a1tm41o+BwRuXdXCtPh6E8RBBj1AdJ3G+22iMbnFy7c+njwN1PETp1PZWPFEIKsrHYX6uWeeRP3JnsZLwr1XzVMSEuzpdS8z8cSw95p0lOjYVg+N8oTaj/Z0Xj3sooyJBJ5O+9GRTilAPkebXyF6fKI93bdBXlD4SB3tvqqULlbSvJAn30qZfZI0lCe01XSvjZ56z/TKGNh9kiPlxprf0gM6Evp0b+vgNNf7L38nm0Kk1n60p3MVx+k3ElbuDCI1KelgUFNtWnqDBlJvWGAGLjYWZEp7raswpBJFlgtCisMik2yqtyhJiBNHM7ktZkmwJepqVn115UEFQogHTYrD8kay6DaSqXVf7Sm9T4vo9rHeHH7c5/cyUTCDY9/5x0PLdxUBLgB57Gv5GOT5tzQLmZK6AGqA0odQ79a06n1SfV1ybueF/pdiA6715Xe35fQ1ZTUJ36Z3UaJQhdLtqXMlr9N9Ikl0NfVgxLBoUtpbHAveNO5iWV98LPH8UxpKBKovDsPOP3wmjLjuRTSc3prI0Km+TL+j4B7aEo4i+Ptbs0HY4o7WEsWSD5c7jk0ExkJy/QCuLIvrjw6ntLx6Apj9ypmOQjquqckHgwJQ798bCRZ3IRZwsKIyFibehPJZ2+n8n35L4jQIgdVMShpz4zYvlobjpz9mppQdCkgVklgeh81cunvMort7CUvc5+k1QL51XJ9ITIKc0EODrFYSU+adha8e2KoQxPWY/pLFsspKTben/tcgv7+K79IsKu63ImEpyY2mSspJFtIDsdLR9qPL+viWgiwv5GWx+epOaV2w99Jhek1aD6pkS8Xqc4Rsk9i3tXrqYhZHfecuVGe2kOBGjxnMQ+Sa7w7UKkcNBUT8dwdER6HsjS7AW0126Xdyty+tisVeN18dVga22VOVItxn51XmNT0Ir6N/KFoDKdGBbpayo40yLvx3Fwn+257p/2vmX23YvV6QyPtgTTaXk9p2G2TSQtt+dDipBXfSalN9caAQFbIIqj857e1yZR1tP7qo5LJtEFMQhCBFINnldM2E0lvylagqfDnNWTKUZyJQNtQpzhSrqY9JHC7VhXKuysP6m9MpMSNZtaVRDohcioMeJWZn1YSErWuqoExRUntQFv06QfI610+rOkR/EbAOnUuJro53UXIdR/TAAE4LNXX6e+vaREXeSdcfD+1sh/tlu53w6gg4vc95WPmRT3vYCc+RGvtfEtABfD0072gb/M7dhpwLUNR72HU0jmPoh6mXajm13pENuGWoElw2QczmiwsnJO6HpMRDg6fkNz4UoOLRoTdGDWSOA6Z+LxHXzGRVOQ50X11OGuDmrteu7jrdbpWLo/bjgYLdG8wHA3w6aB/LclkFJBg6PmUku96DA5c+DqHjzRQ0oifHItju5MN5+9mBVhYRSI/Mf3dUrmUZi/2o6Naqz9OqH8BzY4/jos9rCu8mtJ6U2H5Vmb4VcL6vUJ62Sm/edaILQDJ0rWjClPZeLlACpxWj94pxkstW9E5y+SSXp7vKHuOCfazLOd9Xun0uJOddIbGwVm6rY+kA1ntphEsfx7pof2L2dTE5L164gFxDQdPpO3sjR0NiLPgcqSIXi8Zja3jMoti7DxNc7J9WewUG8ek9JsBrAO4jZENkrPHydaYYLoPX+y/IlltMcZDqDi7OM6FRCNnSG4X8CxLu8NOW/qeVE3Lsm6GD09/Y20RgrCGSHwMVztSGh0JxqtNYkl/t2etWRUTT4se6sYp+AcjhcKBPNvE+lKl2X12s2ZTzMnpQnmkyyK/E9J4M0mMy7pPBRGA0eUUeCo0xLpB8MIMHxmEaenAQHu7pfXbQUxn59DmyCBIeoxWxonmlFqcHvf4pK8FMr4Pi1Hnnchb2R1ahyqnO7VbdwIWEQ5stTWipofOkfouq9wzByo81N2pbzA+K1rv97EyrfgsUIIe8EqrDUpDLp4Pmm8NJI7pLgmKfyRY63efp0SiGGDN6rbYvMNm7prZFLBxQsbiwZkEqvduk8tEOtbbit3x8tyE2qMHoM7t2DUaPzHgL5bhyfXGBPRvkYP/HlbKx89ObRuF817871Jf1FTmP8NC/XdS3mTWdmUACvCdhqRnuCrgqgHEOo49EDJQXNx5RgD6R0beN7m2j264wYqO6eJO/38fx5fI2iGV3Gk3XfYHH8EqCwxqkFrZYjfQBMyzFPPbKgscVyif6rB5u6C8xhYcLphZJVg9CWEVfQcrqI65Ybm4cXpCYZxx6t9rDVmdyzPCPXWjuYpos0BULdBEGcFB9E2PCPaGpRUMnPiUy9cjBzzGYbzK4zJobC8vJrHu8oS8zTTpwx1HWPQdxhKcSJUC4jZ6Ey24Z8gZfQZEw4gPX+5qqx5UeiUx+mLtMvPtm3CjB0uUsrY6l/tL+boOl14HKhQjqJWdYPPSSI3kdNF2OXF5lWS4oE75GIYtavn7MC7I9YxnO1r/FlWt0l4FOweiW5FV8ysvl82fnz5eLqzgK8iq8fR2T/cVmn7OLpCRJizr4vUWQ9vPvWZB2Em5XcnH3UO+MSp6HQhBzTk3ZSBck2PkFHUoZEA1QPpHbBQqqi5Vc8gKCJmvC5TJinC1n9M+EDnx1nVkGnuPDezPwsbgwLQBXWvqtcOPqkNn54k0SkofL5X+VZV4s3vznTV3su8WHjA7zi8WzxX87V10FW6/qTb4G2eY+yJaLd8HDW5LcFfeXyx9/cKZZmyZoiD7/w4/OVAVzZXvaRaaaSciku4HzS7cN0lWRZQagRbQlKICu0+1uXxZw5E0bx12uyK29Svj2ityX6K6EpBuxLnS7S6N47bNWDADh0I9YAkgh1d3kgFB4kDRoI6eK8+DftsHDv7uOvxSJ3UARaJ41FNSd8xEjQQxh7lceoZHSPVfTxk33u66IEdQb2VS4r09tCM7+NMBQ6f3JYWHRNQz8/rnruECR0UeuQA6HPmx94qMYDKMEhT8fRlENes4JCT9yDg8bfsTyropB7mG9EWKQuy2gXFFs+bRpQRW8vL8Q8Ln6cpHL3XjRFnTYSFgjWHf/ccQYbkOPa6Tp+fM/OtMFApDbost6SIxBu494XN6E3odEikNsK+N9bEJch/TJDCNmQuMm2GAqg45LnD+2B5E9mbZAo0np1XDRJ9oDQW+TDAru7aF9kuexTsQ860Pbu+6sdc/30Pku/Hf/nY4c8tsDpSYCt69GeSAouH2PPan5ON8Dz0ZcAAYfk0WN7j2EpU1cb90McZ50nEv92OOkxBfAdKx21LjwFl4kORp+Ysixpo484eNYUwag8EGoCu3iV/HV+tn71XsBUcCtK7A7t4rBwMH11kFylMcVL6OkBv/2QjQvhmnrxLjf/emokb596EHg+N4+KYtRvT1QVgN6awD+gzPAx7lftdrJNgHB+4MEsFfodfDpCNh3yPXICYX3Pv6DZ3+eDz1gvgduUSwmmOuwYeG5T0PXf+jcdE8Ou4sqVrjfjYsSaWYIeVf0aQJvnwA4QDlldVlmt4NvI373V8Wge7jByo029PcMoH0ycIVWGkdluSsL1ZDXR8y/2af7nDaEXbjVgYKGj87dX9RwYbkPVVPg88Dn9xbC9+WAT9WzZ82kd+WZ52uQp6qNc10owGDXp7Xi0NYKO2Hqbak4ieWTWD6JZXBq+Lokcb2Lnvvu3O/dmvb61lXk4xeMXs9U7MtpnZxZ/Wp9MTjCXgkJYXLEKPCqm0RBNuBiZaQrFdXJ/4gHceyLDFPg6SNm3YyKHaNSsI+6VoyB7Zk46HrqE2hoiOkjRtjYk1MX9vmI2SZHzXCbn2LpQdP0YO2j4cjUA+xu2pjU/Wn0PQdao10X1/mI0Q7EhR59M4sHVT5iRlrMVueh4cIwu016ruigmQ6FbHZriUphoGuGHOfZk+anjfM86jkeCpZ8xJjngi4PVKSI8ZbdIMaXHYj2KlCzAVJ22+EuVrM7uSFefn2jJlgHNFaLIkG8zPg82B3OZIezQUZVw21WdJGJ1dx4gGDzUHM1uS4gdcFBA8o33a3+ruSIw2obTLb3VEbiwUGIMEX87DWtB+jhZDIDRbzaPVc8yhTG96jvK9OtwrfC8rzfyM/MXliQ92lGU26MsYVDvdqNKB4vExh9OJaqeRRnVE22bXZETVVsjNHShnK1GzRjHFaPW6qD0V7NvoXion02e3IWW+4GDTT5KgkXDEhCLMq6+Syg5hn/+d0+LqIde52zeLxcnitRXz8k1bFkUQVKozSDfBOoDxOVgU+xdlTB8Pgm1F/E2n+nEKVAIlnVVHpiZqtnpD4I8zGLkk20C2K111JW2xMp605LVU5pvFEKoXM2NUlR9NQ6W9ISa01sEELC6rHDB2lqAwuhACoT+XGrPojD9uzs7FwZuY6GEBaKpyUmjAIFKGj1KCDAY18hFQrhoGZBQrk1qJucD0PASGLjhByoQi501iy4cXyLihtPKJYTP6xg+iRIw/RPhtZBc8ET/oxxr0aCo+UbZcNUbzPDFAr8fiAi7/CAOJkgHIK8g5CIN415tmFwocGcFl61HzzQjiZlTJk2JZogj3+kRt6cc1YYCYExDh5LnHM+0BY+9algCgtHcOC4cngTUh1l0LSCH2gpw5QI1N0lmVoqZx8To5pAAuMC1uFJUUT9rnn3c3YAG3Zz1oA4gVYD2mOCq/7917nwCpuXHuCCPkzUH++y7i6eD2VlZ5EqjgdfZVwNoBXV96eCJjV6yDGAaPhlgO4mYD4ATK3EsB79g1Bc1AEMjkeENBEXgIa0SU9FkIDRJZAqD0WWNIAa/W5xbjxMLVdcwHAQoqWRKWxgjkCZVfqnA62ovj8VkaJ64SP1HYo8ab2rfS5RdqJFcezmSXKJTwUbiIO+HiDYK80TypmplhobZB3p4nI8q4pwqVt/M64uh2t2MCGmZjYreBpmBKJtt/UdyuECUOO2YWinnPspgtbWqcUezvOvl3o8G65UNBDR4+GfGsU9oHMYALbyvpkCu1JDxJ92JoiHBl3APwpv04hWXjOA0+Qa9hTQeMCWhoeCvMlOOT3xhjkRToSysnrWAaNomxNMrSugXH/18biBA/s5auByEGgx7eHk0YJG6gmhxXoAJ0UL4to6IVrEqIReLoBHw4wUQVFuiZx8/FJHFzISqXZe+dN5OB4ukpydYo8NOY7+rzMjpvPUvnkXJPS0aj7E8UEuhSHkv0+DJcmpHmnNiNtnNODnWODShRFA6jTGDZgNaAd8PpsfWtMJrB6YOgipJRk54Arqo7gMkOLgAoB7mndTuvi/SJUHdUXFSzbjZejBrZ2zwW2mldMFZgexcNYN5oPdtnFZD3LlBBoMSVgx/bhXUKhLNvUKoXkPBl1SrN0TyI4bZFDw5TmxVr8034bbPWR81YGWQc/qKuVJYAqKJ43UKEZYPgAc2dqfuQ7lwdkjuo/VDFZj9aBMBY5XZcg+WqagJUjW7NvSkLyOsjIUe/AlUGIaV6XWpFDUpsvFqzYIIKCYXG/uyTa4XIZfUjrwVSjBLj0H4CJWVIfdU+qov0PkyyQz5Uo0KoSrzxBdlmImK0b6UsiLyVA1fA5zdbINiFKhnAGqUjanMtYKHvmVqsFcUP1ARus24PVq67Km38SXwWpp0jV1tY+g2tXIRyDBauXzaGoWArNYVi85S2MtkLJpGiHkdG2GsQE2VVtXWjl0YjVWqZrqWAbrulo/L6y6NoOmxiqPw+hWfkFYlVWqpr7KK8qyLs7ZBKuQy6Kptc1lIQ/LC3lVCpafQdnHbA+sFgv5thZcOuRM2EIi5LMZP0HdpS65fCq45nYZrOvCJaycQVOjtbyVnnlSK5UzQJWKeayRKh56MbCKuTR45TM6iP1qT42L/CpdK+5Zll7LN7IbQnNaLuOVVWGvpcdxHYAL2S5LrguFzhbbhok2uzJjMeftITLIUCbzNtFuO9wZSYHiEpfLTaqTZEQ6qOQwSMjmtlWpmjtTSUcUPrj5gsvGH1fQAOjiLYNytKJViZ+VY2JXWjgvlQXrL7ImR+yKRTfhONxAXy0CdgNKK67F1QdNJ6EzVllSTBjcZTHgNNBVTUTqI+ki5F0jOiYA3TYXwjumOTqW/QPTNYwyrGUYTWgA/LKvttRwYx9k3jEQSQfBoDbSLM4OOBgtrEFUm27DAvEoz5duUrx1Vzx4433GI6f67LiqUeAp8Km+GKAP3YkzxCHkJ9RRUHfB91XKYGadxZYUpS9nH5m5RoHjEI5SwwpNt58GQ9uJZclIROfvb/oOQ3V/tghR+nBu4MH8fDKBV83xZavvXruMbWyVPCMs09N0U46fhndWG2nN5/hK6lC+eJvku/uGgcaDgvkZ6ym7LIa10uxIhHyjjTavhubLVt99dVqNwoR33BCxyWfnFb04T4BL9Db2BpyPBnAbBnk6dHVqZrvzVpt/8pPqhEzBwr5Y8sgqaszUh3tY24pRl3NPw2a3o79VMBOBLRoe6Dt84Mx1CJcB8LZvsI0RWIur3QFKnjQtDtEdejJvBOXUHIxSAxRgml08isHAbsu3Im2p6qPPLuJDbnC9F8dJbizU0Mm7CLmCIx01eo17GFHYQKAtLycPZoHsuwx0XevePLDLzhdVfbqocbaFumvrmyt2RDWtqHrCf9cxAr6AlGl4El86t1BblowgyWdhgnRoFfeVKC90pabb28JGNjy//B0OQIc7A1gsTkieJs4kLKgpwU5h+E7dwonMz1kZMkHicSWmj8IO2YvJkita56djZo7idoMzRO+h44cJooGYeINXpXjuuIVORetR4qMTI2hQmBeT4APRpl2sKsOg+gP9WaQZJf4uDUmcl18vVp/2tPSWVL9ekjy660hcUJoJKZ2oOqJNnjfJbdp4gUgtarI0yfVwvCNFEAZFcJUV0W2wKWjyhuR5af34tyDel3YiX0j4JvmwL3b7gnaZbL/Ewt6SuZDo6r9YKW2++LBjv3IfXaDNjGgXyIfkp30Uh227XwexfIOHkWC+KT8T+r0aS7a2krvHltL7NLEkVLOvdan5TLa7mBLLPyTr4Cvp0zY6d9+Su2DzSL9/jUI2kTEi5oEQ2X7xMgrusmCb1zS68vQnxXC4ffjz/wMaSVwQBw4CAA== + + + dbo + + \ No newline at end of file diff --git a/src/NuGetGallery/NuGetGallery.csproj b/src/NuGetGallery/NuGetGallery.csproj index c507fb9d04..1409da5bc8 100644 --- a/src/NuGetGallery/NuGetGallery.csproj +++ b/src/NuGetGallery/NuGetGallery.csproj @@ -778,6 +778,10 @@ 201706080930506_AddIndexSemVerLevelKeyPackageRegistrationKey.cs + + + 201707131923337_PrefixReservation.cs + @@ -1765,6 +1769,9 @@ 201706080930506_AddIndexSemVerLevelKeyPackageRegistrationKey.cs + + 201707131923337_PrefixReservation.cs + From 6383c863ea0829ce053f603a53a8f6e27f69fd0e Mon Sep 17 00:00:00 2001 From: shishirh Date: Thu, 13 Jul 2017 15:53:36 -0700 Subject: [PATCH 2/8] nit fix --- .../Migrations/201707131923337_PrefixReservation.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.cs b/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.cs index a9b91479c2..8f41e11562 100644 --- a/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.cs +++ b/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.cs @@ -13,7 +13,7 @@ public override void Up() { Key = c.Int(nullable: false, identity: true), Pattern = c.String(nullable: false, maxLength: 128), - IsPublicNamespace = c.Boolean(nullable: false), + IsPublicNamespace = c.Boolean(nullable: false) }) .PrimaryKey(t => t.Key); From 2915d3e5e9e2f335ee18c5dd7e7a90b763091b86 Mon Sep 17 00:00:00 2001 From: shishirh Date: Thu, 13 Jul 2017 16:13:31 -0700 Subject: [PATCH 3/8] refactor --- src/NuGetGallery.Core/Entities/ReservedPrefix.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/NuGetGallery.Core/Entities/ReservedPrefix.cs b/src/NuGetGallery.Core/Entities/ReservedPrefix.cs index 297a692dab..f9a20054b0 100644 --- a/src/NuGetGallery.Core/Entities/ReservedPrefix.cs +++ b/src/NuGetGallery.Core/Entities/ReservedPrefix.cs @@ -8,12 +8,16 @@ namespace NuGetGallery { public class ReservedPrefix : IEntity { + public ReservedPrefix() : this(null, false) + { + } + public ReservedPrefix(string pattern, bool isPublicNamespace) { - PackageRegistrations = new HashSet(); - ReservedPrefixOwners = new HashSet(); Pattern = pattern; IsPublicNamespace = isPublicNamespace; + PackageRegistrations = new HashSet(); + ReservedPrefixOwners = new HashSet(); } [StringLength(CoreConstants.MaxPackageIdLength)] From 860db91218fd7b3ea15e5ec12ee60e839b9da402 Mon Sep 17 00:00:00 2001 From: shishirh Date: Thu, 13 Jul 2017 16:17:12 -0700 Subject: [PATCH 4/8] format --- src/NuGetGallery.Core/Entities/PackageRegistration.cs | 3 +++ src/NuGetGallery.Core/Entities/ReservedPrefix.cs | 2 ++ src/NuGetGallery.Core/Entities/User.cs | 3 +++ 3 files changed, 8 insertions(+) diff --git a/src/NuGetGallery.Core/Entities/PackageRegistration.cs b/src/NuGetGallery.Core/Entities/PackageRegistration.cs index 4860dd7e1e..cc8d2af04a 100644 --- a/src/NuGetGallery.Core/Entities/PackageRegistration.cs +++ b/src/NuGetGallery.Core/Entities/PackageRegistration.cs @@ -21,10 +21,13 @@ public PackageRegistration() public string Id { get; set; } public int DownloadCount { get; set; } + public bool Verified { get; set; } + public virtual ICollection Owners { get; set; } public virtual ICollection Packages { get; set; } public virtual ICollection ReservedPrefixes { get; set; } + public int Key { get; set; } } } \ No newline at end of file diff --git a/src/NuGetGallery.Core/Entities/ReservedPrefix.cs b/src/NuGetGallery.Core/Entities/ReservedPrefix.cs index f9a20054b0..8248adc662 100644 --- a/src/NuGetGallery.Core/Entities/ReservedPrefix.cs +++ b/src/NuGetGallery.Core/Entities/ReservedPrefix.cs @@ -23,7 +23,9 @@ public ReservedPrefix(string pattern, bool isPublicNamespace) [StringLength(CoreConstants.MaxPackageIdLength)] [Required] public string Pattern { get; set; } + public bool IsPublicNamespace { get; set; } + public virtual ICollection PackageRegistrations { get; set; } public virtual ICollection ReservedPrefixOwners { get; set; } diff --git a/src/NuGetGallery.Core/Entities/User.cs b/src/NuGetGallery.Core/Entities/User.cs index 68763b68a6..67cb42466c 100644 --- a/src/NuGetGallery.Core/Entities/User.cs +++ b/src/NuGetGallery.Core/Entities/User.cs @@ -37,8 +37,11 @@ public User(string username) public string Username { get; set; } public virtual ICollection Roles { get; set; } + public bool EmailAllowed { get; set; } + public bool Verified { get; set; } + public virtual ICollection ReservedPrefixes { get; set; } [DefaultValue(true)] From 6a3b89d21282ba175b2c206bab9d33610fc57909 Mon Sep 17 00:00:00 2001 From: shishirh Date: Thu, 13 Jul 2017 17:51:23 -0700 Subject: [PATCH 5/8] address feedback --- src/NuGetGallery.Core/Entities/ReservedPrefix.cs | 11 +++++++---- .../Migrations/201707131923337_PrefixReservation.cs | 5 +++-- .../Migrations/201707131923337_PrefixReservation.resx | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/NuGetGallery.Core/Entities/ReservedPrefix.cs b/src/NuGetGallery.Core/Entities/ReservedPrefix.cs index 8248adc662..7493e88361 100644 --- a/src/NuGetGallery.Core/Entities/ReservedPrefix.cs +++ b/src/NuGetGallery.Core/Entities/ReservedPrefix.cs @@ -8,24 +8,27 @@ namespace NuGetGallery { public class ReservedPrefix : IEntity { - public ReservedPrefix() : this(null, false) + public ReservedPrefix() : this(null, false, false) { } - public ReservedPrefix(string pattern, bool isPublicNamespace) + public ReservedPrefix(string value, bool isPublicNamespace, bool isExactMatch) { - Pattern = pattern; + Value = value; IsPublicNamespace = isPublicNamespace; + IsExactMatch = isExactMatch; PackageRegistrations = new HashSet(); ReservedPrefixOwners = new HashSet(); } [StringLength(CoreConstants.MaxPackageIdLength)] [Required] - public string Pattern { get; set; } + public string Value { get; set; } public bool IsPublicNamespace { get; set; } + public bool IsExactMatch { get; set; } + public virtual ICollection PackageRegistrations { get; set; } public virtual ICollection ReservedPrefixOwners { get; set; } diff --git a/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.cs b/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.cs index 8f41e11562..e3fba54221 100644 --- a/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.cs +++ b/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.cs @@ -12,8 +12,9 @@ public override void Up() c => new { Key = c.Int(nullable: false, identity: true), - Pattern = c.String(nullable: false, maxLength: 128), - IsPublicNamespace = c.Boolean(nullable: false) + Value = c.String(nullable: false, maxLength: 128), + IsPublicNamespace = c.Boolean(nullable: false), + IsExactMatch = c.Boolean(nullable: false) }) .PrimaryKey(t => t.Key); diff --git a/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.resx b/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.resx index 5e93813def..48fd908e3d 100644 --- a/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.resx +++ b/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.resx @@ -118,7 +118,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 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 dbo From 5338adbf6e2ef9bff163f9b2838f6ccf08c44e55 Mon Sep 17 00:00:00 2001 From: shishirh Date: Fri, 14 Jul 2017 10:45:55 -0700 Subject: [PATCH 6/8] add params --- src/NuGetGallery.Core/Entities/ReservedPrefix.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/NuGetGallery.Core/Entities/ReservedPrefix.cs b/src/NuGetGallery.Core/Entities/ReservedPrefix.cs index 7493e88361..9d15db6791 100644 --- a/src/NuGetGallery.Core/Entities/ReservedPrefix.cs +++ b/src/NuGetGallery.Core/Entities/ReservedPrefix.cs @@ -8,7 +8,8 @@ namespace NuGetGallery { public class ReservedPrefix : IEntity { - public ReservedPrefix() : this(null, false, false) + public ReservedPrefix() + : this(value: null, isPublicNamespace: false, isExactMatch: false) { } From 4d2326f15c934bec2fb790af872cc319169d5247 Mon Sep 17 00:00:00 2001 From: shishirh Date: Fri, 14 Jul 2017 12:57:15 -0700 Subject: [PATCH 7/8] add header --- .../Migrations/201707131923337_PrefixReservation.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.cs b/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.cs index e3fba54221..3d743b767a 100644 --- a/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.cs +++ b/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.cs @@ -1,3 +1,6 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + namespace NuGetGallery.Migrations { using System; From 4aeac8552ac6192deec43c7b3d94c891278f0b51 Mon Sep 17 00:00:00 2001 From: shishirh Date: Tue, 18 Jul 2017 18:08:07 -0700 Subject: [PATCH 8/8] address feedback --- .../Entities/PackageRegistration.cs | 6 +- ...ReservedPrefix.cs => ReservedNamespace.cs} | 20 +++---- src/NuGetGallery.Core/Entities/User.cs | 6 +- .../NuGetGallery.Core.csproj | 2 +- .../201707131923337_PrefixReservation.cs | 59 +++++++++---------- .../201707131923337_PrefixReservation.resx | 2 +- 6 files changed, 44 insertions(+), 51 deletions(-) rename src/NuGetGallery.Core/Entities/{ReservedPrefix.cs => ReservedNamespace.cs} (56%) diff --git a/src/NuGetGallery.Core/Entities/PackageRegistration.cs b/src/NuGetGallery.Core/Entities/PackageRegistration.cs index cc8d2af04a..a68e7557f1 100644 --- a/src/NuGetGallery.Core/Entities/PackageRegistration.cs +++ b/src/NuGetGallery.Core/Entities/PackageRegistration.cs @@ -13,7 +13,7 @@ public PackageRegistration() { Owners = new HashSet(); Packages = new HashSet(); - ReservedPrefixes = new HashSet(); + ReservedNamespaces = new HashSet(); } [StringLength(CoreConstants.MaxPackageIdLength)] @@ -22,11 +22,11 @@ public PackageRegistration() public int DownloadCount { get; set; } - public bool Verified { get; set; } + public bool IsVerified { get; set; } public virtual ICollection Owners { get; set; } public virtual ICollection Packages { get; set; } - public virtual ICollection ReservedPrefixes { get; set; } + public virtual ICollection ReservedNamespaces { get; set; } public int Key { get; set; } } diff --git a/src/NuGetGallery.Core/Entities/ReservedPrefix.cs b/src/NuGetGallery.Core/Entities/ReservedNamespace.cs similarity index 56% rename from src/NuGetGallery.Core/Entities/ReservedPrefix.cs rename to src/NuGetGallery.Core/Entities/ReservedNamespace.cs index 9d15db6791..e1605573b5 100644 --- a/src/NuGetGallery.Core/Entities/ReservedPrefix.cs +++ b/src/NuGetGallery.Core/Entities/ReservedNamespace.cs @@ -6,32 +6,32 @@ namespace NuGetGallery { - public class ReservedPrefix : IEntity + public class ReservedNamespace : IEntity { - public ReservedPrefix() - : this(value: null, isPublicNamespace: false, isExactMatch: false) + public ReservedNamespace() + : this(value: null, isSharedNamespace: false, isExactMatch: false) { } - public ReservedPrefix(string value, bool isPublicNamespace, bool isExactMatch) + public ReservedNamespace(string value, bool isSharedNamespace, bool isExactMatch) { Value = value; - IsPublicNamespace = isPublicNamespace; - IsExactMatch = isExactMatch; + IsSharedNamespace = isSharedNamespace; + IsPrefix = isExactMatch; PackageRegistrations = new HashSet(); - ReservedPrefixOwners = new HashSet(); + ReservedNamespaceOwners = new HashSet(); } [StringLength(CoreConstants.MaxPackageIdLength)] [Required] public string Value { get; set; } - public bool IsPublicNamespace { get; set; } + public bool IsSharedNamespace { get; set; } - public bool IsExactMatch { get; set; } + public bool IsPrefix { get; set; } public virtual ICollection PackageRegistrations { get; set; } - public virtual ICollection ReservedPrefixOwners { get; set; } + public virtual ICollection ReservedNamespaceOwners { get; set; } [Key] public int Key { get; set; } diff --git a/src/NuGetGallery.Core/Entities/User.cs b/src/NuGetGallery.Core/Entities/User.cs index 67cb42466c..fd80103805 100644 --- a/src/NuGetGallery.Core/Entities/User.cs +++ b/src/NuGetGallery.Core/Entities/User.cs @@ -19,7 +19,7 @@ public User(string username) { Credentials = new List(); SecurityPolicies = new List(); - ReservedPrefixes = new HashSet(); + ReservedNamespaces = new HashSet(); Roles = new List(); Username = username; } @@ -40,9 +40,7 @@ public User(string username) public bool EmailAllowed { get; set; } - public bool Verified { get; set; } - - public virtual ICollection ReservedPrefixes { get; set; } + public virtual ICollection ReservedNamespaces { get; set; } [DefaultValue(true)] public bool NotifyPackagePushed { get; set; } diff --git a/src/NuGetGallery.Core/NuGetGallery.Core.csproj b/src/NuGetGallery.Core/NuGetGallery.Core.csproj index 348675fcee..af5de1b4c2 100644 --- a/src/NuGetGallery.Core/NuGetGallery.Core.csproj +++ b/src/NuGetGallery.Core/NuGetGallery.Core.csproj @@ -172,7 +172,7 @@ - + diff --git a/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.cs b/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.cs index 3d743b767a..65ed46d7fe 100644 --- a/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.cs +++ b/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.cs @@ -1,6 +1,3 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - namespace NuGetGallery.Migrations { using System; @@ -11,61 +8,59 @@ public partial class PrefixReservation : DbMigration public override void Up() { CreateTable( - "dbo.ReservedPrefixes", + "dbo.ReservedNamespaces", c => new { Key = c.Int(nullable: false, identity: true), Value = c.String(nullable: false, maxLength: 128), - IsPublicNamespace = c.Boolean(nullable: false), - IsExactMatch = c.Boolean(nullable: false) + IsSharedNamespace = c.Boolean(nullable: false), + IsPrefix = c.Boolean(nullable: false), }) .PrimaryKey(t => t.Key); CreateTable( - "dbo.PackageRegistrationReservedPrefixes", + "dbo.PackageRegistrationReservedNamespaces", c => new { PackageRegistration_Key = c.Int(nullable: false), - ReservedPrefix_Key = c.Int(nullable: false), + ReservedNamespace_Key = c.Int(nullable: false), }) - .PrimaryKey(t => new { t.PackageRegistration_Key, t.ReservedPrefix_Key }) + .PrimaryKey(t => new { t.PackageRegistration_Key, t.ReservedNamespace_Key }) .ForeignKey("dbo.PackageRegistrations", t => t.PackageRegistration_Key, cascadeDelete: true) - .ForeignKey("dbo.ReservedPrefixes", t => t.ReservedPrefix_Key, cascadeDelete: true) + .ForeignKey("dbo.ReservedNamespaces", t => t.ReservedNamespace_Key, cascadeDelete: true) .Index(t => t.PackageRegistration_Key) - .Index(t => t.ReservedPrefix_Key); + .Index(t => t.ReservedNamespace_Key); CreateTable( - "dbo.ReservedPrefixUsers", + "dbo.ReservedNamespaceUsers", c => new { - ReservedPrefix_Key = c.Int(nullable: false), + ReservedNamespace_Key = c.Int(nullable: false), User_Key = c.Int(nullable: false), }) - .PrimaryKey(t => new { t.ReservedPrefix_Key, t.User_Key }) - .ForeignKey("dbo.ReservedPrefixes", t => t.ReservedPrefix_Key, cascadeDelete: true) + .PrimaryKey(t => new { t.ReservedNamespace_Key, t.User_Key }) + .ForeignKey("dbo.ReservedNamespaces", t => t.ReservedNamespace_Key, cascadeDelete: true) .ForeignKey("dbo.Users", t => t.User_Key, cascadeDelete: true) - .Index(t => t.ReservedPrefix_Key) + .Index(t => t.ReservedNamespace_Key) .Index(t => t.User_Key); - AddColumn("dbo.Users", "Verified", c => c.Boolean(nullable: false)); - AddColumn("dbo.PackageRegistrations", "Verified", c => c.Boolean(nullable: false)); + AddColumn("dbo.PackageRegistrations", "IsVerified", c => c.Boolean(nullable: false)); } - + public override void Down() { - DropForeignKey("dbo.ReservedPrefixUsers", "User_Key", "dbo.Users"); - DropForeignKey("dbo.ReservedPrefixUsers", "ReservedPrefix_Key", "dbo.ReservedPrefixes"); - DropForeignKey("dbo.PackageRegistrationReservedPrefixes", "ReservedPrefix_Key", "dbo.ReservedPrefixes"); - DropForeignKey("dbo.PackageRegistrationReservedPrefixes", "PackageRegistration_Key", "dbo.PackageRegistrations"); - DropIndex("dbo.ReservedPrefixUsers", new[] { "User_Key" }); - DropIndex("dbo.ReservedPrefixUsers", new[] { "ReservedPrefix_Key" }); - DropIndex("dbo.PackageRegistrationReservedPrefixes", new[] { "ReservedPrefix_Key" }); - DropIndex("dbo.PackageRegistrationReservedPrefixes", new[] { "PackageRegistration_Key" }); - DropColumn("dbo.PackageRegistrations", "Verified"); - DropColumn("dbo.Users", "Verified"); - DropTable("dbo.ReservedPrefixUsers"); - DropTable("dbo.PackageRegistrationReservedPrefixes"); - DropTable("dbo.ReservedPrefixes"); + DropForeignKey("dbo.ReservedNamespaceUsers", "User_Key", "dbo.Users"); + DropForeignKey("dbo.ReservedNamespaceUsers", "ReservedNamespace_Key", "dbo.ReservedNamespaces"); + DropForeignKey("dbo.PackageRegistrationReservedNamespaces", "ReservedNamespace_Key", "dbo.ReservedNamespaces"); + DropForeignKey("dbo.PackageRegistrationReservedNamespaces", "PackageRegistration_Key", "dbo.PackageRegistrations"); + DropIndex("dbo.ReservedNamespaceUsers", new[] { "User_Key" }); + DropIndex("dbo.ReservedNamespaceUsers", new[] { "ReservedNamespace_Key" }); + DropIndex("dbo.PackageRegistrationReservedNamespaces", new[] { "ReservedNamespace_Key" }); + DropIndex("dbo.PackageRegistrationReservedNamespaces", new[] { "PackageRegistration_Key" }); + DropColumn("dbo.PackageRegistrations", "IsVerified"); + DropTable("dbo.ReservedNamespaceUsers"); + DropTable("dbo.PackageRegistrationReservedNamespaces"); + DropTable("dbo.ReservedNamespaces"); } } } diff --git a/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.resx b/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.resx index 48fd908e3d..d78f5b9d80 100644 --- a/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.resx +++ b/src/NuGetGallery/Migrations/201707131923337_PrefixReservation.resx @@ -118,7 +118,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 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 dbo