From 4d03d6b948d9b0b4cd6c77bfb4c67da59b2c2322 Mon Sep 17 00:00:00 2001 From: Boy132 Date: Fri, 18 Jul 2025 13:50:31 +0200 Subject: [PATCH] Improve Mounts API (#1531) --- .../Application/Mounts/MountController.php | 95 ++++++++++++++++--- routes/api-application.php | 5 + 2 files changed, 89 insertions(+), 11 deletions(-) diff --git a/app/Http/Controllers/Api/Application/Mounts/MountController.php b/app/Http/Controllers/Api/Application/Mounts/MountController.php index 5f905d892..e3f6b85f2 100644 --- a/app/Http/Controllers/Api/Application/Mounts/MountController.php +++ b/app/Http/Controllers/Api/Application/Mounts/MountController.php @@ -14,6 +14,12 @@ use App\Http\Requests\Api\Application\Mounts\StoreMountRequest; use App\Http\Requests\Api\Application\Mounts\DeleteMountRequest; use App\Http\Requests\Api\Application\Mounts\UpdateMountRequest; use App\Exceptions\Service\HasActiveServersException; +use App\Http\Requests\Api\Application\Eggs\GetEggsRequest; +use App\Http\Requests\Api\Application\Nodes\GetNodesRequest; +use App\Http\Requests\Api\Application\Servers\GetServerRequest; +use App\Transformers\Api\Application\EggTransformer; +use App\Transformers\Api\Application\NodeTransformer; +use App\Transformers\Api\Application\ServerTransformer; class MountController extends ApplicationApiController { @@ -113,6 +119,42 @@ class MountController extends ApplicationApiController return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); } + /** + * List assigned eggs + * + * @return array + */ + public function getEggs(GetEggsRequest $request, Mount $mount): array + { + return $this->fractal->collection($mount->eggs) + ->transformWith($this->getTransformer(EggTransformer::class)) + ->toArray(); + } + + /** + * List assigned nodes + * + * @return array + */ + public function getNodes(GetNodesRequest $request, Mount $mount): array + { + return $this->fractal->collection($mount->nodes) + ->transformWith($this->getTransformer(NodeTransformer::class)) + ->toArray(); + } + + /** + * List assigned servers + * + * @return array + */ + public function getServers(GetServerRequest $request, Mount $mount): array + { + return $this->fractal->collection($mount->servers) + ->transformWith($this->getTransformer(ServerTransformer::class)) + ->toArray(); + } + /** * Assign eggs to mount * @@ -123,13 +165,11 @@ class MountController extends ApplicationApiController public function addEggs(Request $request, Mount $mount): array { $validatedData = $request->validate([ - 'eggs' => 'required|exists:eggs,id', + 'eggs' => 'required|array|exists:eggs,id', + 'eggs.*' => 'integer', ]); - $eggs = $validatedData['eggs'] ?? []; - if (count($eggs) > 0) { - $mount->eggs()->attach($eggs); - } + $mount->eggs()->attach($validatedData['eggs']); return $this->fractal->item($mount) ->transformWith($this->getTransformer(MountTransformer::class)) @@ -137,7 +177,7 @@ class MountController extends ApplicationApiController } /** - * Assign mounts to mount + * Assign nodes to mount * * Adds nodes to the mount's many-to-many relation. * @@ -145,12 +185,33 @@ class MountController extends ApplicationApiController */ public function addNodes(Request $request, Mount $mount): array { - $data = $request->validate(['nodes' => 'required|exists:nodes,id']); + $validatedData = $request->validate([ + 'nodes' => 'required|array|exists:nodes,id', + 'nodes.*' => 'integer', + ]); - $nodes = $data['nodes'] ?? []; - if (count($nodes) > 0) { - $mount->nodes()->attach($nodes); - } + $mount->nodes()->attach($validatedData['nodes']); + + return $this->fractal->item($mount) + ->transformWith($this->getTransformer(MountTransformer::class)) + ->toArray(); + } + + /** + * Assign servers to mount + * + * Adds servers to the mount's many-to-many relation. + * + * @return array + */ + public function addServers(Request $request, Mount $mount): array + { + $validatedData = $request->validate([ + 'servers' => 'required|array|exists:servers,id', + 'servers.*' => 'integer', + ]); + + $mount->servers()->attach($validatedData['servers']); return $this->fractal->item($mount) ->transformWith($this->getTransformer(MountTransformer::class)) @@ -180,4 +241,16 @@ class MountController extends ApplicationApiController return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); } + + /** + * Unassign server from mount + * + * Deletes a server from the mount's many-to-many relation. + */ + public function deleteServer(Mount $mount, int $server_id): JsonResponse + { + $mount->servers()->detach($server_id); + + return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); + } } diff --git a/routes/api-application.php b/routes/api-application.php index d45a3d1b5..d5fb3e36e 100644 --- a/routes/api-application.php +++ b/routes/api-application.php @@ -133,16 +133,21 @@ Route::prefix('/database-hosts')->group(function () { Route::prefix('mounts')->group(function () { Route::get('/', [Application\Mounts\MountController::class, 'index'])->name('api.application.mounts'); Route::get('/{mount:id}', [Application\Mounts\MountController::class, 'view'])->name('api.application.mounts.view'); + Route::get('/{mount:id}/eggs', [Application\Mounts\MountController::class, 'getEggs']); + Route::get('/{mount:id}/nodes', [Application\Mounts\MountController::class, 'getNodes']); + Route::get('/{mount:id}/servers', [Application\Mounts\MountController::class, 'getServers']); Route::post('/', [Application\Mounts\MountController::class, 'store']); Route::post('/{mount:id}/eggs', [Application\Mounts\MountController::class, 'addEggs'])->name('api.application.mounts.eggs'); Route::post('/{mount:id}/nodes', [Application\Mounts\MountController::class, 'addNodes'])->name('api.application.mounts.nodes'); + Route::post('/{mount:id}/servers', [Application\Mounts\MountController::class, 'addServers'])->name('api.application.mounts.servers'); Route::patch('/{mount:id}', [Application\Mounts\MountController::class, 'update']); Route::delete('/{mount:id}', [Application\Mounts\MountController::class, 'delete']); Route::delete('/{mount:id}/eggs/{egg_id}', [Application\Mounts\MountController::class, 'deleteEgg']); Route::delete('/{mount:id}/nodes/{node_id}', [Application\Mounts\MountController::class, 'deleteNode']); + Route::delete('/{mount:id}/servers/{server_id}', [Application\Mounts\MountController::class, 'deleteServer']); }); /*