Source/NuGetGallery.Operations/Tasks/DeleteUserTask.cs (76 lines of code) (raw):

using System.Data.SqlClient; using System.Linq; using AnglicanGeek.DbExecutor; using NuGetGallery.Operations.Common; namespace NuGetGallery.Operations.Tasks { [Command("deleteuser", "Delete a user's account and all of their packages", AltName = "du")] public class DeleteUserTask : DatabaseAndStorageTask { [Option("The username of the user to delete", AltName = "u")] public string Username { get; set; } public override void ValidateArguments() { base.ValidateArguments(); ArgCheck.Required(Username, "Username"); } public override void ExecuteCommand() { Log.Info( "Delete the user account and all packages for '{0}'.", Username); using (var sqlConnection = new SqlConnection(ConnectionString.ConnectionString)) using (var dbExecutor = new SqlExecutor(sqlConnection)) { sqlConnection.Open(); var user = Util.GetUser(dbExecutor, Username); if (user == null) { Log.Error("User was not found"); return; } Log.Info("User found with EmailAddress '{0}' and UnconfirmedEmailAddress '{1}'", user.EmailAddress, user.UnconfirmedEmailAddress); var packageCount = user.PackageRegistrationIds.Count(); var packageNumber = 0; foreach (var packageId in user.PackageRegistrationIds) { Log.Info("Deleting package '{0}' because '{1}' is the sole owner. ({2}/{3})", packageId, Username, ++packageNumber, packageCount); var deletePackageTask = new DeleteAllPackageVersionsTask { ConnectionString = ConnectionString, StorageAccount = StorageAccount, PackageId = packageId, WhatIf = WhatIf }; deletePackageTask.Execute(); } Log.Info("Deleting remaining package ownership records (from shared ownership)"); if (!WhatIf) { dbExecutor.Execute( "DELETE pro FROM PackageRegistrationOwners pro WHERE pro.UserKey = @userKey", new { userKey = user.Key }); } Log.Info("Deleting package ownership requests"); if (!WhatIf) { dbExecutor.Execute( "DELETE por FROM PackageOwnerRequests por WHERE @userKey IN (por.NewOwnerKey, por.RequestingOwnerKey)", new { userKey = user.Key }); } Log.Info("Deleting the user record itself"); if (!WhatIf) { dbExecutor.Execute( "DELETE u FROM Users u WHERE u.[Key] = @userKey", new { userKey = user.Key }); } Log.Info( "Deleted all packages owned solely by '{0}' as well as the user record." , user.Username); } } } }