Improve Mounts API (#1531)

This commit is contained in:
Boy132 2025-07-18 13:50:31 +02:00 committed by GitHub
parent 1f67054777
commit 4d03d6b948
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 89 additions and 11 deletions

View File

@ -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\DeleteMountRequest;
use App\Http\Requests\Api\Application\Mounts\UpdateMountRequest; use App\Http\Requests\Api\Application\Mounts\UpdateMountRequest;
use App\Exceptions\Service\HasActiveServersException; 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 class MountController extends ApplicationApiController
{ {
@ -113,6 +119,42 @@ class MountController extends ApplicationApiController
return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);
} }
/**
* List assigned eggs
*
* @return array<array-key, mixed>
*/
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<array-key, mixed>
*/
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<array-key, mixed>
*/
public function getServers(GetServerRequest $request, Mount $mount): array
{
return $this->fractal->collection($mount->servers)
->transformWith($this->getTransformer(ServerTransformer::class))
->toArray();
}
/** /**
* Assign eggs to mount * Assign eggs to mount
* *
@ -123,13 +165,11 @@ class MountController extends ApplicationApiController
public function addEggs(Request $request, Mount $mount): array public function addEggs(Request $request, Mount $mount): array
{ {
$validatedData = $request->validate([ $validatedData = $request->validate([
'eggs' => 'required|exists:eggs,id', 'eggs' => 'required|array|exists:eggs,id',
'eggs.*' => 'integer',
]); ]);
$eggs = $validatedData['eggs'] ?? []; $mount->eggs()->attach($validatedData['eggs']);
if (count($eggs) > 0) {
$mount->eggs()->attach($eggs);
}
return $this->fractal->item($mount) return $this->fractal->item($mount)
->transformWith($this->getTransformer(MountTransformer::class)) ->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. * 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 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'] ?? []; $mount->nodes()->attach($validatedData['nodes']);
if (count($nodes) > 0) {
$mount->nodes()->attach($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<array-key, mixed>
*/
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) return $this->fractal->item($mount)
->transformWith($this->getTransformer(MountTransformer::class)) ->transformWith($this->getTransformer(MountTransformer::class))
@ -180,4 +241,16 @@ class MountController extends ApplicationApiController
return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); 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);
}
} }

View File

@ -133,16 +133,21 @@ Route::prefix('/database-hosts')->group(function () {
Route::prefix('mounts')->group(function () { Route::prefix('mounts')->group(function () {
Route::get('/', [Application\Mounts\MountController::class, 'index'])->name('api.application.mounts'); 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}', [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('/', [Application\Mounts\MountController::class, 'store']);
Route::post('/{mount:id}/eggs', [Application\Mounts\MountController::class, 'addEggs'])->name('api.application.mounts.eggs'); 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}/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::patch('/{mount:id}', [Application\Mounts\MountController::class, 'update']);
Route::delete('/{mount:id}', [Application\Mounts\MountController::class, 'delete']); 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}/eggs/{egg_id}', [Application\Mounts\MountController::class, 'deleteEgg']);
Route::delete('/{mount:id}/nodes/{node_id}', [Application\Mounts\MountController::class, 'deleteNode']); Route::delete('/{mount:id}/nodes/{node_id}', [Application\Mounts\MountController::class, 'deleteNode']);
Route::delete('/{mount:id}/servers/{server_id}', [Application\Mounts\MountController::class, 'deleteServer']);
}); });
/* /*