From f0cd3df98a16ea61ce9d200734ddff69422005a2 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sun, 22 Jul 2018 12:04:26 -0400 Subject: [PATCH] Various fixes --- .../Controllers/ChatController.cs | 7 ++---- .../Controllers/DreamDaemonController.cs | 5 +++- .../Controllers/DreamMakerController.cs | 11 +++++++-- .../Controllers/InstanceUserController.cs | 10 ++++---- .../Controllers/JobController.cs | 4 ++-- .../Controllers/ModelController.cs | 8 +++---- src/Tgstation.Server.Host/Core/JobManager.cs | 23 +++++++++++-------- 7 files changed, 38 insertions(+), 30 deletions(-) diff --git a/src/Tgstation.Server.Host/Controllers/ChatController.cs b/src/Tgstation.Server.Host/Controllers/ChatController.cs index 20afd6691e..6cda73d094 100644 --- a/src/Tgstation.Server.Host/Controllers/ChatController.cs +++ b/src/Tgstation.Server.Host/Controllers/ChatController.cs @@ -121,13 +121,10 @@ namespace Tgstation.Server.Host.Controllers /// [TgsAuthorize(ChatSettingsRights.Delete)] - public override async Task Delete([FromBody] Api.Models.ChatSettings model, CancellationToken cancellationToken) + public override async Task Delete(long id, CancellationToken cancellationToken) { - if (model == null) - throw new ArgumentNullException(nameof(model)); - var instance = instanceManager.GetInstance(Instance); - await Task.WhenAll(instance.Chat.DeleteConnection(model.Id, cancellationToken), DatabaseContext.ChatSettings.Where(x => x.Id == model.Id).DeleteAsync(cancellationToken)).ConfigureAwait(false); + await Task.WhenAll(instance.Chat.DeleteConnection(id, cancellationToken), DatabaseContext.ChatSettings.Where(x => x.Id == id).DeleteAsync(cancellationToken)).ConfigureAwait(false); return Ok(); } diff --git a/src/Tgstation.Server.Host/Controllers/DreamDaemonController.cs b/src/Tgstation.Server.Host/Controllers/DreamDaemonController.cs index c1a4a6b673..b5574d49c7 100644 --- a/src/Tgstation.Server.Host/Controllers/DreamDaemonController.cs +++ b/src/Tgstation.Server.Host/Controllers/DreamDaemonController.cs @@ -49,6 +49,7 @@ namespace Tgstation.Server.Host.Controllers [TgsAuthorize(DreamDaemonRights.Start)] public override async Task Create([FromBody] DreamDaemon model, CancellationToken cancellationToken) { + //alias for launching DD var instance = instanceManager.GetInstance(Instance); if (instance.Watchdog.Running) @@ -113,8 +114,9 @@ namespace Tgstation.Server.Host.Controllers /// [TgsAuthorize(DreamDaemonRights.Shutdown)] - public override async Task Delete([FromBody] DreamDaemon model, CancellationToken cancellationToken) + public override async Task Delete(long id, CancellationToken cancellationToken) { + //alias for stopping DD var instance = instanceManager.GetInstance(Instance); if (!instance.Watchdog.Running) @@ -128,6 +130,7 @@ namespace Tgstation.Server.Host.Controllers [TgsAuthorize(DreamDaemonRights.SetAutoStart | DreamDaemonRights.SetPorts | DreamDaemonRights.SetSecurity | DreamDaemonRights.SetWebClient | DreamDaemonRights.SoftRestart | DreamDaemonRights.SoftShutdown | DreamDaemonRights.Start | DreamDaemonRights.SetStartupTimeout)] public override async Task Update([FromBody] DreamDaemon model, CancellationToken cancellationToken) { + //alias for changing DD settings var current = await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).Select(x => x.DreamDaemonSettings).FirstAsync(cancellationToken).ConfigureAwait(false); var userRights = (DreamDaemonRights)AuthenticationContext.GetRight(RightsType.DreamDaemon); diff --git a/src/Tgstation.Server.Host/Controllers/DreamMakerController.cs b/src/Tgstation.Server.Host/Controllers/DreamMakerController.cs index b936a07f87..3437886044 100644 --- a/src/Tgstation.Server.Host/Controllers/DreamMakerController.cs +++ b/src/Tgstation.Server.Host/Controllers/DreamMakerController.cs @@ -75,13 +75,20 @@ namespace Tgstation.Server.Host.Controllers /// [TgsAuthorize(DreamMakerRights.CancelCompile)] - public override async Task Delete([FromBody] Api.Models.DreamMaker model, CancellationToken cancellationToken) + public override async Task Delete(long id, CancellationToken cancellationToken) { //alias for cancelling the latest job var job = await DatabaseContext.CompileJobs.OrderByDescending(x => x.Job.StartedAt).Select(x => new Job { Id = x.Job.Id, StoppedAt = x.Job.StoppedAt }).FirstAsync(cancellationToken).ConfigureAwait(false); if (job.StoppedAt != null) return StatusCode((int)HttpStatusCode.Gone); - await jobManager.CancelJob(job, AuthenticationContext.User, cancellationToken).ConfigureAwait(false); + try + { + await jobManager.CancelJob(job, AuthenticationContext.User, cancellationToken).ConfigureAwait(false); + } + catch (InvalidOperationException) //job already stopped + { + return StatusCode((int)HttpStatusCode.Gone); + } return Ok(); } diff --git a/src/Tgstation.Server.Host/Controllers/InstanceUserController.cs b/src/Tgstation.Server.Host/Controllers/InstanceUserController.cs index abe94e092c..9ddc1d43cc 100644 --- a/src/Tgstation.Server.Host/Controllers/InstanceUserController.cs +++ b/src/Tgstation.Server.Host/Controllers/InstanceUserController.cs @@ -140,7 +140,7 @@ namespace Tgstation.Server.Host.Controllers public override async Task GetId(long id, CancellationToken cancellationToken) { //this functions as userId - var user = await DatabaseContext.Instances.Where(x => x.Id == id).SelectMany(x => x.InstanceUsers).Where(x => x.UserId == id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false); + var user = await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).SelectMany(x => x.InstanceUsers).Where(x => x.UserId == id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false); if (user == default) return NotFound(); return Json(user.ToApi()); @@ -148,13 +148,11 @@ namespace Tgstation.Server.Host.Controllers /// [TgsAuthorize(AdministrationRights.EditUsers)] - public override async Task Delete([FromBody] Api.Models.InstanceUser model, CancellationToken cancellationToken) + public override async Task Delete(long id, CancellationToken cancellationToken) { - var test = StandardModelChecks(model); - if (test != null) - return test; + //id is actually UserId - await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).SelectMany(x => x.InstanceUsers).Where(x => x.UserId == model.UserId).DeleteAsync(cancellationToken).ConfigureAwait(false); + await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).SelectMany(x => x.InstanceUsers).Where(x => x.UserId == id).DeleteAsync(cancellationToken).ConfigureAwait(false); return Ok(); } } diff --git a/src/Tgstation.Server.Host/Controllers/JobController.cs b/src/Tgstation.Server.Host/Controllers/JobController.cs index cefec12234..8219125d29 100644 --- a/src/Tgstation.Server.Host/Controllers/JobController.cs +++ b/src/Tgstation.Server.Host/Controllers/JobController.cs @@ -53,10 +53,10 @@ namespace Tgstation.Server.Host.Controllers /// [TgsAuthorize] - public override async Task Delete([FromBody] Api.Models.Job model, CancellationToken cancellationToken) + public override async Task Delete(long id, CancellationToken cancellationToken) { //don't care if an instance post or not at this point - var job = await DatabaseContext.Jobs.Where(x => x.Id == model.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false); + var job = await DatabaseContext.Jobs.Where(x => x.Id == id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false); if (job == default(Job)) return NotFound(); diff --git a/src/Tgstation.Server.Host/Controllers/ModelController.cs b/src/Tgstation.Server.Host/Controllers/ModelController.cs index aec3cf3769..54ea395d7e 100644 --- a/src/Tgstation.Server.Host/Controllers/ModelController.cs +++ b/src/Tgstation.Server.Host/Controllers/ModelController.cs @@ -46,8 +46,8 @@ namespace Tgstation.Server.Host.Controllers /// /// Attempt to get a specific a /// - /// The for the operation /// The ID of the model to get + /// The for the operation /// A resulting in the of the operation [HttpGet("/{0}")] public virtual Task GetId(long id, CancellationToken cancellationToken) => Task.FromResult((IActionResult)NotFound()); @@ -62,13 +62,13 @@ namespace Tgstation.Server.Host.Controllers public virtual Task Update([FromBody]TModel model, CancellationToken cancellationToken) => Task.FromResult((IActionResult)NotFound()); /// - /// Attempt to delete a + /// Attempt to delete a model with a particular /// - /// The being deleted + /// The ID of the model to delete /// The for the operation /// A resulting in the of the operation [HttpDelete] - public virtual Task Delete([FromBody]TModel model, CancellationToken cancellationToken) => Task.FromResult((IActionResult)NotFound()); + public virtual Task Delete(long id, CancellationToken cancellationToken) => Task.FromResult((IActionResult)NotFound()); /// /// Attempt to list entries of the diff --git a/src/Tgstation.Server.Host/Core/JobManager.cs b/src/Tgstation.Server.Host/Core/JobManager.cs index 03f12ef437..2f0dcc2a94 100644 --- a/src/Tgstation.Server.Host/Core/JobManager.cs +++ b/src/Tgstation.Server.Host/Core/JobManager.cs @@ -149,16 +149,19 @@ namespace Tgstation.Server.Host.Core /// public async Task CancelJob(Job job, User user, CancellationToken cancellationToken) { - if (user != null) - using (var scope = serviceProvider.CreateScope()) - { - var databaseContext = scope.ServiceProvider.GetRequiredService(); - job = new Job { Id = job.Id }; - databaseContext.Jobs.Attach(job); - job.CancelledBy = user; - await databaseContext.Save(cancellationToken).ConfigureAwait(false); - } - CheckGetJob(job).Cancel(); + if (job == null) + throw new ArgumentNullException(nameof(job)); + if (user == null) + throw new ArgumentNullException(nameof(user)); + CheckGetJob(job).Cancel(); //this will ensure the db update is only done once + using (var scope = serviceProvider.CreateScope()) + { + var databaseContext = scope.ServiceProvider.GetRequiredService(); + job = new Job { Id = job.Id }; + databaseContext.Jobs.Attach(job); + job.CancelledBy = user; + await databaseContext.Save(cancellationToken).ConfigureAwait(false); + } } } }