diff --git a/app/Http/Controllers/API/LocationController.php b/app/Http/Controllers/API/LocationController.php new file mode 100644 index 000000000..0fdfea47a --- /dev/null +++ b/app/Http/Controllers/API/LocationController.php @@ -0,0 +1,33 @@ +response->paginator($nodes, new NodeTransformer); + } + + /** + * Create a New Node + * + * @Post("/nodes") + * @Versions({"v1"}) + * @Transaction({ + * @Request({ + * 'name' => 'My API Node', + * 'location' => 1, + * 'public' => 1, + * 'fqdn' => 'daemon.wuzzle.woo', + * 'scheme' => 'https', + * 'memory' => 10240, + * 'memory_overallocate' => 100, + * 'disk' => 204800, + * 'disk_overallocate' => -1, + * 'daemonBase' => '/srv/daemon-data', + * 'daemonSFTP' => 2022, + * 'daemonListen' => 8080 + * }, headers={"Authorization": "Bearer "}), + * @Response(201), + * @Response(422, body={ + * "message": "A validation error occured.", + * "errors": {}, + * "status_code": 422 + * }), + * @Response(503, body={ + * "message": "There was an error while attempting to add this node to the system.", + * "status_code": 503 + * }) + * }) + */ + public function postNode(Request $request) + { + try { + $node = new NodeRepository; + $new = $node->create($request->all()); + return $this->response->created(route('api.nodes.view', [ + 'id' => $new + ])); + } catch (DisplayValidationException $ex) { + throw new ResourceException('A validation error occured.', json_decode($ex->getMessage(), true)); + } catch (DisplayException $ex) { + throw new ResourceException($ex->getMessage()); + } catch (\Exception $e) { + throw new BadRequestHttpException('There was an error while attempting to add this node to the system.'); + } + } + + /** + * List Specific Node + * + * Lists specific fields about a server or all fields pertaining to that node. + * + * @Get("/nodes/{id}/{?fields}") + * @Versions({"v1"}) + * @Parameters({ + * @Parameter("id", type="integer", required=true, description="The ID of the node to get information on."), + * @Parameter("fields", type="string", required=false, description="A comma delimidated list of fields to include.") + * }) + * @Response(200) + */ + public function getNode(Request $request, $id, $fields = null) + { + $query = Models\Node::where('id', $id); + + if (!is_null($request->input('fields'))) { + foreach(explode(',', $request->input('fields')) as $field) { + if (!empty($field)) { + $query->addSelect($field); + } + } + } + + try { + if (!$query->first()) { + throw new NotFoundHttpException('No node by that ID was found.'); + } + return $query->first(); + } catch (NotFoundHttpException $ex) { + throw $ex; + } catch (\Exception $ex) { + throw new BadRequestHttpException('There was an issue with the fields passed in the request.'); + } + } + + /** + * List Node Allocations + * + * Returns a listing of all node allocations. + * + * @Get("/nodes/{id}/allocations") + * @Versions({"v1"}) + * @Parameters({ + * @Parameter("id", type="integer", required=true, description="The ID of the node to get allocations for."), + * }) + * @Response(200) + */ + public function getNodeAllocations(Request $request, $id) + { + $allocations = Models\Allocation::select('ip', 'port', 'assigned_to')->where('node', $id)->orderBy('ip', 'asc')->orderBy('port', 'asc')->get(); + if ($allocations->count() < 1) { + throw new NotFoundHttpException('No allocations where found for the requested node.'); + } + return $allocations; + } + +} diff --git a/app/Http/Controllers/API/ServerController.php b/app/Http/Controllers/API/ServerController.php new file mode 100644 index 000000000..4417bb67c --- /dev/null +++ b/app/Http/Controllers/API/ServerController.php @@ -0,0 +1,84 @@ +response->paginator($servers, new ServerTransformer); + } + + /** + * List Specific Server + * + * Lists specific fields about a server or all fields pertaining to that server. + * + * @Get("/servers/{id}/{fields}") + * @Versions({"v1"}) + * @Parameters({ + * @Parameter("id", type="integer", required=true, description="The ID of the server to get information on."), + * @Parameter("fields", type="string", required=false, description="A comma delimidated list of fields to include.") + * }) + * @Response(200) + */ + public function getServer(Request $request, $id) + { + $query = Models\Server::where('id', $id); + + if (!is_null($request->input('fields'))) { + foreach(explode(',', $request->input('fields')) as $field) { + if (!empty($field)) { + $query->addSelect($field); + } + } + } + + try { + if (!$query->first()) { + throw new NotFoundHttpException('No server by that ID was found.'); + } + return $query->first(); + } catch (NotFoundHttpException $ex) { + throw $ex; + } catch (\Exception $ex) { + throw new BadRequestHttpException('There was an issue with the fields passed in the request.'); + } + } + +} diff --git a/app/Http/Controllers/API/UserController.php b/app/Http/Controllers/API/UserController.php index 5a4a68537..12c9e8167 100644 --- a/app/Http/Controllers/API/UserController.php +++ b/app/Http/Controllers/API/UserController.php @@ -53,12 +53,12 @@ class UserController extends BaseController * }) * @Response(200) */ - public function getUser(Request $request, $id, $fields = null) + public function getUser(Request $request, $id) { $query = Models\User::where('id', $id); - if (!is_null($fields)) { - foreach(explode(',', $fields) as $field) { + if (!is_null($request->input('fields'))) { + foreach(explode(',', $request->input('fields')) as $field) { if (!empty($field)) { $query->addSelect($field); } diff --git a/app/Http/Routes/APIRoutes.php b/app/Http/Routes/APIRoutes.php index 79b7db006..3c1233ff2 100644 --- a/app/Http/Routes/APIRoutes.php +++ b/app/Http/Routes/APIRoutes.php @@ -30,6 +30,10 @@ class APIRoutes }); $api->version('v1', ['middleware' => 'api.auth'], function ($api) { + + /** + * User Routes + */ $api->get('users', [ 'as' => 'api.users', 'uses' => 'Pterodactyl\Http\Controllers\API\UserController@getUsers' @@ -40,20 +44,65 @@ class APIRoutes 'uses' => 'Pterodactyl\Http\Controllers\API\UserController@postUser' ]); - $api->get('users/{id}/{fields?}', [ + $api->get('users/{id}', [ 'as' => 'api.users.view', 'uses' => 'Pterodactyl\Http\Controllers\API\UserController@getUser' ]); - $api->patch('users/{id}/', [ + $api->patch('users/{id}', [ 'as' => 'api.users.patch', 'uses' => 'Pterodactyl\Http\Controllers\API\UserController@patchUser' ]); - $api->delete('users/{id}/', [ + $api->delete('users/{id}', [ 'as' => 'api.users.delete', 'uses' => 'Pterodactyl\Http\Controllers\API\UserController@deleteUser' ]); + + /** + * Server Routes + */ + $api->get('servers', [ + 'as' => 'api.servers', + 'uses' => 'Pterodactyl\Http\Controllers\API\ServerController@getServers' + ]); + + $api->get('servers/{id}', [ + 'as' => 'api.servers.view', + 'uses' => 'Pterodactyl\Http\Controllers\API\ServerController@getServer' + ]); + + /** + * Node Routes + */ + $api->get('nodes', [ + 'as' => 'api.nodes', + 'uses' => 'Pterodactyl\Http\Controllers\API\NodeController@getNodes' + ]); + + $api->post('nodes', [ + 'as' => 'api.nodes.post', + 'uses' => 'Pterodactyl\Http\Controllers\API\NodeController@postNode' + ]); + + $api->get('nodes/{id}', [ + 'as' => 'api.nodes.view', + 'uses' => 'Pterodactyl\Http\Controllers\API\NodeController@getNode' + ]); + + $api->get('nodes/{id}/allocations', [ + 'as' => 'api.nodes.view', + 'uses' => 'Pterodactyl\Http\Controllers\API\NodeController@getNodeAllocations' + ]); + + /** + * Location Routes + */ + $api->get('locations', [ + 'as' => 'api.locations', + 'uses' => 'Pterodactyl\Http\Controllers\API\LocationController@getLocations' + ]); + }); } diff --git a/app/Transformers/NodeTransformer.php b/app/Transformers/NodeTransformer.php new file mode 100644 index 000000000..45a7efbc3 --- /dev/null +++ b/app/Transformers/NodeTransformer.php @@ -0,0 +1,21 @@ +