misc_pterodactyl-panel/app/Services/Database/DatabaseHostService.php

149 lines
4.4 KiB
PHP
Raw Normal View History

<?php
2017-09-26 02:43:01 +00:00
/**
* Pterodactyl - Panel
* Copyright (c) 2015 - 2017 Dane Everitt <dane@daneeveritt.com>.
*
2017-09-26 02:43:01 +00:00
* This software is licensed under the terms of the MIT license.
* https://opensource.org/licenses/MIT
*/
2017-07-09 17:29:18 +00:00
namespace Pterodactyl\Services\Database;
use Illuminate\Database\DatabaseManager;
2017-08-27 00:58:24 +00:00
use Pterodactyl\Exceptions\DisplayException;
2017-08-27 19:55:25 +00:00
use Illuminate\Contracts\Encryption\Encrypter;
use Pterodactyl\Extensions\DynamicDatabaseConnection;
2017-08-27 19:55:25 +00:00
use Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface;
2017-07-15 16:52:34 +00:00
use Pterodactyl\Contracts\Repository\DatabaseHostRepositoryInterface;
class DatabaseHostService
{
/**
* @var \Illuminate\Database\DatabaseManager
*/
protected $database;
2017-08-27 00:58:24 +00:00
/**
* @var \Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface
*/
protected $databaseRepository;
/**
* @var \Pterodactyl\Extensions\DynamicDatabaseConnection
*/
protected $dynamic;
/**
* @var \Illuminate\Contracts\Encryption\Encrypter
*/
protected $encrypter;
/**
2017-07-15 16:52:34 +00:00
* @var \Pterodactyl\Contracts\Repository\DatabaseHostRepositoryInterface
*/
protected $repository;
/**
* DatabaseHostService constructor.
*
2017-07-15 16:52:34 +00:00
* @param \Illuminate\Database\DatabaseManager $database
2017-08-27 00:58:24 +00:00
* @param \Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface $databaseRepository
* @param \Pterodactyl\Contracts\Repository\DatabaseHostRepositoryInterface $repository
2017-07-15 16:52:34 +00:00
* @param \Pterodactyl\Extensions\DynamicDatabaseConnection $dynamic
* @param \Illuminate\Contracts\Encryption\Encrypter $encrypter
*/
public function __construct(
DatabaseManager $database,
2017-08-27 00:58:24 +00:00
DatabaseRepositoryInterface $databaseRepository,
DatabaseHostRepositoryInterface $repository,
DynamicDatabaseConnection $dynamic,
Encrypter $encrypter
) {
$this->database = $database;
2017-08-27 00:58:24 +00:00
$this->databaseRepository = $databaseRepository;
$this->dynamic = $dynamic;
$this->encrypter = $encrypter;
$this->repository = $repository;
}
/**
* Create a new database host and persist it to the database.
*
2017-08-22 03:10:48 +00:00
* @param array $data
* @return \Pterodactyl\Models\DatabaseHost
*
* @throws \Throwable
* @throws \PDOException
*/
public function create(array $data)
{
$this->database->beginTransaction();
$host = $this->repository->create([
'password' => $this->encrypter->encrypt(array_get($data, 'password')),
'name' => array_get($data, 'name'),
'host' => array_get($data, 'host'),
'port' => array_get($data, 'port'),
'username' => array_get($data, 'username'),
'max_databases' => null,
'node_id' => array_get($data, 'node_id'),
]);
// Check Access
$this->dynamic->set('dynamic', $host);
$this->database->connection('dynamic')->select('SELECT 1 FROM dual');
$this->database->commit();
return $host;
}
/**
* Update a database host and persist to the database.
*
2017-08-22 03:10:48 +00:00
* @param int $id
* @param array $data
* @return mixed
*
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
2017-08-27 00:58:24 +00:00
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
*/
public function update($id, array $data)
{
$this->database->beginTransaction();
if (! empty(array_get($data, 'password'))) {
$data['password'] = $this->encrypter->encrypt($data['password']);
} else {
unset($data['password']);
}
$host = $this->repository->update($id, $data);
$this->dynamic->set('dynamic', $host);
$this->database->connection('dynamic')->select('SELECT 1 FROM dual');
$this->database->commit();
return $host;
}
/**
* Delete a database host if it has no active databases attached to it.
*
2017-08-22 03:10:48 +00:00
* @param int $id
* @return bool|null
*
* @throws \Pterodactyl\Exceptions\DisplayException
*/
public function delete($id)
{
2017-08-27 00:58:24 +00:00
$count = $this->databaseRepository->findCountWhere([['database_host_id', '=', $id]]);
if ($count > 0) {
throw new DisplayException(trans('exceptions.databases.delete_has_databases'));
2017-08-27 00:58:24 +00:00
}
return $this->repository->delete($id);
}
}