From fd22cb44f69338eef17c816e0c87bb151967dd98 Mon Sep 17 00:00:00 2001 From: Qstick Date: Sat, 25 Jun 2022 15:23:39 -0500 Subject: [PATCH] Fixed: Collections Improvements Fixes #7383 --- .../Store/Actions/movieCollectionActions.js | 15 +++----- .../Checks/MovieCollectionRootFolderCheck.cs | 4 ++- .../Collections/MovieCollectionService.cs | 21 ++++++++++- .../Movies/RefreshCollectionService.cs | 7 +--- .../Collections/CollectionController.cs | 35 ++++++++++--------- .../Collections/CollectionUpdateResource.cs | 3 +- 6 files changed, 49 insertions(+), 36 deletions(-) diff --git a/frontend/src/Store/Actions/movieCollectionActions.js b/frontend/src/Store/Actions/movieCollectionActions.js index be21a6aa5..5aacb0654 100644 --- a/frontend/src/Store/Actions/movieCollectionActions.js +++ b/frontend/src/Store/Actions/movieCollectionActions.js @@ -258,23 +258,16 @@ export const actionHandlers = handleThunks({ } = payload; const response = {}; - const collections = []; - collectionIds.forEach((id) => { - const collectionToUpdate = { id }; - - if (payload.hasOwnProperty('monitored')) { - collectionToUpdate.monitored = monitored; - } - - collections.push(collectionToUpdate); - }); + if (payload.hasOwnProperty('monitored')) { + response.monitored = monitored; + } if (payload.hasOwnProperty('monitor')) { response.monitorMovies = monitor === 'monitored'; } - response.collections = collections; + response.collectionIds = collectionIds; dispatch(set({ section, diff --git a/src/NzbDrone.Core/HealthCheck/Checks/MovieCollectionRootFolderCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/MovieCollectionRootFolderCheck.cs index 60f749488..8ead19da9 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/MovieCollectionRootFolderCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/MovieCollectionRootFolderCheck.cs @@ -2,13 +2,15 @@ using System.Collections.Generic; using System.Linq; using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; +using NzbDrone.Core.Datastore.Events; using NzbDrone.Core.Localization; using NzbDrone.Core.Movies.Collections; using NzbDrone.Core.Movies.Events; +using NzbDrone.Core.RootFolders; namespace NzbDrone.Core.HealthCheck.Checks { - [CheckOn(typeof(CollectionEditedEvent), CheckOnCondition.Always)] + [CheckOn(typeof(ModelEvent))] public class MovieCollectionRootFolderCheck : HealthCheckBase { private readonly IMovieCollectionService _collectionService; diff --git a/src/NzbDrone.Core/Movies/Collections/MovieCollectionService.cs b/src/NzbDrone.Core/Movies/Collections/MovieCollectionService.cs index 3797b2e92..7a15f72e6 100644 --- a/src/NzbDrone.Core/Movies/Collections/MovieCollectionService.cs +++ b/src/NzbDrone.Core/Movies/Collections/MovieCollectionService.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using NLog; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Movies.Events; @@ -13,6 +14,7 @@ namespace NzbDrone.Core.Movies.Collections IEnumerable GetCollections(IEnumerable ids); List GetAllCollections(); MovieCollection UpdateCollection(MovieCollection collection); + List UpdateCollections(List collections); void RemoveCollection(MovieCollection collection); bool Upsert(MovieCollection collection); bool UpsertMany(List collections); @@ -23,12 +25,14 @@ namespace NzbDrone.Core.Movies.Collections private readonly IMovieCollectionRepository _repo; private readonly IMovieService _movieService; private readonly IEventAggregator _eventAggregator; + private readonly Logger _logger; - public MovieCollectionService(IMovieCollectionRepository repo, IMovieService movieService, IEventAggregator eventAggregator) + public MovieCollectionService(IMovieCollectionRepository repo, IMovieService movieService, IEventAggregator eventAggregator, Logger logger) { _repo = repo; _movieService = movieService; _eventAggregator = eventAggregator; + _logger = logger; } public MovieCollection AddCollection(MovieCollection newCollection) @@ -73,6 +77,21 @@ namespace NzbDrone.Core.Movies.Collections return updatedCollection; } + public List UpdateCollections(List 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); diff --git a/src/NzbDrone.Core/Movies/RefreshCollectionService.cs b/src/NzbDrone.Core/Movies/RefreshCollectionService.cs index d4d46b11b..b6fef847f 100644 --- a/src/NzbDrone.Core/Movies/RefreshCollectionService.cs +++ b/src/NzbDrone.Core/Movies/RefreshCollectionService.cs @@ -12,7 +12,7 @@ using NzbDrone.Core.Movies.Events; namespace NzbDrone.Core.Movies { - public class RefreshCollectionService : IExecute, IHandle + public class RefreshCollectionService : IExecute { private readonly IProvideMovieInfo _movieInfo; private readonly IMovieCollectionService _collectionService; @@ -151,10 +151,5 @@ namespace NzbDrone.Core.Movies } } } - - public void Handle(CollectionEditedEvent message) - { - SyncCollectionMovies(message.Collection); - } } } diff --git a/src/Radarr.Api.V3/Collections/CollectionController.cs b/src/Radarr.Api.V3/Collections/CollectionController.cs index 9732d8d17..e5df26a06 100644 --- a/src/Radarr.Api.V3/Collections/CollectionController.cs +++ b/src/Radarr.Api.V3/Collections/CollectionController.cs @@ -2,9 +2,11 @@ using System.Collections.Generic; using System.Linq; using Microsoft.AspNetCore.Mvc; using NzbDrone.Core.Datastore.Events; +using NzbDrone.Core.Messaging.Commands; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Movies; using NzbDrone.Core.Movies.Collections; +using NzbDrone.Core.Movies.Commands; using NzbDrone.Core.Movies.Events; using NzbDrone.Core.Organizer; using NzbDrone.SignalR; @@ -25,13 +27,15 @@ namespace Radarr.Api.V3.Collections private readonly IMovieMetadataService _movieMetadataService; private readonly IBuildFileNames _fileNameBuilder; private readonly INamingConfigService _namingService; + private readonly IManageCommandQueue _commandQueueManager; public CollectionController(IBroadcastSignalRMessage signalRBroadcaster, IMovieCollectionService collectionService, IMovieService movieService, IMovieMetadataService movieMetadataService, IBuildFileNames fileNameBuilder, - INamingConfigService namingService) + INamingConfigService namingService, + IManageCommandQueue commandQueueManager) : base(signalRBroadcaster) { _collectionService = collectionService; @@ -39,6 +43,7 @@ namespace Radarr.Api.V3.Collections _movieMetadataService = movieMetadataService; _fileNameBuilder = fileNameBuilder; _namingService = namingService; + _commandQueueManager = commandQueueManager; } protected override CollectionResource GetResourceById(int id) @@ -67,34 +72,32 @@ namespace Radarr.Api.V3.Collections } [HttpPut] - public ActionResult UpdateCollections(CollectionUpdateResource collectionResources) + public ActionResult UpdateCollections(CollectionUpdateResource resource) { - var collectionsToUpdate = _collectionService.GetCollections(collectionResources.Collections.Select(c => c.Id)); - var update = new List(); + var collectionsToUpdate = _collectionService.GetCollections(resource.CollectionIds); - foreach (var c in collectionResources.Collections) + foreach (var collection in collectionsToUpdate) { - var collection = collectionsToUpdate.Single(n => n.Id == c.Id); - - if (c.Monitored.HasValue) + if (resource.Monitored.HasValue) { - collection.Monitored = c.Monitored.Value; + collection.Monitored = resource.Monitored.Value; } - if (collectionResources.MonitorMovies.HasValue) + if (resource.MonitorMovies.HasValue) { var movies = _movieService.GetMoviesByCollectionTmdbId(collection.TmdbId); - movies.ForEach(c => c.Monitored = collectionResources.MonitorMovies.Value); + movies.ForEach(c => c.Monitored = resource.MonitorMovies.Value); _movieService.UpdateMovie(movies, true); } - - var updatedCollection = _collectionService.UpdateCollection(collection); - update.Add(updatedCollection.ToResource()); } - return Accepted(update); + var updated = _collectionService.UpdateCollections(collectionsToUpdate.ToList()).ToResource(); + + _commandQueueManager.Push(new RefreshCollectionsCommand()); + + return Accepted(updated); } private IEnumerable MapToResource(List collections, List collectionMovies) @@ -125,7 +128,7 @@ namespace Radarr.Api.V3.Collections foreach (var movie in _movieMetadataService.GetMoviesByCollectionTmdbId(collection.TmdbId)) { var movieResource = movie.ToResource(); - movieResource.Folder = _fileNameBuilder.GetMovieFolder(new Movie { Title = movie.Title, Year = movie.Year, ImdbId = movie.ImdbId, TmdbId = movie.TmdbId }); + movieResource.Folder = _fileNameBuilder.GetMovieFolder(new Movie { MovieMetadata = movie }); resource.Movies.Add(movieResource); } diff --git a/src/Radarr.Api.V3/Collections/CollectionUpdateResource.cs b/src/Radarr.Api.V3/Collections/CollectionUpdateResource.cs index 05e269814..6359e5101 100644 --- a/src/Radarr.Api.V3/Collections/CollectionUpdateResource.cs +++ b/src/Radarr.Api.V3/Collections/CollectionUpdateResource.cs @@ -5,7 +5,8 @@ namespace Radarr.Api.V3.Collections { public class CollectionUpdateResource { - public List Collections { get; set; } + public List CollectionIds { get; set; } + public bool? Monitored { get; set; } public bool? MonitorMovies { get; set; } } }