diff --git a/src/NuGetGallery.Core/Services/CorePackageFileService.cs b/src/NuGetGallery.Core/Services/CorePackageFileService.cs index 44c840511c..59f097c496 100644 --- a/src/NuGetGallery.Core/Services/CorePackageFileService.cs +++ b/src/NuGetGallery.Core/Services/CorePackageFileService.cs @@ -80,6 +80,24 @@ public Task DeleteValidationPackageFileAsync(string id, string version) return _fileStorageService.DeleteFileAsync(CoreConstants.ValidationFolderName, fileName); } + public Task DeletePackageFileAsync(string id, string version) + { + if (String.IsNullOrWhiteSpace(id)) + { + throw new ArgumentNullException(nameof(id)); + } + + if (String.IsNullOrWhiteSpace(version)) + { + throw new ArgumentNullException(nameof(version)); + } + + var normalizedVersion = NuGetVersionFormatter.Normalize(version); + + var fileName = BuildFileName(id, normalizedVersion, CoreConstants.PackageFileSavePathTemplate, CoreConstants.NuGetPackageFileExtension); + return _fileStorageService.DeleteFileAsync(CoreConstants.PackagesFolderName, fileName); + } + public Task GetValidationPackageReadUriAsync(Package package, DateTimeOffset endOfAccess) { package = package ?? throw new ArgumentNullException(nameof(package)); diff --git a/src/NuGetGallery.Core/Services/ICorePackageFileService.cs b/src/NuGetGallery.Core/Services/ICorePackageFileService.cs index ad4fe574af..1a5189bff9 100644 --- a/src/NuGetGallery.Core/Services/ICorePackageFileService.cs +++ b/src/NuGetGallery.Core/Services/ICorePackageFileService.cs @@ -49,5 +49,12 @@ public interface ICorePackageFileService /// The package ID. This value is case-insensitive. /// The package version. This value is case-insensitive and need not be normalized. Task DeleteValidationPackageFileAsync(string id, string version); + + /// + /// Deletes the nupkg from the publicly available package storage. + /// + /// The package ID. This value is case-insensitive. + /// The package version. This value is case-insensitive and need not be normalized. + Task DeletePackageFileAsync(string id, string version); } } \ No newline at end of file diff --git a/src/NuGetGallery/Services/IPackageFileService.cs b/src/NuGetGallery/Services/IPackageFileService.cs index ab03e3b1aa..ca43da0c76 100644 --- a/src/NuGetGallery/Services/IPackageFileService.cs +++ b/src/NuGetGallery/Services/IPackageFileService.cs @@ -20,11 +20,6 @@ public interface IPackageFileService : ICorePackageFileService /// Task CreateDownloadPackageActionResultAsync(Uri requestUrl, string unsafeId, string unsafeVersion); - /// - /// Deletes the nupkg from the file storage. - /// - Task DeletePackageFileAsync(string id, string version); - /// /// Copies the contents of the package represented by the stream into the file storage backup location. /// diff --git a/src/NuGetGallery/Services/PackageFileService.cs b/src/NuGetGallery/Services/PackageFileService.cs index 6e90489566..eb0ad38ecf 100644 --- a/src/NuGetGallery/Services/PackageFileService.cs +++ b/src/NuGetGallery/Services/PackageFileService.cs @@ -44,22 +44,6 @@ public Task CreateDownloadPackageActionResultAsync(Uri requestUrl, return _fileStorageService.CreateDownloadFileActionResultAsync(requestUrl, CoreConstants.PackagesFolderName, fileName); } - public Task DeletePackageFileAsync(string id, string version) - { - if (String.IsNullOrWhiteSpace(id)) - { - throw new ArgumentNullException(nameof(id)); - } - - if (String.IsNullOrWhiteSpace(version)) - { - throw new ArgumentNullException(nameof(version)); - } - - var fileName = BuildFileName(id, version, CoreConstants.PackageFileSavePathTemplate, CoreConstants.NuGetPackageFileExtension); - return _fileStorageService.DeleteFileAsync(CoreConstants.PackagesFolderName, fileName); - } - public Task StorePackageFileInBackupLocationAsync(Package package, Stream packageFile) { if (package == null) diff --git a/tests/NuGetGallery.Core.Facts/Services/CorePackageFileServiceFacts.cs b/tests/NuGetGallery.Core.Facts/Services/CorePackageFileServiceFacts.cs index e02d121c17..9bcf16eeeb 100644 --- a/tests/NuGetGallery.Core.Facts/Services/CorePackageFileServiceFacts.cs +++ b/tests/NuGetGallery.Core.Facts/Services/CorePackageFileServiceFacts.cs @@ -13,6 +13,7 @@ namespace NuGetGallery public class CorePackageFileServiceFacts { private const string ValidationFolderName = "validation"; + private const string PackagesFolderName = "packages"; private const string Id = "NuGet.Versioning"; private const string Version = "4.3.0.0-BETA+1"; private const string NormalizedVersion = "4.3.0-BETA"; @@ -310,7 +311,7 @@ public async Task WillDownloadTheFileViaTheFileStorageService() } } - public class TheDeletePackageFileMethod : FactsBase + public class TheDeleteValidationPackageFileMethod : FactsBase { [Fact] public async Task WillThrowIfIdIsNull() @@ -348,6 +349,44 @@ public async Task WillDeleteTheFileViaTheFileStorageService() } } + public class TheDeletePackageFileMethod : FactsBase + { + [Fact] + public async Task WillThrowIfIdIsNull() + { + string id = null; + + var ex = await Assert.ThrowsAsync( + () => _service.DeletePackageFileAsync(id, Version)); + + Assert.Equal("id", ex.ParamName); + } + + [Fact] + public async Task WillThrowIfVersionIsNull() + { + string version = null; + + var ex = await Assert.ThrowsAsync( + () => _service.DeletePackageFileAsync(Id, version)); + + Assert.Equal("version", ex.ParamName); + } + + [Fact] + public async Task WillDeleteTheFileViaTheFileStorageService() + { + await _service.DeletePackageFileAsync(Id, Version); + + _fileStorageService.Verify( + x => x.DeleteFileAsync(PackagesFolderName, ValidationFileName), + Times.Once); + _fileStorageService.Verify( + x => x.DeleteFileAsync(It.IsAny(), It.IsAny()), + Times.Once); + } + } + public class TheGetValidationPackageReadUriAsyncMethod : FactsBase { [Fact]