mirror of
https://github.com/alchemy-fr/Phraseanet.git
synced 2025-10-15 14:03:27 +00:00
Refactor databox service and controller
This commit is contained in:
@@ -110,26 +110,14 @@ class DataboxesController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function createDatabase(Request $request)
|
public function createDatabase(Request $request)
|
||||||
{
|
{
|
||||||
if ('' === $dbName = $request->request->get('new_dbname', '')) {
|
$dbName = $request->request->get('new_dbname', '');
|
||||||
return $this->app->redirectPath('admin_databases', ['error' => 'no-empty']);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (\p4string::hasAccent($dbName)) {
|
|
||||||
return $this->app->redirectPath('admin_databases', ['error' => 'special-chars']);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var DataboxService $databoxService */
|
/** @var DataboxService $databoxService */
|
||||||
$databoxService = $this->app['databox.service'];
|
$databoxService = $this->app['databox.service'];
|
||||||
$dataTemplate = $request->request->get('new_data_template');
|
$dataTemplate = $request->request->get('new_data_template');
|
||||||
|
|
||||||
$connectionSettings = $request->request->get('new_settings') == false ? null : new DataboxConnectionSettings(
|
|
||||||
$request->request->get('new_hostname'),
|
|
||||||
$request->request->get('new_port'),
|
|
||||||
$request->request->get('new_user'),
|
|
||||||
$request->request->get('new_password')
|
|
||||||
);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
$connectionSettings = $this->buildSettingsFromRequest($request);
|
||||||
$databox = $databoxService->createDatabox(
|
$databox = $databoxService->createDatabox(
|
||||||
$dbName,
|
$dbName,
|
||||||
$dataTemplate,
|
$dataTemplate,
|
||||||
@@ -143,11 +131,17 @@ class DataboxesController extends Controller
|
|||||||
'reload-tree' => 1
|
'reload-tree' => 1
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
catch (\InvalidArgumentException $exception) {
|
||||||
|
return $this->handleInvalidArgument($exception);
|
||||||
|
}
|
||||||
catch (DBALException $e) {
|
catch (DBALException $e) {
|
||||||
return $this->app->redirectPath('admin_databases', ['success' => 0, 'error' => 'database-failed']);
|
return $this->app->redirectPath('admin_databases', ['success' => 0, 'error' => 'database-failed']);
|
||||||
}
|
}
|
||||||
catch (\Exception $e) {
|
catch (\Exception $e) {
|
||||||
return $this->app->redirectPath('admin_databases', ['success' => 0, 'error' => 'base-failed']);
|
return $this->app->redirectPath('admin_databases', [
|
||||||
|
'success' => 0,
|
||||||
|
'error' => 'base-failed'
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,25 +153,13 @@ class DataboxesController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function databaseMount(Request $request)
|
public function databaseMount(Request $request)
|
||||||
{
|
{
|
||||||
if ('' === $dbName = trim($request->request->get('new_dbname', ''))) {
|
$dbName = trim($request->request->get('new_dbname', ''));
|
||||||
return $this->app->redirectPath('admin_databases', ['success' => 0, 'error' => 'no-empty']);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (\p4string::hasAccent($dbName)) {
|
|
||||||
return $this->app->redirectPath('admin_databases', ['success' => 0, 'error' => 'special-chars']);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var DataboxService $databoxService */
|
/** @var DataboxService $databoxService */
|
||||||
$databoxService = $this->app['databox.service'];
|
$databoxService = $this->app['databox.service'];
|
||||||
|
|
||||||
$connectionSettings = $request->request->get('new_settings') == false ? null : new DataboxConnectionSettings(
|
|
||||||
$request->request->get('new_hostname'),
|
|
||||||
$request->request->get('new_port'),
|
|
||||||
$request->request->get('new_user'),
|
|
||||||
$request->request->get('new_password')
|
|
||||||
);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
$connectionSettings = $this->buildSettingsFromRequest($request);
|
||||||
$databox = $databoxService->mountDatabox($dbName, $this->app->getAuthenticatedUser(), $connectionSettings);
|
$databox = $databoxService->mountDatabox($dbName, $this->app->getAuthenticatedUser(), $connectionSettings);
|
||||||
|
|
||||||
return $this->app->redirectPath('admin_database', [
|
return $this->app->redirectPath('admin_database', [
|
||||||
@@ -185,11 +167,48 @@ class DataboxesController extends Controller
|
|||||||
'success' => 1,
|
'success' => 1,
|
||||||
'reload-tree' => 1,
|
'reload-tree' => 1,
|
||||||
]);
|
]);
|
||||||
} catch (\Exception $exception) {
|
}
|
||||||
|
catch (\InvalidArgumentException $exception) {
|
||||||
|
return $this->handleInvalidArgument($exception);
|
||||||
|
}
|
||||||
|
catch (\Exception $exception) {
|
||||||
return $this->app->redirectPath('admin_databases', [
|
return $this->app->redirectPath('admin_databases', [
|
||||||
'success' => 0,
|
'success' => 0,
|
||||||
'error' => 'mount-failed'
|
'error' => 'mount-failed'
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Request $request
|
||||||
|
* @return DataboxConnectionSettings|null
|
||||||
|
*/
|
||||||
|
protected function buildSettingsFromRequest(Request $request)
|
||||||
|
{
|
||||||
|
$connectionSettings = $request->request->get('new_settings') == false ? null : new DataboxConnectionSettings(
|
||||||
|
$request->request->get('new_hostname'),
|
||||||
|
$request->request->get('new_port'),
|
||||||
|
$request->request->get('new_user'),
|
||||||
|
$request->request->get('new_password')
|
||||||
|
);
|
||||||
|
|
||||||
|
return $connectionSettings;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $exception
|
||||||
|
* @return RedirectResponse
|
||||||
|
*/
|
||||||
|
protected function handleInvalidArgument(\InvalidArgumentException $exception)
|
||||||
|
{
|
||||||
|
if ($exception->getCode() == DataboxService::EMPTY_DB_NAME) {
|
||||||
|
return $this->app->redirectPath('admin_databases', ['success' => 0, 'error' => 'no-empty']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($exception->getCode() == DataboxService::INVALID_DB_NAME) {
|
||||||
|
return $this->app->redirectPath('admin_databases', ['success' => 0, 'error' => 'special-chars']);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new \InvalidArgumentException($exception->getMessage(), $exception->getCode(), $exception);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -13,6 +13,10 @@ use Doctrine\DBAL\Connection;
|
|||||||
*/
|
*/
|
||||||
class DataboxService
|
class DataboxService
|
||||||
{
|
{
|
||||||
|
|
||||||
|
const EMPTY_DB_NAME = 0;
|
||||||
|
const INVALID_DB_NAME = 1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var Application
|
* @var Application
|
||||||
*/
|
*/
|
||||||
@@ -80,6 +84,8 @@ class DataboxService
|
|||||||
User $owner,
|
User $owner,
|
||||||
DataboxConnectionSettings $connectionSettings = null
|
DataboxConnectionSettings $connectionSettings = null
|
||||||
) {
|
) {
|
||||||
|
$this->validateDatabaseName($databaseName);
|
||||||
|
|
||||||
$dataTemplate = new \SplFileInfo($this->rootPath . '/lib/conf.d/data_templates/' . $dataTemplate . '.xml');
|
$dataTemplate = new \SplFileInfo($this->rootPath . '/lib/conf.d/data_templates/' . $dataTemplate . '.xml');
|
||||||
$connectionSettings = $connectionSettings ?: DataboxConnectionSettings::fromArray(
|
$connectionSettings = $connectionSettings ?: DataboxConnectionSettings::fromArray(
|
||||||
$this->configuration->get(['main', 'database'])
|
$this->configuration->get(['main', 'database'])
|
||||||
@@ -113,6 +119,8 @@ class DataboxService
|
|||||||
*/
|
*/
|
||||||
public function mountDatabox($databaseName, User $owner, DataboxConnectionSettings $connectionSettings = null)
|
public function mountDatabox($databaseName, User $owner, DataboxConnectionSettings $connectionSettings = null)
|
||||||
{
|
{
|
||||||
|
$this->validateDatabaseName($databaseName);
|
||||||
|
|
||||||
$connectionSettings = $connectionSettings ?: DataboxConnectionSettings::fromArray(
|
$connectionSettings = $connectionSettings ?: DataboxConnectionSettings::fromArray(
|
||||||
$this->configuration->get(['main', 'database'])
|
$this->configuration->get(['main', 'database'])
|
||||||
);
|
);
|
||||||
@@ -141,4 +149,18 @@ class DataboxService
|
|||||||
throw new \RuntimeException($exception->getMessage(), 0, $exception);
|
throw new \RuntimeException($exception->getMessage(), 0, $exception);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function validateDatabaseName($databaseName)
|
||||||
|
{
|
||||||
|
if (trim($databaseName) == '') {
|
||||||
|
throw new \InvalidArgumentException('Database name cannot be empty.', self::EMPTY_DB_NAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (\p4string::hasAccent($databaseName)) {
|
||||||
|
throw new \InvalidArgumentException(
|
||||||
|
'Database name cannot contain special characters.',
|
||||||
|
self::INVALID_DB_NAME
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user