27c21175d7
Migrate much of BI to Services. Added Wireless Profile Provider plugin feature. Added Certificate Authority Provider plugin feature. Modified Certificate Provider plugin feature. Database migration v17, for Device Profiles. Enrolment Client Updated to support CA Certificates, Wireless Profiles and Hardware Info. New Client Enrolment Protocol to support new features. Plugin Manifest Generator added to main solution. Improved AD search performance.
214 lines
7.6 KiB
C#
214 lines
7.6 KiB
C#
using Disco.Data.Repository;
|
|
using Disco.Models.Repository;
|
|
using Disco.Services.Authorization;
|
|
using Disco.Services.Jobs.JobQueues;
|
|
using Disco.Services.Users;
|
|
using System;
|
|
using System.Linq;
|
|
|
|
namespace Disco.Services
|
|
{
|
|
public static class JobQueueExtensions
|
|
{
|
|
|
|
#region Edit Sla
|
|
public static bool CanEditSla(this JobQueueJob jqj)
|
|
{
|
|
if (jqj.RemovedDate.HasValue)
|
|
return false;
|
|
|
|
if (UserService.CurrentAuthorization.Has(Claims.Job.Properties.JobQueueProperties.EditAnySLA))
|
|
{
|
|
// Can edit ANY queue
|
|
return true;
|
|
}
|
|
else if (UserService.CurrentAuthorization.Has(Claims.Job.Properties.JobQueueProperties.EditOwnSLA))
|
|
{
|
|
// Can edit from OWN queue
|
|
return JobQueueService.UsersQueues(UserService.CurrentUser).Any(q => q.JobQueue.Id == jqj.JobQueueId);
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
public static void OnEditSla(this JobQueueJob jqj, DateTime? SlaExpiresDate)
|
|
{
|
|
if (!jqj.CanEditSla())
|
|
throw new InvalidOperationException("Editing job SLA for this queue is denied");
|
|
|
|
if (SlaExpiresDate.HasValue && jqj.AddedDate > SlaExpiresDate.Value)
|
|
throw new ArgumentException("The SLA Expires Date must be greater than the Added Date", "SLAExpiresDate");
|
|
|
|
jqj.SLAExpiresDate = SlaExpiresDate;
|
|
}
|
|
#endregion
|
|
|
|
#region Edit Priority
|
|
public static bool CanEditPriority(this JobQueueJob jqj)
|
|
{
|
|
if (jqj.RemovedDate.HasValue)
|
|
return false;
|
|
|
|
if (UserService.CurrentAuthorization.Has(Claims.Job.Properties.JobQueueProperties.EditAnyPriority))
|
|
{
|
|
// Can edit ANY queue
|
|
return true;
|
|
}
|
|
else if (UserService.CurrentAuthorization.Has(Claims.Job.Properties.JobQueueProperties.EditOwnPriority))
|
|
{
|
|
// Can edit from OWN queue
|
|
return JobQueueService.UsersQueues(UserService.CurrentUser).Any(q => q.JobQueue.Id == jqj.JobQueueId);
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
public static void OnEditPriority(this JobQueueJob jqj, JobQueuePriority Priority)
|
|
{
|
|
if (!jqj.CanEditPriority())
|
|
throw new InvalidOperationException("Editing job priority for this queue is denied");
|
|
|
|
jqj.Priority = Priority;
|
|
}
|
|
#endregion
|
|
|
|
#region Edit Comments
|
|
private static bool CanEditComments(this JobQueueJob jqj)
|
|
{
|
|
if (UserService.CurrentAuthorization.Has(Claims.Job.Properties.JobQueueProperties.EditAnyComments))
|
|
{
|
|
// Can edit ANY queue
|
|
return true;
|
|
}
|
|
else if (UserService.CurrentAuthorization.Has(Claims.Job.Properties.JobQueueProperties.EditOwnComments))
|
|
{
|
|
// Can edit from OWN queue
|
|
return JobQueueService.UsersQueues(UserService.CurrentUser).Any(q => q.JobQueue.Id == jqj.JobQueueId);
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
public static bool CanEditAddedComment(this JobQueueJob jqj)
|
|
{
|
|
return jqj.CanEditComments();
|
|
}
|
|
public static bool CanEditRemovedComment(this JobQueueJob jqj)
|
|
{
|
|
if (!jqj.RemovedDate.HasValue)
|
|
return false;
|
|
|
|
return jqj.CanEditComments();
|
|
}
|
|
public static void OnEditAddedComment(this JobQueueJob jqj, string AddedComment)
|
|
{
|
|
if (!jqj.CanEditAddedComment())
|
|
throw new InvalidOperationException("Editing job added comments for this queue is denied");
|
|
|
|
jqj.AddedComment = string.IsNullOrWhiteSpace(AddedComment) ? null : AddedComment.Trim();
|
|
}
|
|
public static void OnEditRemovedComment(this JobQueueJob jqj, string RemovedComment)
|
|
{
|
|
if (!jqj.CanEditRemovedComment())
|
|
throw new InvalidOperationException("Editing job removed comments for this queue is denied");
|
|
|
|
jqj.RemovedComment = string.IsNullOrWhiteSpace(RemovedComment) ? null : RemovedComment.Trim();
|
|
}
|
|
#endregion
|
|
|
|
#region Remove
|
|
public static bool CanRemove(this JobQueueJob jqj)
|
|
{
|
|
if (jqj.RemovedDate.HasValue)
|
|
return false;
|
|
|
|
if (UserService.CurrentAuthorization.Has(Claims.Job.Actions.RemoveAnyQueues))
|
|
{
|
|
// Can remove from ANY queue
|
|
return true;
|
|
}
|
|
else if (UserService.CurrentAuthorization.Has(Claims.Job.Actions.RemoveOwnQueues))
|
|
{
|
|
// Can remove from OWN queue
|
|
return JobQueueService.UsersQueues(UserService.CurrentUser).Any(q => q.JobQueue.Id == jqj.JobQueueId);
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
public static void OnRemove(this JobQueueJob jqj, User Technician, string Comment)
|
|
{
|
|
if (!jqj.CanRemove())
|
|
throw new InvalidOperationException("Removing job from queue is denied");
|
|
|
|
jqj.RemovedDate = DateTime.Now;
|
|
jqj.RemovedUserId = Technician.UserId;
|
|
jqj.RemovedComment = string.IsNullOrWhiteSpace(Comment) ? null : Comment.Trim();
|
|
}
|
|
#endregion
|
|
|
|
#region Add
|
|
public static bool CanAddQueues(this Job j)
|
|
{
|
|
// Job Closed?
|
|
if (j.ClosedDate.HasValue)
|
|
return false;
|
|
|
|
if (UserService.CurrentAuthorization.HasAny(Claims.Job.Actions.AddAnyQueues, Claims.Job.Actions.AddOwnQueues))
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
public static bool CanAddQueue(this Job j, JobQueue jq)
|
|
{
|
|
// Shortcut
|
|
if (!j.CanAddQueues())
|
|
return false;
|
|
|
|
// Already in Queue?
|
|
if (j.JobQueues.Any(jjq => !jjq.RemovedDate.HasValue && jjq.JobQueueId == jq.Id))
|
|
return false;
|
|
|
|
// Can add ANY queue
|
|
if (UserService.CurrentAuthorization.Has(Claims.Job.Actions.AddAnyQueues))
|
|
return true;
|
|
|
|
// Can add OWN queue
|
|
if (UserService.CurrentAuthorization.Has(Claims.Job.Actions.AddOwnQueues))
|
|
{
|
|
return JobQueueService.UsersQueues(UserService.CurrentUser).Any(q => q.JobQueue.Id == jq.Id);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
public static JobQueueJob OnAddQueue(this Job j, DiscoDataContext Database, JobQueue jq, User Technician, string Comment, DateTime? SLAExpires, JobQueuePriority Priority)
|
|
{
|
|
if (!j.CanAddQueue(jq))
|
|
throw new InvalidOperationException("Adding job to queue is denied");
|
|
|
|
if (SLAExpires.HasValue && SLAExpires.Value < DateTime.Now)
|
|
throw new ArgumentException("The SLA Date must be greater than the current time", "SLAExpires");
|
|
|
|
var jqj = new JobQueueJob()
|
|
{
|
|
JobQueueId = jq.Id,
|
|
JobId = j.Id,
|
|
AddedDate = DateTime.Now,
|
|
AddedUserId = Technician.UserId,
|
|
AddedComment = string.IsNullOrWhiteSpace(Comment) ? null : Comment.Trim(),
|
|
SLAExpiresDate = SLAExpires,
|
|
Priority = Priority
|
|
};
|
|
|
|
Database.JobQueueJobs.Add(jqj);
|
|
return jqj;
|
|
}
|
|
#endregion
|
|
|
|
}
|
|
}
|