diff --git a/MoonlightServers.ApiServer/Http/Controllers/Admin/Servers/ServerVariablesController.cs b/MoonlightServers.ApiServer/Http/Controllers/Admin/Servers/ServerVariablesController.cs new file mode 100644 index 0000000..4b41ba3 --- /dev/null +++ b/MoonlightServers.ApiServer/Http/Controllers/Admin/Servers/ServerVariablesController.cs @@ -0,0 +1,50 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using MoonCore.Attributes; +using MoonCore.Exceptions; +using MoonCore.Extended.Abstractions; +using MoonCore.Helpers; +using MoonCore.Models; +using MoonlightServers.ApiServer.Database.Entities; +using MoonlightServers.Shared.Http.Responses.Admin.ServerVariables; + +namespace MoonlightServers.ApiServer.Http.Controllers.Admin.Servers; + +[ApiController] +[Route("api/admin/servers")] +public class ServerVariablesController : Controller +{ + private readonly DatabaseRepository VariableRepository; + private readonly DatabaseRepository ServerRepository; + + public ServerVariablesController(DatabaseRepository variableRepository, DatabaseRepository serverRepository) + { + VariableRepository = variableRepository; + ServerRepository = serverRepository; + } + + [HttpGet("{serverId}/variables")] + [RequirePermission("admin.servers.get")] + public async Task> Get([FromRoute] int serverId, [FromQuery] int page, [FromQuery] int pageSize) + { + var server = await ServerRepository + .Get() + .FirstOrDefaultAsync(x => x.Id == serverId); + + if (server == null) + throw new HttpApiException("No server with this id found", 404); + + //TODO: Replace with a extension method to use queryable extension for PagedData + + var variables = await VariableRepository + .Get() + .Where(x => x.Server.Id == server.Id) + .ToArrayAsync(); + + var castedVariables = variables + .Select(x => Mapper.Map(x)) + .ToArray(); + + return PagedData.Create(castedVariables, page, pageSize); + } +} \ No newline at end of file diff --git a/MoonlightServers.ApiServer/Http/Controllers/Admin/Servers/ServersController.cs b/MoonlightServers.ApiServer/Http/Controllers/Admin/Servers/ServersController.cs index 21f7ca1..1134abb 100644 --- a/MoonlightServers.ApiServer/Http/Controllers/Admin/Servers/ServersController.cs +++ b/MoonlightServers.ApiServer/Http/Controllers/Admin/Servers/ServersController.cs @@ -146,11 +146,13 @@ public class ServersController : Controller // Variables foreach (var variable in star.Variables) { + var requestVar = request.Variables.FirstOrDefault(x => x.Key == variable.Key); + var serverVar = new ServerVariable() { Key = variable.Key, - Value = request.Variables.TryGetValue(variable.Key, out var value) - ? value + Value = requestVar != null + ? requestVar.Value : variable.DefaultValue }; @@ -207,6 +209,22 @@ public class ServersController : Controller // Set allocations server.Allocations = allocations; + // Process variables + foreach (var variable in request.Variables) + { + // Search server variable associated to the variable in the request + var serverVar = server.Variables + .FirstOrDefault(x => x.Key == variable.Key); + + if(serverVar == null) + continue; + + // Update value + serverVar.Value = variable.Value; + } + + // TODO: Call node + ServerRepository.Update(server); return CrudHelper.MapToResult(server); diff --git a/MoonlightServers.Frontend/UI/Components/Servers/CreateServerPartials/VariablesServerCreate.razor b/MoonlightServers.Frontend/UI/Components/Servers/CreateServerPartials/VariablesServerCreate.razor index b52d498..1f866da 100644 --- a/MoonlightServers.Frontend/UI/Components/Servers/CreateServerPartials/VariablesServerCreate.razor +++ b/MoonlightServers.Frontend/UI/Components/Servers/CreateServerPartials/VariablesServerCreate.razor @@ -2,6 +2,7 @@ @using MoonCore.Helpers @using MoonCore.Blazor.Tailwind.Components @using MoonCore.Models +@using MoonlightServers.Shared.Http.Requests.Admin.ServerVariables @using MoonlightServers.Shared.Http.Responses.Admin.StarVariables @inject HttpApiClient ApiClient @@ -11,8 +12,9 @@ @foreach (var variable in StarVariables) { // Load value of default - var value = Request.Variables.TryGetValue(variable.Key, out var val) - ? val + var requestVar = Request.Variables.FirstOrDefault(x => x.Key == variable.Key); + var value = requestVar != null + ? requestVar.Value : variable.DefaultValue;
@@ -60,10 +62,25 @@ var value = args.Value?.ToString() ?? ""; // Remove variable from request when set to its default value - if (value == starVariable.DefaultValue && Request.Variables.ContainsKey(starVariable.Key)) - Request.Variables.Remove(starVariable.Key); + if (value == starVariable.DefaultValue && Request.Variables.Any(x => x.Key == starVariable.Key)) + Request.Variables.RemoveAll(x => x.Key == starVariable.Key); else - Request.Variables[starVariable.Key] = value; + { + var serverVar = Request.Variables + .FirstOrDefault(x => x.Key == starVariable.Key); + + if (serverVar == null) + { + serverVar = new CreateServerVariableRequest() + { + Key = starVariable.Key + }; + + Request.Variables.Add(serverVar); + } + + serverVar.Value = value; + } await InvokeAsync(StateHasChanged); } diff --git a/MoonlightServers.Frontend/UI/Components/Servers/UpdateServerPartials/VariablesServerUpdate.razor b/MoonlightServers.Frontend/UI/Components/Servers/UpdateServerPartials/VariablesServerUpdate.razor index 10e10ae..2779ac9 100644 --- a/MoonlightServers.Frontend/UI/Components/Servers/UpdateServerPartials/VariablesServerUpdate.razor +++ b/MoonlightServers.Frontend/UI/Components/Servers/UpdateServerPartials/VariablesServerUpdate.razor @@ -2,36 +2,38 @@ @using MoonCore.Helpers @using MoonCore.Blazor.Tailwind.Components @using MoonCore.Models +@using MoonlightServers.Shared.Http.Requests.Admin.ServerVariables @using MoonlightServers.Shared.Http.Responses.Admin.Servers +@using MoonlightServers.Shared.Http.Responses.Admin.ServerVariables @using MoonlightServers.Shared.Http.Responses.Admin.StarVariables @inject HttpApiClient ApiClient
- @foreach (var variable in StarVariables) + @foreach (var variable in Variables) { - // Load value of default - /* - var value = Request.Variables.TryGetValue(variable.Key, out var val) - ? val - : variable.DefaultValue;*/ + var reqVariable = Request.Variables.FirstOrDefault(x => x.Key == variable.Key); + var starVariable = StarVariables.FirstOrDefault(x => x.Key == variable.Key); - var value = ""; + // Ignore all variables which aren't defined in the star + if (starVariable == null) + continue; + + var value = reqVariable != null + ? reqVariable.Value + : variable.Value;
-

- @variable.Description + @starVariable.Description

} @@ -44,6 +46,7 @@ [Parameter] public ServerDetailResponse Server { get; set; } private StarVariableDetailResponse[] StarVariables; + private ServerVariableDetailResponse[] Variables; private async Task Load(LazyLoader _) { @@ -52,19 +55,39 @@ $"api/admin/servers/stars/{Server.StarId}/variables?page={page}&pageSize={pageSize}" ) ); + + Variables = await PagedData.All(async (page, pageSize) => + await ApiClient.GetJson>( + $"api/admin/servers/{Server.Id}/variables?page={page}&pageSize={pageSize}" + ) + ); } - private async Task UpdateValue(StarVariableDetailResponse starVariable, ChangeEventArgs args) + private async Task UpdateValue(ServerVariableDetailResponse serverVariable, ChangeEventArgs args) { - /* var value = args.Value?.ToString() ?? ""; // Remove variable from request when set to its default value - if (value == starVariable.DefaultValue && Request.Variables.ContainsKey(starVariable.Key)) - Request.Variables.Remove(starVariable.Key); + if (value == serverVariable.Value && Request.Variables.Any(x => x.Key == serverVariable.Key)) + Request.Variables.RemoveAll(x => x.Key == serverVariable.Key); else - Request.Variables[starVariable.Key] = value; + { + var serverVar = Request.Variables + .FirstOrDefault(x => x.Key == serverVariable.Key); - await InvokeAsync(StateHasChanged);*/ + if (serverVar == null) + { + serverVar = new UpdateServerVariableRequest() + { + Key = serverVariable.Key + }; + + Request.Variables.Add(serverVar); + } + + serverVar.Value = value; + } + + await InvokeAsync(StateHasChanged); } } \ No newline at end of file diff --git a/MoonlightServers.Shared/Http/Requests/Admin/ServerVariables/CreateServerVariableRequest.cs b/MoonlightServers.Shared/Http/Requests/Admin/ServerVariables/CreateServerVariableRequest.cs new file mode 100644 index 0000000..bda7801 --- /dev/null +++ b/MoonlightServers.Shared/Http/Requests/Admin/ServerVariables/CreateServerVariableRequest.cs @@ -0,0 +1,10 @@ +using System.ComponentModel.DataAnnotations; + +namespace MoonlightServers.Shared.Http.Requests.Admin.ServerVariables; + +public class CreateServerVariableRequest +{ + [Required(ErrorMessage = "You need to provide a key for the variable")] + public string Key { get; set; } + public string Value { get; set; } +} \ No newline at end of file diff --git a/MoonlightServers.Shared/Http/Requests/Admin/ServerVariables/UpdateServerVariableRequest.cs b/MoonlightServers.Shared/Http/Requests/Admin/ServerVariables/UpdateServerVariableRequest.cs new file mode 100644 index 0000000..4972fa5 --- /dev/null +++ b/MoonlightServers.Shared/Http/Requests/Admin/ServerVariables/UpdateServerVariableRequest.cs @@ -0,0 +1,10 @@ +using System.ComponentModel.DataAnnotations; + +namespace MoonlightServers.Shared.Http.Requests.Admin.ServerVariables; + +public class UpdateServerVariableRequest +{ + [Required(ErrorMessage = "You need to provide a key for the variable")] + public string Key { get; set; } + public string Value { get; set; } +} \ No newline at end of file diff --git a/MoonlightServers.Shared/Http/Requests/Admin/Servers/CreateServerRequest.cs b/MoonlightServers.Shared/Http/Requests/Admin/Servers/CreateServerRequest.cs index 7b6ae88..1801f98 100644 --- a/MoonlightServers.Shared/Http/Requests/Admin/Servers/CreateServerRequest.cs +++ b/MoonlightServers.Shared/Http/Requests/Admin/Servers/CreateServerRequest.cs @@ -1,4 +1,5 @@ using System.ComponentModel.DataAnnotations; +using MoonlightServers.Shared.Http.Requests.Admin.ServerVariables; namespace MoonlightServers.Shared.Http.Requests.Admin.Servers; @@ -31,5 +32,5 @@ public class CreateServerRequest public int NodeId { get; set; } public int[] AllocationIds { get; set; } = []; - public Dictionary Variables { get; set; } = new(); + public List Variables { get; set; } = new(); } \ No newline at end of file diff --git a/MoonlightServers.Shared/Http/Requests/Admin/Servers/UpdateServerRequest.cs b/MoonlightServers.Shared/Http/Requests/Admin/Servers/UpdateServerRequest.cs index f8babce..5007b15 100644 --- a/MoonlightServers.Shared/Http/Requests/Admin/Servers/UpdateServerRequest.cs +++ b/MoonlightServers.Shared/Http/Requests/Admin/Servers/UpdateServerRequest.cs @@ -1,4 +1,5 @@ using System.ComponentModel.DataAnnotations; +using MoonlightServers.Shared.Http.Requests.Admin.ServerVariables; namespace MoonlightServers.Shared.Http.Requests.Admin.Servers; @@ -31,4 +32,6 @@ public class UpdateServerRequest //public int NodeId { get; set; } public int[] AllocationIds { get; set; } = []; + + public List Variables { get; set; } = new(); } \ No newline at end of file