diff --git a/MoonlightServers.ApiServer/Http/Controllers/Admin/Nodes/NodeAllocationsController.cs b/MoonlightServers.ApiServer/Http/Controllers/Admin/Nodes/NodeAllocationsController.cs index 6230876..f9bb4fc 100644 --- a/MoonlightServers.ApiServer/Http/Controllers/Admin/Nodes/NodeAllocationsController.cs +++ b/MoonlightServers.ApiServer/Http/Controllers/Admin/Nodes/NodeAllocationsController.cs @@ -2,6 +2,9 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using MoonCore.Extended.Abstractions; +using MoonCore.Helpers; +using Moonlight.ApiServer.App.Attributes; +using Moonlight.ApiServer.App.Exceptions; using Moonlight.ApiServer.App.Helpers; using MoonlightServers.ApiServer.Database.Entities; using MoonlightServers.Shared.Http.Requests.Admin.Allocations; @@ -20,6 +23,41 @@ public class NodeAllocationsController : BaseSubCrudController> Create(CreateAllocationRequest request) + { + if (ItemRepository.Get().Any(x => x.IpAddress == request.IpAddress && x.Port == request.Port)) + throw new ApiException("An allocation with this ip and port already exists", statusCode: 400); + + var item = Mapper.Map(request!); + + Property.Invoke(RootItem).Add(item); + RootItemRepository.Update(RootItem); + + var response = Mapper.Map(item); + + return Ok(response); + } + + [HttpPatch("{id}")] + [RequirePermission("admin.servers.nodes.allocations.create")] + public override async Task> Update(int id, UpdateAllocationRequest request) + { + var item = LoadItemById(id); + + if (ItemRepository.Get().Any(x => x.IpAddress == request.IpAddress && x.Port == request.Port && x.Id != item.Id)) + throw new ApiException("An allocation with this ip and port already exists", statusCode: 400); + + var mappedItem = Mapper.Map(item, request!, ignoreNullValues: true); + + ItemRepository.Update(mappedItem); + + var response = Mapper.Map(mappedItem); + + return Ok(response); + } + protected override IEnumerable IncludeRelations(IQueryable items) => items.Include(x => x.Allocations); } \ No newline at end of file diff --git a/MoonlightServers.ApiServer/Http/Controllers/Admin/Nodes/NodesController.cs b/MoonlightServers.ApiServer/Http/Controllers/Admin/Nodes/NodesController.cs index 3c68529..6b8f551 100644 --- a/MoonlightServers.ApiServer/Http/Controllers/Admin/Nodes/NodesController.cs +++ b/MoonlightServers.ApiServer/Http/Controllers/Admin/Nodes/NodesController.cs @@ -15,15 +15,9 @@ namespace MoonlightServers.ApiServer.Http.Controllers.Admin.Nodes; [Route("admin/servers/nodes")] public class NodesController : BaseCrudController { - private DatabaseRepository NodeRepository; - private DatabaseRepository AllocationRepository; - - public NodesController(DatabaseRepository itemRepository, DatabaseRepository allocationRepository) : base(itemRepository) + public NodesController(DatabaseRepository itemRepository) : base(itemRepository) { PermissionPrefix = "admin.servers.nodes"; - - NodeRepository = itemRepository; - AllocationRepository = allocationRepository; } [HttpPost] @@ -35,7 +29,7 @@ public class NodesController : BaseCrudController(request); node.Token = Formatter.GenerateString(32); - var finalNode = NodeRepository.Add(node); + var finalNode = ItemRepository.Add(node); return Ok(Mapper.Map(finalNode)); } @@ -50,7 +44,7 @@ public class NodesController : BaseCrudController(item)); } diff --git a/MoonlightServers.Client/UI/Components/Forms/AllocationEditor.razor b/MoonlightServers.Client/UI/Components/Forms/AllocationEditor.razor index 06762a6..82aa6a1 100644 --- a/MoonlightServers.Client/UI/Components/Forms/AllocationEditor.razor +++ b/MoonlightServers.Client/UI/Components/Forms/AllocationEditor.razor @@ -26,7 +26,7 @@ private void OnConfigure(CrudOptions options) { options.Loader = async (page, pageSize) - => await HttpApiClient.GetJson>($"admin/servers/nodes/{NodeId}/allocations"); + => await HttpApiClient.GetJson>($"admin/servers/nodes/{NodeId}/allocations?page={page}&pageSize={pageSize}"); options.CreateFunction = async request => await HttpApiClient.Post($"admin/servers/nodes/{NodeId}/allocations", request); options.UpdateFunction = async (request, item) => await HttpApiClient.Patch($"admin/servers/nodes/{NodeId}/allocations/{item.Id}", request);