using System; using System.Collections.Generic; using System.IO; using System.Linq; using NLog; using NzbDrone.Common.Disk; using NzbDrone.Core.MediaFiles.Events; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Tv; using NzbDrone.Core.Tv.Events; namespace NzbDrone.Core.Extras.Files { public interface IExtraFileService where TExtraFile : ExtraFile, new() { List GetFilesBySeries(int seriesId); List GetFilesByEpisodeFile(int episodeFileId); TExtraFile FindByPath(string path); void Upsert(TExtraFile extraFile); void Upsert(List extraFiles); void Delete(int id); void DeleteMany(IEnumerable ids); } public abstract class ExtraFileService : IExtraFileService, IHandleAsync, IHandleAsync where TExtraFile : ExtraFile, new() { private readonly IExtraFileRepository _repository; private readonly ISeriesService _seriesService; private readonly IDiskProvider _diskProvider; private readonly Logger _logger; public ExtraFileService(IExtraFileRepository repository, ISeriesService seriesService, IDiskProvider diskProvider, Logger logger) { _repository = repository; _seriesService = seriesService; _diskProvider = diskProvider; _logger = logger; } public List GetFilesBySeries(int seriesId) { return _repository.GetFilesBySeries(seriesId); } public List GetFilesByEpisodeFile(int episodeFileId) { return _repository.GetFilesByEpisodeFile(episodeFileId); } public TExtraFile FindByPath(string path) { return _repository.FindByPath(path); } public void Upsert(TExtraFile extraFile) { Upsert(new List { extraFile }); } public void Upsert(List extraFiles) { extraFiles.ForEach(m => { m.LastUpdated = DateTime.UtcNow; if (m.Id == 0) { m.Added = m.LastUpdated; } }); _repository.InsertMany(extraFiles.Where(m => m.Id == 0).ToList()); _repository.UpdateMany(extraFiles.Where(m => m.Id > 0).ToList()); } public void Delete(int id) { _repository.Delete(id); } public void DeleteMany(IEnumerable ids) { _repository.DeleteMany(ids); } public void HandleAsync(SeriesDeletedEvent message) { _logger.Debug("Deleting Extra from database for series: {0}", message.Series); _repository.DeleteForSeries(message.Series.Id); } public void HandleAsync(EpisodeFileDeletedEvent message) { var episodeFile = message.EpisodeFile; var series = _seriesService.GetSeries(message.EpisodeFile.SeriesId); foreach (var extra in _repository.GetFilesByEpisodeFile(episodeFile.Id)) { var path = Path.Combine(series.Path, extra.RelativePath); if (_diskProvider.FileExists(path)) { _diskProvider.DeleteFile(path); } } _logger.Debug("Deleting Extra from database for episode file: {0}", episodeFile); _repository.DeleteForEpisodeFile(episodeFile.Id); } } }