From 447bf63a4dc390055a3aee03ec5372a58d43b246 Mon Sep 17 00:00:00 2001 From: ta264 Date: Wed, 26 Jun 2019 21:57:31 +0100 Subject: [PATCH] Fixed: Correctly delete trackfiles on AlbumDeletedEvent GetFilesByAlbum performs a join on the album releases under the hood, which won't be populated once the album is deleted. Fix by providing a special delete method which omits the join and just looks at albumId. --- .../MediaFiles/MediaFileRepositoryFixture.cs | 10 ++++++++++ src/NzbDrone.Core/MediaFiles/MediaFileRepository.cs | 7 +++++++ src/NzbDrone.Core/MediaFiles/MediaFileService.cs | 3 +-- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core.Test/MediaFiles/MediaFileRepositoryFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/MediaFileRepositoryFixture.cs index 8cd50a027..ceba74021 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/MediaFileRepositoryFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/MediaFileRepositoryFixture.cs @@ -6,6 +6,7 @@ using NzbDrone.Core.Qualities; using NzbDrone.Core.Music; using NzbDrone.Core.Test.Framework; using System.Collections.Generic; +using System.Linq; namespace NzbDrone.Core.Test.MediaFiles { @@ -140,5 +141,14 @@ namespace NzbDrone.Core.Test.MediaFiles file.Artist.Value.Metadata.Value.Should().NotBeNull(); } } + + [Test] + public void delete_files_by_album_should_work_if_join_fails() + { + Db.Delete(album); + Subject.DeleteFilesByAlbum(album.Id); + + Db.All().Where(x => x.AlbumId == album.Id).Should().HaveCount(0); + } } } diff --git a/src/NzbDrone.Core/MediaFiles/MediaFileRepository.cs b/src/NzbDrone.Core/MediaFiles/MediaFileRepository.cs index ea5d19ecd..b1800a6d6 100644 --- a/src/NzbDrone.Core/MediaFiles/MediaFileRepository.cs +++ b/src/NzbDrone.Core/MediaFiles/MediaFileRepository.cs @@ -14,6 +14,7 @@ namespace NzbDrone.Core.MediaFiles List GetFilesByRelease(int releaseId); List GetFilesWithBasePath(string path); TrackFile GetFileWithPath(string path); + void DeleteFilesByAlbum(int albumId); } @@ -51,6 +52,12 @@ namespace NzbDrone.Core.MediaFiles .ToList(); } + public void DeleteFilesByAlbum(int albumId) + { + var ids = DataMapper.Query().Where(x => x.AlbumId == albumId); + DeleteMany(ids); + } + public List GetFilesByRelease(int releaseId) { return Query diff --git a/src/NzbDrone.Core/MediaFiles/MediaFileService.cs b/src/NzbDrone.Core/MediaFiles/MediaFileService.cs index 4bada76e4..bc52483b0 100644 --- a/src/NzbDrone.Core/MediaFiles/MediaFileService.cs +++ b/src/NzbDrone.Core/MediaFiles/MediaFileService.cs @@ -148,8 +148,7 @@ namespace NzbDrone.Core.MediaFiles public void HandleAsync(AlbumDeletedEvent message) { - var files = GetFilesByAlbum(message.Album.Id); - _mediaFileRepository.DeleteMany(files); + _mediaFileRepository.DeleteFilesByAlbum(message.Album.Id); } public List GetFilesByArtist(int artistId)