mirror of
https://github.com/tgstation/tgstation-server.git
synced 2026-08-30 00:22:40 +01:00
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
This commit is contained in:
@@ -78,6 +78,11 @@ namespace Tgstation.Server.Api
|
||||
/// </summary>
|
||||
public const string Jobs = Root + nameof(Models.Job);
|
||||
|
||||
/// <summary>
|
||||
/// The postfix for list operations
|
||||
/// </summary>
|
||||
public const string List = "List";
|
||||
|
||||
/// <summary>
|
||||
/// Apply an <paramref name="id"/> postfix to a <paramref name="route"/>
|
||||
/// </summary>
|
||||
@@ -91,6 +96,6 @@ namespace Tgstation.Server.Api
|
||||
/// </summary>
|
||||
/// <param name="route">The route</param>
|
||||
/// <returns>The <paramref name="route"/> with /List appended</returns>
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ namespace Tgstation.Server.Client.Components
|
||||
public Task<Byond> ActiveVersion(CancellationToken cancellationToken) => apiClient.Read<Byond>(Routes.Byond, instance.Id, cancellationToken);
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<IReadOnlyList<Byond>> InstalledVersions(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<Byond>>(Routes.List(Routes.Byond), instance.Id, cancellationToken);
|
||||
public Task<IReadOnlyList<Byond>> InstalledVersions(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<Byond>>(Routes.ListRoute(Routes.Byond), instance.Id, cancellationToken);
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<Byond> SetActiveVersion(Byond byond, CancellationToken cancellationToken) => apiClient.Update<Byond, Byond>(Routes.Byond, byond ?? throw new ArgumentNullException(nameof(byond)), instance.Id, cancellationToken);
|
||||
|
||||
@@ -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);
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<IReadOnlyList<ChatBot>> List(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<ChatBot>>(Routes.List(Routes.Chat), instance.Id, cancellationToken);
|
||||
public Task<IReadOnlyList<ChatBot>> List(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<ChatBot>>(Routes.ListRoute(Routes.Chat), instance.Id, cancellationToken);
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<ChatBot> Update(ChatBot settings, CancellationToken cancellationToken) => apiClient.Update<ChatBot, ChatBot>(Routes.Chat, settings ?? throw new ArgumentNullException(nameof(settings)), instance.Id, cancellationToken);
|
||||
|
||||
@@ -52,7 +52,7 @@ namespace Tgstation.Server.Client.Components
|
||||
public Task<ConfigurationFile> CreateDirectory(ConfigurationFile directory, CancellationToken cancellationToken) => apiClient.Create<ConfigurationFile, ConfigurationFile>(Routes.Configuration, directory, instance.Id, cancellationToken);
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<IReadOnlyList<ConfigurationFile>> List(string directory, CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<ConfigurationFile>>(Routes.List(Routes.Configuration) + SanitizeGetPath(directory), instance.Id, cancellationToken);
|
||||
public Task<IReadOnlyList<ConfigurationFile>> List(string directory, CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<ConfigurationFile>>(Routes.ListRoute(Routes.Configuration) + SanitizeGetPath(directory), instance.Id, cancellationToken);
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<ConfigurationFile> Read(ConfigurationFile file, CancellationToken cancellationToken)
|
||||
|
||||
@@ -38,7 +38,7 @@ namespace Tgstation.Server.Client.Components
|
||||
public Task<CompileJob> GetCompileJob(CompileJob compileJob, CancellationToken cancellationToken) => apiClient.Read<CompileJob>(Routes.SetID(Routes.DreamMaker, compileJob?.Id ?? throw new ArgumentNullException(nameof(compileJob))), instance.Id, cancellationToken);
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<IReadOnlyList<CompileJob>> GetJobIds(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<CompileJob>>(Routes.List(Routes.DreamMaker), instance.Id, cancellationToken);
|
||||
public Task<IReadOnlyList<CompileJob>> GetJobIds(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<CompileJob>>(Routes.ListRoute(Routes.DreamMaker), instance.Id, cancellationToken);
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<DreamMaker> Read(CancellationToken cancellationToken) => apiClient.Read<DreamMaker>(Routes.DreamMaker, instance.Id, cancellationToken);
|
||||
|
||||
@@ -44,7 +44,7 @@ namespace Tgstation.Server.Client.Components
|
||||
public Task<InstanceUser> Update(InstanceUser instanceUser, CancellationToken cancellationToken) => apiClient.Update<InstanceUser, InstanceUser>(Routes.InstanceUser, instanceUser ?? throw new ArgumentNullException(nameof(instanceUser)), instance.Id, cancellationToken);
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<IReadOnlyList<InstanceUser>> List(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<InstanceUser>>(Routes.List(Routes.InstanceUser), instance.Id, cancellationToken);
|
||||
public Task<IReadOnlyList<InstanceUser>> List(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<InstanceUser>>(Routes.ListRoute(Routes.InstanceUser), instance.Id, cancellationToken);
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<InstanceUser> GetId(InstanceUser instanceUser, CancellationToken cancellationToken) => apiClient.Read<InstanceUser>(Routes.SetID(Routes.InstanceUser, instanceUser?.UserId ?? throw new ArgumentNullException(nameof(instanceUser))), instance.Id, cancellationToken);
|
||||
|
||||
@@ -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);
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<IReadOnlyList<Job>> List(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<Job>>(Routes.List(Routes.Jobs), instance.Id, cancellationToken);
|
||||
public Task<IReadOnlyList<Job>> List(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<Job>>(Routes.ListRoute(Routes.Jobs), instance.Id, cancellationToken);
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<IReadOnlyList<Job>> ListActive(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<Job>>(Routes.Jobs, instance.Id, cancellationToken);
|
||||
|
||||
@@ -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);
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<IReadOnlyList<Instance>> List(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<Instance>>(Routes.List(Routes.InstanceManager), cancellationToken);
|
||||
public Task<IReadOnlyList<Instance>> List(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<Instance>>(Routes.ListRoute(Routes.InstanceManager), cancellationToken);
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<Instance> Update(Instance instance, CancellationToken cancellationToken) => apiClient.Update<Instance, Instance>(Routes.InstanceManager, instance ?? throw new ArgumentNullException(nameof(instance)), cancellationToken);
|
||||
|
||||
@@ -31,7 +31,7 @@ namespace Tgstation.Server.Client
|
||||
public Task<User> GetId(User user, CancellationToken cancellationToken) => apiClient.Read<User>(Routes.SetID(Routes.User, user?.Id ?? throw new ArgumentNullException(nameof(user))), cancellationToken);
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<IReadOnlyList<User>> List(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<User>>(Routes.List(Routes.User), cancellationToken);
|
||||
public Task<IReadOnlyList<User>> List(CancellationToken cancellationToken) => apiClient.Read<IReadOnlyList<User>>(Routes.ListRoute(Routes.User), cancellationToken);
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<User> Read(CancellationToken cancellationToken) => apiClient.Read<User>(Routes.User, cancellationToken);
|
||||
|
||||
@@ -22,10 +22,10 @@ using Tgstation.Server.Host.Security;
|
||||
namespace Tgstation.Server.Host.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// <see cref="ModelController{TModel}"/> for <see cref="Administration"/>
|
||||
/// <see cref="ApiController"/> for <see cref="Administration"/> purposes
|
||||
/// </summary>
|
||||
[Route(Routes.Administration)]
|
||||
public sealed class AdministrationController : ModelController<Administration>
|
||||
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
|
||||
/// <param name="logger">The <see cref="ILogger"/> for the <see cref="ApiController"/></param>
|
||||
/// <param name="updatesConfigurationOptions">The <see cref="IOptions{TOptions}"/> containing value of <see cref="updatesConfiguration"/></param>
|
||||
/// <param name="generalConfigurationOptions">The <see cref="IOptions{TOptions}"/> containing value of <see cref="generalConfiguration"/></param>
|
||||
public AdministrationController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IGitHubClientFactory gitHubClientFactory, IServerControl serverUpdater, IApplication application, IIOManager ioManager, IPlatformIdentifier platformIdentifier, ILogger<AdministrationController> logger, IOptions<UpdatesConfiguration> updatesConfigurationOptions, IOptions<GeneralConfiguration> generalConfigurationOptions) : base(databaseContext, authenticationContextFactory, logger, false)
|
||||
public AdministrationController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IGitHubClientFactory gitHubClientFactory, IServerControl serverUpdater, IApplication application, IIOManager ioManager, IPlatformIdentifier platformIdentifier, ILogger<AdministrationController> logger, IOptions<UpdatesConfiguration> updatesConfigurationOptions, IOptions<GeneralConfiguration> 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);
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpGet]
|
||||
[TgsAuthorize]
|
||||
[ProducesResponseType(typeof(Administration), 200)]
|
||||
[ProducesResponseType(424)]
|
||||
[ProducesResponseType(429)]
|
||||
public override async Task<IActionResult> Read(CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> Read(CancellationToken cancellationToken)
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -199,10 +199,10 @@ namespace Tgstation.Server.Host.Controllers
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpPost]
|
||||
[TgsAuthorize(AdministrationRights.ChangeVersion)]
|
||||
[ProducesResponseType(typeof(ErrorMessage), 422)]
|
||||
public override async Task<IActionResult> Update([FromBody] Administration model, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> Update([FromBody] Administration model, CancellationToken cancellationToken)
|
||||
{
|
||||
if (model == null)
|
||||
throw new ArgumentNullException(nameof(model));
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace Tgstation.Server.Host.Controllers
|
||||
/// Controller for managing <see cref="Api.Models.Byond.Version"/>s
|
||||
/// </summary>
|
||||
[Route(Routes.Byond)]
|
||||
public sealed class ByondController : ModelController<Api.Models.Byond>
|
||||
public sealed class ByondController : ApiController
|
||||
{
|
||||
/// <summary>
|
||||
/// The <see cref="IInstanceManager"/> for the <see cref="ByondController"/>
|
||||
@@ -40,35 +40,35 @@ namespace Tgstation.Server.Host.Controllers
|
||||
/// <param name="instanceManager">The value of <see cref="instanceManager"/></param>
|
||||
/// <param name="jobManager">The value of <see cref="jobManager"/></param>
|
||||
/// <param name="logger">The <see cref="ILogger"/> for the <see cref="ApiController"/></param>
|
||||
public ByondController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IJobManager jobManager, ILogger<ByondController> logger) : base(databaseContext, authenticationContextFactory, logger, true)
|
||||
public ByondController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IJobManager jobManager, ILogger<ByondController> logger) : base(databaseContext, authenticationContextFactory, logger, true, true)
|
||||
{
|
||||
this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
|
||||
this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpGet]
|
||||
[TgsAuthorize(ByondRights.ReadActive)]
|
||||
[ProducesResponseType(typeof(Api.Models.Byond), 200)]
|
||||
public override Task<IActionResult> Read(CancellationToken cancellationToken) => Task.FromResult<IActionResult>(
|
||||
public Task<IActionResult> Read(CancellationToken cancellationToken) => Task.FromResult<IActionResult>(
|
||||
Json(new Api.Models.Byond
|
||||
{
|
||||
Version = instanceManager.GetInstance(Instance).ByondManager.ActiveVersion
|
||||
}));
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpGet(Routes.List)]
|
||||
[TgsAuthorize(ByondRights.ListInstalled)]
|
||||
[ProducesResponseType(typeof(IEnumerable<Api.Models.Byond>), 200)]
|
||||
public override Task<IActionResult> List(CancellationToken cancellationToken) => Task.FromResult<IActionResult>(
|
||||
public Task<IActionResult> List(CancellationToken cancellationToken) => Task.FromResult<IActionResult>(
|
||||
Json(instanceManager.GetInstance(Instance).ByondManager.InstalledVersions.Select(x => new Api.Models.Byond
|
||||
{
|
||||
Version = x
|
||||
})));
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpPost]
|
||||
[TgsAuthorize(ByondRights.ChangeVersion)]
|
||||
[ProducesResponseType(typeof(Api.Models.Byond), 200)]
|
||||
[ProducesResponseType(typeof(Api.Models.Byond), 202)]
|
||||
public override async Task<IActionResult> Update([FromBody] Api.Models.Byond model, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> Update([FromBody] Api.Models.Byond model, CancellationToken cancellationToken)
|
||||
{
|
||||
if (model == null)
|
||||
throw new ArgumentNullException(nameof(model));
|
||||
|
||||
@@ -20,10 +20,10 @@ using Z.EntityFramework.Plus;
|
||||
namespace Tgstation.Server.Host.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// <see cref="ModelController{TModel}"/> for managing <see cref="Api.Models.ChatBot"/>s
|
||||
/// <see cref="ApiController"/> for managing <see cref="Api.Models.ChatBot"/>s
|
||||
/// </summary>
|
||||
[Route(Routes.Chat)]
|
||||
public sealed class ChatController : ModelController<Api.Models.ChatBot>
|
||||
public sealed class ChatController : ApiController
|
||||
{
|
||||
/// <summary>
|
||||
/// The <see cref="IInstanceManager"/> for the <see cref="ChatController"/>
|
||||
@@ -37,7 +37,7 @@ namespace Tgstation.Server.Host.Controllers
|
||||
/// <param name="authenticationContextFactory">The <see cref="IAuthenticationContextFactory"/> for the <see cref="ApiController"/></param>
|
||||
/// <param name="instanceManager">The value of <see cref="instanceManager"/></param>
|
||||
/// <param name="logger">The <see cref="ILogger"/> for the <see cref="ApiController"/></param>
|
||||
public ChatController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, ILogger<ChatController> logger) : base(databaseContext, authenticationContextFactory, logger, true)
|
||||
public ChatController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, ILogger<ChatController> 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
|
||||
};
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpPut]
|
||||
[TgsAuthorize(ChatBotRights.Create)]
|
||||
[ProducesResponseType(typeof(Api.Models.ChatBot), 201)]
|
||||
public override async Task<IActionResult> Create([FromBody] Api.Models.ChatBot model, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> 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());
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpDelete]
|
||||
[TgsAuthorize(ChatBotRights.Delete)]
|
||||
[ProducesResponseType(200)]
|
||||
public override async Task<IActionResult> Delete(long id, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> 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();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpGet(Routes.List)]
|
||||
[TgsAuthorize(ChatBotRights.Read)]
|
||||
[ProducesResponseType(typeof(IEnumerable<Api.Models.ChatBot>), 200)]
|
||||
public override async Task<IActionResult> List(CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> 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()));
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpGet("{id}")]
|
||||
[TgsAuthorize(ChatBotRights.Read)]
|
||||
[ProducesResponseType(typeof(Api.Models.ChatBot), 200)]
|
||||
[ProducesResponseType(410)]
|
||||
public override async Task<IActionResult> GetId(long id, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> 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());
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
#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<IActionResult> Update([FromBody] Api.Models.ChatBot model, CancellationToken cancellationToken)
|
||||
#pragma warning disable CA1506 // TODO: Decomplexify
|
||||
public async Task<IActionResult> Update([FromBody] Api.Models.ChatBot model, CancellationToken cancellationToken)
|
||||
{
|
||||
if (model == null)
|
||||
throw new ArgumentNullException(nameof(model));
|
||||
|
||||
@@ -17,10 +17,10 @@ using Tgstation.Server.Host.Security;
|
||||
namespace Tgstation.Server.Host.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// The <see cref="ModelController{TModel}"/> for <see cref="ConfigurationFile"/>s
|
||||
/// The <see cref="ApiController"/> for <see cref="ConfigurationFile"/>s
|
||||
/// </summary>
|
||||
[Route(Routes.Configuration)]
|
||||
public sealed class ConfigurationController : ModelController<ConfigurationFile>
|
||||
public sealed class ConfigurationController : ApiController
|
||||
{
|
||||
/// <summary>
|
||||
/// The <see cref="IInstanceManager"/> for the <see cref="ConfigurationController"/>
|
||||
@@ -40,7 +40,7 @@ namespace Tgstation.Server.Host.Controllers
|
||||
/// <param name="instanceManager">The value of <see cref="instanceManager"/></param>
|
||||
/// <param name="ioManager">The value of <see cref="ioManager"/></param>
|
||||
/// <param name="logger">The <see cref="ILogger"/> for the <see cref="ApiController"/></param>
|
||||
public ConfigurationController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IIOManager ioManager, ILogger<ConfigurationController> logger) : base(databaseContext, authenticationContextFactory, logger, true)
|
||||
public ConfigurationController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IIOManager ioManager, ILogger<ConfigurationController> 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;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpPost]
|
||||
[TgsAuthorize(ConfigurationRights.Write)]
|
||||
[ProducesResponseType(typeof(ConfigurationFile), 200)]
|
||||
[ProducesResponseType(typeof(ConfigurationFile), 201)]
|
||||
[ProducesResponseType(501)]
|
||||
public override async Task<IActionResult> Update([FromBody] ConfigurationFile model, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> Update([FromBody] ConfigurationFile model, CancellationToken cancellationToken)
|
||||
{
|
||||
if (model == null)
|
||||
throw new ArgumentNullException(nameof(model));
|
||||
@@ -110,6 +110,8 @@ namespace Tgstation.Server.Host.Controllers
|
||||
/// <param name="filePath">The path of the file to get</param>
|
||||
/// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation</param>
|
||||
/// <returns>A <see cref="Task{TResult}"/> resulting in the <see cref="IActionResult"/> for the operation</returns>
|
||||
/// <response code="410">File not found on disk.</response>
|
||||
/// <response code="501">POSIX system impersonation requested but not implemented.</response>
|
||||
[HttpGet(Routes.File + "/{*filePath}")]
|
||||
[TgsAuthorize(ConfigurationRights.Read)]
|
||||
[ProducesResponseType(typeof(ConfigurationFile), 200)]
|
||||
@@ -148,7 +150,9 @@ namespace Tgstation.Server.Host.Controllers
|
||||
/// <param name="directoryPath">The path of the directory to get</param>
|
||||
/// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation</param>
|
||||
/// <returns>A <see cref="Task{TResult}"/> resulting in the <see cref="IActionResult"/> for the operation</returns>
|
||||
[HttpGet("List/{*directoryPath}")]
|
||||
/// <response code="410">Directory not found on disk.</response>
|
||||
/// <response code="501">POSIX system impersonation requested but not implemented.</response>
|
||||
[HttpGet(Routes.List + "/{*directoryPath}")]
|
||||
[TgsAuthorize(ConfigurationRights.List)]
|
||||
[ProducesResponseType(typeof(IReadOnlyList<ConfigurationFile>), 200)]
|
||||
[ProducesResponseType(410)]
|
||||
@@ -176,20 +180,20 @@ namespace Tgstation.Server.Host.Controllers
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpGet(Routes.List)]
|
||||
[TgsAuthorize(ConfigurationRights.List)]
|
||||
[ProducesResponseType(typeof(IReadOnlyList<ConfigurationFile>), 200)]
|
||||
[ProducesResponseType(410)]
|
||||
[ProducesResponseType(501)]
|
||||
public override Task<IActionResult> List(CancellationToken cancellationToken) => Directory(null, cancellationToken);
|
||||
public Task<IActionResult> List(CancellationToken cancellationToken) => Directory(null, cancellationToken);
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpPut]
|
||||
[TgsAuthorize(ConfigurationRights.Write)]
|
||||
[ProducesResponseType(typeof(ConfigurationFile), 200)]
|
||||
[ProducesResponseType(typeof(ConfigurationFile), 201)]
|
||||
[ProducesResponseType(410)]
|
||||
[ProducesResponseType(501)]
|
||||
public override async Task<IActionResult> Create([FromBody] ConfigurationFile model, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> Create([FromBody] ConfigurationFile model, CancellationToken cancellationToken)
|
||||
{
|
||||
if (model == null)
|
||||
throw new ArgumentNullException(nameof(model));
|
||||
@@ -226,6 +230,8 @@ namespace Tgstation.Server.Host.Controllers
|
||||
/// <param name="directory">A <see cref="ConfigurationFile"/> representing the path to the directory to delete</param>
|
||||
/// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation</param>
|
||||
/// <returns>A <see cref="Task{TResult}"/> resulting in the <see cref="IActionResult"/> of the operation</returns>
|
||||
/// <response code="200">Empty directory deleted successfully.</response>
|
||||
/// <response code="501">POSIX system impersonation requested but not implemented.</response>
|
||||
[HttpDelete]
|
||||
[TgsAuthorize(ConfigurationRights.Delete)]
|
||||
[ProducesResponseType(200)]
|
||||
|
||||
@@ -20,10 +20,10 @@ using Tgstation.Server.Host.Security;
|
||||
namespace Tgstation.Server.Host.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// <see cref="ModelController{TModel}"/> for managing the <see cref="DreamDaemon"/>
|
||||
/// <see cref="ApiController"/> for managing the <see cref="DreamDaemon"/>
|
||||
/// </summary>
|
||||
[Route(Routes.DreamDaemon)]
|
||||
public sealed class DreamDaemonController : ModelController<DreamDaemon>
|
||||
public sealed class DreamDaemonController : ApiController
|
||||
{
|
||||
/// <summary>
|
||||
/// The <see cref="IJobManager"/> for the <see cref="DreamMakerController"/>
|
||||
@@ -43,17 +43,17 @@ namespace Tgstation.Server.Host.Controllers
|
||||
/// <param name="jobManager">The value of <see cref="jobManager"/></param>
|
||||
/// <param name="instanceManager">The value of <see cref="instanceManager"/></param>
|
||||
/// <param name="logger">The <see cref="ILogger"/> for the <see cref="ApiController"/></param>
|
||||
public DreamDaemonController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, ILogger<DreamDaemonController> logger) : base(databaseContext, authenticationContextFactory, logger, true)
|
||||
public DreamDaemonController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, ILogger<DreamDaemonController> logger) : base(databaseContext, authenticationContextFactory, logger, true, true)
|
||||
{
|
||||
this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
|
||||
this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpPut]
|
||||
[TgsAuthorize(DreamDaemonRights.Start)]
|
||||
[ProducesResponseType(typeof(Api.Models.Job), 202)]
|
||||
[ProducesResponseType(410)]
|
||||
public override async Task<IActionResult> Create([FromBody] DreamDaemon model, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> 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());
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpGet]
|
||||
[TgsAuthorize(DreamDaemonRights.ReadMetadata | DreamDaemonRights.ReadRevision)]
|
||||
[ProducesResponseType(typeof(DreamDaemon), 200)]
|
||||
[ProducesResponseType(410)]
|
||||
public override Task<IActionResult> Read(CancellationToken cancellationToken) => ReadImpl(null, cancellationToken);
|
||||
public Task<IActionResult> Read(CancellationToken cancellationToken) => ReadImpl(null, cancellationToken);
|
||||
|
||||
/// <summary>
|
||||
/// Implementation of <see cref="Read(CancellationToken)"/>
|
||||
@@ -132,10 +132,11 @@ namespace Tgstation.Server.Host.Controllers
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Stops DreamDaemon if it's running
|
||||
/// Stops the Watchdog if it's running
|
||||
/// </summary>
|
||||
/// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation</param>
|
||||
/// <returns>A <see cref="Task{TResult}"/> resulting in the <see cref="IActionResult"/> of the operation</returns>
|
||||
/// <response code="200">Watchdog terminated.</response>
|
||||
[HttpDelete]
|
||||
[TgsAuthorize(DreamDaemonRights.Shutdown)]
|
||||
[ProducesResponseType(200)]
|
||||
@@ -146,12 +147,12 @@ namespace Tgstation.Server.Host.Controllers
|
||||
return Ok();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
#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<IActionResult> Update([FromBody] DreamDaemon model, CancellationToken cancellationToken)
|
||||
#pragma warning disable CA1506 // TODO: Decomplexify
|
||||
public async Task<IActionResult> 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
|
||||
|
||||
/// <summary>
|
||||
/// Handle a HTTP PATCH to the <see cref="DreamDaemonController"/>
|
||||
/// Creates a <see cref="Api.Models.Job"/> to restart the Watchdog. It will start if it wasn't already running.
|
||||
/// </summary>
|
||||
/// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation</param>
|
||||
/// <returns>A <see cref="Task{TResult}"/> resulting in the <see cref="IActionResult"/> of the request</returns>
|
||||
/// <response code="202">Job started successfully.</response>
|
||||
[HttpPatch]
|
||||
[TgsAuthorize(DreamDaemonRights.Restart)]
|
||||
[ProducesResponseType(typeof(Api.Models.Job), 202)]
|
||||
|
||||
@@ -18,11 +18,11 @@ using Tgstation.Server.Host.Security;
|
||||
namespace Tgstation.Server.Host.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// Controller for managing the compiler
|
||||
/// <see cref="ApiController"/> for managing the deployment system.
|
||||
/// </summary>
|
||||
[Route(Routes.DreamMaker)]
|
||||
#pragma warning disable CA1506 // TODO: Decomplexify
|
||||
public sealed class DreamMakerController : ModelController<DreamMaker>
|
||||
public sealed class DreamMakerController : ApiController
|
||||
{
|
||||
/// <summary>
|
||||
/// The <see cref="IJobManager"/> for the <see cref="DreamMakerController"/>
|
||||
@@ -42,27 +42,27 @@ namespace Tgstation.Server.Host.Controllers
|
||||
/// <param name="jobManager">The value of <see cref="jobManager"/></param>
|
||||
/// <param name="instanceManager">The value of <see cref="instanceManager"/></param>
|
||||
/// <param name="logger">The <see cref="ILogger"/> for the <see cref="ApiController"/></param>
|
||||
public DreamMakerController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, ILogger<DreamMakerController> logger) : base(databaseContext, authenticationContextFactory, logger, true)
|
||||
public DreamMakerController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, ILogger<DreamMakerController> logger) : base(databaseContext, authenticationContextFactory, logger, true, true)
|
||||
{
|
||||
this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
|
||||
this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpGet]
|
||||
[TgsAuthorize(DreamMakerRights.Read)]
|
||||
[ProducesResponseType(typeof(DreamMaker), 200)]
|
||||
public override async Task<IActionResult> Read(CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> 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());
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpGet("{id}")]
|
||||
[TgsAuthorize(DreamMakerRights.CompileJobs)]
|
||||
[ProducesResponseType(typeof(Api.Models.CompileJob), 200)]
|
||||
[ProducesResponseType(404)]
|
||||
public override async Task<IActionResult> GetId(long id, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> 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());
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpGet(Routes.List)]
|
||||
[TgsAuthorize(DreamMakerRights.CompileJobs)]
|
||||
[ProducesResponseType(typeof(List<Api.Models.CompileJob>), 200)]
|
||||
public override async Task<IActionResult> List(CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> 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);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpPut]
|
||||
[TgsAuthorize(DreamMakerRights.Compile)]
|
||||
[ProducesResponseType(typeof(Api.Models.Job), 202)]
|
||||
public override async Task<IActionResult> Create([FromBody] DreamMaker model, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> Create([FromBody] DreamMaker model, CancellationToken cancellationToken)
|
||||
{
|
||||
var job = new Models.Job
|
||||
{
|
||||
@@ -104,12 +104,12 @@ namespace Tgstation.Server.Host.Controllers
|
||||
return Accepted(job.ToApi());
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpPost]
|
||||
[TgsAuthorize(DreamMakerRights.SetDme | DreamMakerRights.SetApiValidationPort | DreamMakerRights.SetApiValidationPort)]
|
||||
[ProducesResponseType(typeof(DreamMaker), 200)]
|
||||
[ProducesResponseType(200)]
|
||||
[ProducesResponseType(410)]
|
||||
public override async Task<IActionResult> Update([FromBody] DreamMaker model, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> Update([FromBody] DreamMaker model, CancellationToken cancellationToken)
|
||||
{
|
||||
if (model.ApiValidationPort == 0)
|
||||
return BadRequest(new ErrorMessage { Message = "API Validation port cannot be 0!" });
|
||||
|
||||
@@ -88,10 +88,13 @@ namespace Tgstation.Server.Host.Controllers
|
||||
/// <summary>
|
||||
/// Main page of the <see cref="Application"/>
|
||||
/// </summary>
|
||||
/// <returns>The <see cref="Api.Models.ServerInformation"/> of the <see cref="Application"/> if a properly authenticated API request, the web control panel if on a browser and enabled, <see cref="UnauthorizedResult"/> otherwise</returns>
|
||||
/// <returns>
|
||||
/// The <see cref="Api.Models.ServerInformation"/> of the <see cref="Application"/> if a properly authenticated API request, the web control panel if on a browser and enabled, <see cref="UnauthorizedResult"/> otherwise.
|
||||
/// </returns>
|
||||
/// <response code="200"><see cref="Api.Models.ServerInformation"/> retrieved successfully.</response>
|
||||
[HttpGet]
|
||||
[TgsAuthorize]
|
||||
[AllowAnonymous]
|
||||
[HttpGet]
|
||||
[ProducesResponseType(typeof(Api.Models.ServerInformation), 200)]
|
||||
public IActionResult Home()
|
||||
{
|
||||
@@ -117,6 +120,9 @@ namespace Tgstation.Server.Host.Controllers
|
||||
/// </summary>
|
||||
/// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation</param>
|
||||
/// <returns>A <see cref="Task{TResult}"/> resulting in the <see cref="IActionResult"/> of the operation</returns>
|
||||
/// <response code="200">User logged in and <see cref="Api.Models.Token"/> generated successfully.</response>
|
||||
/// <response code="401">User authentication failed.</response>
|
||||
/// <response code="403">User authenticated but is disabled by an administrator.</response>
|
||||
[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)
|
||||
|
||||
@@ -23,11 +23,11 @@ using Tgstation.Server.Host.Security;
|
||||
namespace Tgstation.Server.Host.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// Controller for managing <see cref="Components.Instance"/>s
|
||||
/// <see cref="ApiController"/> for managing <see cref="Components.Instance"/>s
|
||||
/// </summary>
|
||||
[Route(Routes.InstanceManager)]
|
||||
#pragma warning disable CA1506 // TODO: Decomplexify
|
||||
public sealed class InstanceController : ModelController<Api.Models.Instance>
|
||||
public sealed class InstanceController : ApiController
|
||||
{
|
||||
/// <summary>
|
||||
/// File name to allow attaching instances
|
||||
@@ -72,7 +72,7 @@ namespace Tgstation.Server.Host.Controllers
|
||||
/// <param name="application">The value of <see cref="application"/></param>
|
||||
/// <param name="platformIdentifier">The value of <see cref="platformIdentifier"/></param>
|
||||
/// <param name="logger">The <see cref="ILogger"/> for the <see cref="ApiController"/></param>
|
||||
public InstanceController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, IIOManager ioManager, IApplication application, IPlatformIdentifier platformIdentifier, ILogger<InstanceController> logger) : base(databaseContext, authenticationContextFactory, logger, false)
|
||||
public InstanceController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, IIOManager ioManager, IApplication application, IPlatformIdentifier platformIdentifier, ILogger<InstanceController> 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
|
||||
};
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpPut]
|
||||
[TgsAuthorize(InstanceManagerRights.Create)]
|
||||
[ProducesResponseType(typeof(Api.Models.Instance), 200)]
|
||||
[ProducesResponseType(typeof(Api.Models.Instance), 201)]
|
||||
public override async Task<IActionResult> Create([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> 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);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpDelete]
|
||||
[TgsAuthorize(InstanceManagerRights.Delete)]
|
||||
[ProducesResponseType(200)]
|
||||
[ProducesResponseType(410)]
|
||||
public override async Task<IActionResult> Delete(long id, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> 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();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[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<IActionResult> Update([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> 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
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpGet(Routes.List)]
|
||||
[TgsAuthorize(InstanceManagerRights.List | InstanceManagerRights.Read)]
|
||||
[ProducesResponseType(typeof(IEnumerable<Api.Models.Instance>), 200)]
|
||||
public override async Task<IActionResult> List(CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> List(CancellationToken cancellationToken)
|
||||
{
|
||||
IQueryable<Models.Instance> query = DatabaseContext.Instances;
|
||||
if (!AuthenticationContext.User.InstanceManagerRights.Value.HasFlag(InstanceManagerRights.List))
|
||||
@@ -425,11 +425,11 @@ namespace Tgstation.Server.Host.Controllers
|
||||
return Json(apis);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpGet("{id}")]
|
||||
[TgsAuthorize(InstanceManagerRights.List | InstanceManagerRights.Read)]
|
||||
[ProducesResponseType(typeof(Api.Models.Instance), 200)]
|
||||
[ProducesResponseType(410)]
|
||||
public override async Task<IActionResult> GetId(long id, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> GetId(long id, CancellationToken cancellationToken)
|
||||
{
|
||||
var query = DatabaseContext.Instances.Where(x => x.Id == id);
|
||||
var cantList = !AuthenticationContext.User.InstanceManagerRights.Value.HasFlag(InstanceManagerRights.List);
|
||||
|
||||
@@ -17,10 +17,10 @@ using Z.EntityFramework.Plus;
|
||||
namespace Tgstation.Server.Host.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// For managing <see cref="User"/>s
|
||||
/// <see cref="ApiController"/> for managing <see cref="InstanceUser"/>s.
|
||||
/// </summary>
|
||||
[Route(Routes.InstanceUser)]
|
||||
public sealed class InstanceUserController : ModelController<Api.Models.InstanceUser>
|
||||
public sealed class InstanceUserController : ApiController
|
||||
{
|
||||
/// <summary>
|
||||
/// Construct a <see cref="UserController"/>
|
||||
@@ -28,7 +28,7 @@ namespace Tgstation.Server.Host.Controllers
|
||||
/// <param name="databaseContext">The <see cref="IDatabaseContext"/> for the <see cref="ApiController"/></param>
|
||||
/// <param name="authenticationContextFactory">The <see cref="IAuthenticationContextFactory"/> for the <see cref="ApiController"/></param>
|
||||
/// <param name="logger">The <see cref="ILogger"/> for the <see cref="ApiController"/></param>
|
||||
public InstanceUserController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger<InstanceUserController> logger) : base(databaseContext, authenticationContextFactory, logger, true) // false instance requirement, we handle this ourself
|
||||
public InstanceUserController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger<InstanceUserController> logger) : base(databaseContext, authenticationContextFactory, logger, true, true)
|
||||
{ }
|
||||
|
||||
/// <summary>
|
||||
@@ -47,10 +47,10 @@ namespace Tgstation.Server.Host.Controllers
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpPut]
|
||||
[TgsAuthorize(InstanceUserRights.CreateUsers)]
|
||||
[ProducesResponseType(typeof(Api.Models.InstanceUser), 201)]
|
||||
public override async Task<IActionResult> Create([FromBody] Api.Models.InstanceUser model, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> 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());
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpPost]
|
||||
[TgsAuthorize(InstanceUserRights.WriteUsers)]
|
||||
[ProducesResponseType(typeof(Api.Models.InstanceUser), 200)]
|
||||
[ProducesResponseType(410)]
|
||||
#pragma warning disable CA1506 // TODO: Decomplexify
|
||||
public override async Task<IActionResult> Update([FromBody] Api.Models.InstanceUser model, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> 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
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpGet]
|
||||
[TgsAuthorize]
|
||||
[ProducesResponseType(typeof(Api.Models.InstanceUser), 200)]
|
||||
[ProducesResponseType(404)]
|
||||
public override Task<IActionResult> Read(CancellationToken cancellationToken) => Task.FromResult(AuthenticationContext.InstanceUser != null ? (IActionResult)Json(AuthenticationContext.InstanceUser.ToApi()) : NotFound());
|
||||
public Task<IActionResult> Read(CancellationToken cancellationToken) => Task.FromResult(AuthenticationContext.InstanceUser != null ? (IActionResult)Json(AuthenticationContext.InstanceUser.ToApi()) : NotFound());
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpGet(Routes.List)]
|
||||
[TgsAuthorize(InstanceUserRights.ReadUsers)]
|
||||
[ProducesResponseType(typeof(IEnumerable<Api.Models.InstanceUser>), 200)]
|
||||
public override async Task<IActionResult> List(CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> 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()));
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpGet("{id}")]
|
||||
[TgsAuthorize(InstanceUserRights.ReadUsers)]
|
||||
[ProducesResponseType(typeof(Api.Models.InstanceUser), 200)]
|
||||
[ProducesResponseType(410)]
|
||||
public override async Task<IActionResult> GetId(long id, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> 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());
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpDelete]
|
||||
[TgsAuthorize(InstanceUserRights.WriteUsers)]
|
||||
[ProducesResponseType(200)]
|
||||
public override async Task<IActionResult> Delete(long id, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> 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();
|
||||
|
||||
@@ -15,10 +15,10 @@ using Tgstation.Server.Host.Security;
|
||||
namespace Tgstation.Server.Host.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// <see cref="ModelController{TModel}"/> for <see cref="Api.Models.Job"/>s
|
||||
/// <see cref="ApiController"/> for <see cref="Api.Models.Job"/>s
|
||||
/// </summary>
|
||||
[Route(Routes.Jobs)]
|
||||
public sealed class JobController : ModelController<Api.Models.Job>
|
||||
public sealed class JobController : ApiController
|
||||
{
|
||||
/// <summary>
|
||||
/// The <see cref="IJobManager"/> for the <see cref="JobController"/>
|
||||
@@ -32,24 +32,24 @@ namespace Tgstation.Server.Host.Controllers
|
||||
/// <param name="authenticationContextFactory">The <see cref="IAuthenticationContextFactory"/> for the <see cref="ApiController"/></param>
|
||||
/// <param name="jobManager">The value of <see cref="jobManager"/></param>
|
||||
/// <param name="logger">The <see cref="ILogger"/> for the <see cref="ApiController"/></param>
|
||||
public JobController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, ILogger<JobController> logger) : base(databaseContext, authenticationContextFactory, logger, true)
|
||||
public JobController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, ILogger<JobController> logger) : base(databaseContext, authenticationContextFactory, logger, true, true)
|
||||
{
|
||||
this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpGet]
|
||||
[TgsAuthorize]
|
||||
[ProducesResponseType(typeof(IEnumerable<Api.Models.Job>), 200)]
|
||||
public override async Task<IActionResult> Read(CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> 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()));
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpGet(Routes.List)]
|
||||
[TgsAuthorize]
|
||||
[ProducesResponseType(typeof(List<Api.Models.Job>), 200)]
|
||||
public override async Task<IActionResult> List(CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> 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);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpDelete]
|
||||
[TgsAuthorize]
|
||||
[ProducesResponseType(202)]
|
||||
[ProducesResponseType(404)]
|
||||
[ProducesResponseType(410)]
|
||||
public override async Task<IActionResult> Delete(long id, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> 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);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpGet("{id}")]
|
||||
[TgsAuthorize]
|
||||
[ProducesResponseType(404)]
|
||||
[ProducesResponseType(typeof(Api.Models.Job), 200)]
|
||||
public override async Task<IActionResult> GetId(long id, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> 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))
|
||||
|
||||
@@ -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
|
||||
{
|
||||
/// <summary>
|
||||
/// An <see cref="ApiController"/> representing a <typeparamref name="TModel"/>
|
||||
/// </summary>
|
||||
/// <typeparam name="TModel">The model being represented</typeparam>
|
||||
public abstract class ModelController<TModel> : ApiController where TModel : class
|
||||
{
|
||||
/// <summary>
|
||||
/// Construct a <see cref="ModelController{TModel}"/>
|
||||
/// </summary>
|
||||
/// <param name="databaseContext">The <see cref="IDatabaseContext"/> for the <see cref="ApiController"/></param>
|
||||
/// <param name="authenticationContextFactory">The <see cref="IAuthenticationContextFactory"/> for the <see cref="ApiController"/></param>
|
||||
/// <param name="logger">The <see cref="ILogger"/> for the <see cref="ApiController"/></param>
|
||||
/// <param name="requireInstance">If the <see cref="ModelController{TModel}"/> requires an <see cref="IAuthenticationContext.InstanceUser"/></param>
|
||||
public ModelController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ILogger logger, bool requireInstance) : base(databaseContext, authenticationContextFactory, logger, requireInstance, true) { }
|
||||
|
||||
/// <summary>
|
||||
/// Attempt to create a <paramref name="model"/>
|
||||
/// </summary>
|
||||
/// <param name="model">The <typeparamref name="TModel"/> being created</param>
|
||||
/// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation</param>
|
||||
/// <returns>A <see cref="Task{TResult}"/> resulting in the <see cref="IActionResult"/> of the operation</returns>
|
||||
[HttpPut]
|
||||
public virtual Task<IActionResult> Create([FromBody]TModel model, CancellationToken cancellationToken) => Task.FromResult((IActionResult)NotFound());
|
||||
|
||||
/// <summary>
|
||||
/// Attempt to read a <typeparamref name="TModel"/>
|
||||
/// </summary>
|
||||
/// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation</param>
|
||||
/// <returns>A <see cref="Task{TResult}"/> resulting in the <see cref="IActionResult"/> of the operation</returns>
|
||||
[HttpGet]
|
||||
public virtual Task<IActionResult> Read(CancellationToken cancellationToken) => Task.FromResult((IActionResult)NotFound());
|
||||
|
||||
/// <summary>
|
||||
/// Attempt to get a specific a <typeparamref name="TModel"/>
|
||||
/// </summary>
|
||||
/// <param name="id">The ID of the model to get</param>
|
||||
/// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation</param>
|
||||
/// <returns>A <see cref="Task{TResult}"/> resulting in the <see cref="IActionResult"/> of the operation</returns>
|
||||
[HttpGet("{id}")]
|
||||
public virtual Task<IActionResult> GetId(long id, CancellationToken cancellationToken) => Task.FromResult((IActionResult)NotFound());
|
||||
|
||||
/// <summary>
|
||||
/// Attempt to update a <paramref name="model"/>
|
||||
/// </summary>
|
||||
/// <param name="model">The <typeparamref name="TModel"/> being updated</param>
|
||||
/// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation</param>
|
||||
/// <returns>A <see cref="Task{TResult}"/> resulting in the <see cref="IActionResult"/> of the operation</returns>
|
||||
[HttpPost]
|
||||
public virtual Task<IActionResult> Update([FromBody]TModel model, CancellationToken cancellationToken) => Task.FromResult((IActionResult)NotFound());
|
||||
|
||||
/// <summary>
|
||||
/// Attempt to delete a model with a particular <paramref name="id"/>
|
||||
/// </summary>
|
||||
/// <param name="id">The ID of the model to delete</param>
|
||||
/// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation</param>
|
||||
/// <returns>A <see cref="Task{TResult}"/> resulting in the <see cref="IActionResult"/> of the operation</returns>
|
||||
[HttpDelete("{id}")]
|
||||
public virtual Task<IActionResult> Delete(long id, CancellationToken cancellationToken) => Task.FromResult((IActionResult)NotFound());
|
||||
|
||||
/// <summary>
|
||||
/// Attempt to list entries of the <typeparamref name="TModel"/>
|
||||
/// </summary>
|
||||
/// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation</param>
|
||||
/// <returns>A <see cref="Task{TResult}"/> resulting in the <see cref="IActionResult"/> of the operation</returns>
|
||||
[HttpGet("List")]
|
||||
public virtual Task<IActionResult> List(CancellationToken cancellationToken) => Task.FromResult((IActionResult)NotFound());
|
||||
}
|
||||
}
|
||||
@@ -23,11 +23,11 @@ using Tgstation.Server.Host.Security;
|
||||
namespace Tgstation.Server.Host.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// Controller for managing the <see cref="Repository"/>s
|
||||
/// <see cref="ApiController"/> for managing the <see cref="Repository"/>s
|
||||
/// </summary>
|
||||
[Route(Routes.Repository)]
|
||||
#pragma warning disable CA1506 // TODO: Decomplexify
|
||||
public sealed class RepositoryController : ModelController<Repository>
|
||||
public sealed class RepositoryController : ApiController
|
||||
{
|
||||
/// <summary>
|
||||
/// The <see cref="IInstanceManager"/> for the <see cref="RepositoryController"/>
|
||||
@@ -59,7 +59,7 @@ namespace Tgstation.Server.Host.Controllers
|
||||
/// <param name="jobManager">The value of <see cref="jobManager"/></param>
|
||||
/// <param name="logger">The <see cref="ILogger"/> for the <see cref="ApiController"/></param>
|
||||
/// <param name="generalConfigurationOptions">The <see cref="IOptions{TOptions}"/> containing value of <see cref="generalConfiguration"/></param>
|
||||
public RepositoryController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IGitHubClientFactory gitHubClientFactory, IJobManager jobManager, ILogger<RepositoryController> logger, IOptions<GeneralConfiguration> generalConfigurationOptions) : base(databaseContext, authenticationContextFactory, logger, true)
|
||||
public RepositoryController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IGitHubClientFactory gitHubClientFactory, IJobManager jobManager, ILogger<RepositoryController> logger, IOptions<GeneralConfiguration> 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;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpPut]
|
||||
[TgsAuthorize(RepositoryRights.SetOrigin)]
|
||||
[ProducesResponseType(typeof(Repository), 201)]
|
||||
[ProducesResponseType(410)]
|
||||
public override async Task<IActionResult> Create([FromBody] Repository model, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> Create([FromBody] Repository model, CancellationToken cancellationToken)
|
||||
{
|
||||
if (model == null)
|
||||
throw new ArgumentNullException(nameof(model));
|
||||
@@ -216,10 +216,13 @@ namespace Tgstation.Server.Host.Controllers
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Delete the <see cref="Repository"/>
|
||||
/// Delete the <see cref="Repository"/>.
|
||||
/// </summary>
|
||||
/// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation</param>
|
||||
/// <returns>A <see cref="Task{TResult}"/> resulting in the <see cref="IActionResult"/> of the operation</returns>
|
||||
/// <response code="202">Job to delete the repository created successfully.</response>
|
||||
/// <response code="410">The repository is not present.</response>
|
||||
[HttpDelete]
|
||||
[TgsAuthorize(RepositoryRights.Delete)]
|
||||
[ProducesResponseType(typeof(Repository), 202)]
|
||||
[ProducesResponseType(410)]
|
||||
@@ -249,12 +252,12 @@ namespace Tgstation.Server.Host.Controllers
|
||||
return Accepted(api);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpGet]
|
||||
[TgsAuthorize(RepositoryRights.Read)]
|
||||
[ProducesResponseType(typeof(Repository), 200)]
|
||||
[ProducesResponseType(typeof(Repository), 201)]
|
||||
[ProducesResponseType(410)]
|
||||
public override async Task<IActionResult> Read(CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> 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
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[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<IActionResult> Update([FromBody]Repository model, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> Update([FromBody]Repository model, CancellationToken cancellationToken)
|
||||
{
|
||||
if (model == null)
|
||||
throw new ArgumentNullException(nameof(model));
|
||||
|
||||
@@ -19,10 +19,10 @@ using Tgstation.Server.Host.Security;
|
||||
namespace Tgstation.Server.Host.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// For managing <see cref="User"/>s
|
||||
/// <see cref="ApiController"/> for managing <see cref="User"/>s.
|
||||
/// </summary>
|
||||
[Route(Routes.User)]
|
||||
public sealed class UserController : ModelController<UserUpdate>
|
||||
public sealed class UserController : ApiController
|
||||
{
|
||||
/// <summary>
|
||||
/// The <see cref="ISystemIdentityFactory"/> for the <see cref="UserController"/>
|
||||
@@ -53,7 +53,7 @@ namespace Tgstation.Server.Host.Controllers
|
||||
/// <param name="cryptographySuite">The value of <see cref="cryptographySuite"/></param>
|
||||
/// <param name="logger">The value of <see cref="logger"/></param>
|
||||
/// <param name="generalConfigurationOptions">The <see cref="IOptions{TOptions}"/> containing the value of <see cref="generalConfiguration"/></param>
|
||||
public UserController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ISystemIdentityFactory systemIdentityFactory, ICryptographySuite cryptographySuite, ILogger<UserController> logger, IOptions<GeneralConfiguration> generalConfigurationOptions) : base(databaseContext, authenticationContextFactory, logger, false)
|
||||
public UserController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ISystemIdentityFactory systemIdentityFactory, ICryptographySuite cryptographySuite, ILogger<UserController> logger, IOptions<GeneralConfiguration> 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;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpPut]
|
||||
[TgsAuthorize(AdministrationRights.WriteUsers)]
|
||||
[ProducesResponseType(typeof(Api.Models.User), 201)]
|
||||
[ProducesResponseType(410)]
|
||||
[ProducesResponseType(501)]
|
||||
public override async Task<IActionResult> Create([FromBody] UserUpdate model, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> 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));
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpPost]
|
||||
[TgsAuthorize(AdministrationRights.WriteUsers | AdministrationRights.EditOwnPassword)]
|
||||
[ProducesResponseType(typeof(Api.Models.User), 200)]
|
||||
[ProducesResponseType(404)]
|
||||
public override async Task<IActionResult> Update([FromBody] UserUpdate model, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> Update([FromBody] UserUpdate model, CancellationToken cancellationToken)
|
||||
{
|
||||
if (model == null)
|
||||
throw new ArgumentNullException(nameof(model));
|
||||
@@ -190,15 +190,15 @@ namespace Tgstation.Server.Host.Controllers
|
||||
});
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpGet]
|
||||
[TgsAuthorize]
|
||||
[ProducesResponseType(typeof(Api.Models.User), 200)]
|
||||
public override Task<IActionResult> Read(CancellationToken cancellationToken) => Task.FromResult<IActionResult>(Json(AuthenticationContext.User.ToApi(true)));
|
||||
public Task<IActionResult> Read(CancellationToken cancellationToken) => Task.FromResult<IActionResult>(Json(AuthenticationContext.User.ToApi(true)));
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpGet(Routes.List)]
|
||||
[TgsAuthorize(AdministrationRights.ReadUsers)]
|
||||
[ProducesResponseType(typeof(IEnumerable<Api.Models.User>), 200)]
|
||||
public override async Task<IActionResult> List(CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> 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)));
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[HttpGet("{id}")]
|
||||
[TgsAuthorize]
|
||||
[ProducesResponseType(typeof(Api.Models.User), 200)]
|
||||
[ProducesResponseType(404)]
|
||||
public override async Task<IActionResult> GetId(long id, CancellationToken cancellationToken)
|
||||
public async Task<IActionResult> GetId(long id, CancellationToken cancellationToken)
|
||||
{
|
||||
if (id == AuthenticationContext.User.Id)
|
||||
return await Read(cancellationToken).ConfigureAwait(false);
|
||||
|
||||
Reference in New Issue
Block a user