mirror of
https://github.com/fergalmoran/Readarr.git
synced 2026-02-27 10:14:57 +00:00
Fixed: Refreshing / Deleting Series
This commit is contained in:
@@ -20,6 +20,9 @@ namespace NzbDrone.Core.Books
|
||||
[MemberwiseEqualityIgnore]
|
||||
public LazyLoaded<List<Book>> Books { get; set; }
|
||||
|
||||
// A placeholder used in refresh only
|
||||
public string ForeignAuthorId { get; set; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return string.Format("[{0}][{1}]", ForeignSeriesId.NullSafe(), Title.NullSafe());
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using NzbDrone.Core.Datastore;
|
||||
using NzbDrone.Core.Messaging.Events;
|
||||
@@ -8,6 +8,7 @@ namespace NzbDrone.Core.Books
|
||||
public interface ISeriesBookLinkRepository : IBasicRepository<SeriesBookLink>
|
||||
{
|
||||
List<SeriesBookLink> GetLinksBySeries(int seriesId);
|
||||
List<SeriesBookLink> GetLinksBySeriesAndAuthor(int seriesId, string foreignAuthorId);
|
||||
List<SeriesBookLink> GetLinksByBook(List<int> bookIds);
|
||||
}
|
||||
|
||||
@@ -23,6 +24,17 @@ namespace NzbDrone.Core.Books
|
||||
return Query(x => x.SeriesId == seriesId);
|
||||
}
|
||||
|
||||
public List<SeriesBookLink> GetLinksBySeriesAndAuthor(int seriesId, string foreignAuthorId)
|
||||
{
|
||||
return _database.Query<SeriesBookLink>(
|
||||
Builder()
|
||||
.Join<SeriesBookLink, Book>((l, b) => l.BookId == b.Id)
|
||||
.Join<Book, AuthorMetadata>((b, a) => b.AuthorMetadataId == a.Id)
|
||||
.Where<SeriesBookLink>(x => x.SeriesId == seriesId)
|
||||
.Where<AuthorMetadata>(a => a.ForeignAuthorId == foreignAuthorId))
|
||||
.ToList();
|
||||
}
|
||||
|
||||
public List<SeriesBookLink> GetLinksByBook(List<int> bookIds)
|
||||
{
|
||||
return _database.QueryJoined<SeriesBookLink, Series>(
|
||||
|
||||
@@ -3,7 +3,6 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Serializer;
|
||||
|
||||
namespace NzbDrone.Core.Books
|
||||
{
|
||||
@@ -73,7 +72,15 @@ namespace NzbDrone.Core.Books
|
||||
|
||||
protected override void DeleteEntity(Series local, bool deleteFiles)
|
||||
{
|
||||
_seriesService.Delete(local.Id);
|
||||
_logger.Trace($"Removing links for series {local} author {local.ForeignAuthorId}");
|
||||
var children = GetLocalChildren(local, null);
|
||||
_linkService.DeleteMany(children);
|
||||
|
||||
if (!_linkService.GetLinksBySeries(local.Id).Any())
|
||||
{
|
||||
_logger.Trace($"Series {local} has no links remaining, removing");
|
||||
_seriesService.Delete(local.Id);
|
||||
}
|
||||
}
|
||||
|
||||
protected override List<SeriesBookLink> GetRemoteChildren(Series local, Series remote)
|
||||
@@ -83,7 +90,7 @@ namespace NzbDrone.Core.Books
|
||||
|
||||
protected override List<SeriesBookLink> GetLocalChildren(Series entity, List<SeriesBookLink> remoteChildren)
|
||||
{
|
||||
return _linkService.GetLinksBySeries(entity.Id);
|
||||
return _linkService.GetLinksBySeriesAndAuthor(entity.Id, entity.ForeignAuthorId);
|
||||
}
|
||||
|
||||
protected override Tuple<SeriesBookLink, List<SeriesBookLink>> GetMatchingExistingChildren(List<SeriesBookLink> existingChildren, SeriesBookLink remote)
|
||||
@@ -155,6 +162,7 @@ namespace NzbDrone.Core.Books
|
||||
|
||||
foreach (var item in all)
|
||||
{
|
||||
item.ForeignAuthorId = remoteData.ForeignAuthorId;
|
||||
updated |= RefreshEntityInfo(item, remoteSeries, remoteData, true, forceUpdateFileTags, null);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,17 +1,21 @@
|
||||
using System.Collections.Generic;
|
||||
using NzbDrone.Core.Books.Events;
|
||||
using NzbDrone.Core.Messaging.Events;
|
||||
|
||||
namespace NzbDrone.Core.Books
|
||||
{
|
||||
public interface ISeriesBookLinkService
|
||||
{
|
||||
List<SeriesBookLink> GetLinksBySeries(int seriesId);
|
||||
List<SeriesBookLink> GetLinksBySeriesAndAuthor(int seriesId, string foreignAuthorId);
|
||||
List<SeriesBookLink> GetLinksByBook(List<int> bookIds);
|
||||
void InsertMany(List<SeriesBookLink> model);
|
||||
void UpdateMany(List<SeriesBookLink> model);
|
||||
void DeleteMany(List<SeriesBookLink> model);
|
||||
}
|
||||
|
||||
public class SeriesBookLinkService : ISeriesBookLinkService
|
||||
public class SeriesBookLinkService : ISeriesBookLinkService,
|
||||
IHandle<BookDeletedEvent>
|
||||
{
|
||||
private readonly ISeriesBookLinkRepository _repo;
|
||||
|
||||
@@ -25,6 +29,11 @@ namespace NzbDrone.Core.Books
|
||||
return _repo.GetLinksBySeries(seriesId);
|
||||
}
|
||||
|
||||
public List<SeriesBookLink> GetLinksBySeriesAndAuthor(int seriesId, string foreignAuthorId)
|
||||
{
|
||||
return _repo.GetLinksBySeriesAndAuthor(seriesId, foreignAuthorId);
|
||||
}
|
||||
|
||||
public List<SeriesBookLink> GetLinksByBook(List<int> bookIds)
|
||||
{
|
||||
return _repo.GetLinksByBook(bookIds);
|
||||
@@ -44,5 +53,11 @@ namespace NzbDrone.Core.Books
|
||||
{
|
||||
_repo.DeleteMany(model);
|
||||
}
|
||||
|
||||
public void Handle(BookDeletedEvent message)
|
||||
{
|
||||
var links = GetLinksByBook(new List<int> { message.Book.Id });
|
||||
DeleteMany(links);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -105,6 +105,7 @@ namespace NzbDrone.Core.Datastore
|
||||
.LazyLoad(a => a.Books, (db, a) => db.Query<Book>(new SqlBuilder().Where<Book>(rg => rg.AuthorMetadataId == a.Id)).ToList(), a => a.Id > 0);
|
||||
|
||||
Mapper.Entity<Series>("Series").RegisterModel()
|
||||
.Ignore(s => s.ForeignAuthorId)
|
||||
.LazyLoad(s => s.LinkItems,
|
||||
(db, series) => db.Query<SeriesBookLink>(new SqlBuilder().Where<SeriesBookLink>(s => s.SeriesId == series.Id)).ToList(),
|
||||
s => s.Id > 0)
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
using Dapper;
|
||||
using NzbDrone.Core.Datastore;
|
||||
|
||||
namespace NzbDrone.Core.Housekeeping.Housekeepers
|
||||
{
|
||||
public class CleanupOrphanedEditions : IHousekeepingTask
|
||||
{
|
||||
private readonly IMainDatabase _database;
|
||||
|
||||
public CleanupOrphanedEditions(IMainDatabase database)
|
||||
{
|
||||
_database = database;
|
||||
}
|
||||
|
||||
public void Clean()
|
||||
{
|
||||
using (var mapper = _database.OpenConnection())
|
||||
{
|
||||
mapper.Execute(@"DELETE FROM Editions
|
||||
WHERE Id IN (
|
||||
SELECT Editions.Id FROM Editions
|
||||
LEFT OUTER JOIN Books
|
||||
ON Editions.BookId = Books.Id
|
||||
WHERE Books.Id IS NULL)");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
using Dapper;
|
||||
using NzbDrone.Core.Datastore;
|
||||
|
||||
namespace NzbDrone.Core.Housekeeping.Housekeepers
|
||||
{
|
||||
public class CleanupOrphanedSeriesBookLinks : IHousekeepingTask
|
||||
{
|
||||
private readonly IMainDatabase _database;
|
||||
|
||||
public CleanupOrphanedSeriesBookLinks(IMainDatabase database)
|
||||
{
|
||||
_database = database;
|
||||
}
|
||||
|
||||
public void Clean()
|
||||
{
|
||||
using (var mapper = _database.OpenConnection())
|
||||
{
|
||||
mapper.Execute(@"DELETE FROM SeriesBookLinks
|
||||
WHERE Id IN (
|
||||
SELECT SeriesBookLinks.Id FROM SeriesBookLinks
|
||||
LEFT OUTER JOIN Books
|
||||
ON SeriesBookLinks.BookId = Books.Id
|
||||
WHERE Books.Id IS NULL)");
|
||||
|
||||
mapper.Execute(@"DELETE FROM SeriesBookLinks
|
||||
WHERE Id IN (
|
||||
SELECT SeriesBookLinks.Id FROM SeriesBookLinks
|
||||
LEFT OUTER JOIN Series
|
||||
ON SeriesBookLinks.SeriesId = Series.Id
|
||||
WHERE Series.Id IS NULL)");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user