1
0
mirror of https://github.com/Sonarr/Sonarr.git synced 2026-04-23 22:25:56 -04:00

New: Use ASP.NET Core instead of Nancy

Co-Authored-By: ta264 <ta264@users.noreply.github.com>
This commit is contained in:
Qstick
2021-11-06 15:44:26 -05:00
committed by Mark McDowall
parent b83bb2cade
commit 1169741c54
246 changed files with 4232 additions and 9158 deletions
@@ -0,0 +1,106 @@
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 Sonarr.Http.REST
{
public abstract class RestControllerWithSignalR<TResource, TModel> : RestController<TResource>, IHandle<ModelEvent<TModel>>
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<VersionedApiControllerAttribute>();
if (apiAttribute != null && apiAttribute.Resource != VersionedApiControllerAttribute.CONTROLLER_RESOURCE)
{
Resource = apiAttribute.Resource;
}
else
{
Resource = new TResource().ResourceName.Trim('/');
}
}
[NonAction]
public void Handle(ModelEvent<TModel> 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)
{
return;
}
if (GetType().Namespace.Contains("V3"))
{
var signalRMessage = new SignalRMessage
{
Name = Resource,
Body = new ResourceChangeMessage<TResource>(resource, action),
Action = action
};
_signalRBroadcaster.BroadcastMessage(signalRMessage);
}
}
protected void BroadcastResourceChange(ModelAction action)
{
if (!_signalRBroadcaster.IsConnected)
{
return;
}
if (GetType().Namespace.Contains("V3"))
{
var signalRMessage = new SignalRMessage
{
Name = Resource,
Body = new ResourceChangeMessage<TResource>(action),
Action = action
};
_signalRBroadcaster.BroadcastMessage(signalRMessage);
}
}
}
}