Fix database management things to actually work correctly.

This commit is contained in:
Dane Everitt 2017-07-22 13:55:30 -05:00
parent 580e5ac569
commit 63e39fbe58
No known key found for this signature in database
GPG key ID: EEA66103B3D71F53
14 changed files with 124 additions and 119 deletions

View file

@ -44,4 +44,12 @@ interface UserRepositoryInterface extends RepositoryInterface, SearchableInterfa
* @throws \Pterodactyl\Exceptions\DisplayException
*/
public function deleteIfNoServers($id);
/**
* Return all matching models for a user in a format that can be used for dropdowns.
*
* @param string $query
* @return \Illuminate\Database\Eloquent\Collection
*/
public function filterUsersByQuery($query);
}

View file

@ -63,6 +63,11 @@ class ServersController extends Controller
*/
protected $databaseRepository;
/**
* @var \Pterodactyl\Services\Database\CreationService
*/
protected $databaseCreationService;
/**
* @var \Pterodactyl\Contracts\Repository\DatabaseHostRepositoryInterface
*/
@ -97,6 +102,7 @@ class ServersController extends Controller
AllocationRepositoryInterface $allocationRepository,
ConfigRepository $config,
CreationService $service,
\Pterodactyl\Services\Database\CreationService $databaseCreationService,
DatabaseRepositoryInterface $databaseRepository,
DatabaseHostRepository $databaseHostRepository,
LocationRepositoryInterface $locationRepository,
@ -106,6 +112,7 @@ class ServersController extends Controller
) {
$this->allocationRepository = $allocationRepository;
$this->config = $config;
$this->databaseCreationService = $databaseCreationService;
$this->databaseRepository = $databaseRepository;
$this->databaseHostRepository = $databaseHostRepository;
$this->locationRepository = $locationRepository;
@ -583,20 +590,25 @@ class ServersController extends Controller
*/
public function newDatabase(Request $request, $id)
{
$repo = new DatabaseRepository;
try {
$repo->create($id, $request->only(['host', 'database', 'connection']));
Alert::success('A new database was assigned to this server successfully.')->flash();
} catch (DisplayValidationException $ex) {
return redirect()->route('admin.servers.view.database', $id)->withInput()->withErrors(json_decode($ex->getMessage()))->withInput();
} catch (DisplayException $ex) {
Alert::danger($ex->getMessage())->flash();
} catch (\Exception $ex) {
Log::error($ex);
Alert::danger('An exception occured while attempting to add a new database for this server. This error has been logged.')->flash();
}
$this->databaseCreationService->create($id, [
'database' => $request->input('database'),
'remote' => $request->input('remote'),
'database_host_id' => $request->input('database_host_id'),
]);
// $repo = new DatabaseRepository;
//
// try {
// $repo->create($id, $request->only(['host', 'database', 'connection']));
//
// Alert::success('A new database was assigned to this server successfully.')->flash();
// } catch (DisplayValidationException $ex) {
// return redirect()->route('admin.servers.view.database', $id)->withInput()->withErrors(json_decode($ex->getMessage()))->withInput();
// } catch (DisplayException $ex) {
// Alert::danger($ex->getMessage())->flash();
// } catch (\Exception $ex) {
// Log::error($ex);
// Alert::danger('An exception occured while attempting to add a new database for this server. This error has been logged.')->flash();
// }
return redirect()->route('admin.servers.view.database', $id)->withInput();
}

View file

@ -28,7 +28,7 @@ use Illuminate\Http\Request;
use Pterodactyl\Contracts\Repository\UserRepositoryInterface;
use Pterodactyl\Models\User;
use Prologue\Alerts\AlertsMessageBag;
use Pterodactyl\Services\Administrative\UserService;
use Pterodactyl\Services\UserService;
use Pterodactyl\Exceptions\DisplayException;
use Pterodactyl\Http\Controllers\Controller;
use Pterodactyl\Http\Requests\Admin\UserFormRequest;
@ -41,7 +41,7 @@ class UserController extends Controller
protected $alert;
/**
* @var \Pterodactyl\Services\Administrative\UserService
* @var \Pterodactyl\Services\UserService
*/
protected $service;
@ -59,7 +59,7 @@ class UserController extends Controller
* UserController constructor.
*
* @param \Prologue\Alerts\AlertsMessageBag $alert
* @param \Pterodactyl\Services\Administrative\UserService $service
* @param \Pterodactyl\Services\UserService $service
* @param \Pterodactyl\Contracts\Repository\UserRepositoryInterface $repository
* @param \Pterodactyl\Models\User $model
*/
@ -178,17 +178,11 @@ class UserController extends Controller
/**
* Get a JSON response of users on the system.
*
* @param \Illuminate\Http\Request $request
* @return \Pterodactyl\Models\User
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Database\Eloquent\Collection
*/
public function json(Request $request)
{
return $this->model->search($request->input('q'))->all([
'id', 'email', 'username', 'name_first', 'name_last',
])->transform(function ($item) {
$item->md5 = md5(strtolower($item->email));
return $item;
});
return $this->repository->filterUsersByQuery($request->input('q'));
}
}

View file

@ -33,17 +33,10 @@ class DatabaseHostFormRequest extends AdminFormRequest
*/
public function rules()
{
$this->merge([
'node_id' => ($this->input('node_id') < 1) ? null : $this->input('node_id'),
'host' => gethostbyname($this->input('host')),
]);
$rules = app()->make(DatabaseHost::class)->getRules();
if ($this->method() === 'PATCH') {
$rules['host'] = $rules['host'] . ',' . $this->route()->parameter('host')->id;
if ($this->method() !== 'POST') {
return DatabaseHost::getUpdateRulesForId($this->route()->parameter('host')->id);
}
return $rules;
return DatabaseHost::getCreateRules();
}
}

View file

@ -24,11 +24,12 @@
namespace Pterodactyl\Models;
use Illuminate\Database\Eloquent\Model;
use Sofa\Eloquence\Eloquence;
use Sofa\Eloquence\Validable;
use Illuminate\Database\Eloquent\Model;
use Sofa\Eloquence\Contracts\Validable as ValidableContract;
class Database extends Model
class Database extends Model implements ValidableContract
{
use Eloquence, Validable;
@ -52,7 +53,7 @@ class Database extends Model
* @var array
*/
protected $fillable = [
'server_id', 'database_host_id', 'database', 'username', 'remote',
'server_id', 'database_host_id', 'database', 'username', 'password', 'remote',
];
/**

View file

@ -27,8 +27,9 @@ namespace Pterodactyl\Models;
use Sofa\Eloquence\Eloquence;
use Sofa\Eloquence\Validable;
use Illuminate\Database\Eloquent\Model;
use Sofa\Eloquence\Contracts\Validable as ValidableContract;
class DatabaseHost extends Model
class DatabaseHost extends Model implements ValidableContract
{
use Eloquence, Validable;
@ -52,7 +53,7 @@ class DatabaseHost extends Model
* @var array
*/
protected $fillable = [
'name', 'host', 'port', 'username', 'max_databases', 'node_id',
'name', 'host', 'port', 'username', 'password', 'max_databases', 'node_id',
];
/**
@ -79,11 +80,12 @@ class DatabaseHost extends Model
'node_id' => 'sometimes|required',
];
/**
* Validation rules to assign to this model.
*
* @var array
*/
/**
* Validation rules to assign to this model.
*
* @var array
*/
// @todo the node_id field doesn't validate correctly if no node is provided in request
protected static $dataIntegrityRules = [
'name' => 'string|max:255',
'host' => 'ip|unique:database_hosts,host',

View file

@ -24,32 +24,32 @@
namespace Pterodactyl\Repositories\Eloquent;
use Illuminate\Database\DatabaseManager;
use Pterodactyl\Models\Database;
use Illuminate\Foundation\Application;
use Illuminate\Database\ConnectionResolver;
use Pterodactyl\Exceptions\DisplayException;
use Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface;
class DatabaseRepository extends EloquentRepository implements DatabaseRepositoryInterface
{
/**
* @var \Illuminate\Database\ConnectionResolverInterface
* @var \Illuminate\Database\DatabaseManager
*/
protected $connection;
protected $database;
/**
* DatabaseRepository constructor.
*
* @param \Illuminate\Foundation\Application $application
* @param \Illuminate\Database\ConnectionResolver $connection
* @param \Illuminate\Foundation\Application $application
* @param \Illuminate\Database\DatabaseManager $database
*/
public function __construct(
Application $application,
ConnectionResolver $connection
DatabaseManager $database
) {
parent::__construct($application);
$this->connection = $connection;
$this->database = $database;
}
/**
@ -150,6 +150,6 @@ class DatabaseRepository extends EloquentRepository implements DatabaseRepositor
*/
protected function runStatement($statement, $connection = null)
{
return $this->connection->connection($connection)->statement($statement);
return $this->database->connection($connection)->statement($statement);
}
}

View file

@ -93,4 +93,22 @@ class UserRepository extends SearchableRepository implements UserRepositoryInter
return $user->delete();
}
/**
* {@inheritdoc}
*/
public function filterUsersByQuery($query)
{
$this->withColumns([
'id', 'email', 'username', 'name_first', 'name_last',
]);
$instance = $this->getBuilder()->search($query)->get($this->getColumns());
return $instance->transform(function ($item) {
$item->md5 = md5(strtolower($item->email));
return $item;
});
}
}

View file

@ -24,8 +24,7 @@
namespace Pterodactyl\Services\Database;
use Illuminate\Database\ConnectionResolver;
use Illuminate\Database\ConnectionInterface;
use Illuminate\Database\DatabaseManager;
use Illuminate\Contracts\Encryption\Encrypter;
use Pterodactyl\Extensions\DynamicDatabaseConnection;
use Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface;
@ -33,12 +32,7 @@ use Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface;
class CreationService
{
/**
* @var \Illuminate\Database\ConnectionResolver
*/
protected $connection;
/**
* @var \Illuminate\Database\ConnectionInterface
* @var \Illuminate\Database\DatabaseManager
*/
protected $database;
@ -60,20 +54,17 @@ class CreationService
/**
* CreationService constructor.
*
* @param \Illuminate\Database\ConnectionInterface $database
* @param \Illuminate\Database\ConnectionResolver $connection
* @param \Illuminate\Database\DatabaseManager $database
* @param \Pterodactyl\Extensions\DynamicDatabaseConnection $dynamic
* @param \Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface $repository
* @param \Illuminate\Contracts\Encryption\Encrypter $encrypter
*/
public function __construct(
ConnectionInterface $database,
ConnectionResolver $connection,
DatabaseManager $database,
DynamicDatabaseConnection $dynamic,
DatabaseRepositoryInterface $repository,
Encrypter $encrypter
) {
$this->connection = $connection;
$this->database = $database;
$this->dynamic = $dynamic;
$this->encrypter = $encrypter;
@ -83,6 +74,7 @@ class CreationService
/**
* Create a new database that is linked to a specific host.
*
* @param int $server
* @param array $data
* @return \Illuminate\Database\Eloquent\Model
*
@ -90,10 +82,11 @@ class CreationService
* @throws \Pterodactyl\Exceptions\DisplayException
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
*/
public function create(array $data)
public function create($server, array $data)
{
$data['database'] = sprintf('d%d_%s', $data['server_id'], $data['database']);
$data['username'] = sprintf('u%d_%s', $data['server_id'], str_random(10));
$data['server_id'] = $server;
$data['database'] = sprintf('d%d_%s', $server, $data['database']);
$data['username'] = sprintf('u%d_%s', $server, str_random(10));
$data['password'] = $this->encrypter->encrypt(str_random(16));
$this->database->beginTransaction();

View file

@ -24,8 +24,8 @@
namespace Pterodactyl\Services\Database;
use Illuminate\Database\DatabaseManager;
use Illuminate\Contracts\Encryption\Encrypter;
use Illuminate\Database\DatabaseManager;
use Pterodactyl\Extensions\DynamicDatabaseConnection;
use Pterodactyl\Contracts\Repository\DatabaseHostRepositoryInterface;
@ -54,14 +54,14 @@ class DatabaseHostService
/**
* DatabaseHostService constructor.
*
* @param \Pterodactyl\Contracts\Repository\DatabaseHostRepositoryInterface $repository
* @param \Illuminate\Database\DatabaseManager $database
* @param \Pterodactyl\Contracts\Repository\DatabaseHostRepositoryInterface $repository
* @param \Pterodactyl\Extensions\DynamicDatabaseConnection $dynamic
* @param \Illuminate\Contracts\Encryption\Encrypter $encrypter
*/
public function __construct(
DatabaseHostRepositoryInterface $repository,
DatabaseManager $database,
DatabaseHostRepositoryInterface $repository,
DynamicDatabaseConnection $dynamic,
Encrypter $encrypter
) {
@ -74,7 +74,7 @@ class DatabaseHostService
/**
* Create a new database host and persist it to the database.
*
* @param array $data
* @param array $data
* @return \Pterodactyl\Models\DatabaseHost
*
* @throws \Throwable
@ -106,11 +106,11 @@ class DatabaseHostService
/**
* Update a database host and persist to the database.
*
* @param int $id
* @param array $data
* @param int $id
* @param array $data
* @return mixed
*
* @throws \PDOException
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
*/
public function update($id, array $data)
{
@ -135,7 +135,7 @@ class DatabaseHostService
/**
* Delete a database host if it has no active databases attached to it.
*
* @param int $id
* @param int $id
* @return bool|null
*
* @throws \Pterodactyl\Exceptions\DisplayException