diff --git a/MoonlightServers.ApiServer/Http/Controllers/Admin/Stars/StarDockerImagesController.cs b/MoonlightServers.ApiServer/Http/Controllers/Admin/Stars/StarDockerImagesController.cs new file mode 100644 index 0000000..da68dc3 --- /dev/null +++ b/MoonlightServers.ApiServer/Http/Controllers/Admin/Stars/StarDockerImagesController.cs @@ -0,0 +1,94 @@ +using Microsoft.AspNetCore.Mvc; +using MoonCore.Exceptions; +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.StarDockerImages; +using MoonlightServers.Shared.Http.Responses.Admin.StarDockerImages; + +namespace MoonlightServers.ApiServer.Http.Controllers.Admin.Stars; + +[ApiController] +[Route("api/admin/servers/stars")] +public class StarDockerImagesController : Controller +{ + private readonly CrudHelper CrudHelper; + private readonly DatabaseRepository StarRepository; + private readonly DatabaseRepository StarDockerImageRepository; + + private Star Star; + + public StarDockerImagesController( + CrudHelper crudHelper, + DatabaseRepository starRepository, + DatabaseRepository starDockerImageRepository + ) + { + CrudHelper = crudHelper; + StarRepository = starRepository; + StarDockerImageRepository = starDockerImageRepository; + } + + private void ApplyStar(int id) + { + var star = StarRepository + .Get() + .FirstOrDefault(x => x.Id == id); + + if (star == null) + throw new HttpApiException("A star with this id could not be found", 404); + + Star = star; + + CrudHelper.QueryModifier = dockerImages => + dockerImages.Where(x => x.Star.Id == star.Id); + } + + [HttpGet("{starId:int}/dockerImages")] + public async Task> Get([FromRoute] int starId, [FromQuery] int page, [FromQuery] int pageSize) + { + ApplyStar(starId); + + return await CrudHelper.Get(page, pageSize); + } + + [HttpGet("{starId:int}/dockerImages/{id:int}")] + public async Task GetSingle([FromRoute] int starId, [FromRoute] int id) + { + ApplyStar(starId); + + return await CrudHelper.GetSingle(id); + } + + [HttpPost("{starId:int}/dockerImages")] + public async Task Create([FromRoute] int starId, [FromBody] CreateStarDockerImageRequest request) + { + ApplyStar(starId); + + var starDockerImage = Mapper.Map(request); + starDockerImage.Star = Star; + + var finalVariable = StarDockerImageRepository.Add(starDockerImage); + + return CrudHelper.MapToResult(finalVariable); + } + + [HttpPatch("{starId:int}/dockerImages/{id:int}")] + public async Task Update([FromRoute] int starId, [FromRoute] int id, + [FromBody] UpdateStarDockerImageRequest request) + { + ApplyStar(starId); + + return await CrudHelper.Update(id, request); + } + + [HttpDelete("{starId:int}/dockerImages/{id:int}")] + public async Task Delete([FromRoute] int starId, [FromRoute] int id) + { + ApplyStar(starId); + + await CrudHelper.Delete(id); + } +} \ No newline at end of file diff --git a/MoonlightServers.Frontend/UI/Components/Stars/Modals/CreateDockerImageModal.razor b/MoonlightServers.Frontend/UI/Components/Stars/Modals/CreateDockerImageModal.razor new file mode 100644 index 0000000..7ae71b7 --- /dev/null +++ b/MoonlightServers.Frontend/UI/Components/Stars/Modals/CreateDockerImageModal.razor @@ -0,0 +1,58 @@ +@using MoonCore.Blazor.Tailwind.Modals.Components +@using MoonlightServers.Shared.Enums +@using MoonlightServers.Frontend.UI.Components.Forms +@using MoonCore.Blazor.Tailwind.Components +@using MoonlightServers.Shared.Http.Requests.Admin.StarDockerImages + +@inherits BaseModal + +

Add a new variable

+ + +
+
+ + +
+ +
+ + +
+ +
+ + +
+
+
+ +
+ Cancel + Create +
+ +@code +{ + [Parameter] public Func OnSubmit { get; set; } + + private CreateStarDockerImageRequest Form; + private HandleForm HandleForm; + + protected override void OnInitialized() + { + // Set default values + Form = new() + { + AutoPulling = true + }; + } + + private async Task OnValidSubmit() + { + await OnSubmit.Invoke(Form); + await Hide(); + } + + private Task Submit() => HandleForm.Submit(); +} \ No newline at end of file diff --git a/MoonlightServers.Frontend/UI/Components/Stars/Modals/CreateStarVariableModal.razor b/MoonlightServers.Frontend/UI/Components/Stars/Modals/CreateVariableModal.razor similarity index 100% rename from MoonlightServers.Frontend/UI/Components/Stars/Modals/CreateStarVariableModal.razor rename to MoonlightServers.Frontend/UI/Components/Stars/Modals/CreateVariableModal.razor diff --git a/MoonlightServers.Frontend/UI/Components/Stars/Modals/UpdateDockerImageModal.razor b/MoonlightServers.Frontend/UI/Components/Stars/Modals/UpdateDockerImageModal.razor new file mode 100644 index 0000000..03ad462 --- /dev/null +++ b/MoonlightServers.Frontend/UI/Components/Stars/Modals/UpdateDockerImageModal.razor @@ -0,0 +1,56 @@ +@using MoonCore.Blazor.Tailwind.Modals.Components +@using MoonlightServers.Frontend.UI.Components.Forms +@using MoonCore.Blazor.Tailwind.Components +@using MoonCore.Helpers +@using MoonlightServers.Shared.Http.Requests.Admin.StarDockerImages +@using MoonlightServers.Shared.Http.Responses.Admin.StarDockerImages + +@inherits BaseModal + +

Update variable

+ + +
+
+ + +
+ +
+ + +
+ +
+ + +
+
+
+ +
+ Cancel + Update +
+ +@code +{ + [Parameter] public Func OnSubmit { get; set; } + [Parameter] public StarDockerImageDetailResponse DockerImage { get; set; } + + private UpdateStarDockerImageRequest Form; + private HandleForm HandleForm; + + protected override void OnInitialized() + { + Form = Mapper.Map(DockerImage); + } + + private async Task OnValidSubmit() + { + await OnSubmit.Invoke(Form); + await Hide(); + } + + private Task Submit() => HandleForm.Submit(); +} \ No newline at end of file diff --git a/MoonlightServers.Frontend/UI/Components/Stars/Modals/UpdateStarVariableModel.razor b/MoonlightServers.Frontend/UI/Components/Stars/Modals/UpdateVariableModal.razor similarity index 100% rename from MoonlightServers.Frontend/UI/Components/Stars/Modals/UpdateStarVariableModel.razor rename to MoonlightServers.Frontend/UI/Components/Stars/Modals/UpdateVariableModal.razor diff --git a/MoonlightServers.Frontend/UI/Components/Stars/UpdateStarPartials/DockerImageStarUpdate.razor b/MoonlightServers.Frontend/UI/Components/Stars/UpdateStarPartials/DockerImageStarUpdate.razor new file mode 100644 index 0000000..dec212c --- /dev/null +++ b/MoonlightServers.Frontend/UI/Components/Stars/UpdateStarPartials/DockerImageStarUpdate.razor @@ -0,0 +1,110 @@ +@using MoonCore.Blazor.Tailwind.Alerts +@using MoonCore.Blazor.Tailwind.Components +@using MoonCore.Blazor.Tailwind.Modals +@using MoonCore.Blazor.Tailwind.Toasts +@using MoonCore.Helpers +@using MoonCore.Models +@using MoonlightServers.Frontend.UI.Components.Stars.Modals +@using MoonlightServers.Shared.Http.Requests.Admin.StarDockerImages +@using MoonlightServers.Shared.Http.Responses.Admin.StarDockerImages +@using MoonlightServers.Shared.Http.Responses.Admin.Stars + +@inject HttpApiClient ApiClient +@inject ModalService ModalService +@inject ToastService ToastService +@inject AlertService AlertService + +
+ +
+ + +
+ @foreach (var dockerImage in DockerImages) + { +
+
+
+ + @dockerImage.DisplayName +
+ +
+ + + +
+
+
+ } +
+
+ +@code +{ + [Parameter] public StarDetailResponse Star { get; set; } + + private StarDockerImageDetailResponse[] DockerImages; + private LazyLoader LazyLoader; + + private async Task Load(LazyLoader _) + { + var pagedVariables = await ApiClient.GetJson>( + $"api/admin/servers/stars/{Star.Id}/dockerImages?page=0&pageSize=50" + ); + + DockerImages = pagedVariables.Items; + } + + private async Task AddDockerImage() + { + Func onSubmit = async request => + { + await ApiClient.Post($"api/admin/servers/stars/{Star.Id}/dockerImages", request); + + await ToastService.Success("Successfully created docker image"); + await LazyLoader.Reload(); + }; + + await ModalService.Launch(parameters => + { + parameters.Add("OnSubmit", onSubmit); + }); + } + + private async Task UpdateDockerImage(StarDockerImageDetailResponse dockerImage) + { + Func onSubmit = async request => + { + await ApiClient.Patch($"api/admin/servers/stars/{Star.Id}/dockerImages/{dockerImage.Id}", request); + + await ToastService.Success("Successfully updated docker image"); + await LazyLoader.Reload(); + }; + + await ModalService.Launch(parameters => + { + parameters.Add("OnSubmit", onSubmit); + parameters.Add("DockerImage", dockerImage); + }); + } + + private async Task DeleteDockerImage(StarDockerImageDetailResponse dockerImage) + { + await AlertService.ConfirmDanger( + "Delete docker image", + "Do you really want to delete the selected docker image? This cannot be undone", + async () => + { + await ApiClient.Delete($"api/admin/servers/stars/{Star.Id}/dockerImages/{dockerImage.Id}"); + + await ToastService.Success("Successfully deleted docker image"); + await LazyLoader.Reload(); + } + ); + } +} diff --git a/MoonlightServers.Frontend/UI/Components/Stars/UpdateStarPartials/ParseConfigStarUpdate.razor b/MoonlightServers.Frontend/UI/Components/Stars/UpdateStarPartials/ParseConfigStarUpdate.razor index 91dc850..9fff3e1 100644 --- a/MoonlightServers.Frontend/UI/Components/Stars/UpdateStarPartials/ParseConfigStarUpdate.razor +++ b/MoonlightServers.Frontend/UI/Components/Stars/UpdateStarPartials/ParseConfigStarUpdate.razor @@ -27,7 +27,7 @@ else
- + @configuration.File
diff --git a/MoonlightServers.Frontend/UI/Components/Stars/UpdateStarPartials/VariablesStarUpdate.razor b/MoonlightServers.Frontend/UI/Components/Stars/UpdateStarPartials/VariablesStarUpdate.razor index 6ba2156..2477c63 100644 --- a/MoonlightServers.Frontend/UI/Components/Stars/UpdateStarPartials/VariablesStarUpdate.razor +++ b/MoonlightServers.Frontend/UI/Components/Stars/UpdateStarPartials/VariablesStarUpdate.razor @@ -25,7 +25,7 @@
- + @variable.Name
@@ -70,7 +70,7 @@ await LazyLoader.Reload(); }; - await ModalService.Launch(parameters => + await ModalService.Launch(parameters => { parameters.Add("OnSubmit", onSubmit); }, "max-w-xl"); @@ -86,7 +86,7 @@ await LazyLoader.Reload(); }; - await ModalService.Launch(parameters => + await ModalService.Launch(parameters => { parameters.Add("OnSubmit", onSubmit); parameters.Add("Variable", variable); @@ -106,7 +106,5 @@ await LazyLoader.Reload(); } ); - - await InvokeAsync(StateHasChanged); } } diff --git a/MoonlightServers.Frontend/UI/Views/Admin/Stars/Update.razor b/MoonlightServers.Frontend/UI/Views/Admin/Stars/Update.razor index 0707b5f..f426f75 100644 --- a/MoonlightServers.Frontend/UI/Views/Admin/Stars/Update.razor +++ b/MoonlightServers.Frontend/UI/Views/Admin/Stars/Update.razor @@ -47,6 +47,10 @@ + + + + diff --git a/MoonlightServers.Shared/Http/Requests/Admin/StarDockerImages/CreateStarDockerImageRequest.cs b/MoonlightServers.Shared/Http/Requests/Admin/StarDockerImages/CreateStarDockerImageRequest.cs new file mode 100644 index 0000000..655597d --- /dev/null +++ b/MoonlightServers.Shared/Http/Requests/Admin/StarDockerImages/CreateStarDockerImageRequest.cs @@ -0,0 +1,15 @@ +using System.ComponentModel.DataAnnotations; + +namespace MoonlightServers.Shared.Http.Requests.Admin.StarDockerImages; + +public class CreateStarDockerImageRequest +{ + [Required(ErrorMessage = "You need to provide a display name")] + public string DisplayName { get; set; } + + [Required(ErrorMessage = "You need to specify a docker image identifier")] + [RegularExpression("^(?:(?=[^:\\/]{1,253})(?!-)[a-zA-Z0-9-]{1,63}(?