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\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<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
*
@ -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<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)
->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);
}
}

View File

@ -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']);
});
/*