You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
3.2 KiB
107 lines
3.2 KiB
3 years ago
|
using System.Reflection;
|
||
|
using Microsoft.AspNetCore.Mvc;
|
||
11 years ago
|
using NzbDrone.Core.Datastore;
|
||
|
using NzbDrone.Core.Datastore.Events;
|
||
11 years ago
|
using NzbDrone.Core.Messaging.Events;
|
||
11 years ago
|
using NzbDrone.SignalR;
|
||
|
|
||
3 years ago
|
namespace Lidarr.Http.REST
|
||
11 years ago
|
{
|
||
3 years ago
|
public abstract class RestControllerWithSignalR<TResource, TModel> : RestController<TResource>, IHandle<ModelEvent<TModel>>
|
||
11 years ago
|
where TResource : RestResource, new()
|
||
9 years ago
|
where TModel : ModelBase, new()
|
||
11 years ago
|
{
|
||
3 years ago
|
protected string Resource { get; }
|
||
10 years ago
|
private readonly IBroadcastSignalRMessage _signalRBroadcaster;
|
||
11 years ago
|
|
||
3 years ago
|
protected RestControllerWithSignalR(IBroadcastSignalRMessage signalRBroadcaster)
|
||
11 years ago
|
{
|
||
10 years ago
|
_signalRBroadcaster = signalRBroadcaster;
|
||
11 years ago
|
|
||
3 years ago
|
var apiAttribute = GetType().GetCustomAttribute<VersionedApiControllerAttribute>();
|
||
|
if (apiAttribute != null && apiAttribute.Resource != VersionedApiControllerAttribute.CONTROLLER_RESOURCE)
|
||
|
{
|
||
|
Resource = apiAttribute.Resource;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Resource = new TResource().ResourceName.Trim('/');
|
||
|
}
|
||
11 years ago
|
}
|
||
|
|
||
3 years ago
|
[NonAction]
|
||
11 years ago
|
public void Handle(ModelEvent<TModel> message)
|
||
|
{
|
||
5 years ago
|
if (!_signalRBroadcaster.IsConnected)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
5 years ago
|
|
||
11 years ago
|
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)
|
||
|
{
|
||
5 years ago
|
if (!_signalRBroadcaster.IsConnected)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
5 years ago
|
|
||
7 years ago
|
if (action == ModelAction.Deleted)
|
||
|
{
|
||
|
BroadcastResourceChange(action, new TResource { Id = id });
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
var resource = GetResourceById(id);
|
||
|
BroadcastResourceChange(action, resource);
|
||
|
}
|
||
10 years ago
|
}
|
||
11 years ago
|
|
||
10 years ago
|
protected void BroadcastResourceChange(ModelAction action, TResource resource)
|
||
|
{
|
||
4 years ago
|
if (!_signalRBroadcaster.IsConnected || resource == null)
|
||
5 years ago
|
{
|
||
|
return;
|
||
|
}
|
||
5 years ago
|
|
||
6 years ago
|
if (GetType().Namespace.Contains("V1"))
|
||
11 years ago
|
{
|
||
6 years ago
|
var signalRMessage = new SignalRMessage
|
||
|
{
|
||
|
Name = Resource,
|
||
|
Body = new ResourceChangeMessage<TResource>(resource, action),
|
||
|
Action = action
|
||
|
};
|
||
11 years ago
|
|
||
6 years ago
|
_signalRBroadcaster.BroadcastMessage(signalRMessage);
|
||
|
}
|
||
11 years ago
|
}
|
||
|
|
||
|
protected void BroadcastResourceChange(ModelAction action)
|
||
|
{
|
||
5 years ago
|
if (!_signalRBroadcaster.IsConnected)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
5 years ago
|
|
||
7 years ago
|
if (GetType().Namespace.Contains("V1"))
|
||
11 years ago
|
{
|
||
7 years ago
|
var signalRMessage = new SignalRMessage
|
||
|
{
|
||
|
Name = Resource,
|
||
|
Body = new ResourceChangeMessage<TResource>(action),
|
||
|
Action = action
|
||
|
};
|
||
11 years ago
|
|
||
7 years ago
|
_signalRBroadcaster.BroadcastMessage(signalRMessage);
|
||
|
}
|
||
11 years ago
|
}
|
||
|
}
|
||
7 years ago
|
}
|