diff --git a/src/Tgstation.Server.Api/Routes.cs b/src/Tgstation.Server.Api/Routes.cs
index 2ba4b4b19b..6a2da6c8f0 100644
--- a/src/Tgstation.Server.Api/Routes.cs
+++ b/src/Tgstation.Server.Api/Routes.cs
@@ -78,6 +78,11 @@ namespace Tgstation.Server.Api
///
public const string Jobs = Root + nameof(Models.Job);
+ ///
+ /// The postfix for list operations
+ ///
+ public const string List = "List";
+
///
/// Apply an postfix to a
///
@@ -91,6 +96,6 @@ namespace Tgstation.Server.Api
///
/// The route
/// The with /List appended
- public static string List(string route) => String.Format(CultureInfo.InvariantCulture, "{0}/List", route);
+ public static string ListRoute(string route) => String.Format(CultureInfo.InvariantCulture, "{0}/{1}", route, List);
}
}
diff --git a/src/Tgstation.Server.Client/Components/ByondClient.cs b/src/Tgstation.Server.Client/Components/ByondClient.cs
index f3675dc265..23d56dc64a 100644
--- a/src/Tgstation.Server.Client/Components/ByondClient.cs
+++ b/src/Tgstation.Server.Client/Components/ByondClient.cs
@@ -35,7 +35,7 @@ namespace Tgstation.Server.Client.Components
public Task ActiveVersion(CancellationToken cancellationToken) => apiClient.Read(Routes.Byond, instance.Id, cancellationToken);
///
- public Task> InstalledVersions(CancellationToken cancellationToken) => apiClient.Read>(Routes.List(Routes.Byond), instance.Id, cancellationToken);
+ public Task> InstalledVersions(CancellationToken cancellationToken) => apiClient.Read>(Routes.ListRoute(Routes.Byond), instance.Id, cancellationToken);
///
public Task SetActiveVersion(Byond byond, CancellationToken cancellationToken) => apiClient.Update(Routes.Byond, byond ?? throw new ArgumentNullException(nameof(byond)), instance.Id, cancellationToken);
diff --git a/src/Tgstation.Server.Client/Components/ChatBotsClient.cs b/src/Tgstation.Server.Client/Components/ChatBotsClient.cs
index f7890f1f22..5a05e8c930 100644
--- a/src/Tgstation.Server.Client/Components/ChatBotsClient.cs
+++ b/src/Tgstation.Server.Client/Components/ChatBotsClient.cs
@@ -38,7 +38,7 @@ namespace Tgstation.Server.Client.Components
public Task Delete(ChatBot settings, CancellationToken cancellationToken) => apiClient.Delete(Routes.SetID(Routes.Chat, settings?.Id ?? throw new ArgumentNullException(nameof(settings))), instance.Id, cancellationToken);
///
- public Task> List(CancellationToken cancellationToken) => apiClient.Read>(Routes.List(Routes.Chat), instance.Id, cancellationToken);
+ public Task> List(CancellationToken cancellationToken) => apiClient.Read>(Routes.ListRoute(Routes.Chat), instance.Id, cancellationToken);
///
public Task Update(ChatBot settings, CancellationToken cancellationToken) => apiClient.Update(Routes.Chat, settings ?? throw new ArgumentNullException(nameof(settings)), instance.Id, cancellationToken);
diff --git a/src/Tgstation.Server.Client/Components/ConfigurationClient.cs b/src/Tgstation.Server.Client/Components/ConfigurationClient.cs
index 54dc6acf39..4063e73963 100644
--- a/src/Tgstation.Server.Client/Components/ConfigurationClient.cs
+++ b/src/Tgstation.Server.Client/Components/ConfigurationClient.cs
@@ -52,7 +52,7 @@ namespace Tgstation.Server.Client.Components
public Task CreateDirectory(ConfigurationFile directory, CancellationToken cancellationToken) => apiClient.Create(Routes.Configuration, directory, instance.Id, cancellationToken);
///
- public Task> List(string directory, CancellationToken cancellationToken) => apiClient.Read>(Routes.List(Routes.Configuration) + SanitizeGetPath(directory), instance.Id, cancellationToken);
+ public Task> List(string directory, CancellationToken cancellationToken) => apiClient.Read>(Routes.ListRoute(Routes.Configuration) + SanitizeGetPath(directory), instance.Id, cancellationToken);
///
public Task Read(ConfigurationFile file, CancellationToken cancellationToken)
diff --git a/src/Tgstation.Server.Client/Components/DreamMakerClient.cs b/src/Tgstation.Server.Client/Components/DreamMakerClient.cs
index 942d252812..d08c587194 100644
--- a/src/Tgstation.Server.Client/Components/DreamMakerClient.cs
+++ b/src/Tgstation.Server.Client/Components/DreamMakerClient.cs
@@ -38,7 +38,7 @@ namespace Tgstation.Server.Client.Components
public Task GetCompileJob(CompileJob compileJob, CancellationToken cancellationToken) => apiClient.Read(Routes.SetID(Routes.DreamMaker, compileJob?.Id ?? throw new ArgumentNullException(nameof(compileJob))), instance.Id, cancellationToken);
///
- public Task> GetJobIds(CancellationToken cancellationToken) => apiClient.Read>(Routes.List(Routes.DreamMaker), instance.Id, cancellationToken);
+ public Task> GetJobIds(CancellationToken cancellationToken) => apiClient.Read>(Routes.ListRoute(Routes.DreamMaker), instance.Id, cancellationToken);
///
public Task Read(CancellationToken cancellationToken) => apiClient.Read(Routes.DreamMaker, instance.Id, cancellationToken);
diff --git a/src/Tgstation.Server.Client/Components/InstanceUserClient.cs b/src/Tgstation.Server.Client/Components/InstanceUserClient.cs
index 440340b6c4..cc9757f00b 100644
--- a/src/Tgstation.Server.Client/Components/InstanceUserClient.cs
+++ b/src/Tgstation.Server.Client/Components/InstanceUserClient.cs
@@ -44,7 +44,7 @@ namespace Tgstation.Server.Client.Components
public Task Update(InstanceUser instanceUser, CancellationToken cancellationToken) => apiClient.Update(Routes.InstanceUser, instanceUser ?? throw new ArgumentNullException(nameof(instanceUser)), instance.Id, cancellationToken);
///
- public Task> List(CancellationToken cancellationToken) => apiClient.Read>(Routes.List(Routes.InstanceUser), instance.Id, cancellationToken);
+ public Task> List(CancellationToken cancellationToken) => apiClient.Read>(Routes.ListRoute(Routes.InstanceUser), instance.Id, cancellationToken);
///
public Task GetId(InstanceUser instanceUser, CancellationToken cancellationToken) => apiClient.Read(Routes.SetID(Routes.InstanceUser, instanceUser?.UserId ?? throw new ArgumentNullException(nameof(instanceUser))), instance.Id, cancellationToken);
diff --git a/src/Tgstation.Server.Client/Components/JobsClient.cs b/src/Tgstation.Server.Client/Components/JobsClient.cs
index d6c421e65d..d673abfc41 100644
--- a/src/Tgstation.Server.Client/Components/JobsClient.cs
+++ b/src/Tgstation.Server.Client/Components/JobsClient.cs
@@ -35,7 +35,7 @@ namespace Tgstation.Server.Client.Components
public Task Cancel(Job job, CancellationToken cancellationToken) => apiClient.Delete(Routes.SetID(Routes.Jobs, job?.Id ?? throw new ArgumentNullException(nameof(job))), instance.Id, cancellationToken);
///
- public Task> List(CancellationToken cancellationToken) => apiClient.Read>(Routes.List(Routes.Jobs), instance.Id, cancellationToken);
+ public Task> List(CancellationToken cancellationToken) => apiClient.Read>(Routes.ListRoute(Routes.Jobs), instance.Id, cancellationToken);
///
public Task> ListActive(CancellationToken cancellationToken) => apiClient.Read>(Routes.Jobs, instance.Id, cancellationToken);
diff --git a/src/Tgstation.Server.Client/InstanceManagerClient.cs b/src/Tgstation.Server.Client/InstanceManagerClient.cs
index 62d99de98d..aa5458f0e6 100644
--- a/src/Tgstation.Server.Client/InstanceManagerClient.cs
+++ b/src/Tgstation.Server.Client/InstanceManagerClient.cs
@@ -39,7 +39,7 @@ namespace Tgstation.Server.Client
public Task Detach(Instance instance, CancellationToken cancellationToken) => apiClient.Delete(Routes.SetID(Routes.InstanceManager, instance?.Id ?? throw new ArgumentNullException(nameof(instance))), cancellationToken);
///
- public Task> List(CancellationToken cancellationToken) => apiClient.Read>(Routes.List(Routes.InstanceManager), cancellationToken);
+ public Task> List(CancellationToken cancellationToken) => apiClient.Read>(Routes.ListRoute(Routes.InstanceManager), cancellationToken);
///
public Task Update(Instance instance, CancellationToken cancellationToken) => apiClient.Update(Routes.InstanceManager, instance ?? throw new ArgumentNullException(nameof(instance)), cancellationToken);
diff --git a/src/Tgstation.Server.Client/UsersClient.cs b/src/Tgstation.Server.Client/UsersClient.cs
index 1e6c5fd45e..9d4aa53de6 100644
--- a/src/Tgstation.Server.Client/UsersClient.cs
+++ b/src/Tgstation.Server.Client/UsersClient.cs
@@ -31,7 +31,7 @@ namespace Tgstation.Server.Client
public Task GetId(User user, CancellationToken cancellationToken) => apiClient.Read(Routes.SetID(Routes.User, user?.Id ?? throw new ArgumentNullException(nameof(user))), cancellationToken);
///
- public Task> List(CancellationToken cancellationToken) => apiClient.Read>(Routes.List(Routes.User), cancellationToken);
+ public Task> List(CancellationToken cancellationToken) => apiClient.Read>(Routes.ListRoute(Routes.User), cancellationToken);
///
public Task Read(CancellationToken cancellationToken) => apiClient.Read(Routes.User, cancellationToken);
diff --git a/src/Tgstation.Server.Host/Controllers/AdministrationController.cs b/src/Tgstation.Server.Host/Controllers/AdministrationController.cs
index 0cdf62a0a2..0914dc5d78 100644
--- a/src/Tgstation.Server.Host/Controllers/AdministrationController.cs
+++ b/src/Tgstation.Server.Host/Controllers/AdministrationController.cs
@@ -22,10 +22,10 @@ using Tgstation.Server.Host.Security;
namespace Tgstation.Server.Host.Controllers
{
///
- /// for
+ /// for purposes
///
[Route(Routes.Administration)]
- public sealed class AdministrationController : ModelController
+ public sealed class AdministrationController : ApiController
{
const string RestartNotSupportedException = "This deployment of tgstation-server is lacking the Tgstation.Server.Host.Watchdog component. Restarts and version changes cannot be completed!";
@@ -79,7 +79,7 @@ namespace Tgstation.Server.Host.Controllers
/// The for the
/// The containing value of
/// The containing value of
- public AdministrationController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IGitHubClientFactory gitHubClientFactory, IServerControl serverUpdater, IApplication application, IIOManager ioManager, IPlatformIdentifier platformIdentifier, ILogger logger, IOptions updatesConfigurationOptions, IOptions generalConfigurationOptions) : base(databaseContext, authenticationContextFactory, logger, false)
+ public AdministrationController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IGitHubClientFactory gitHubClientFactory, IServerControl serverUpdater, IApplication application, IIOManager ioManager, IPlatformIdentifier platformIdentifier, ILogger logger, IOptions updatesConfigurationOptions, IOptions generalConfigurationOptions) : base(databaseContext, authenticationContextFactory, logger, false, true)
{
this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
this.serverUpdater = serverUpdater ?? throw new ArgumentNullException(nameof(serverUpdater));
@@ -152,12 +152,12 @@ namespace Tgstation.Server.Host.Controllers
IGitHubClient GetGitHubClient() => String.IsNullOrEmpty(generalConfiguration.GitHubAccessToken) ? gitHubClientFactory.CreateClient() : gitHubClientFactory.CreateClient(generalConfiguration.GitHubAccessToken);
- ///
+ [HttpGet]
[TgsAuthorize]
[ProducesResponseType(typeof(Administration), 200)]
[ProducesResponseType(424)]
[ProducesResponseType(429)]
- public override async Task Read(CancellationToken cancellationToken)
+ public async Task Read(CancellationToken cancellationToken)
{
try
{
@@ -199,10 +199,10 @@ namespace Tgstation.Server.Host.Controllers
}
}
- ///
+ [HttpPost]
[TgsAuthorize(AdministrationRights.ChangeVersion)]
[ProducesResponseType(typeof(ErrorMessage), 422)]
- public override async Task Update([FromBody] Administration model, CancellationToken cancellationToken)
+ public async Task Update([FromBody] Administration model, CancellationToken cancellationToken)
{
if (model == null)
throw new ArgumentNullException(nameof(model));
diff --git a/src/Tgstation.Server.Host/Controllers/ByondController.cs b/src/Tgstation.Server.Host/Controllers/ByondController.cs
index 717fd136bb..7b7e11bc36 100644
--- a/src/Tgstation.Server.Host/Controllers/ByondController.cs
+++ b/src/Tgstation.Server.Host/Controllers/ByondController.cs
@@ -20,7 +20,7 @@ namespace Tgstation.Server.Host.Controllers
/// Controller for managing s
///
[Route(Routes.Byond)]
- public sealed class ByondController : ModelController
+ public sealed class ByondController : ApiController
{
///
/// The for the
@@ -40,35 +40,35 @@ namespace Tgstation.Server.Host.Controllers
/// The value of
/// The value of
/// The for the
- public ByondController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IJobManager jobManager, ILogger logger) : base(databaseContext, authenticationContextFactory, logger, true)
+ public ByondController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IJobManager jobManager, ILogger logger) : base(databaseContext, authenticationContextFactory, logger, true, true)
{
this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
}
- ///
+ [HttpGet]
[TgsAuthorize(ByondRights.ReadActive)]
[ProducesResponseType(typeof(Api.Models.Byond), 200)]
- public override Task Read(CancellationToken cancellationToken) => Task.FromResult(
+ public Task Read(CancellationToken cancellationToken) => Task.FromResult(
Json(new Api.Models.Byond
{
Version = instanceManager.GetInstance(Instance).ByondManager.ActiveVersion
}));
- ///
+ [HttpGet(Routes.List)]
[TgsAuthorize(ByondRights.ListInstalled)]
[ProducesResponseType(typeof(IEnumerable), 200)]
- public override Task List(CancellationToken cancellationToken) => Task.FromResult(
+ public Task List(CancellationToken cancellationToken) => Task.FromResult(
Json(instanceManager.GetInstance(Instance).ByondManager.InstalledVersions.Select(x => new Api.Models.Byond
{
Version = x
})));
- ///
+ [HttpPost]
[TgsAuthorize(ByondRights.ChangeVersion)]
[ProducesResponseType(typeof(Api.Models.Byond), 200)]
[ProducesResponseType(typeof(Api.Models.Byond), 202)]
- public override async Task Update([FromBody] Api.Models.Byond model, CancellationToken cancellationToken)
+ public async Task Update([FromBody] Api.Models.Byond model, CancellationToken cancellationToken)
{
if (model == null)
throw new ArgumentNullException(nameof(model));
diff --git a/src/Tgstation.Server.Host/Controllers/ChatController.cs b/src/Tgstation.Server.Host/Controllers/ChatController.cs
index 695fb0cd03..a83ed01dda 100644
--- a/src/Tgstation.Server.Host/Controllers/ChatController.cs
+++ b/src/Tgstation.Server.Host/Controllers/ChatController.cs
@@ -20,10 +20,10 @@ using Z.EntityFramework.Plus;
namespace Tgstation.Server.Host.Controllers
{
///
- /// for managing s
+ /// for managing s
///
[Route(Routes.Chat)]
- public sealed class ChatController : ModelController
+ public sealed class ChatController : ApiController
{
///
/// The for the
@@ -37,7 +37,7 @@ namespace Tgstation.Server.Host.Controllers
/// The for the
/// The value of
/// The for the
- public ChatController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, ILogger logger) : base(databaseContext, authenticationContextFactory, logger, true)
+ public ChatController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, ILogger logger) : base(databaseContext, authenticationContextFactory, logger, true, true)
{
this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
}
@@ -57,10 +57,10 @@ namespace Tgstation.Server.Host.Controllers
Tag = api.Tag
};
- ///
+ [HttpPut]
[TgsAuthorize(ChatBotRights.Create)]
[ProducesResponseType(typeof(Api.Models.ChatBot), 201)]
- public override async Task Create([FromBody] Api.Models.ChatBot model, CancellationToken cancellationToken)
+ public async Task Create([FromBody] Api.Models.ChatBot model, CancellationToken cancellationToken)
{
if (model == null)
throw new ArgumentNullException(nameof(model));
@@ -130,10 +130,10 @@ namespace Tgstation.Server.Host.Controllers
return StatusCode((int)HttpStatusCode.Created, dbModel.ToApi());
}
- ///
+ [HttpDelete]
[TgsAuthorize(ChatBotRights.Delete)]
[ProducesResponseType(200)]
- public override async Task Delete(long id, CancellationToken cancellationToken)
+ public async Task Delete(long id, CancellationToken cancellationToken)
{
var instance = instanceManager.GetInstance(Instance);
await Task.WhenAll(instance.Chat.DeleteConnection(id, cancellationToken), DatabaseContext.ChatBots.Where(x => x.Id == id).DeleteAsync(cancellationToken)).ConfigureAwait(false);
@@ -141,10 +141,10 @@ namespace Tgstation.Server.Host.Controllers
return Ok();
}
- ///
+ [HttpGet(Routes.List)]
[TgsAuthorize(ChatBotRights.Read)]
[ProducesResponseType(typeof(IEnumerable), 200)]
- public override async Task List(CancellationToken cancellationToken)
+ public async Task List(CancellationToken cancellationToken)
{
var query = DatabaseContext.ChatBots.Where(x => x.InstanceId == Instance.Id).Include(x => x.Channels);
@@ -159,11 +159,11 @@ namespace Tgstation.Server.Host.Controllers
return Json(results.Select(x => x.ToApi()));
}
- ///
+ [HttpGet("{id}")]
[TgsAuthorize(ChatBotRights.Read)]
[ProducesResponseType(typeof(Api.Models.ChatBot), 200)]
[ProducesResponseType(410)]
- public override async Task GetId(long id, CancellationToken cancellationToken)
+ public async Task GetId(long id, CancellationToken cancellationToken)
{
var query = DatabaseContext.ChatBots.Where(x => x.Id == id).Include(x => x.Channels);
@@ -179,12 +179,12 @@ namespace Tgstation.Server.Host.Controllers
return Json(results.ToApi());
}
- ///
- #pragma warning disable CA1506 // TODO: Decomplexify
+ [HttpGet]
[TgsAuthorize(ChatBotRights.WriteChannels | ChatBotRights.WriteConnectionString | ChatBotRights.WriteEnabled | ChatBotRights.WriteName | ChatBotRights.WriteProvider)]
[ProducesResponseType(200)]
[ProducesResponseType(typeof(Api.Models.ChatBot), 200)]
- public override async Task Update([FromBody] Api.Models.ChatBot model, CancellationToken cancellationToken)
+ #pragma warning disable CA1506 // TODO: Decomplexify
+ public async Task Update([FromBody] Api.Models.ChatBot model, CancellationToken cancellationToken)
{
if (model == null)
throw new ArgumentNullException(nameof(model));
diff --git a/src/Tgstation.Server.Host/Controllers/ConfigurationController.cs b/src/Tgstation.Server.Host/Controllers/ConfigurationController.cs
index b2849e30b7..9144c9677a 100644
--- a/src/Tgstation.Server.Host/Controllers/ConfigurationController.cs
+++ b/src/Tgstation.Server.Host/Controllers/ConfigurationController.cs
@@ -17,10 +17,10 @@ using Tgstation.Server.Host.Security;
namespace Tgstation.Server.Host.Controllers
{
///
- /// The for s
+ /// The for s
///
[Route(Routes.Configuration)]
- public sealed class ConfigurationController : ModelController
+ public sealed class ConfigurationController : ApiController
{
///
/// The for the
@@ -40,7 +40,7 @@ namespace Tgstation.Server.Host.Controllers
/// The value of
/// The value of
/// The for the
- public ConfigurationController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IIOManager ioManager, ILogger logger) : base(databaseContext, authenticationContextFactory, logger, true)
+ public ConfigurationController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IIOManager ioManager, ILogger logger) : base(databaseContext, authenticationContextFactory, logger, true, true)
{
this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
@@ -64,12 +64,12 @@ namespace Tgstation.Server.Host.Controllers
return false;
}
- ///
+ [HttpPost]
[TgsAuthorize(ConfigurationRights.Write)]
[ProducesResponseType(typeof(ConfigurationFile), 200)]
[ProducesResponseType(typeof(ConfigurationFile), 201)]
[ProducesResponseType(501)]
- public override async Task Update([FromBody] ConfigurationFile model, CancellationToken cancellationToken)
+ public async Task Update([FromBody] ConfigurationFile model, CancellationToken cancellationToken)
{
if (model == null)
throw new ArgumentNullException(nameof(model));
@@ -110,6 +110,8 @@ namespace Tgstation.Server.Host.Controllers
/// The path of the file to get
/// The for the operation
/// A resulting in the for the operation
+ /// File not found on disk.
+ /// POSIX system impersonation requested but not implemented.
[HttpGet(Routes.File + "/{*filePath}")]
[TgsAuthorize(ConfigurationRights.Read)]
[ProducesResponseType(typeof(ConfigurationFile), 200)]
@@ -148,7 +150,9 @@ namespace Tgstation.Server.Host.Controllers
/// The path of the directory to get
/// The for the operation
/// A resulting in the for the operation
- [HttpGet("List/{*directoryPath}")]
+ /// Directory not found on disk.
+ /// POSIX system impersonation requested but not implemented.
+ [HttpGet(Routes.List + "/{*directoryPath}")]
[TgsAuthorize(ConfigurationRights.List)]
[ProducesResponseType(typeof(IReadOnlyList), 200)]
[ProducesResponseType(410)]
@@ -176,20 +180,20 @@ namespace Tgstation.Server.Host.Controllers
}
}
- ///
+ [HttpGet(Routes.List)]
[TgsAuthorize(ConfigurationRights.List)]
[ProducesResponseType(typeof(IReadOnlyList), 200)]
[ProducesResponseType(410)]
[ProducesResponseType(501)]
- public override Task List(CancellationToken cancellationToken) => Directory(null, cancellationToken);
+ public Task List(CancellationToken cancellationToken) => Directory(null, cancellationToken);
- ///
+ [HttpPut]
[TgsAuthorize(ConfigurationRights.Write)]
[ProducesResponseType(typeof(ConfigurationFile), 200)]
[ProducesResponseType(typeof(ConfigurationFile), 201)]
[ProducesResponseType(410)]
[ProducesResponseType(501)]
- public override async Task Create([FromBody] ConfigurationFile model, CancellationToken cancellationToken)
+ public async Task Create([FromBody] ConfigurationFile model, CancellationToken cancellationToken)
{
if (model == null)
throw new ArgumentNullException(nameof(model));
@@ -226,6 +230,8 @@ namespace Tgstation.Server.Host.Controllers
/// A representing the path to the directory to delete
/// The for the operation
/// A resulting in the of the operation
+ /// Empty directory deleted successfully.
+ /// POSIX system impersonation requested but not implemented.
[HttpDelete]
[TgsAuthorize(ConfigurationRights.Delete)]
[ProducesResponseType(200)]
diff --git a/src/Tgstation.Server.Host/Controllers/DreamDaemonController.cs b/src/Tgstation.Server.Host/Controllers/DreamDaemonController.cs
index 06994df6b6..ca86960519 100644
--- a/src/Tgstation.Server.Host/Controllers/DreamDaemonController.cs
+++ b/src/Tgstation.Server.Host/Controllers/DreamDaemonController.cs
@@ -20,10 +20,10 @@ using Tgstation.Server.Host.Security;
namespace Tgstation.Server.Host.Controllers
{
///
- /// for managing the
+ /// for managing the
///
[Route(Routes.DreamDaemon)]
- public sealed class DreamDaemonController : ModelController
+ public sealed class DreamDaemonController : ApiController
{
///
/// The for the
@@ -43,17 +43,17 @@ namespace Tgstation.Server.Host.Controllers
/// The value of
/// The value of
/// The for the
- public DreamDaemonController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, ILogger logger) : base(databaseContext, authenticationContextFactory, logger, true)
+ public DreamDaemonController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, ILogger logger) : base(databaseContext, authenticationContextFactory, logger, true, true)
{
this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
}
- ///
+ [HttpPut]
[TgsAuthorize(DreamDaemonRights.Start)]
[ProducesResponseType(typeof(Api.Models.Job), 202)]
[ProducesResponseType(410)]
- public override async Task Create([FromBody] DreamDaemon model, CancellationToken cancellationToken)
+ public async Task Create([FromBody] DreamDaemon model, CancellationToken cancellationToken)
{
// alias for launching DD
var instance = instanceManager.GetInstance(Instance);
@@ -73,11 +73,11 @@ namespace Tgstation.Server.Host.Controllers
return Accepted(job.ToApi());
}
- ///
+ [HttpGet]
[TgsAuthorize(DreamDaemonRights.ReadMetadata | DreamDaemonRights.ReadRevision)]
[ProducesResponseType(typeof(DreamDaemon), 200)]
[ProducesResponseType(410)]
- public override Task Read(CancellationToken cancellationToken) => ReadImpl(null, cancellationToken);
+ public Task Read(CancellationToken cancellationToken) => ReadImpl(null, cancellationToken);
///
/// Implementation of
@@ -132,10 +132,11 @@ namespace Tgstation.Server.Host.Controllers
}
///
- /// Stops DreamDaemon if it's running
+ /// Stops the Watchdog if it's running
///
/// The for the operation
/// A resulting in the of the operation
+ /// Watchdog terminated.
[HttpDelete]
[TgsAuthorize(DreamDaemonRights.Shutdown)]
[ProducesResponseType(200)]
@@ -146,12 +147,12 @@ namespace Tgstation.Server.Host.Controllers
return Ok();
}
- ///
- #pragma warning disable CA1506 // TODO: Decomplexify
+ [HttpPost]
[TgsAuthorize(DreamDaemonRights.SetAutoStart | DreamDaemonRights.SetPorts | DreamDaemonRights.SetSecurity | DreamDaemonRights.SetWebClient | DreamDaemonRights.SoftRestart | DreamDaemonRights.SoftShutdown | DreamDaemonRights.Start | DreamDaemonRights.SetStartupTimeout)]
[ProducesResponseType(typeof(DreamDaemon), 200)]
[ProducesResponseType(410)]
- public override async Task Update([FromBody] DreamDaemon model, CancellationToken cancellationToken)
+ #pragma warning disable CA1506 // TODO: Decomplexify
+ public async Task Update([FromBody] DreamDaemon model, CancellationToken cancellationToken)
{
if (model == null)
throw new ArgumentNullException(nameof(model));
@@ -220,10 +221,11 @@ namespace Tgstation.Server.Host.Controllers
#pragma warning restore CA1506
///
- /// Handle a HTTP PATCH to the
+ /// Creates a to restart the Watchdog. It will start if it wasn't already running.
///
/// The for the operation
/// A resulting in the of the request
+ /// Job started successfully.
[HttpPatch]
[TgsAuthorize(DreamDaemonRights.Restart)]
[ProducesResponseType(typeof(Api.Models.Job), 202)]
diff --git a/src/Tgstation.Server.Host/Controllers/DreamMakerController.cs b/src/Tgstation.Server.Host/Controllers/DreamMakerController.cs
index af71b78151..1d45c7132b 100644
--- a/src/Tgstation.Server.Host/Controllers/DreamMakerController.cs
+++ b/src/Tgstation.Server.Host/Controllers/DreamMakerController.cs
@@ -18,11 +18,11 @@ using Tgstation.Server.Host.Security;
namespace Tgstation.Server.Host.Controllers
{
///
- /// Controller for managing the compiler
+ /// for managing the deployment system.
///
[Route(Routes.DreamMaker)]
#pragma warning disable CA1506 // TODO: Decomplexify
- public sealed class DreamMakerController : ModelController
+ public sealed class DreamMakerController : ApiController
{
///
/// The for the
@@ -42,27 +42,27 @@ namespace Tgstation.Server.Host.Controllers
/// The value of
/// The value of
/// The for the
- public DreamMakerController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, ILogger logger) : base(databaseContext, authenticationContextFactory, logger, true)
+ public DreamMakerController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, ILogger logger) : base(databaseContext, authenticationContextFactory, logger, true, true)
{
this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
}
- ///
+ [HttpGet]
[TgsAuthorize(DreamMakerRights.Read)]
[ProducesResponseType(typeof(DreamMaker), 200)]
- public override async Task Read(CancellationToken cancellationToken)
+ public async Task Read(CancellationToken cancellationToken)
{
var instance = instanceManager.GetInstance(Instance);
var dreamMakerSettings = await DatabaseContext.DreamMakerSettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
return Json(dreamMakerSettings.ToApi());
}
- ///
+ [HttpGet("{id}")]
[TgsAuthorize(DreamMakerRights.CompileJobs)]
[ProducesResponseType(typeof(Api.Models.CompileJob), 200)]
[ProducesResponseType(404)]
- public override async Task GetId(long id, CancellationToken cancellationToken)
+ public async Task GetId(long id, CancellationToken cancellationToken)
{
var compileJob = await DatabaseContext.CompileJobs
.Where(x => x.Id == id && x.Job.Instance.Id == Instance.Id)
@@ -75,10 +75,10 @@ namespace Tgstation.Server.Host.Controllers
return Json(compileJob.ToApi());
}
- ///
+ [HttpGet(Routes.List)]
[TgsAuthorize(DreamMakerRights.CompileJobs)]
[ProducesResponseType(typeof(List), 200)]
- public override async Task List(CancellationToken cancellationToken)
+ public async Task List(CancellationToken cancellationToken)
{
var compileJobs = await DatabaseContext.CompileJobs.Where(x => x.Job.Instance.Id == Instance.Id).OrderByDescending(x => x.Job.StoppedAt).Select(x => new Api.Models.CompileJob
{
@@ -87,10 +87,10 @@ namespace Tgstation.Server.Host.Controllers
return Json(compileJobs);
}
- ///
+ [HttpPut]
[TgsAuthorize(DreamMakerRights.Compile)]
[ProducesResponseType(typeof(Api.Models.Job), 202)]
- public override async Task Create([FromBody] DreamMaker model, CancellationToken cancellationToken)
+ public async Task Create([FromBody] DreamMaker model, CancellationToken cancellationToken)
{
var job = new Models.Job
{
@@ -104,12 +104,12 @@ namespace Tgstation.Server.Host.Controllers
return Accepted(job.ToApi());
}
- ///
+ [HttpPost]
[TgsAuthorize(DreamMakerRights.SetDme | DreamMakerRights.SetApiValidationPort | DreamMakerRights.SetApiValidationPort)]
[ProducesResponseType(typeof(DreamMaker), 200)]
[ProducesResponseType(200)]
[ProducesResponseType(410)]
- public override async Task Update([FromBody] DreamMaker model, CancellationToken cancellationToken)
+ public async Task Update([FromBody] DreamMaker model, CancellationToken cancellationToken)
{
if (model.ApiValidationPort == 0)
return BadRequest(new ErrorMessage { Message = "API Validation port cannot be 0!" });
diff --git a/src/Tgstation.Server.Host/Controllers/HomeController.cs b/src/Tgstation.Server.Host/Controllers/HomeController.cs
index d5e61a062b..b936049c8c 100644
--- a/src/Tgstation.Server.Host/Controllers/HomeController.cs
+++ b/src/Tgstation.Server.Host/Controllers/HomeController.cs
@@ -88,10 +88,13 @@ namespace Tgstation.Server.Host.Controllers
///
/// Main page of the
///
- /// The of the if a properly authenticated API request, the web control panel if on a browser and enabled, otherwise
+ ///
+ /// The of the if a properly authenticated API request, the web control panel if on a browser and enabled, otherwise.
+ ///
+ /// retrieved successfully.
+ [HttpGet]
[TgsAuthorize]
[AllowAnonymous]
- [HttpGet]
[ProducesResponseType(typeof(Api.Models.ServerInformation), 200)]
public IActionResult Home()
{
@@ -117,6 +120,9 @@ namespace Tgstation.Server.Host.Controllers
///
/// The for the operation
/// A resulting in the of the operation
+ /// User logged in and generated successfully.
+ /// User authentication failed.
+ /// User authenticated but is disabled by an administrator.
[HttpPost]
[ProducesResponseType(typeof(Api.Models.Token), 200)]
[ProducesResponseType(401)]
@@ -204,7 +210,10 @@ namespace Tgstation.Server.Host.Controllers
// Now that the bookeeping is done, tell them to fuck off if necessary
if (!user.Enabled.Value)
+ {
+ Logger.LogTrace("Not logging in disabled user {0}.", user.Id);
return Forbid();
+ }
var token = await tokenFactory.CreateToken(user, cancellationToken).ConfigureAwait(false);
if (systemIdentity != null)
diff --git a/src/Tgstation.Server.Host/Controllers/InstanceController.cs b/src/Tgstation.Server.Host/Controllers/InstanceController.cs
index c02dd7d936..6383c81368 100644
--- a/src/Tgstation.Server.Host/Controllers/InstanceController.cs
+++ b/src/Tgstation.Server.Host/Controllers/InstanceController.cs
@@ -23,11 +23,11 @@ using Tgstation.Server.Host.Security;
namespace Tgstation.Server.Host.Controllers
{
///
- /// Controller for managing s
+ /// for managing s
///
[Route(Routes.InstanceManager)]
#pragma warning disable CA1506 // TODO: Decomplexify
- public sealed class InstanceController : ModelController
+ public sealed class InstanceController : ApiController
{
///
/// File name to allow attaching instances
@@ -72,7 +72,7 @@ namespace Tgstation.Server.Host.Controllers
/// The value of
/// The value of
/// The for the
- public InstanceController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, IIOManager ioManager, IApplication application, IPlatformIdentifier platformIdentifier, ILogger logger) : base(databaseContext, authenticationContextFactory, logger, false)
+ public InstanceController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, IIOManager ioManager, IApplication application, IPlatformIdentifier platformIdentifier, ILogger logger) : base(databaseContext, authenticationContextFactory, logger, false, true)
{
this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
@@ -108,11 +108,11 @@ namespace Tgstation.Server.Host.Controllers
UserId = AuthenticationContext.User.Id
};
- ///
+ [HttpPut]
[TgsAuthorize(InstanceManagerRights.Create)]
[ProducesResponseType(typeof(Api.Models.Instance), 200)]
[ProducesResponseType(typeof(Api.Models.Instance), 201)]
- public override async Task Create([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)
+ public async Task Create([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)
{
if (model == null)
throw new ArgumentNullException(nameof(model));
@@ -216,11 +216,11 @@ namespace Tgstation.Server.Host.Controllers
return attached ? (IActionResult)Json(api) : StatusCode((int)HttpStatusCode.Created, api);
}
- ///
+ [HttpDelete]
[TgsAuthorize(InstanceManagerRights.Delete)]
[ProducesResponseType(200)]
[ProducesResponseType(410)]
- public override async Task Delete(long id, CancellationToken cancellationToken)
+ public async Task Delete(long id, CancellationToken cancellationToken)
{
var originalModel = await DatabaseContext.Instances.Where(x => x.Id == id)
.Include(x => x.WatchdogReattachInformation)
@@ -252,12 +252,12 @@ namespace Tgstation.Server.Host.Controllers
return Ok();
}
- ///
+ [HttpPost]
[TgsAuthorize(InstanceManagerRights.Relocate | InstanceManagerRights.Rename | InstanceManagerRights.SetAutoUpdate | InstanceManagerRights.SetConfiguration | InstanceManagerRights.SetOnline)]
[ProducesResponseType(typeof(Api.Models.Instance), 200)]
[ProducesResponseType(410)]
#pragma warning disable CA1502 // TODO: Decomplexify
- public override async Task Update([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)
+ public async Task Update([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)
{
var instanceQuery = DatabaseContext.Instances.Where(x => x.Id == model.Id);
@@ -400,10 +400,10 @@ namespace Tgstation.Server.Host.Controllers
}
#pragma warning restore CA1502
- ///
+ [HttpGet(Routes.List)]
[TgsAuthorize(InstanceManagerRights.List | InstanceManagerRights.Read)]
[ProducesResponseType(typeof(IEnumerable), 200)]
- public override async Task List(CancellationToken cancellationToken)
+ public async Task List(CancellationToken cancellationToken)
{
IQueryable query = DatabaseContext.Instances;
if (!AuthenticationContext.User.InstanceManagerRights.Value.HasFlag(InstanceManagerRights.List))
@@ -425,11 +425,11 @@ namespace Tgstation.Server.Host.Controllers
return Json(apis);
}
- ///
+ [HttpGet("{id}")]
[TgsAuthorize(InstanceManagerRights.List | InstanceManagerRights.Read)]
[ProducesResponseType(typeof(Api.Models.Instance), 200)]
[ProducesResponseType(410)]
- public override async Task GetId(long id, CancellationToken cancellationToken)
+ public async Task GetId(long id, CancellationToken cancellationToken)
{
var query = DatabaseContext.Instances.Where(x => x.Id == id);
var cantList = !AuthenticationContext.User.InstanceManagerRights.Value.HasFlag(InstanceManagerRights.List);
diff --git a/src/Tgstation.Server.Host/Controllers/InstanceUserController.cs b/src/Tgstation.Server.Host/Controllers/InstanceUserController.cs
index 2217e8f0e9..6e51490755 100644
--- a/src/Tgstation.Server.Host/Controllers/InstanceUserController.cs
+++ b/src/Tgstation.Server.Host/Controllers/InstanceUserController.cs
@@ -17,10 +17,10 @@ using Z.EntityFramework.Plus;
namespace Tgstation.Server.Host.Controllers
{
///
- /// For managing s
+ /// for managing s.
///
[Route(Routes.InstanceUser)]
- public sealed class InstanceUserController : ModelController
+ public sealed class InstanceUserController : ApiController
{
///
/// Construct a
@@ -28,7 +28,7 @@ namespace Tgstation.Server.Host.Controllers
/// The for the
/// The for the
/// The for the
- public InstanceUserController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger) : base(databaseContext, authenticationContextFactory, logger, true) // false instance requirement, we handle this ourself
+ public InstanceUserController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger) : base(databaseContext, authenticationContextFactory, logger, true, true)
{ }
///
@@ -47,10 +47,10 @@ namespace Tgstation.Server.Host.Controllers
return null;
}
- ///
+ [HttpPut]
[TgsAuthorize(InstanceUserRights.CreateUsers)]
[ProducesResponseType(typeof(Api.Models.InstanceUser), 201)]
- public override async Task Create([FromBody] Api.Models.InstanceUser model, CancellationToken cancellationToken)
+ public async Task Create([FromBody] Api.Models.InstanceUser model, CancellationToken cancellationToken)
{
var test = StandardModelChecks(model);
if (test != null)
@@ -75,12 +75,12 @@ namespace Tgstation.Server.Host.Controllers
return StatusCode((int)HttpStatusCode.Created, dbUser.ToApi());
}
- ///
+ [HttpPost]
[TgsAuthorize(InstanceUserRights.WriteUsers)]
[ProducesResponseType(typeof(Api.Models.InstanceUser), 200)]
[ProducesResponseType(410)]
#pragma warning disable CA1506 // TODO: Decomplexify
- public override async Task Update([FromBody] Api.Models.InstanceUser model, CancellationToken cancellationToken)
+ public async Task Update([FromBody] Api.Models.InstanceUser model, CancellationToken cancellationToken)
{
var test = StandardModelChecks(model);
if (test != null)
@@ -106,26 +106,26 @@ namespace Tgstation.Server.Host.Controllers
}
#pragma warning restore CA1506
- ///
+ [HttpGet]
[TgsAuthorize]
[ProducesResponseType(typeof(Api.Models.InstanceUser), 200)]
[ProducesResponseType(404)]
- public override Task Read(CancellationToken cancellationToken) => Task.FromResult(AuthenticationContext.InstanceUser != null ? (IActionResult)Json(AuthenticationContext.InstanceUser.ToApi()) : NotFound());
+ public Task Read(CancellationToken cancellationToken) => Task.FromResult(AuthenticationContext.InstanceUser != null ? (IActionResult)Json(AuthenticationContext.InstanceUser.ToApi()) : NotFound());
- ///
+ [HttpGet(Routes.List)]
[TgsAuthorize(InstanceUserRights.ReadUsers)]
[ProducesResponseType(typeof(IEnumerable), 200)]
- public override async Task List(CancellationToken cancellationToken)
+ public async Task List(CancellationToken cancellationToken)
{
var users = await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).SelectMany(x => x.InstanceUsers).ToListAsync(cancellationToken).ConfigureAwait(false);
return Json(users.Select(x => x.ToApi()));
}
- ///
+ [HttpGet("{id}")]
[TgsAuthorize(InstanceUserRights.ReadUsers)]
[ProducesResponseType(typeof(Api.Models.InstanceUser), 200)]
[ProducesResponseType(410)]
- public override async Task GetId(long id, CancellationToken cancellationToken)
+ public async Task GetId(long id, CancellationToken cancellationToken)
{
// this functions as userId
var user = await DatabaseContext.Instances.Where(x => x.Id == Instance.Id).SelectMany(x => x.InstanceUsers).Where(x => x.UserId == id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
@@ -134,10 +134,10 @@ namespace Tgstation.Server.Host.Controllers
return Json(user.ToApi());
}
- ///
+ [HttpDelete]
[TgsAuthorize(InstanceUserRights.WriteUsers)]
[ProducesResponseType(200)]
- public override async Task Delete(long id, CancellationToken cancellationToken)
+ public async Task Delete(long id, CancellationToken cancellationToken)
{
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 c305597c4b..156e294e45 100644
--- a/src/Tgstation.Server.Host/Controllers/JobController.cs
+++ b/src/Tgstation.Server.Host/Controllers/JobController.cs
@@ -15,10 +15,10 @@ using Tgstation.Server.Host.Security;
namespace Tgstation.Server.Host.Controllers
{
///
- /// for s
+ /// for s
///
[Route(Routes.Jobs)]
- public sealed class JobController : ModelController
+ public sealed class JobController : ApiController
{
///
/// The for the
@@ -32,24 +32,24 @@ namespace Tgstation.Server.Host.Controllers
/// The for the
/// The value of
/// The for the
- public JobController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, ILogger logger) : base(databaseContext, authenticationContextFactory, logger, true)
+ public JobController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, ILogger logger) : base(databaseContext, authenticationContextFactory, logger, true, true)
{
this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
}
- ///
+ [HttpGet]
[TgsAuthorize]
[ProducesResponseType(typeof(IEnumerable), 200)]
- public override async Task Read(CancellationToken cancellationToken)
+ public async Task Read(CancellationToken cancellationToken)
{
var result = await DatabaseContext.Jobs.Where(x => x.Instance.Id == Instance.Id && !x.StoppedAt.HasValue).OrderByDescending(x => x.StartedAt).ToListAsync(cancellationToken).ConfigureAwait(false);
return Json(result.Select(x => x.ToApi()));
}
- ///
+ [HttpGet(Routes.List)]
[TgsAuthorize]
[ProducesResponseType(typeof(List), 200)]
- public override async Task List(CancellationToken cancellationToken)
+ public async Task List(CancellationToken cancellationToken)
{
// you KNOW this will need pagination eventually right?
var jobs = await DatabaseContext.Jobs.Where(x => x.Instance.Id == Instance.Id).OrderByDescending(x => x.StartedAt).Select(x => new Api.Models.Job
@@ -59,12 +59,12 @@ namespace Tgstation.Server.Host.Controllers
return Json(jobs);
}
- ///
+ [HttpDelete]
[TgsAuthorize]
[ProducesResponseType(202)]
[ProducesResponseType(404)]
[ProducesResponseType(410)]
- public override async Task Delete(long id, CancellationToken cancellationToken)
+ public 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 == id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
@@ -81,11 +81,11 @@ namespace Tgstation.Server.Host.Controllers
return cancelled ? (IActionResult)Accepted() : StatusCode((int)HttpStatusCode.Gone);
}
- ///
+ [HttpGet("{id}")]
[TgsAuthorize]
[ProducesResponseType(404)]
[ProducesResponseType(typeof(Api.Models.Job), 200)]
- public override async Task GetId(long id, CancellationToken cancellationToken)
+ public async Task GetId(long id, CancellationToken cancellationToken)
{
var job = await DatabaseContext.Jobs.Where(x => x.Id == id).Include(x => x.StartedBy).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
if (job == default(Job))
diff --git a/src/Tgstation.Server.Host/Controllers/ModelController.cs b/src/Tgstation.Server.Host/Controllers/ModelController.cs
deleted file mode 100644
index 3434992040..0000000000
--- a/src/Tgstation.Server.Host/Controllers/ModelController.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.Extensions.Logging;
-using System.Threading;
-using System.Threading.Tasks;
-using Tgstation.Server.Host.Models;
-using Tgstation.Server.Host.Security;
-
-namespace Tgstation.Server.Host.Controllers
-{
- ///
- /// An representing a
- ///
- /// The model being represented
- public abstract class ModelController : ApiController where TModel : class
- {
- ///
- /// Construct a
- ///
- /// The for the
- /// The for the
- /// The for the
- /// If the requires an
- public ModelController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance) : base(databaseContext, authenticationContextFactory, logger, requireInstance, true) { }
-
- ///
- /// Attempt to create a
- ///
- /// The being created
- /// The for the operation
- /// A resulting in the of the operation
- [HttpPut]
- public virtual Task Create([FromBody]TModel model, CancellationToken cancellationToken) => Task.FromResult((IActionResult)NotFound());
-
- ///
- /// Attempt to read a
- ///
- /// The for the operation
- /// A resulting in the of the operation
- [HttpGet]
- public virtual Task Read(CancellationToken cancellationToken) => Task.FromResult((IActionResult)NotFound());
-
- ///
- /// Attempt to get a specific a
- ///
- /// The ID of the model to get
- /// The for the operation
- /// A resulting in the of the operation
- [HttpGet("{id}")]
- public virtual Task GetId(long id, CancellationToken cancellationToken) => Task.FromResult((IActionResult)NotFound());
-
- ///
- /// Attempt to update a
- ///
- /// The being updated
- /// The for the operation
- /// A resulting in the of the operation
- [HttpPost]
- public virtual Task Update([FromBody]TModel model, CancellationToken cancellationToken) => Task.FromResult((IActionResult)NotFound());
-
- ///
- /// Attempt to delete a model with a particular
- ///
- /// The ID of the model to delete
- /// The for the operation
- /// A resulting in the of the operation
- [HttpDelete("{id}")]
- public virtual Task Delete(long id, CancellationToken cancellationToken) => Task.FromResult((IActionResult)NotFound());
-
- ///
- /// Attempt to list entries of the
- ///
- /// The for the operation
- /// A resulting in the of the operation
- [HttpGet("List")]
- public virtual Task List(CancellationToken cancellationToken) => Task.FromResult((IActionResult)NotFound());
- }
-}
diff --git a/src/Tgstation.Server.Host/Controllers/RepositoryController.cs b/src/Tgstation.Server.Host/Controllers/RepositoryController.cs
index f08fa51e9d..fde31f048c 100644
--- a/src/Tgstation.Server.Host/Controllers/RepositoryController.cs
+++ b/src/Tgstation.Server.Host/Controllers/RepositoryController.cs
@@ -23,11 +23,11 @@ using Tgstation.Server.Host.Security;
namespace Tgstation.Server.Host.Controllers
{
///
- /// Controller for managing the s
+ /// for managing the s
///
[Route(Routes.Repository)]
#pragma warning disable CA1506 // TODO: Decomplexify
- public sealed class RepositoryController : ModelController
+ public sealed class RepositoryController : ApiController
{
///
/// The for the
@@ -59,7 +59,7 @@ namespace Tgstation.Server.Host.Controllers
/// The value of
/// The for the
/// The containing value of
- public RepositoryController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IGitHubClientFactory gitHubClientFactory, IJobManager jobManager, ILogger logger, IOptions generalConfigurationOptions) : base(databaseContext, authenticationContextFactory, logger, true)
+ public RepositoryController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IGitHubClientFactory gitHubClientFactory, IJobManager jobManager, ILogger logger, IOptions generalConfigurationOptions) : base(databaseContext, authenticationContextFactory, logger, true, true)
{
this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
@@ -126,11 +126,11 @@ namespace Tgstation.Server.Host.Controllers
return needsDbUpdate;
}
- ///
+ [HttpPut]
[TgsAuthorize(RepositoryRights.SetOrigin)]
[ProducesResponseType(typeof(Repository), 201)]
[ProducesResponseType(410)]
- public override async Task Create([FromBody] Repository model, CancellationToken cancellationToken)
+ public async Task Create([FromBody] Repository model, CancellationToken cancellationToken)
{
if (model == null)
throw new ArgumentNullException(nameof(model));
@@ -216,10 +216,13 @@ namespace Tgstation.Server.Host.Controllers
}
///
- /// Delete the
+ /// Delete the .
///
/// The for the operation
/// A resulting in the of the operation
+ /// Job to delete the repository created successfully.
+ /// The repository is not present.
+ [HttpDelete]
[TgsAuthorize(RepositoryRights.Delete)]
[ProducesResponseType(typeof(Repository), 202)]
[ProducesResponseType(410)]
@@ -249,12 +252,12 @@ namespace Tgstation.Server.Host.Controllers
return Accepted(api);
}
- ///
+ [HttpGet]
[TgsAuthorize(RepositoryRights.Read)]
[ProducesResponseType(typeof(Repository), 200)]
[ProducesResponseType(typeof(Repository), 201)]
[ProducesResponseType(410)]
- public override async Task Read(CancellationToken cancellationToken)
+ public async Task Read(CancellationToken cancellationToken)
{
var currentModel = await DatabaseContext.RepositorySettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
@@ -289,11 +292,14 @@ namespace Tgstation.Server.Host.Controllers
}
}
- ///
+ [HttpPost]
[TgsAuthorize(RepositoryRights.ChangeAutoUpdateSettings | RepositoryRights.ChangeCommitter | RepositoryRights.ChangeCredentials | RepositoryRights.ChangeTestMergeCommits | RepositoryRights.MergePullRequest | RepositoryRights.SetReference | RepositoryRights.SetSha | RepositoryRights.UpdateBranch)]
+ [ProducesResponseType(typeof(Repository), 200)]
+ [ProducesResponseType(typeof(Repository), 202)]
+ [ProducesResponseType(410)]
#pragma warning disable CA1502 // TODO: Decomplexify
#pragma warning disable CA1505
- public override async Task Update([FromBody]Repository model, CancellationToken cancellationToken)
+ public async Task Update([FromBody]Repository model, CancellationToken cancellationToken)
{
if (model == null)
throw new ArgumentNullException(nameof(model));
diff --git a/src/Tgstation.Server.Host/Controllers/UserController.cs b/src/Tgstation.Server.Host/Controllers/UserController.cs
index ebe9aaf2b3..ed3cf8d495 100644
--- a/src/Tgstation.Server.Host/Controllers/UserController.cs
+++ b/src/Tgstation.Server.Host/Controllers/UserController.cs
@@ -19,10 +19,10 @@ using Tgstation.Server.Host.Security;
namespace Tgstation.Server.Host.Controllers
{
///
- /// For managing s
+ /// for managing s.
///
[Route(Routes.User)]
- public sealed class UserController : ModelController
+ public sealed class UserController : ApiController
{
///
/// The for the
@@ -53,7 +53,7 @@ namespace Tgstation.Server.Host.Controllers
/// The value of
/// The value of
/// The containing the value of
- public UserController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ISystemIdentityFactory systemIdentityFactory, ICryptographySuite cryptographySuite, ILogger logger, IOptions generalConfigurationOptions) : base(databaseContext, authenticationContextFactory, logger, false)
+ public UserController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ISystemIdentityFactory systemIdentityFactory, ICryptographySuite cryptographySuite, ILogger logger, IOptions generalConfigurationOptions) : base(databaseContext, authenticationContextFactory, logger, false, true)
{
this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
this.systemIdentityFactory = systemIdentityFactory ?? throw new ArgumentNullException(nameof(systemIdentityFactory));
@@ -73,12 +73,12 @@ namespace Tgstation.Server.Host.Controllers
return null;
}
- ///
+ [HttpPut]
[TgsAuthorize(AdministrationRights.WriteUsers)]
[ProducesResponseType(typeof(Api.Models.User), 201)]
[ProducesResponseType(410)]
[ProducesResponseType(501)]
- public override async Task Create([FromBody] UserUpdate model, CancellationToken cancellationToken)
+ public async Task Create([FromBody] UserUpdate model, CancellationToken cancellationToken)
{
if (model == null)
throw new ArgumentNullException(nameof(model));
@@ -140,11 +140,11 @@ namespace Tgstation.Server.Host.Controllers
return StatusCode((int)HttpStatusCode.Created, dbUser.ToApi(true));
}
- ///
+ [HttpPost]
[TgsAuthorize(AdministrationRights.WriteUsers | AdministrationRights.EditOwnPassword)]
[ProducesResponseType(typeof(Api.Models.User), 200)]
[ProducesResponseType(404)]
- public override async Task Update([FromBody] UserUpdate model, CancellationToken cancellationToken)
+ public async Task Update([FromBody] UserUpdate model, CancellationToken cancellationToken)
{
if (model == null)
throw new ArgumentNullException(nameof(model));
@@ -190,15 +190,15 @@ namespace Tgstation.Server.Host.Controllers
});
}
- ///
+ [HttpGet]
[TgsAuthorize]
[ProducesResponseType(typeof(Api.Models.User), 200)]
- public override Task Read(CancellationToken cancellationToken) => Task.FromResult(Json(AuthenticationContext.User.ToApi(true)));
+ public Task Read(CancellationToken cancellationToken) => Task.FromResult(Json(AuthenticationContext.User.ToApi(true)));
- ///
+ [HttpGet(Routes.List)]
[TgsAuthorize(AdministrationRights.ReadUsers)]
[ProducesResponseType(typeof(IEnumerable), 200)]
- public override async Task List(CancellationToken cancellationToken)
+ public async Task List(CancellationToken cancellationToken)
{
var users = await DatabaseContext.Users
.Include(x => x.CreatedBy)
@@ -206,11 +206,11 @@ namespace Tgstation.Server.Host.Controllers
return Json(users.Select(x => x.ToApi(true)));
}
- ///
+ [HttpGet("{id}")]
[TgsAuthorize]
[ProducesResponseType(typeof(Api.Models.User), 200)]
[ProducesResponseType(404)]
- public override async Task GetId(long id, CancellationToken cancellationToken)
+ public async Task GetId(long id, CancellationToken cancellationToken)
{
if (id == AuthenticationContext.User.Id)
return await Read(cancellationToken).ConfigureAwait(false);