mirror of https://github.com/Radarr/Radarr
137 lines
4.3 KiB
C#
137 lines
4.3 KiB
C#
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using NLog;
|
|
using NzbDrone.Core.Messaging.Events;
|
|
using NzbDrone.Core.Movies.Events;
|
|
|
|
namespace NzbDrone.Core.Movies.Collections
|
|
{
|
|
public interface IMovieCollectionService
|
|
{
|
|
MovieCollection AddCollection(MovieCollection collection);
|
|
MovieCollection GetCollection(int id);
|
|
MovieCollection FindByTmdbId(int tmdbId);
|
|
IEnumerable<MovieCollection> GetCollections(IEnumerable<int> ids);
|
|
List<MovieCollection> GetAllCollections();
|
|
MovieCollection UpdateCollection(MovieCollection collection);
|
|
List<MovieCollection> UpdateCollections(List<MovieCollection> collections);
|
|
void RemoveCollection(MovieCollection collection);
|
|
bool Upsert(MovieCollection collection);
|
|
bool UpsertMany(List<MovieCollection> collections);
|
|
}
|
|
|
|
public class MovieCollectionService : IMovieCollectionService, IHandleAsync<MoviesDeletedEvent>
|
|
{
|
|
private readonly IMovieCollectionRepository _repo;
|
|
private readonly IMovieService _movieService;
|
|
private readonly IEventAggregator _eventAggregator;
|
|
private readonly Logger _logger;
|
|
|
|
public MovieCollectionService(IMovieCollectionRepository repo, IMovieService movieService, IEventAggregator eventAggregator, Logger logger)
|
|
{
|
|
_repo = repo;
|
|
_movieService = movieService;
|
|
_eventAggregator = eventAggregator;
|
|
_logger = logger;
|
|
}
|
|
|
|
public MovieCollection AddCollection(MovieCollection newCollection)
|
|
{
|
|
var existing = _repo.GetByTmdbId(newCollection.TmdbId);
|
|
|
|
if (existing == null)
|
|
{
|
|
var collection = _repo.Insert(newCollection);
|
|
|
|
_eventAggregator.PublishEvent(new CollectionAddedEvent(collection));
|
|
|
|
return collection;
|
|
}
|
|
|
|
return existing;
|
|
}
|
|
|
|
public MovieCollection GetCollection(int id)
|
|
{
|
|
return _repo.Get(id);
|
|
}
|
|
|
|
public IEnumerable<MovieCollection> GetCollections(IEnumerable<int> ids)
|
|
{
|
|
return _repo.Get(ids);
|
|
}
|
|
|
|
public List<MovieCollection> GetAllCollections()
|
|
{
|
|
return _repo.All().ToList();
|
|
}
|
|
|
|
public MovieCollection UpdateCollection(MovieCollection collection)
|
|
{
|
|
var storedCollection = GetCollection(collection.Id);
|
|
|
|
var updatedCollection = _repo.Update(collection);
|
|
|
|
_eventAggregator.PublishEvent(new CollectionEditedEvent(updatedCollection, storedCollection));
|
|
|
|
return updatedCollection;
|
|
}
|
|
|
|
public List<MovieCollection> UpdateCollections(List<MovieCollection> collections)
|
|
{
|
|
_logger.Debug("Updating {0} movie collections", collections.Count);
|
|
|
|
foreach (var c in collections)
|
|
{
|
|
_logger.Trace("Updating: {0}", c.Title);
|
|
}
|
|
|
|
_repo.UpdateMany(collections);
|
|
_logger.Debug("{0} movie collections updated", collections.Count);
|
|
|
|
return collections;
|
|
}
|
|
|
|
public void RemoveCollection(MovieCollection collection)
|
|
{
|
|
_repo.Delete(collection);
|
|
|
|
_eventAggregator.PublishEvent(new CollectionDeletedEvent(collection));
|
|
}
|
|
|
|
public bool Upsert(MovieCollection collection)
|
|
{
|
|
return _repo.UpsertMany(new List<MovieCollection> { collection });
|
|
}
|
|
|
|
public bool UpsertMany(List<MovieCollection> collections)
|
|
{
|
|
return _repo.UpsertMany(collections);
|
|
}
|
|
|
|
public void HandleAsync(MoviesDeletedEvent message)
|
|
{
|
|
var collections = message.Movies.Select(x => x.MovieMetadata.Value.CollectionTmdbId).Distinct();
|
|
|
|
foreach (var collectionTmdbId in collections)
|
|
{
|
|
if (collectionTmdbId == 0 || _movieService.GetMoviesByCollectionTmdbId(collectionTmdbId).Any())
|
|
{
|
|
continue;
|
|
}
|
|
|
|
var collection = FindByTmdbId(collectionTmdbId);
|
|
|
|
_repo.Delete(collectionTmdbId);
|
|
|
|
_eventAggregator.PublishEvent(new CollectionDeletedEvent(collection));
|
|
}
|
|
}
|
|
|
|
public MovieCollection FindByTmdbId(int tmdbId)
|
|
{
|
|
return _repo.GetByTmdbId(tmdbId);
|
|
}
|
|
}
|
|
}
|