From 4168b93d61ca079c4b5fbbcc24905b3c04baf683 Mon Sep 17 00:00:00 2001 From: ChiaraBm Date: Wed, 11 Dec 2024 16:42:56 +0100 Subject: [PATCH] Added simple node crud --- .../Admin/Nodes/NodesController.cs | 77 ++++++++++++++++++ .../UI/Views/Admin/Nodes/Create.razor | 72 +++++++++++++++++ .../UI/Views/Admin/Nodes/Index.razor | 80 +++++++++++++++++++ .../UI/Views/Admin/Nodes/Update.razor | 69 ++++++++++++++++ .../Requests/Admin/Nodes/CreateNodeRequest.cs | 23 ++++++ .../Requests/Admin/Nodes/UpdateNodeRequest.cs | 23 ++++++ .../NodeAllocationDetailResponse.cs | 9 +++ .../Admin/Nodes/NodeDetailResponse.cs | 21 +++++ .../MoonlightServers.Shared.csproj | 4 + 9 files changed, 378 insertions(+) create mode 100644 MoonlightServers.ApiServer/Http/Controllers/Admin/Nodes/NodesController.cs create mode 100644 MoonlightServers.Frontend/UI/Views/Admin/Nodes/Create.razor create mode 100644 MoonlightServers.Frontend/UI/Views/Admin/Nodes/Index.razor create mode 100644 MoonlightServers.Frontend/UI/Views/Admin/Nodes/Update.razor create mode 100644 MoonlightServers.Shared/Http/Requests/Admin/Nodes/CreateNodeRequest.cs create mode 100644 MoonlightServers.Shared/Http/Requests/Admin/Nodes/UpdateNodeRequest.cs create mode 100644 MoonlightServers.Shared/Http/Responses/Admin/NodeAllocations/NodeAllocationDetailResponse.cs create mode 100644 MoonlightServers.Shared/Http/Responses/Admin/Nodes/NodeDetailResponse.cs diff --git a/MoonlightServers.ApiServer/Http/Controllers/Admin/Nodes/NodesController.cs b/MoonlightServers.ApiServer/Http/Controllers/Admin/Nodes/NodesController.cs new file mode 100644 index 0000000..66c39ea --- /dev/null +++ b/MoonlightServers.ApiServer/Http/Controllers/Admin/Nodes/NodesController.cs @@ -0,0 +1,77 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using MoonCore.Extended.Abstractions; +using MoonCore.Extended.Helpers; +using MoonCore.Helpers; +using MoonCore.Models; +using MoonlightServers.ApiServer.Database.Entities; +using MoonlightServers.Shared.Http.Requests.Admin.Nodes; +using MoonlightServers.Shared.Http.Responses.Admin.NodeAllocations; +using MoonlightServers.Shared.Http.Responses.Admin.Nodes; + +namespace MoonlightServers.ApiServer.Http.Controllers.Admin.Nodes; + +[ApiController] +[Route("api/admin/servers/nodes")] +public class NodesController : Controller +{ + private readonly CrudHelper CrudHelper; + private readonly DatabaseRepository NodeRepository; + + public NodesController( + CrudHelper crudHelper, + DatabaseRepository nodeRepository + ) + { + CrudHelper = crudHelper; + NodeRepository = nodeRepository; + + CrudHelper.QueryModifier = nodes => + nodes.Include(x => x.Allocations); + + CrudHelper.LateMapper = (node, response) => + { + response.Allocations = node.Allocations + .Select(x => Mapper.Map(x)) + .ToArray(); + + return response; + }; + } + + [HttpGet] + public async Task> Get([FromQuery] int page, [FromQuery] int pageSize) + { + return await CrudHelper.Get(page, pageSize); + } + + [HttpGet("{id:int}")] + public async Task GetSingle([FromRoute] int id) + { + return await CrudHelper.GetSingle(id); + } + + [HttpPost] + public async Task Create([FromBody] CreateNodeRequest request) + { + var node = Mapper.Map(request); + + node.Token = Formatter.GenerateString(32); + + var finalNode = NodeRepository.Add(node); + + return CrudHelper.MapToResult(finalNode); + } + + [HttpPatch("{id:int}")] + public async Task Update([FromRoute] int id, [FromBody] UpdateNodeRequest request) + { + return await CrudHelper.Update(id, request); + } + + [HttpDelete("{id:int}")] + public async Task Delete([FromRoute] int id) + { + await CrudHelper.Delete(id); + } +} \ No newline at end of file diff --git a/MoonlightServers.Frontend/UI/Views/Admin/Nodes/Create.razor b/MoonlightServers.Frontend/UI/Views/Admin/Nodes/Create.razor new file mode 100644 index 0000000..1b06dbe --- /dev/null +++ b/MoonlightServers.Frontend/UI/Views/Admin/Nodes/Create.razor @@ -0,0 +1,72 @@ +@page "/admin/servers/nodes/create" + +@using MoonCore.Blazor.Tailwind.Components +@using MoonCore.Blazor.Tailwind.Forms +@using MoonCore.Blazor.Tailwind.Toasts +@using MoonCore.Helpers +@using MoonlightServers.Shared.Http.Requests.Admin.Nodes + +@inject HttpApiClient ApiClient +@inject NavigationManager Navigation +@inject ToastService ToastService + + + + + + Create + + + +
+ + + +
+ +@code + +{ + private HandleForm Form; + private CreateNodeRequest Request; + + protected override void OnInitialized() + { + Request = new(); + } + + private void OnConfigure(FormConfiguration configuration) + { + configuration.WithField(x => x.Name); + configuration.WithField(x => x.Fqdn); + + configuration.WithField(x => x.HttpPort, fieldConfiguration => + { + fieldConfiguration.DefaultValue = 8080; + }); + + configuration.WithField(x => x.FtpPort, fieldConfiguration => + { + fieldConfiguration.DefaultValue = 2021; + }); + + var advancedPage = configuration.WithPage("Advanced"); + + advancedPage.WithField(x => x.EnableTransparentMode); + advancedPage.WithField(x => x.EnableDynamicFirewall); + } + + private async Task OnSubmit() + { + await ApiClient.Post("api/admin/servers/nodes", Request); + + await ToastService.Success("Successfully created Node"); + GoBack(); + } + + private void GoBack() + => Navigation.NavigateTo(ComponentHelper.GetRouteOfComponent()!); +} \ No newline at end of file diff --git a/MoonlightServers.Frontend/UI/Views/Admin/Nodes/Index.razor b/MoonlightServers.Frontend/UI/Views/Admin/Nodes/Index.razor new file mode 100644 index 0000000..3de409e --- /dev/null +++ b/MoonlightServers.Frontend/UI/Views/Admin/Nodes/Index.razor @@ -0,0 +1,80 @@ +@page "/admin/servers/nodes" + +@using MoonCore.Blazor.Tailwind.MinimalCrud +@using MoonCore.Helpers +@using MoonCore.Models +@using MoonCore.Blazor.Tailwind.DataTable +@using MoonlightServers.Shared.Http.Responses.Admin.Nodes +@using MoonCore.Blazor.Tailwind.Components + +@inject HttpApiClient ApiClient + +
+ +
+ + + + + + + + + + + + + + + + + + + + + +@code + + + +{ + private void OnConfigure(MinimalCrudOptions options) + { + options.Title = "Nodes"; + options.ItemLoader = async (page, pageSize) => + await ApiClient.GetJson>($"api/admin/servers/nodes?page={page}&pageSize={pageSize}"); + + options.CreateUrl = ComponentHelper.GetRouteOfComponent(); + options.UpdateUrl = item => ComponentHelper.GetRouteOfComponent(item.Id)!; + options.DeleteFunction = async item => await ApiClient.Delete($"api/admin/servers/nodes/{item.Id}"); + } +} \ No newline at end of file diff --git a/MoonlightServers.Frontend/UI/Views/Admin/Nodes/Update.razor b/MoonlightServers.Frontend/UI/Views/Admin/Nodes/Update.razor new file mode 100644 index 0000000..80bb89e --- /dev/null +++ b/MoonlightServers.Frontend/UI/Views/Admin/Nodes/Update.razor @@ -0,0 +1,69 @@ +@page "/admin/servers/nodes/update/{Id:int}" + +@using MoonCore.Blazor.Tailwind.Components +@using MoonCore.Blazor.Tailwind.Forms +@using MoonCore.Blazor.Tailwind.Toasts +@using MoonCore.Helpers +@using MoonlightServers.Shared.Http.Requests.Admin.Nodes +@using MoonlightServers.Shared.Http.Responses.Admin.Nodes + +@inject HttpApiClient ApiClient +@inject NavigationManager Navigation +@inject ToastService ToastService + + + + + + + Update + + + +
+ + + +
+
+ +@code +{ + [Parameter] public int Id { get; set; } + + private HandleForm Form; + private UpdateNodeRequest Request; + + private async Task Load(LazyLoader _) + { + var detail = await ApiClient.GetJson($"api/admin/servers/nodes/{Id}"); + Request = Mapper.Map(detail); + } + + private void OnConfigure(FormConfiguration configuration) + { + configuration.WithField(x => x.Name); + configuration.WithField(x => x.Fqdn); + configuration.WithField(x => x.HttpPort); + configuration.WithField(x => x.FtpPort); + + var advancedPage = configuration.WithPage("Advanced"); + + advancedPage.WithField(x => x.EnableTransparentMode); + advancedPage.WithField(x => x.EnableDynamicFirewall); + } + + private async Task OnSubmit() + { + await ApiClient.Patch($"api/admin/servers/nodes/{Id}", Request); + + await ToastService.Success("Successfully updated Node"); + GoBack(); + } + + private void GoBack() + => Navigation.NavigateTo(ComponentHelper.GetRouteOfComponent()!); +} \ No newline at end of file diff --git a/MoonlightServers.Shared/Http/Requests/Admin/Nodes/CreateNodeRequest.cs b/MoonlightServers.Shared/Http/Requests/Admin/Nodes/CreateNodeRequest.cs new file mode 100644 index 0000000..92d2f3c --- /dev/null +++ b/MoonlightServers.Shared/Http/Requests/Admin/Nodes/CreateNodeRequest.cs @@ -0,0 +1,23 @@ +using System.ComponentModel.DataAnnotations; + +namespace MoonlightServers.Shared.Http.Requests.Admin.Nodes; + +public class CreateNodeRequest +{ + [Required(ErrorMessage = "You need to provide a name")] + public string Name { get; set; } + + [Required(ErrorMessage = "You need to provide a fqdn")] + public string Fqdn { get; set; } + + [Required(ErrorMessage = "You need to provide a http port")] + [Range(1, 65535, ErrorMessage = "You need to provide a valid http port")] + public int HttpPort { get; set; } + + [Required(ErrorMessage = "You need to provide a ftp port")] + [Range(1, 65535, ErrorMessage = "You need to provide a valid ftp port")] + public int FtpPort { get; set; } + + public bool EnableTransparentMode { get; set; } + public bool EnableDynamicFirewall { get; set; } +} \ No newline at end of file diff --git a/MoonlightServers.Shared/Http/Requests/Admin/Nodes/UpdateNodeRequest.cs b/MoonlightServers.Shared/Http/Requests/Admin/Nodes/UpdateNodeRequest.cs new file mode 100644 index 0000000..027d0fc --- /dev/null +++ b/MoonlightServers.Shared/Http/Requests/Admin/Nodes/UpdateNodeRequest.cs @@ -0,0 +1,23 @@ +using System.ComponentModel.DataAnnotations; + +namespace MoonlightServers.Shared.Http.Requests.Admin.Nodes; + +public class UpdateNodeRequest +{ + [Required(ErrorMessage = "You need to provide a name")] + public string Name { get; set; } + + [Required(ErrorMessage = "You need to provide a fqdn")] + public string Fqdn { get; set; } + + [Required(ErrorMessage = "You need to provide a http port")] + [Range(1, 65535, ErrorMessage = "You need to provide a valid http port")] + public int HttpPort { get; set; } + + [Required(ErrorMessage = "You need to provide a ftp port")] + [Range(1, 65535, ErrorMessage = "You need to provide a valid ftp port")] + public int FtpPort { get; set; } + + public bool EnableTransparentMode { get; set; } + public bool EnableDynamicFirewall { get; set; } +} \ No newline at end of file diff --git a/MoonlightServers.Shared/Http/Responses/Admin/NodeAllocations/NodeAllocationDetailResponse.cs b/MoonlightServers.Shared/Http/Responses/Admin/NodeAllocations/NodeAllocationDetailResponse.cs new file mode 100644 index 0000000..477e6e6 --- /dev/null +++ b/MoonlightServers.Shared/Http/Responses/Admin/NodeAllocations/NodeAllocationDetailResponse.cs @@ -0,0 +1,9 @@ +namespace MoonlightServers.Shared.Http.Responses.Admin.NodeAllocations; + +public class NodeAllocationDetailResponse +{ + public int Id { get; set; } + + public string IpAddress { get; set; } + public int Port { get; set; } +} \ 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 new file mode 100644 index 0000000..ff97587 --- /dev/null +++ b/MoonlightServers.Shared/Http/Responses/Admin/Nodes/NodeDetailResponse.cs @@ -0,0 +1,21 @@ +using MoonlightServers.Shared.Http.Responses.Admin.NodeAllocations; + +namespace MoonlightServers.Shared.Http.Responses.Admin.Nodes; + +public class NodeDetailResponse +{ + public int Id { get; set; } + + //public List Servers { get; set; } = new(); + public NodeAllocationDetailResponse[] Allocations { get; set; } + + 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; } + + public bool EnableTransparentMode { get; set; } + public bool EnableDynamicFirewall { get; set; } +} \ No newline at end of file diff --git a/MoonlightServers.Shared/MoonlightServers.Shared.csproj b/MoonlightServers.Shared/MoonlightServers.Shared.csproj index 3a63532..15874d5 100644 --- a/MoonlightServers.Shared/MoonlightServers.Shared.csproj +++ b/MoonlightServers.Shared/MoonlightServers.Shared.csproj @@ -6,4 +6,8 @@ enable + + + +