From 291b80cc60a679437ca5670bfa9449ad1455db4f Mon Sep 17 00:00:00 2001 From: ChiaraBm Date: Thu, 5 Dec 2024 17:27:17 +0100 Subject: [PATCH] Started implementing star crud --- .../Controllers/Admin/Stars/StarController.cs | 77 +++++++++++++++++++ .../MoonlightServers.ApiServer.csproj | 1 - MoonlightServers.Frontend/Styles/style.css | 69 +---------------- .../UI/Views/Admin/Stars/Create.razor | 59 ++++++++++++++ .../UI/Views/Admin/Stars/Index.razor | 29 +++++++ .../UI/Views/Admin/Stars/Update.razor | 61 +++++++++++++++ .../Requests/Admin/Stars/CreateStarRequest.cs | 45 +++++++++++ .../Requests/Admin/Stars/UpdateStarRequest.cs | 6 ++ .../StarDockerImageDetailResponse.cs | 10 +++ .../StarVariableDetailResponse.cs | 20 +++++ .../Admin/Stars/StarDetailResponse.cs | 34 ++++++++ .../Http/Responses/ExampleResponse.cs | 6 -- .../MoonlightServers.Shared.csproj | 4 - 13 files changed, 342 insertions(+), 79 deletions(-) create mode 100644 MoonlightServers.ApiServer/Http/Controllers/Admin/Stars/StarController.cs create mode 100644 MoonlightServers.Frontend/UI/Views/Admin/Stars/Create.razor create mode 100644 MoonlightServers.Frontend/UI/Views/Admin/Stars/Index.razor create mode 100644 MoonlightServers.Frontend/UI/Views/Admin/Stars/Update.razor create mode 100644 MoonlightServers.Shared/Http/Requests/Admin/Stars/CreateStarRequest.cs create mode 100644 MoonlightServers.Shared/Http/Requests/Admin/Stars/UpdateStarRequest.cs create mode 100644 MoonlightServers.Shared/Http/Responses/Admin/StarDockerImages/StarDockerImageDetailResponse.cs create mode 100644 MoonlightServers.Shared/Http/Responses/Admin/StarVariables/StarVariableDetailResponse.cs create mode 100644 MoonlightServers.Shared/Http/Responses/Admin/Stars/StarDetailResponse.cs delete mode 100644 MoonlightServers.Shared/Http/Responses/ExampleResponse.cs diff --git a/MoonlightServers.ApiServer/Http/Controllers/Admin/Stars/StarController.cs b/MoonlightServers.ApiServer/Http/Controllers/Admin/Stars/StarController.cs new file mode 100644 index 0000000..2a039fe --- /dev/null +++ b/MoonlightServers.ApiServer/Http/Controllers/Admin/Stars/StarController.cs @@ -0,0 +1,77 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using MoonCore.Attributes; +using MoonCore.Extended.Helpers; +using MoonCore.Helpers; +using MoonCore.Models; +using MoonlightServers.ApiServer.Database.Entities; +using MoonlightServers.Shared.Http.Requests.Admin.Stars; +using MoonlightServers.Shared.Http.Responses.Admin.StarDockerImages; +using MoonlightServers.Shared.Http.Responses.Admin.Stars; +using MoonlightServers.Shared.Http.Responses.Admin.StarVariables; + +namespace MoonlightServers.ApiServer.Http.Controllers.Admin.Stars; + +[ApiController] +[Route("api/admin/servers/stars")] +public class StarController : Controller +{ + private readonly CrudHelper CrudHelper; + + public StarController(CrudHelper crudHelper) + { + CrudHelper = crudHelper; + + CrudHelper.QueryModifier = stars => stars + .Include(x => x.Variables) + .Include(x => x.DockerImages); + + CrudHelper.LateMapper = (star, response) => + { + response.DockerImages = star.DockerImages + .Select(x => Mapper.Map(x)) + .ToArray(); + + response.Variables = star.Variables + .Select(x => Mapper.Map(x)) + .ToArray(); + + return response; + }; + } + + [HttpGet] + [RequirePermission("admin.servers.stars.get")] + public async Task> Get([FromQuery] int page, [FromQuery] int pageSize) + { + return await CrudHelper.Get(page, pageSize); + } + + [HttpGet("{id:int}")] + [RequirePermission("admin.servers.stars.get")] + public async Task GetSingle([FromRoute] int id) + { + return await CrudHelper.GetSingle(id); + } + + [HttpPost] + [RequirePermission("admin.servers.stars.create")] + public async Task Create([FromBody] CreateStarRequest request) + { + return await CrudHelper.Create(request); + } + + [HttpPatch("{id:int}")] + [RequirePermission("admin.servers.stars.update")] + public async Task Update([FromRoute] int id, [FromBody] UpdateStarRequest request) + { + return await CrudHelper.Update(id, request); + } + + [HttpDelete("{id:int}")] + [RequirePermission("admin.servers.stars.delete")] + public async Task Delete([FromRoute] int id) + { + await CrudHelper.Delete(id); + } +} \ No newline at end of file diff --git a/MoonlightServers.ApiServer/MoonlightServers.ApiServer.csproj b/MoonlightServers.ApiServer/MoonlightServers.ApiServer.csproj index 2eb0575..2d0d049 100644 --- a/MoonlightServers.ApiServer/MoonlightServers.ApiServer.csproj +++ b/MoonlightServers.ApiServer/MoonlightServers.ApiServer.csproj @@ -20,7 +20,6 @@ - diff --git a/MoonlightServers.Frontend/Styles/style.css b/MoonlightServers.Frontend/Styles/style.css index ae019c1..ebb7488 100644 --- a/MoonlightServers.Frontend/Styles/style.css +++ b/MoonlightServers.Frontend/Styles/style.css @@ -5,75 +5,8 @@ @import "additions/fonts.css"; @import "additions/buttons.css"; @import "additions/cards.css"; -@import "additions/forms.css"; @import "additions/progress.css"; @import "additions/scrollbar.css"; @import "additions/loaders.css"; -@import "tailwindcss/utilities"; - -#blazor-error-ui { - display: none; -} - -#loader { - display: block; - width: 10rem; - height: 10rem; - border-radius: 50%; - border: 3px solid transparent; - border-top-color: #9370DB; - -webkit-animation: spin 2s linear infinite; - animation: spin 2s linear infinite; - @apply border-t-primary-500 -} -#loader:before { - content: ""; - position: absolute; - top: 5px; - left: 5px; - right: 5px; - bottom: 5px; - border-radius: 50%; - border: 3px solid transparent; - -webkit-animation: spin 3s linear infinite; - animation: spin 3s linear infinite; - @apply border-t-tertiary-500 -} -#loader:after { - content: ""; - position: absolute; - top: 15px; - left: 15px; - right: 15px; - bottom: 15px; - border-radius: 50%; - border: 3px solid transparent; - -webkit-animation: spin 1.5s linear infinite; - animation: spin 1.5s linear infinite; - @apply border-t-info-500 -} -@-webkit-keyframes spin { - 0% { - -webkit-transform: rotate(0deg); - -ms-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - -ms-transform: rotate(360deg); - transform: rotate(360deg); - } -} -@keyframes spin { - 0% { - -webkit-transform: rotate(0deg); - -ms-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - -ms-transform: rotate(360deg); - transform: rotate(360deg); - } -} \ No newline at end of file +@import "tailwindcss/utilities"; \ No newline at end of file diff --git a/MoonlightServers.Frontend/UI/Views/Admin/Stars/Create.razor b/MoonlightServers.Frontend/UI/Views/Admin/Stars/Create.razor new file mode 100644 index 0000000..a3ab96f --- /dev/null +++ b/MoonlightServers.Frontend/UI/Views/Admin/Stars/Create.razor @@ -0,0 +1,59 @@ +@page "/admin/servers/stars/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.Stars + +@inject HttpApiClient ApiClient +@inject NavigationManager Navigation +@inject ToastService ToastService + + + + + Back + + + + Create + + + +
+ + + +
+ +@code + +{ + private HandleForm Form; + private CreateStarRequest Request; + + protected override void OnInitialized() + { + Request = new(); + } + + private void OnConfigure(FormConfiguration configuration) + { + + } + + private async Task OnSubmit() + { + await ApiClient.Post("api/admin/servers/stars", Request); + + await ToastService.Success("Successfully created Star"); + await GoBack(); + } + + private Task GoBack() + { + Navigation.NavigateTo(ComponentHelper.GetRouteOfComponent()!); + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/MoonlightServers.Frontend/UI/Views/Admin/Stars/Index.razor b/MoonlightServers.Frontend/UI/Views/Admin/Stars/Index.razor new file mode 100644 index 0000000..fb9f75f --- /dev/null +++ b/MoonlightServers.Frontend/UI/Views/Admin/Stars/Index.razor @@ -0,0 +1,29 @@ +@page "/admin/servers/stars" + +@using MoonCore.Blazor.Tailwind.MinimalCrud +@using MoonCore.Helpers +@using MoonCore.Models +@using MoonCore.Blazor.Tailwind.DataTable +@using MoonlightServers.Shared.Http.Responses.Admin.Stars + +@inject HttpApiClient ApiClient + + + + + + + +@code +{ + private void OnConfigure(MinimalCrudOptions options) + { + options.Title = "Stars"; + options.ItemLoader = async (page, pageSize) => + await ApiClient.GetJson>($"api/admin/servers/stars?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/stars/{item.Id}"); + } +} \ No newline at end of file diff --git a/MoonlightServers.Frontend/UI/Views/Admin/Stars/Update.razor b/MoonlightServers.Frontend/UI/Views/Admin/Stars/Update.razor new file mode 100644 index 0000000..9e2c98f --- /dev/null +++ b/MoonlightServers.Frontend/UI/Views/Admin/Stars/Update.razor @@ -0,0 +1,61 @@ +@page "/admin/servers/stars/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.Stars +@using MoonlightServers.Shared.Http.Responses.Admin.Stars + +@inject HttpApiClient ApiClient +@inject NavigationManager Navigation +@inject ToastService ToastService + + + + + + + Update + + + +
+ + + +
+
+ +@code +{ + [Parameter] public int Id { get; set; } + + private HandleForm Form; + private UpdateStarRequest Request; + + private async Task Load(LazyLoader _) + { + var detail = await ApiClient.GetJson($"api/stars/{Id}"); + Request = Mapper.Map(detail); + } + + private void OnConfigure(FormConfiguration configuration) + { + + } + + private async Task OnSubmit() + { + await ApiClient.Patch($"api/stars/{Id}", Request); + + await ToastService.Success("Successfully updated Star"); + GoBack(); + } + + private void GoBack() + => Navigation.NavigateTo(ComponentHelper.GetRouteOfComponent()!); +} \ No newline at end of file diff --git a/MoonlightServers.Shared/Http/Requests/Admin/Stars/CreateStarRequest.cs b/MoonlightServers.Shared/Http/Requests/Admin/Stars/CreateStarRequest.cs new file mode 100644 index 0000000..2ab8f84 --- /dev/null +++ b/MoonlightServers.Shared/Http/Requests/Admin/Stars/CreateStarRequest.cs @@ -0,0 +1,45 @@ +using System.ComponentModel.DataAnnotations; + +namespace MoonlightServers.Shared.Http.Requests.Admin.Stars; + +public class CreateStarRequest +{ + [Required(ErrorMessage = "You need to specify a name")] + public string Name { get; set; } + + [Required(ErrorMessage = "You need to specify a author")] + public string Author { get; set; } + + public string? UpdateUrl { get; set; } + public string? DonateUrl { get; set; } + + [Required(ErrorMessage = "You need to specify a startup command")] + public string StartupCommand { get; set; } = "echo Starting up :)"; + + [Required(ErrorMessage = "You need to specify a stop command")] + public string StopCommand { get; set; } = "^C"; + + [Required(ErrorMessage = "You need to specify a online detection string")] + public string OnlineDetection { get; set; } + + + + [Required(ErrorMessage = "You need to specify an install shell")] + public string InstallShell { get; set; } = "/bin/bash"; + + [Required(ErrorMessage = "You need to specify an install docker image")] + [RegularExpression("^(?:(?=[^:\\/]{1,253})(?!-)[a-zA-Z0-9-]{1,63}(?enable - - - -