diff --git a/MoonlightServers.ApiServer/Http/Controllers/Admin/Servers/ServersController.cs b/MoonlightServers.ApiServer/Http/Controllers/Admin/Servers/ServersController.cs index a162f6e..0aaf9cc 100644 --- a/MoonlightServers.ApiServer/Http/Controllers/Admin/Servers/ServersController.cs +++ b/MoonlightServers.ApiServer/Http/Controllers/Admin/Servers/ServersController.cs @@ -6,6 +6,7 @@ using MoonCore.Extended.Abstractions; using MoonCore.Extended.Helpers; using MoonCore.Helpers; using MoonCore.Models; +using Moonlight.ApiServer.Database.Entities; using MoonlightServers.ApiServer.Database.Entities; using MoonlightServers.Shared.Http.Requests.Admin.Servers; using MoonlightServers.Shared.Http.Responses.Admin.NodeAllocations; @@ -24,6 +25,7 @@ public class ServersController : Controller private readonly DatabaseRepository AllocationRepository; private readonly DatabaseRepository VariableRepository; private readonly DatabaseRepository ServerRepository; + private readonly DatabaseRepository UserRepository; public ServersController( CrudHelper crudHelper, @@ -31,8 +33,8 @@ public class ServersController : Controller DatabaseRepository nodeRepository, DatabaseRepository allocationRepository, DatabaseRepository variableRepository, - DatabaseRepository serverRepository - ) + DatabaseRepository serverRepository, + DatabaseRepository userRepository) { CrudHelper = crudHelper; StarRepository = starRepository; @@ -40,6 +42,7 @@ public class ServersController : Controller AllocationRepository = allocationRepository; VariableRepository = variableRepository; ServerRepository = serverRepository; + UserRepository = userRepository; CrudHelper.QueryModifier = servers => servers .Include(x => x.Node) @@ -51,6 +54,7 @@ public class ServersController : Controller { response.NodeId = server.Node.Id; response.StarId = server.Star.Id; + response.AllocationIds = server.Allocations.Select(x => x.Id).ToArray(); return response; }; @@ -76,6 +80,10 @@ public class ServersController : Controller { // Construct model var server = Mapper.Map(request); + + // Check if owner user exist + if (UserRepository.Get().All(x => x.Id != request.OwnerId)) + throw new HttpApiException("No user with this id found", 400); var star = StarRepository .Get() diff --git a/MoonlightServers.Frontend/UI/Components/Servers/CreateServerPartials/AllocationsServerCrete.razor b/MoonlightServers.Frontend/UI/Components/Servers/CreateServerPartials/AllocationsServerCreate.razor similarity index 78% rename from MoonlightServers.Frontend/UI/Components/Servers/CreateServerPartials/AllocationsServerCrete.razor rename to MoonlightServers.Frontend/UI/Components/Servers/CreateServerPartials/AllocationsServerCreate.razor index a0a5889..a322bec 100644 --- a/MoonlightServers.Frontend/UI/Components/Servers/CreateServerPartials/AllocationsServerCrete.razor +++ b/MoonlightServers.Frontend/UI/Components/Servers/CreateServerPartials/AllocationsServerCreate.razor @@ -30,11 +30,13 @@ // Handle unselected node if (Request.NodeId <= 0) return []; - - var data = await ApiClient.GetJson>( - $"api/admin/servers/nodes/{Request.NodeId}/allocations/free?page=0&pageSize=50" - ); - return data.Items; + var items = await PagedData.All(async (page, pageSize) => + await ApiClient.GetJson>( + $"api/admin/servers/nodes/{Request.NodeId}/allocations/free?page={page}&pageSize={pageSize}" + ) + ); + + return items; } } \ No newline at end of file diff --git a/MoonlightServers.Frontend/UI/Components/Servers/CreateServerPartials/GeneralServerCreate.razor b/MoonlightServers.Frontend/UI/Components/Servers/CreateServerPartials/GeneralServerCreate.razor index 158b1ed..c95de65 100644 --- a/MoonlightServers.Frontend/UI/Components/Servers/CreateServerPartials/GeneralServerCreate.razor +++ b/MoonlightServers.Frontend/UI/Components/Servers/CreateServerPartials/GeneralServerCreate.razor @@ -1,10 +1,10 @@ @using MoonlightServers.Shared.Http.Requests.Admin.Servers -@using MoonlightServers.Frontend.UI.Components.Forms @using MoonCore.Helpers @using MoonCore.Models @using MoonlightServers.Shared.Http.Responses.Admin.Nodes @using MoonlightServers.Shared.Http.Responses.Admin.Stars @using MoonCore.Blazor.Tailwind.Inputs +@using Moonlight.Shared.Http.Responses.Admin.Users @inject HttpApiClient ApiClient @@ -16,6 +16,20 @@ +
+ +
+ + +
+
+
@@ -75,15 +89,46 @@ { [Parameter] public CreateServerRequest Request { get; set; } + private UserDetailResponse[]? Users; + private async Task LoadStars() { - var starData = await ApiClient.GetJson>("api/admin/servers/stars?page=0&pageSize=50"); - return starData.Items; + var items = await PagedData.All(async (page, pageSize) => + await ApiClient.GetJson>( + $"api/admin/servers/stars?page={page}&pageSize={pageSize}" + ) + ); + + return items; } private async Task LoadNodes() { - var nodeData = await ApiClient.GetJson>("api/admin/servers/nodes?page=0&pageSize=50"); - return nodeData.Items; + var items = await PagedData.All(async (page, pageSize) => + await ApiClient.GetJson>( + $"api/admin/servers/nodes?page={page}&pageSize={pageSize}" + ) + ); + + return items; + } + + private async Task Loader(string searchTerm) + { + if (Users == null) + { + Users = await PagedData.All(async (page, pageSize) => + await ApiClient.GetJson>( + $"api/admin/users?page={page}&pageSize={pageSize}" + ) + ); + } + + if (string.IsNullOrEmpty(searchTerm)) + return Users; + + return Users + .Where(x => x.Email.Contains(searchTerm)) + .ToArray(); } } \ No newline at end of file diff --git a/MoonlightServers.Frontend/UI/Components/Servers/CreateServerPartials/VariablesServerCreate.razor b/MoonlightServers.Frontend/UI/Components/Servers/CreateServerPartials/VariablesServerCreate.razor new file mode 100644 index 0000000..b52d498 --- /dev/null +++ b/MoonlightServers.Frontend/UI/Components/Servers/CreateServerPartials/VariablesServerCreate.razor @@ -0,0 +1,70 @@ +@using MoonlightServers.Shared.Http.Requests.Admin.Servers +@using MoonCore.Helpers +@using MoonCore.Blazor.Tailwind.Components +@using MoonCore.Models +@using MoonlightServers.Shared.Http.Responses.Admin.StarVariables + +@inject HttpApiClient ApiClient + + +
+ @foreach (var variable in StarVariables) + { + // Load value of default + var value = Request.Variables.TryGetValue(variable.Key, out var val) + ? val + : variable.DefaultValue; + +
+ +
+ +
+

+ @variable.Description +

+
+ } +
+
+ +@code +{ + [Parameter] public CreateServerRequest Request { get; set; } + + private StarVariableDetailResponse[] StarVariables; + + private async Task Load(LazyLoader _) + { + if (Request.StarId <= 0) + { + StarVariables = []; + return; + } + + StarVariables = await PagedData.All(async (page, pageSize) => + await ApiClient.GetJson>( + $"api/admin/servers/stars/{Request.StarId}/variables?page={page}&pageSize={pageSize}" + ) + ); + } + + private async Task UpdateValue(StarVariableDetailResponse starVariable, 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); + else + Request.Variables[starVariable.Key] = value; + + await InvokeAsync(StateHasChanged); + } +} \ No newline at end of file diff --git a/MoonlightServers.Frontend/UI/Components/Servers/UpdateServerPartials/AdvancedServerUpdate.razor b/MoonlightServers.Frontend/UI/Components/Servers/UpdateServerPartials/AdvancedServerUpdate.razor new file mode 100644 index 0000000..87c527d --- /dev/null +++ b/MoonlightServers.Frontend/UI/Components/Servers/UpdateServerPartials/AdvancedServerUpdate.razor @@ -0,0 +1,16 @@ +@using MoonlightServers.Shared.Http.Requests.Admin.Servers +@using MoonCore.Blazor.Tailwind.Inputs + +
+
+ +
+ +
+
+
+ +@code +{ + [Parameter] public UpdateServerRequest Request { get; set; } +} \ No newline at end of file diff --git a/MoonlightServers.Frontend/UI/Components/Servers/UpdateServerPartials/AllocationsServerUpdate.razor b/MoonlightServers.Frontend/UI/Components/Servers/UpdateServerPartials/AllocationsServerUpdate.razor new file mode 100644 index 0000000..b05e767 --- /dev/null +++ b/MoonlightServers.Frontend/UI/Components/Servers/UpdateServerPartials/AllocationsServerUpdate.razor @@ -0,0 +1,44 @@ +@using MoonlightServers.Shared.Http.Requests.Admin.Servers +@using MoonCore.Blazor.Tailwind.Inputs +@using MoonCore.Helpers +@using MoonCore.Models +@using MoonlightServers.Shared.Http.Responses.Admin.NodeAllocations +@using MoonlightServers.Shared.Http.Responses.Admin.Servers + +@inject HttpApiClient ApiClient + +
+
+ +
+ +
+
+
+ +@code +{ + [Parameter] public UpdateServerRequest Request { get; set; } + [Parameter] public ServerDetailResponse Server { get; set; } + + private async Task Loader() + { + // Handle unselected node + if (Server.NodeId <= 0) + return []; + + var items = await PagedData.All(async (page, pageSize) => + await ApiClient.GetJson>( + $"api/admin/servers/nodes/{Server.NodeId}/allocations/free?page={page}&pageSize={pageSize}" + ) + ); + + return items; + } +} \ No newline at end of file diff --git a/MoonlightServers.Frontend/UI/Components/Servers/UpdateServerPartials/GeneralServerUpdate.razor b/MoonlightServers.Frontend/UI/Components/Servers/UpdateServerPartials/GeneralServerUpdate.razor new file mode 100644 index 0000000..8e413fa --- /dev/null +++ b/MoonlightServers.Frontend/UI/Components/Servers/UpdateServerPartials/GeneralServerUpdate.razor @@ -0,0 +1,86 @@ +@using MoonlightServers.Shared.Http.Requests.Admin.Servers +@using MoonCore.Helpers +@using MoonCore.Models +@using MoonCore.Blazor.Tailwind.Inputs +@using Moonlight.Shared.Http.Responses.Admin.Users + +@inject HttpApiClient ApiClient + +
+
+ +
+ +
+
+ +
+ +
+ + +
+
+
+ +
+

+ Resources +

+

Define the servers resource limit

+ +
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+
+
+ +@code +{ + [Parameter] public UpdateServerRequest Request { get; set; } + + private UserDetailResponse[]? Users; + + private async Task Loader(string searchTerm) + { + if (Users == null) + { + Users = await PagedData.All(async (page, pageSize) => + await ApiClient.GetJson>( + $"api/admin/users?page={page}&pageSize={pageSize}" + ) + ); + } + + if (string.IsNullOrEmpty(searchTerm)) + return Users; + + return Users + .Where(x => x.Email.Contains(searchTerm)) + .ToArray(); + } +} \ No newline at end of file diff --git a/MoonlightServers.Frontend/UI/Components/Servers/UpdateServerPartials/VariablesServerUpdate.razor b/MoonlightServers.Frontend/UI/Components/Servers/UpdateServerPartials/VariablesServerUpdate.razor new file mode 100644 index 0000000..10e10ae --- /dev/null +++ b/MoonlightServers.Frontend/UI/Components/Servers/UpdateServerPartials/VariablesServerUpdate.razor @@ -0,0 +1,70 @@ +@using MoonlightServers.Shared.Http.Requests.Admin.Servers +@using MoonCore.Helpers +@using MoonCore.Blazor.Tailwind.Components +@using MoonCore.Models +@using MoonlightServers.Shared.Http.Responses.Admin.Servers +@using MoonlightServers.Shared.Http.Responses.Admin.StarVariables + +@inject HttpApiClient ApiClient + + +
+ @foreach (var variable in StarVariables) + { + // Load value of default + /* + var value = Request.Variables.TryGetValue(variable.Key, out var val) + ? val + : variable.DefaultValue;*/ + + var value = ""; + +
+ +
+ +
+

+ @variable.Description +

+
+ } +
+
+ +@code +{ + [Parameter] public UpdateServerRequest Request { get; set; } + [Parameter] public ServerDetailResponse Server { get; set; } + + private StarVariableDetailResponse[] StarVariables; + + private async Task Load(LazyLoader _) + { + StarVariables = await PagedData.All(async (page, pageSize) => + await ApiClient.GetJson>( + $"api/admin/servers/stars/{Server.StarId}/variables?page={page}&pageSize={pageSize}" + ) + ); + } + + private async Task UpdateValue(StarVariableDetailResponse starVariable, 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); + else + Request.Variables[starVariable.Key] = value; + + await InvokeAsync(StateHasChanged);*/ + } +} \ No newline at end of file diff --git a/MoonlightServers.Frontend/UI/Views/Admin/All/Create.razor b/MoonlightServers.Frontend/UI/Views/Admin/All/Create.razor index d597594..1d521e7 100644 --- a/MoonlightServers.Frontend/UI/Views/Admin/All/Create.razor +++ b/MoonlightServers.Frontend/UI/Views/Admin/All/Create.razor @@ -29,7 +29,10 @@ - + + + + diff --git a/MoonlightServers.Frontend/UI/Views/Admin/All/Update.razor b/MoonlightServers.Frontend/UI/Views/Admin/All/Update.razor index 682660c..76cb9f7 100644 --- a/MoonlightServers.Frontend/UI/Views/Admin/All/Update.razor +++ b/MoonlightServers.Frontend/UI/Views/Admin/All/Update.razor @@ -6,6 +6,7 @@ @using MoonCore.Helpers @using MoonlightServers.Shared.Http.Requests.Admin.Servers @using MoonlightServers.Shared.Http.Responses.Admin.Servers +@using MoonlightServers.Frontend.UI.Components.Servers.UpdateServerPartials @inject HttpApiClient ApiClient @inject NavigationManager Navigation @@ -25,7 +26,20 @@
- + + + + + + + + + + + + + +
@@ -36,16 +50,12 @@ private HandleForm Form; private UpdateServerRequest Request; + private ServerDetailResponse Server; private async Task Load(LazyLoader _) { - var detail = await ApiClient.GetJson($"api/admin/servers/{Id}"); - Request = Mapper.Map(detail); - } - - private void OnConfigure(FormConfiguration configuration) - { - + var Server = await ApiClient.GetJson($"api/admin/servers/{Id}"); + Request = Mapper.Map(Server); } private async Task OnSubmit() diff --git a/MoonlightServers.Shared/Http/Requests/Admin/Servers/UpdateServerRequest.cs b/MoonlightServers.Shared/Http/Requests/Admin/Servers/UpdateServerRequest.cs index b01af90..f8babce 100644 --- a/MoonlightServers.Shared/Http/Requests/Admin/Servers/UpdateServerRequest.cs +++ b/MoonlightServers.Shared/Http/Requests/Admin/Servers/UpdateServerRequest.cs @@ -16,8 +16,6 @@ public class UpdateServerRequest [Range(1, int.MaxValue, ErrorMessage = "You need to provide a valid disk amount")] public int Disk { get; set; } - - public bool UseVirtualDisk { get; set; } [Range(0, int.MaxValue, ErrorMessage = "You need to provide a valid bandwidth amount")] public int Bandwidth { get; set; } @@ -26,10 +24,11 @@ public class UpdateServerRequest public int DockerImageIndex { get; set; } - public int StarId { get; set; } + // TODO: Add star change + //public int StarId { get; set; } - public int NodeId { get; set; } + // TODO: Add transfer + //public int NodeId { get; set; } public int[] AllocationIds { get; set; } = []; - public Dictionary Variables { get; set; } = new(); } \ No newline at end of file diff --git a/MoonlightServers.Shared/Http/Responses/Admin/Nodes/NodeDetailResponse.cs b/MoonlightServers.Shared/Http/Responses/Admin/Nodes/NodeDetailResponse.cs index c5de901..f93c43c 100644 --- a/MoonlightServers.Shared/Http/Responses/Admin/Nodes/NodeDetailResponse.cs +++ b/MoonlightServers.Shared/Http/Responses/Admin/Nodes/NodeDetailResponse.cs @@ -7,7 +7,6 @@ public class NodeDetailResponse public string Name { get; set; } public string Fqdn { get; set; } - public string Token { get; set; } public int HttpPort { get; set; } public int FtpPort { get; set; } diff --git a/MoonlightServers.Shared/Http/Responses/Admin/Servers/ServerDetailResponse.cs b/MoonlightServers.Shared/Http/Responses/Admin/Servers/ServerDetailResponse.cs index d4e4d8a..67c7296 100644 --- a/MoonlightServers.Shared/Http/Responses/Admin/Servers/ServerDetailResponse.cs +++ b/MoonlightServers.Shared/Http/Responses/Admin/Servers/ServerDetailResponse.cs @@ -22,4 +22,6 @@ public class ServerDetailResponse public int StarId { get; set; } public int NodeId { get; set; } + + public int[] AllocationIds { get; set; } = []; } \ No newline at end of file