using System; using System.Collections.Generic; using System.Linq; using Microsoft.AspNetCore.Mvc; using NzbDrone.Core.Datastore.Events; using NzbDrone.Core.Download.Pending; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Queue; using NzbDrone.SignalR; using Readarr.Http; using Readarr.Http.REST; namespace Readarr.Api.V1.Queue { [V1ApiController("queue/details")] public class QueueDetailsController : RestControllerWithSignalR, IHandle, IHandle { private readonly IQueueService _queueService; private readonly IPendingReleaseService _pendingReleaseService; public QueueDetailsController(IBroadcastSignalRMessage broadcastSignalRMessage, IQueueService queueService, IPendingReleaseService pendingReleaseService) : base(broadcastSignalRMessage) { _queueService = queueService; _pendingReleaseService = pendingReleaseService; } protected override QueueResource GetResourceById(int id) { throw new NotImplementedException(); } [HttpGet] public List GetQueue(int? authorId, [FromQuery]List bookIds, bool includeAuthor = false, bool includeBook = true) { var queue = _queueService.GetQueue(); var pending = _pendingReleaseService.GetPendingQueue(); var fullQueue = queue.Concat(pending); if (authorId.HasValue) { return fullQueue.Where(q => q.Author?.Id == authorId.Value).ToResource(includeAuthor, includeBook); } if (bookIds.Any()) { return fullQueue.Where(q => q.Book != null && bookIds.Contains(q.Book.Id)).ToResource(includeAuthor, includeBook); } return fullQueue.ToResource(includeAuthor, includeBook); } [NonAction] public void Handle(QueueUpdatedEvent message) { BroadcastResourceChange(ModelAction.Sync); } [NonAction] public void Handle(PendingReleasesUpdatedEvent message) { BroadcastResourceChange(ModelAction.Sync); } } }