using System; using System.Collections.Generic; using System.Linq; using NzbDrone.Core.Datastore; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Movies; using NzbDrone.Core.Profiles; using NzbDrone.Core.Qualities; namespace NzbDrone.Core.History { public interface IHistoryRepository : IBasicRepository { List GetBestQualityInHistory(int movieId); MovieHistory MostRecentForDownloadId(string downloadId); List FindByDownloadId(string downloadId); List FindDownloadHistory(int movieId, QualityModel quality); List GetByMovieId(int movieId, MovieHistoryEventType? eventType); void DeleteForMovies(List movieIds); MovieHistory MostRecentForMovie(int movieId); List Since(DateTime date, MovieHistoryEventType? eventType); } public class HistoryRepository : BasicRepository, IHistoryRepository { public HistoryRepository(IMainDatabase database, IEventAggregator eventAggregator) : base(database, eventAggregator) { } public List GetBestQualityInHistory(int movieId) { var history = Query(x => x.MovieId == movieId); return history.Select(h => h.Quality).ToList(); } public MovieHistory MostRecentForDownloadId(string downloadId) { return FindByDownloadId(downloadId) .OrderByDescending(h => h.Date) .FirstOrDefault(); } public List FindByDownloadId(string downloadId) { return Query(x => x.DownloadId == downloadId); } public List FindDownloadHistory(int movieId, QualityModel quality) { var allowed = new[] { (int)MovieHistoryEventType.Grabbed, (int)MovieHistoryEventType.DownloadFailed, (int)MovieHistoryEventType.DownloadFolderImported }; return Query(h => h.MovieId == movieId && h.Quality == quality && allowed.Contains((int)h.EventType)); } public List GetByMovieId(int movieId, MovieHistoryEventType? eventType) { var builder = new SqlBuilder(_database.DatabaseType) .Join((h, m) => h.MovieId == m.Id) .Join((m, p) => m.ProfileId == p.Id) .Where(h => h.MovieId == movieId); if (eventType.HasValue) { builder.Where(h => h.EventType == eventType); } return PagedQuery(builder).OrderByDescending(h => h.Date).ToList(); } public void DeleteForMovies(List movieIds) { Delete(c => movieIds.Contains(c.MovieId)); } protected override SqlBuilder PagedBuilder() => new SqlBuilder(_database.DatabaseType) .Join((h, m) => h.MovieId == m.Id) .Join((m, p) => m.ProfileId == p.Id); protected override IEnumerable PagedQuery(SqlBuilder sql) => _database.QueryJoined(sql, (hist, movie, profile) => { hist.Movie = movie; hist.Movie.Profile = profile; return hist; }); public MovieHistory MostRecentForMovie(int movieId) { return Query(x => x.MovieId == movieId) .OrderByDescending(h => h.Date) .FirstOrDefault(); } public List Since(DateTime date, MovieHistoryEventType? eventType) { var builder = new SqlBuilder(_database.DatabaseType) .Join((h, m) => h.MovieId == m.Id) .Join((m, p) => m.ProfileId == p.Id) .Where(x => x.Date >= date); if (eventType.HasValue) { builder.Where(h => h.EventType == eventType); } return PagedQuery(builder).OrderBy(h => h.Date).ToList(); } } }