From 488acce5640fff985f9bdb0c567fa65327d66ff3 Mon Sep 17 00:00:00 2001 From: Boy132 Date: Tue, 30 Apr 2024 00:03:00 +0200 Subject: [PATCH] update database settings command --- .../Environment/DatabaseSettingsCommand.php | 100 +++++++++++------- 1 file changed, 60 insertions(+), 40 deletions(-) diff --git a/app/Console/Commands/Environment/DatabaseSettingsCommand.php b/app/Console/Commands/Environment/DatabaseSettingsCommand.php index ff15e3ecb..bf31b1357 100644 --- a/app/Console/Commands/Environment/DatabaseSettingsCommand.php +++ b/app/Console/Commands/Environment/DatabaseSettingsCommand.php @@ -11,14 +11,20 @@ class DatabaseSettingsCommand extends Command { use EnvironmentWriterTrait; + public const DATABASE_DRIVERS = [ + 'sqlite' => 'SQLite (recommended)', + 'mysql' => 'MySQL', + ]; + protected $description = 'Configure database settings for the Panel.'; protected $signature = 'p:environment:database + {--driver= : The database driver backend to use.} + {--database= : The database to use.} {--host= : The connection address for the MySQL server.} {--port= : The connection port for the MySQL server.} - {--database= : The database to use.} - {--username= : Username to use when connecting.} - {--password= : Password to use for this database.}'; + {--username= : Username to use when connecting to the MySQL server.} + {--password= : Password to use for the MySQL database.}'; protected array $variables = []; @@ -35,51 +41,65 @@ class DatabaseSettingsCommand extends Command */ public function handle(): int { - $this->output->note('It is highly recommended to not use "localhost" as your database host as we have seen frequent socket connection issues. If you want to use a local connection you should be using "127.0.0.1".'); - $this->variables['DB_HOST'] = $this->option('host') ?? $this->ask( - 'Database Host', - config('database.connections.mysql.host', '127.0.0.1') + $selected = config('database.default', 'sqlite'); + $this->variables['DB_CONNECTION'] = $this->option('driver') ?? $this->choice( + 'Database Driver', + self::DATABASE_DRIVERS, + array_key_exists($selected, self::DATABASE_DRIVERS) ? $selected : null ); - $this->variables['DB_PORT'] = $this->option('port') ?? $this->ask( - 'Database Port', - config('database.connections.mysql.port', 3306) - ); + if ($this->variables['DB_CONNECTION'] === 'mysql') { + $this->output->note('It is highly recommended to not use "localhost" as your database host as we have seen frequent socket connection issues. If you want to use a local connection you should be using "127.0.0.1".'); + $this->variables['DB_HOST'] = $this->option('host') ?? $this->ask( + 'Database Host', + config('database.connections.mysql.host', '127.0.0.1') + ); - $this->variables['DB_DATABASE'] = $this->option('database') ?? $this->ask( - 'Database Name', - config('database.connections.mysql.database', 'panel') - ); + $this->variables['DB_PORT'] = $this->option('port') ?? $this->ask( + 'Database Port', + config('database.connections.mysql.port', 3306) + ); - $this->output->note('Using the "root" account for MySQL connections is not only highly frowned upon, it is also not allowed by this application. You\'ll need to have created a MySQL user for this software.'); - $this->variables['DB_USERNAME'] = $this->option('username') ?? $this->ask( - 'Database Username', - config('database.connections.mysql.username', 'pelican') - ); + $this->variables['DB_DATABASE'] = $this->option('database') ?? $this->ask( + 'Database Name', + config('database.connections.mysql.database', 'panel') + ); - $askForMySQLPassword = true; - if (!empty(config('database.connections.mysql.password')) && $this->input->isInteractive()) { - $this->variables['DB_PASSWORD'] = config('database.connections.mysql.password'); - $askForMySQLPassword = $this->confirm('It appears you already have a MySQL connection password defined, would you like to change it?'); - } + $this->output->note('Using the "root" account for MySQL connections is not only highly frowned upon, it is also not allowed by this application. You\'ll need to have created a MySQL user for this software.'); + $this->variables['DB_USERNAME'] = $this->option('username') ?? $this->ask( + 'Database Username', + config('database.connections.mysql.username', 'pelican') + ); - if ($askForMySQLPassword) { - $this->variables['DB_PASSWORD'] = $this->option('password') ?? $this->secret('Database Password'); - } - - try { - $this->testMySQLConnection(); - } catch (\PDOException $exception) { - $this->output->error(sprintf('Unable to connect to the MySQL server using the provided credentials. The error returned was "%s".', $exception->getMessage())); - $this->output->error('Your connection credentials have NOT been saved. You will need to provide valid connection information before proceeding.'); - - if ($this->confirm('Go back and try again?')) { - $this->database->disconnect('_panel_command_test'); - - return $this->handle(); + $askForMySQLPassword = true; + if (!empty(config('database.connections.mysql.password')) && $this->input->isInteractive()) { + $this->variables['DB_PASSWORD'] = config('database.connections.mysql.password'); + $askForMySQLPassword = $this->confirm('It appears you already have a MySQL connection password defined, would you like to change it?'); } - return 1; + if ($askForMySQLPassword) { + $this->variables['DB_PASSWORD'] = $this->option('password') ?? $this->secret('Database Password'); + } + + try { + $this->testMySQLConnection(); + } catch (\PDOException $exception) { + $this->output->error(sprintf('Unable to connect to the MySQL server using the provided credentials. The error returned was "%s".', $exception->getMessage())); + $this->output->error('Your connection credentials have NOT been saved. You will need to provide valid connection information before proceeding.'); + + if ($this->confirm('Go back and try again?')) { + $this->database->disconnect('_panel_command_test'); + + return $this->handle(); + } + + return 1; + } + } elseif ($this->variables['DB_CONNECTION'] === 'sqlite') { + $this->variables['DB_DATABASE'] = $this->option('database') ?? $this->ask( + 'Database Path', + config('database.connections.sqlite.database', database_path('database.sqlite')) + ); } $this->writeToEnvironment($this->variables);