From ac65d5fa21c106bbf9f88449ace2c9119b1dbc56 Mon Sep 17 00:00:00 2001 From: Dane Everitt Date: Sat, 16 Jan 2016 00:25:21 -0500 Subject: [PATCH] Finish base API. Making PR, any additional API functions or modifications can be done within the repository now. --- .../Controllers/API/LocationController.php | 12 ++- app/Http/Controllers/API/NodeController.php | 25 ++++- app/Http/Controllers/API/ServerController.php | 99 ++++++++++++++++++- .../Controllers/API/ServiceController.php | 47 +++++++++ app/Http/Controllers/API/UserController.php | 2 +- app/Http/Routes/APIRoutes.php | 40 +++++++- app/Repositories/NodeRepository.php | 6 ++ app/Repositories/ServerRepository.php | 24 +++++ 8 files changed, 249 insertions(+), 6 deletions(-) create mode 100644 app/Http/Controllers/API/ServiceController.php diff --git a/app/Http/Controllers/API/LocationController.php b/app/Http/Controllers/API/LocationController.php index 0fdfea47a..1671337b8 100644 --- a/app/Http/Controllers/API/LocationController.php +++ b/app/Http/Controllers/API/LocationController.php @@ -2,6 +2,7 @@ namespace Pterodactyl\Http\Controllers\API; +use DB; use Illuminate\Http\Request; use Pterodactyl\Models\Location; @@ -27,7 +28,16 @@ class LocationController extends BaseController */ public function getLocations(Request $request) { - return Location::all(); + $locations = Location::select('locations.*', DB::raw('GROUP_CONCAT(nodes.id) as nodes')) + ->join('nodes', 'locations.id', '=', 'nodes.location') + ->groupBy('locations.id') + ->get(); + + foreach($locations as &$location) { + $location->nodes = explode(',', $location->nodes); + } + + return $locations; } } diff --git a/app/Http/Controllers/API/NodeController.php b/app/Http/Controllers/API/NodeController.php index 30b78580d..71580e4e4 100644 --- a/app/Http/Controllers/API/NodeController.php +++ b/app/Http/Controllers/API/NodeController.php @@ -40,7 +40,7 @@ class NodeController extends BaseController */ public function getNodes(Request $request) { - $nodes = Models\Node::paginate(15); + $nodes = Models\Node::paginate(50); return $this->response->paginator($nodes, new NodeTransformer); } @@ -151,4 +151,27 @@ class NodeController extends BaseController return $allocations; } + /** + * Delete Node + * + * @Delete("/nodes/{id}") + * @Versions({"v1"}) + * @Parameters({ + * @Parameter("id", type="integer", required=true, description="The ID of the node."), + * }) + * @Response(204) + */ + public function deleteNode(Request $request, $id) + { + try { + $node = new NodeRepository; + $node->delete($id); + return $this->response->noContent(); + } catch (DisplayException $ex) { + throw new ResourceException($ex->getMessage()); + } catch(\Exception $e) { + throw new ServiceUnavailableHttpException('An error occured while attempting to delete this node.'); + } + } + } diff --git a/app/Http/Controllers/API/ServerController.php b/app/Http/Controllers/API/ServerController.php index 4417bb67c..ab2f1b3b5 100644 --- a/app/Http/Controllers/API/ServerController.php +++ b/app/Http/Controllers/API/ServerController.php @@ -40,16 +40,43 @@ class ServerController extends BaseController */ public function getServers(Request $request) { - $servers = Models\Server::paginate(15); + $servers = Models\Server::paginate(50); return $this->response->paginator($servers, new ServerTransformer); } + /** + * Create Server + * + * @Post("/servers") + * @Versions({"v1"}) + * @Parameters({ + * @Parameter("page", type="integer", description="The page of results to view.", default=1) + * }) + * @Response(201) + */ + public function postServer(Request $request) + { + try { + $server = new ServerRepository; + $new = $server->create($request->all()); + return $this->response->created(route('api.servers.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 server to the system.'); + } + } + /** * List Specific Server * * Lists specific fields about a server or all fields pertaining to that server. * - * @Get("/servers/{id}/{fields}") + * @Get("/servers/{id}{?fields}") * @Versions({"v1"}) * @Parameters({ * @Parameter("id", type="integer", required=true, description="The ID of the server to get information on."), @@ -81,4 +108,72 @@ class ServerController extends BaseController } } + /** + * Suspend Server + * + * @Post("/servers/{id}/suspend") + * @Versions({"v1"}) + * @Parameters({ + * @Parameter("id", type="integer", required=true, description="The ID of the server."), + * }) + * @Response(204) + */ + public function postServerSuspend(Request $request, $id) + { + try { + $server = new ServerRepository; + $server->suspend($id); + } catch (DisplayException $ex) { + throw new ResourceException($ex->getMessage()); + } catch (\Exception $ex) { + throw new ServiceUnavailableHttpException('An error occured while attempting to suspend this server instance.'); + } + } + + /** + * Unsuspend Server + * + * @Post("/servers/{id}/unsuspend") + * @Versions({"v1"}) + * @Parameters({ + * @Parameter("id", type="integer", required=true, description="The ID of the server."), + * }) + * @Response(204) + */ + public function postServerUnsuspend(Request $request, $id) + { + try { + $server = new ServerRepository; + $server->unsuspend($id); + } catch (DisplayException $ex) { + throw new ResourceException($ex->getMessage()); + } catch (\Exception $ex) { + throw new ServiceUnavailableHttpException('An error occured while attempting to unsuspend this server instance.'); + } + } + + /** + * Delete Server + * + * @Delete("/servers/{id}/{force}") + * @Versions({"v1"}) + * @Parameters({ + * @Parameter("id", type="integer", required=true, description="The ID of the server."), + * @Parameter("force", type="string", required=false, description="Use 'force' if the server should be removed regardless of daemon response."), + * }) + * @Response(204) + */ + public function deleteServer(Request $request, $id, $force = null) + { + try { + $server = new ServerRepository; + $server->deleteServer($id, $force); + return $this->response->noContent(); + } catch (DisplayException $ex) { + throw new ResourceException($ex->getMessage()); + } catch(\Exception $e) { + throw new ServiceUnavailableHttpException('An error occured while attempting to delete this server.'); + } + } + } diff --git a/app/Http/Controllers/API/ServiceController.php b/app/Http/Controllers/API/ServiceController.php new file mode 100644 index 000000000..cd0ac1202 --- /dev/null +++ b/app/Http/Controllers/API/ServiceController.php @@ -0,0 +1,47 @@ +where('parent_service', $service->id)->get(); + foreach($options as &$opt) { + $opt->variables = Models\ServiceVariables::where('option_id', $opt->id)->get(); + } + + return [ + 'service' => $service, + 'options' => $options + ]; + + } + +} diff --git a/app/Http/Controllers/API/UserController.php b/app/Http/Controllers/API/UserController.php index 12c9e8167..db63b44d3 100644 --- a/app/Http/Controllers/API/UserController.php +++ b/app/Http/Controllers/API/UserController.php @@ -36,7 +36,7 @@ class UserController extends BaseController */ public function getUsers(Request $request) { - $users = Models\User::paginate(15); + $users = Models\User::paginate(50); return $this->response->paginator($users, new UserTransformer); } diff --git a/app/Http/Routes/APIRoutes.php b/app/Http/Routes/APIRoutes.php index a0e715cb5..7178fc4d8 100644 --- a/app/Http/Routes/APIRoutes.php +++ b/app/Http/Routes/APIRoutes.php @@ -49,11 +49,31 @@ class APIRoutes 'uses' => 'Pterodactyl\Http\Controllers\API\ServerController@getServers' ]); + $api->post('servers', [ + 'as' => 'api.servers.post', + 'uses' => 'Pterodactyl\Http\Controllers\API\ServerController@postServer' + ]); + $api->get('servers/{id}', [ 'as' => 'api.servers.view', 'uses' => 'Pterodactyl\Http\Controllers\API\ServerController@getServer' ]); + $api->post('servers/{id}/suspend', [ + 'as' => 'api.servers.suspend', + 'uses' => 'Pterodactyl\Http\Controllers\API\ServerController@postServerSuspend' + ]); + + $api->post('servers/{id}/unsuspend', [ + 'as' => 'api.servers.unsuspend', + 'uses' => 'Pterodactyl\Http\Controllers\API\ServerController@postServerUnsuspend' + ]); + + $api->delete('servers/{id}/{force?}', [ + 'as' => 'api.servers.delete', + 'uses' => 'Pterodactyl\Http\Controllers\API\ServerController@deleteServer' + ]); + /** * Node Routes */ @@ -73,10 +93,15 @@ class APIRoutes ]); $api->get('nodes/{id}/allocations', [ - 'as' => 'api.nodes.view', + 'as' => 'api.nodes.view_allocations', 'uses' => 'Pterodactyl\Http\Controllers\API\NodeController@getNodeAllocations' ]); + $api->delete('nodes/{id}', [ + 'as' => 'api.nodes.view', + 'uses' => 'Pterodactyl\Http\Controllers\API\NodeController@deleteNode' + ]); + /** * Location Routes */ @@ -85,6 +110,19 @@ class APIRoutes 'uses' => 'Pterodactyl\Http\Controllers\API\LocationController@getLocations' ]); + /** + * Service Routes + */ + $api->get('services', [ + 'as' => 'api.services', + 'uses' => 'Pterodactyl\Http\Controllers\API\ServiceController@getServices' + ]); + + $api->get('services/{id}', [ + 'as' => 'api.services.view', + 'uses' => 'Pterodactyl\Http\Controllers\API\ServiceController@getService' + ]); + }); } diff --git a/app/Repositories/NodeRepository.php b/app/Repositories/NodeRepository.php index 5611cc260..368a3dae0 100644 --- a/app/Repositories/NodeRepository.php +++ b/app/Repositories/NodeRepository.php @@ -183,4 +183,10 @@ class NodeRepository { } } + public function delete($id) + { + // @TODO: add logic; + return true; + } + } diff --git a/app/Repositories/ServerRepository.php b/app/Repositories/ServerRepository.php index 4b8f292db..6587fe5cb 100644 --- a/app/Repositories/ServerRepository.php +++ b/app/Repositories/ServerRepository.php @@ -685,4 +685,28 @@ class ServerRepository return $server->save(); } + /** + * Suspends a server instance making it unable to be booted or used by a user. + * @param integer $id + * @return boolean + */ + public function suspend($id) + { + // @TODO: Implement logic; not doing it now since that is outside of the + // scope of this API brance. + return true; + } + + /** + * Unsuspends a server instance. + * @param integer $id + * @return boolean + */ + public function unsuspend($id) + { + // @TODO: Implement logic; not doing it now since that is outside of the + // scope of this API brance. + return true; + } + }