From 337d01e4ed89ed8e11d5d4ac4482691518be3910 Mon Sep 17 00:00:00 2001 From: Qstick Date: Thu, 17 Aug 2023 22:03:50 -0500 Subject: [PATCH] Add housekeeper for orphaned list movies --- .../CleanupOrphanedImportListMoviesFixture.cs | 55 +++++++++++++++++++ .../CleanupOrphanedImportListMovies.cs | 27 +++++++++ 2 files changed, 82 insertions(+) create mode 100644 src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupOrphanedImportListMoviesFixture.cs create mode 100644 src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedImportListMovies.cs diff --git a/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupOrphanedImportListMoviesFixture.cs b/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupOrphanedImportListMoviesFixture.cs new file mode 100644 index 000000000..0e7f87440 --- /dev/null +++ b/src/NzbDrone.Core.Test/Housekeeping/Housekeepers/CleanupOrphanedImportListMoviesFixture.cs @@ -0,0 +1,55 @@ +using FizzWare.NBuilder; +using FluentAssertions; +using NUnit.Framework; +using NzbDrone.Core.Housekeeping.Housekeepers; +using NzbDrone.Core.ImportLists; +using NzbDrone.Core.ImportLists.ImportListMovies; +using NzbDrone.Core.Test.Framework; + +namespace NzbDrone.Core.Test.Housekeeping.Housekeepers +{ + [TestFixture] + public class CleanupOrphanedImportListMoviesFixture : DbTest + { + private ImportListDefinition _importList; + + [SetUp] + public void Setup() + { + _importList = Builder.CreateNew() + .BuildNew(); + } + + private void GivenImportList() + { + Db.Insert(_importList); + } + + [Test] + public void should_delete_orphaned_importlistmovies() + { + var status = Builder.CreateNew() + .With(h => h.ListId = _importList.Id) + .BuildNew(); + Db.Insert(status); + + Subject.Clean(); + AllStoredModels.Should().BeEmpty(); + } + + [Test] + public void should_not_delete_unorphaned_importlistmovies() + { + GivenImportList(); + + var status = Builder.CreateNew() + .With(h => h.ListId = _importList.Id) + .BuildNew(); + Db.Insert(status); + + Subject.Clean(); + AllStoredModels.Should().HaveCount(1); + AllStoredModels.Should().Contain(h => h.ListId == _importList.Id); + } + } +} diff --git a/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedImportListMovies.cs b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedImportListMovies.cs new file mode 100644 index 000000000..baf211c8a --- /dev/null +++ b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupOrphanedImportListMovies.cs @@ -0,0 +1,27 @@ +using Dapper; +using NzbDrone.Core.Datastore; + +namespace NzbDrone.Core.Housekeeping.Housekeepers +{ + public class CleanupOrphanedImportListMovies : IHousekeepingTask + { + private readonly IMainDatabase _database; + + public CleanupOrphanedImportListMovies(IMainDatabase database) + { + _database = database; + } + + public void Clean() + { + using var mapper = _database.OpenConnection(); + + mapper.Execute(@"DELETE FROM ""ImportListMovies"" + WHERE ""Id"" IN ( + SELECT ""ImportListMovies"".""Id"" FROM ""ImportListMovies"" + LEFT OUTER JOIN ""ImportLists"" + ON ""ImportListMovies"".""ListId"" = ""ImportLists"".""Id"" + WHERE ""ImportLists"".""Id"" IS NULL)"); + } + } +}