using System.Reflection; using Microsoft.AspNetCore.Mvc; using NzbDrone.Core.Datastore; using NzbDrone.Core.Datastore.Events; using NzbDrone.Core.Messaging.Events; using NzbDrone.SignalR; namespace Lidarr.Http.REST { public abstract class RestControllerWithSignalR : RestController, IHandle> where TResource : RestResource, new() where TModel : ModelBase, new() { protected string Resource { get; } private readonly IBroadcastSignalRMessage _signalRBroadcaster; protected RestControllerWithSignalR(IBroadcastSignalRMessage signalRBroadcaster) { _signalRBroadcaster = signalRBroadcaster; var apiAttribute = GetType().GetCustomAttribute(); if (apiAttribute != null && apiAttribute.Resource != VersionedApiControllerAttribute.CONTROLLER_RESOURCE) { Resource = apiAttribute.Resource; } else { Resource = new TResource().ResourceName.Trim('/'); } } [NonAction] public void Handle(ModelEvent message) { if (!_signalRBroadcaster.IsConnected) { return; } if (message.Action == ModelAction.Deleted || message.Action == ModelAction.Sync) { BroadcastResourceChange(message.Action); } BroadcastResourceChange(message.Action, message.Model.Id); } protected void BroadcastResourceChange(ModelAction action, int id) { if (!_signalRBroadcaster.IsConnected) { return; } if (action == ModelAction.Deleted) { BroadcastResourceChange(action, new TResource { Id = id }); } else { var resource = GetResourceById(id); BroadcastResourceChange(action, resource); } } protected void BroadcastResourceChange(ModelAction action, TResource resource) { if (!_signalRBroadcaster.IsConnected || resource == null) { return; } if (GetType().Namespace.Contains("V1")) { var signalRMessage = new SignalRMessage { Name = Resource, Body = new ResourceChangeMessage(resource, action), Action = action }; _signalRBroadcaster.BroadcastMessage(signalRMessage); } } protected void BroadcastResourceChange(ModelAction action) { if (!_signalRBroadcaster.IsConnected) { return; } if (GetType().Namespace.Contains("V1")) { var signalRMessage = new SignalRMessage { Name = Resource, Body = new ResourceChangeMessage(action), Action = action }; _signalRBroadcaster.BroadcastMessage(signalRMessage); } } } }