Finish base API.

Making PR, any additional API functions or modifications can be done
within the repository now.
This commit is contained in:
Dane Everitt 2016-01-16 00:25:21 -05:00
parent 77e3744b40
commit ac65d5fa21
8 changed files with 249 additions and 6 deletions

View file

@ -2,6 +2,7 @@
namespace Pterodactyl\Http\Controllers\API; namespace Pterodactyl\Http\Controllers\API;
use DB;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Pterodactyl\Models\Location; use Pterodactyl\Models\Location;
@ -27,7 +28,16 @@ class LocationController extends BaseController
*/ */
public function getLocations(Request $request) 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;
} }
} }

View file

@ -40,7 +40,7 @@ class NodeController extends BaseController
*/ */
public function getNodes(Request $request) public function getNodes(Request $request)
{ {
$nodes = Models\Node::paginate(15); $nodes = Models\Node::paginate(50);
return $this->response->paginator($nodes, new NodeTransformer); return $this->response->paginator($nodes, new NodeTransformer);
} }
@ -151,4 +151,27 @@ class NodeController extends BaseController
return $allocations; 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.');
}
}
} }

View file

@ -40,16 +40,43 @@ class ServerController extends BaseController
*/ */
public function getServers(Request $request) public function getServers(Request $request)
{ {
$servers = Models\Server::paginate(15); $servers = Models\Server::paginate(50);
return $this->response->paginator($servers, new ServerTransformer); 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 * List Specific Server
* *
* Lists specific fields about a server or all fields pertaining to that server. * Lists specific fields about a server or all fields pertaining to that server.
* *
* @Get("/servers/{id}/{fields}") * @Get("/servers/{id}{?fields}")
* @Versions({"v1"}) * @Versions({"v1"})
* @Parameters({ * @Parameters({
* @Parameter("id", type="integer", required=true, description="The ID of the server to get information on."), * @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.');
}
}
} }

View file

@ -0,0 +1,47 @@
<?php
namespace Pterodactyl\Http\Controllers\API;
use Illuminate\Http\Request;
use Pterodactyl\Models;
use Pterodactyl\Transformers\ServiceTransformer;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
/**
* @Resource("Services")
*/
class ServiceController extends BaseController
{
public function __construct()
{
//
}
public function getServices(Request $request)
{
return Models\Service::all();
}
public function getService(Request $request, $id)
{
$service = Models\Service::find($id);
if (!$service) {
throw new NotFoundHttpException('No service by that ID was found.');
}
$options = Models\ServiceOptions::select('id', 'name', 'description', 'tag', 'docker_image')->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
];
}
}

View file

@ -36,7 +36,7 @@ class UserController extends BaseController
*/ */
public function getUsers(Request $request) public function getUsers(Request $request)
{ {
$users = Models\User::paginate(15); $users = Models\User::paginate(50);
return $this->response->paginator($users, new UserTransformer); return $this->response->paginator($users, new UserTransformer);
} }

View file

@ -49,11 +49,31 @@ class APIRoutes
'uses' => 'Pterodactyl\Http\Controllers\API\ServerController@getServers' '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}', [ $api->get('servers/{id}', [
'as' => 'api.servers.view', 'as' => 'api.servers.view',
'uses' => 'Pterodactyl\Http\Controllers\API\ServerController@getServer' '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 * Node Routes
*/ */
@ -73,10 +93,15 @@ class APIRoutes
]); ]);
$api->get('nodes/{id}/allocations', [ $api->get('nodes/{id}/allocations', [
'as' => 'api.nodes.view', 'as' => 'api.nodes.view_allocations',
'uses' => 'Pterodactyl\Http\Controllers\API\NodeController@getNodeAllocations' 'uses' => 'Pterodactyl\Http\Controllers\API\NodeController@getNodeAllocations'
]); ]);
$api->delete('nodes/{id}', [
'as' => 'api.nodes.view',
'uses' => 'Pterodactyl\Http\Controllers\API\NodeController@deleteNode'
]);
/** /**
* Location Routes * Location Routes
*/ */
@ -85,6 +110,19 @@ class APIRoutes
'uses' => 'Pterodactyl\Http\Controllers\API\LocationController@getLocations' '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'
]);
}); });
} }

View file

@ -183,4 +183,10 @@ class NodeRepository {
} }
} }
public function delete($id)
{
// @TODO: add logic;
return true;
}
} }

View file

@ -685,4 +685,28 @@ class ServerRepository
return $server->save(); 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;
}
} }