From f1fe846ce6b32ea58b1a53ede900736bc9215b45 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Thu, 9 Jan 2020 21:32:10 -0500 Subject: [PATCH] Removes the mistake that was ModelController - Controllers inherit ApiController - Add now missing Http verb attributes - Added response comments for methods with documentation - Renamed API List function to ListRoute --- src/Tgstation.Server.Api/Routes.cs | 7 +- .../Components/ByondClient.cs | 2 +- .../Components/ChatBotsClient.cs | 2 +- .../Components/ConfigurationClient.cs | 2 +- .../Components/DreamMakerClient.cs | 2 +- .../Components/InstanceUserClient.cs | 2 +- .../Components/JobsClient.cs | 2 +- .../InstanceManagerClient.cs | 2 +- src/Tgstation.Server.Client/UsersClient.cs | 2 +- .../Controllers/AdministrationController.cs | 14 ++-- .../Controllers/ByondController.cs | 16 ++-- .../Controllers/ChatController.cs | 28 +++---- .../Controllers/ConfigurationController.cs | 26 ++++--- .../Controllers/DreamDaemonController.cs | 26 ++++--- .../Controllers/DreamMakerController.cs | 26 +++---- .../Controllers/HomeController.cs | 13 +++- .../Controllers/InstanceController.cs | 26 +++---- .../Controllers/InstanceUserController.cs | 30 ++++---- .../Controllers/JobController.cs | 22 +++--- .../Controllers/ModelController.cs | 77 ------------------- .../Controllers/RepositoryController.cs | 26 ++++--- .../Controllers/UserController.cs | 26 +++---- 22 files changed, 165 insertions(+), 214 deletions(-) delete mode 100644 src/Tgstation.Server.Host/Controllers/ModelController.cs 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);