Files
Disco/Disco.Services/Jobs/JobUpdatesHub.cs
T
2017-03-25 15:29:51 +11:00

123 lines
4.7 KiB
C#

using Disco.Data.Repository;
using Disco.Data.Repository.Monitor;
using Disco.Models.Repository;
using Disco.Services.Authorization;
using Disco.Services.Web.Signalling;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;
using System;
using System.Linq;
using System.Reactive.Linq;
using System.Threading.Tasks;
using Disco.Services.Users;
namespace Disco.Services.Jobs
{
[HubName("jobUpdates"), DiscoHubAuthorize(Claims.Job.Show)]
public class JobUpdatesHub : Hub
{
private const string JobLogsPrefix = "JobLogs_";
private const string JobAttachmentsPrefix = "JobAttachments_";
public static IHubContext HubContext { get; private set; }
private static IDisposable RepositoryBeforeSubscription;
private static IDisposable RepositoryAfterSubscription;
static JobUpdatesHub()
{
HubContext = GlobalHost.ConnectionManager.GetHubContext<JobUpdatesHub>();
// Subscribe to Repository Monitor for Changes
RepositoryBeforeSubscription = RepositoryMonitor.StreamBeforeCommit
.Where(e => (
e.EntityType == typeof(JobLog) && e.EventType == RepositoryMonitorEventType.Deleted ||
e.EntityType == typeof(JobAttachment) && e.EventType == RepositoryMonitorEventType.Deleted
))
.Subscribe(RepositoryEventBefore);
RepositoryAfterSubscription = RepositoryMonitor.StreamAfterCommit
.Where(e => (
e.EntityType == typeof(JobLog) && e.EventType == RepositoryMonitorEventType.Added ||
e.EntityType == typeof(JobAttachment) && e.EventType == RepositoryMonitorEventType.Added
))
.Subscribe(RepositoryAfterEvent);
}
private static string LogsGroupName(int JobId)
{
return JobLogsPrefix + JobId.ToString();
}
private static string AttachmentsGroupName(int JobId)
{
return JobAttachmentsPrefix + JobId.ToString();
}
public override Task OnConnected()
{
int jobId;
string jobIdParam;
jobIdParam = Context.QueryString["JobId"];
if (string.IsNullOrWhiteSpace(jobIdParam))
throw new ArgumentNullException("JobId");
if (!int.TryParse(jobIdParam, out jobId))
throw new ArgumentException("An integer was expected", "JobId");
var userAuth = UserService.GetAuthorization(Context.User.Identity.Name);
if (userAuth.Has(Claims.Job.ShowLogs))
Groups.Add(Context.ConnectionId, LogsGroupName(jobId));
if (userAuth.Has(Claims.Job.ShowAttachments))
Groups.Add(Context.ConnectionId, AttachmentsGroupName(jobId));
return base.OnConnected();
}
private static void RepositoryEventBefore(RepositoryMonitorEvent e)
{
if (e.EventType == RepositoryMonitorEventType.Deleted)
{
if (e.EntityType == typeof(JobLog))
{
var repositoryLog = (JobLog)e.Entity;
int logJobId;
using (DiscoDataContext Database = new DiscoDataContext())
logJobId = Database.JobLogs.Where(l => l.Id == repositoryLog.Id).Select(a => a.JobId).First();
HubContext.Clients.Group(LogsGroupName(logJobId)).removeLog(repositoryLog.Id);
}
if (e.EntityType == typeof(JobAttachment))
{
var repositoryAttachment = (JobAttachment)e.Entity;
int attachmentJobId;
using (DiscoDataContext Database = new DiscoDataContext())
attachmentJobId = Database.JobAttachments.Where(a => a.Id == repositoryAttachment.Id).Select(a => a.JobId).First();
HubContext.Clients.Group(AttachmentsGroupName(attachmentJobId)).removeAttachment(repositoryAttachment.Id);
}
}
}
private static void RepositoryAfterEvent(RepositoryMonitorEvent e)
{
if (e.EventType == RepositoryMonitorEventType.Added)
{
if (e.EntityType == typeof(JobLog))
{
var a = (JobLog)e.Entity;
HubContext.Clients.Group(LogsGroupName(a.JobId)).addLog(a.Id);
}
if (e.EntityType == typeof(JobAttachment))
{
var a = (JobAttachment)e.Entity;
HubContext.Clients.Group(AttachmentsGroupName(a.JobId)).addAttachment(a.Id);
}
}
}
}
}