Files
Disco/Disco.Web/Areas/API/Controllers/JobQueueJobController.cs
T
2025-07-20 11:24:04 +10:00

232 lines
9.7 KiB
C#

using Disco.Models.Repository;
using Disco.Services;
using Disco.Services.Authorization;
using Disco.Services.Jobs.JobQueues;
using Disco.Services.Web;
using System;
using System.Linq;
using System.Web.Mvc;
namespace Disco.Web.Areas.API.Controllers
{
public partial class JobQueueJobController : AuthorizedDatabaseController
{
const string pAddedComment = "addedcomment";
const string pRemovedComment = "removedcomment";
const string pSla = "sla";
const string pPriority = "priority";
public virtual ActionResult Update(int id, string key, string value = null, bool? redirect = null)
{
try
{
if (id < 0)
throw new ArgumentOutOfRangeException("id");
if (string.IsNullOrEmpty(key))
throw new ArgumentNullException("key");
var jobQueueJob = Database.JobQueueJobs.Include("Job").FirstOrDefault(jqj => jqj.Id == id);
if (jobQueueJob != null)
{
switch (key.ToLower())
{
case pAddedComment:
UpdateAddedComment(jobQueueJob, value);
break;
case pRemovedComment:
UpdateRemovedComment(jobQueueJob, value);
break;
case pSla:
UpdateSla(jobQueueJob, value);
break;
case pPriority:
UpdatePriority(jobQueueJob, value);
break;
default:
throw new Exception("Invalid Update Key");
}
}
else
{
throw new Exception("Invalid Job Queue Job Id");
}
if (redirect.HasValue && redirect.Value)
return Redirect(string.Format("{0}#jobDetailTab-Queues", Url.Action(MVC.Job.Show(jobQueueJob.JobId))));
else
return Json("OK", JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
if (redirect.HasValue && redirect.Value)
throw;
else
return Json(string.Format("Error: {0}", ex.Message), JsonRequestBehavior.AllowGet);
}
}
#region Update Shortcut Methods
[DiscoAuthorizeAny(Claims.Job.Properties.JobQueueProperties.EditAnyComments, Claims.Job.Properties.JobQueueProperties.EditOwnComments)]
public virtual ActionResult UpdateAddedComment(int id, string AddedComment = null, bool? redirect = null)
{
return Update(id, pAddedComment, AddedComment, redirect);
}
[DiscoAuthorizeAny(Claims.Job.Properties.JobQueueProperties.EditAnyComments, Claims.Job.Properties.JobQueueProperties.EditOwnComments)]
public virtual ActionResult UpdateRemovedComment(int id, string RemovedComment = null, bool? redirect = null)
{
return Update(id, pRemovedComment, RemovedComment, redirect);
}
[DiscoAuthorizeAny(Claims.Job.Properties.JobQueueProperties.EditAnySLA, Claims.Job.Properties.JobQueueProperties.EditOwnSLA)]
public virtual ActionResult UpdateSla(int id, string SLA = null, bool? redirect = null)
{
return Update(id, pSla, SLA, redirect);
}
[DiscoAuthorizeAny(Claims.Job.Properties.JobQueueProperties.EditAnyPriority, Claims.Job.Properties.JobQueueProperties.EditOwnPriority)]
public virtual ActionResult UpdatePriority(int id, string Priority = null, bool? redirect = null)
{
return Update(id, pPriority, Priority, redirect);
}
[DiscoAuthorizeAny(Claims.Job.Properties.JobQueueProperties.EditAnySLA, Claims.Job.Properties.JobQueueProperties.EditOwnSLA,
Claims.Job.Properties.JobQueueProperties.EditAnyPriority, Claims.Job.Properties.JobQueueProperties.EditOwnPriority)]
public virtual ActionResult UpdateSlaAndPriority(int id, string Sla = null, string Priority = null, bool? redirect = null)
{
try
{
if (id < 0)
throw new ArgumentOutOfRangeException("id");
var jobQueueJob = Database.JobQueueJobs.Include("Job").FirstOrDefault(jqj => jqj.Id == id);
if (jobQueueJob != null)
{
UpdateSla(jobQueueJob, Sla);
UpdatePriority(jobQueueJob, Priority);
}
else
{
throw new Exception("Invalid Job Queue Job Id");
}
if (redirect.HasValue && redirect.Value)
return Redirect(string.Format("{0}#jobDetailTab-Queues", Url.Action(MVC.Job.Show(jobQueueJob.JobId))));
else
return Json("OK", JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
if (redirect.HasValue && redirect.Value)
throw;
else
return Json(string.Format("Error: {0}", ex.Message), JsonRequestBehavior.AllowGet);
}
}
#endregion
#region Update Properties
private void UpdateAddedComment(JobQueueJob jobQueueJob, string AddedComment)
{
if (!jobQueueJob.CanEditAddedComment())
throw new InvalidOperationException("Editing added comment for job queue job is Denied");
jobQueueJob.OnEditAddedComment(AddedComment);
Database.SaveChanges();
}
private void UpdateRemovedComment(JobQueueJob jobQueueJob, string RemovedComment)
{
if (!jobQueueJob.CanEditRemovedComment())
throw new InvalidOperationException("Editing removed comment for job queue job is Denied");
jobQueueJob.OnEditRemovedComment(RemovedComment);
Database.SaveChanges();
}
private void UpdateSla(JobQueueJob jobQueueJob, string Sla)
{
if (!jobQueueJob.CanEditSla())
throw new InvalidOperationException("Editing SLA for job queue job is Denied");
if (!string.IsNullOrEmpty(Sla))
{
DateTime SLADate;
if (DateTime.TryParse(Sla, out SLADate))
{
jobQueueJob.OnEditSla(SLADate);
Database.SaveChanges();
}
else
{
throw new ArgumentException("Unable to Parse SLA Date", "SLA");
}
}
else
{
jobQueueJob.OnEditSla(null);
Database.SaveChanges();
}
}
private void UpdatePriority(JobQueueJob jobQueueJob, string Priority)
{
if (!jobQueueJob.CanEditPriority())
throw new InvalidOperationException("Editing Priority for job queue job is Denied");
JobQueuePriority priority;
if (!Enum.TryParse(Priority, out priority))
throw new ArgumentException("Invalid Priority Value", "Priority");
jobQueueJob.OnEditPriority(priority);
Database.SaveChanges();
}
#endregion
#region Actions
[DiscoAuthorizeAny(Claims.Job.Actions.AddAnyQueues, Claims.Job.Actions.AddOwnQueues)]
public virtual ActionResult AddJob(int id, int JobId, string Comment, int? SLAExpiresMinutes, JobQueuePriority Priority)
{
DateTime? SLAExpires = (SLAExpiresMinutes.HasValue && SLAExpiresMinutes.Value > 0) ? DateTime.Now.AddMinutes(SLAExpiresMinutes.Value) : (DateTime?)null;
var jobQueueToken = JobQueueService.GetQueue(id);
if (jobQueueToken == null)
throw new ArgumentException("Invalid Job Queue Id", "id");
var job = Database.Jobs.Include("JobQueues").FirstOrDefault(j => j.Id == JobId);
if (job == null)
throw new ArgumentException("Invalid Job Id", "JobId");
if (!job.CanAddQueue(jobQueueToken.JobQueue))
throw new InvalidOperationException("Adding job to queue is Denied");
var jobQueueJob = job.OnAddQueue(Database, jobQueueToken.JobQueue, CurrentUser, Comment, SLAExpires, Priority);
Database.SaveChanges();
return Redirect(string.Format("{0}#jobDetailTab-Queues", Url.Action(MVC.Job.Show(job.Id))));
}
[DiscoAuthorizeAny(Claims.Job.Actions.RemoveAnyQueues, Claims.Job.Actions.RemoveOwnQueues)]
public virtual ActionResult RemoveJob(int id, string Comment, bool? CloseJob = null)
{
Database.Configuration.LazyLoadingEnabled = true;
var jobQueueJob = Database.JobQueueJobs.Find(id);
if (jobQueueJob == null)
throw new ArgumentException("Invalid Job Queue Job Id", "id");
if (!jobQueueJob.CanRemove())
throw new InvalidOperationException("Removing job from queue is Denied");
var job = Database.Jobs.Find(jobQueueJob.JobId);
if (job == null)
throw new ArgumentException("Invalid Job Id", "JobId");
jobQueueJob.OnRemove(CurrentUser, Comment);
Database.SaveChanges();
if (CloseJob.HasValue && CloseJob.Value && job.CanCloseNormally())
{
job.OnCloseNormally(Database, Database.Users.Find(CurrentUser.UserId));
Database.SaveChanges();
}
return Redirect(string.Format("{0}#jobDetailTab-Queues", Url.Action(MVC.Job.Show(job.Id))));
}
#endregion
}
}