mirror of
https://github.com/pelican-dev/panel.git
synced 2025-05-19 18:44:46 +02:00

* Just skip this table because it no longer exists * Add postgresql * This no longer needs to be there * These are the same output in mysql, but different in postgresql * Fix these migrations for postgresql * This table no longer exists * This is expected to be a json column for json operations, required for postgresql * Shoot for the stars * Fix pint * Why was this missing * Updates * Restore this * This needs to be explicit * Don’t like strings * Fix these classes * Use different method to compare dates * Apparently postgresql doesn’t like case insensitivity * Postgresql orders it backwards * Ordered different by postgresql * Unnecessary and breaking * Make sure the order is correct for postresql * Fix this with the order too * Remove this * Force email to be lowercased * Update app/Models/User.php
147 lines
6.7 KiB
PHP
147 lines
6.7 KiB
PHP
<?php
|
|
|
|
namespace App\Livewire\Installer\Steps;
|
|
|
|
use App\Livewire\Installer\PanelInstaller;
|
|
use Exception;
|
|
use Filament\Forms\Components\TextInput;
|
|
use Filament\Forms\Components\ToggleButtons;
|
|
use Filament\Forms\Components\Wizard\Step;
|
|
use Filament\Forms\Get;
|
|
use Filament\Forms\Set;
|
|
use Filament\Notifications\Notification;
|
|
use Filament\Support\Exceptions\Halt;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class DatabaseStep
|
|
{
|
|
public const DATABASE_DRIVERS = [
|
|
'sqlite' => 'SQLite',
|
|
'mariadb' => 'MariaDB',
|
|
'mysql' => 'MySQL',
|
|
'pgsql' => 'PostgreSQL',
|
|
];
|
|
|
|
public static function make(PanelInstaller $installer): Step
|
|
{
|
|
return Step::make('database')
|
|
->label('Database')
|
|
->columns()
|
|
->schema([
|
|
ToggleButtons::make('env_database.DB_CONNECTION')
|
|
->label('Database Driver')
|
|
->hintIcon('tabler-question-mark')
|
|
->hintIconTooltip('The driver used for the panel database. We recommend "SQLite".')
|
|
->required()
|
|
->inline()
|
|
->options(self::DATABASE_DRIVERS)
|
|
->default(config('database.default'))
|
|
->live()
|
|
->afterStateUpdated(function ($state, Set $set, Get $get) {
|
|
$set('env_database.DB_DATABASE', $state === 'sqlite' ? 'database.sqlite' : 'panel');
|
|
|
|
switch ($state) {
|
|
case 'sqlite':
|
|
$set('env_database.DB_HOST', null);
|
|
$set('env_database.DB_PORT', null);
|
|
$set('env_database.DB_USERNAME', null);
|
|
$set('env_database.DB_PASSWORD', null);
|
|
break;
|
|
case 'mariadb':
|
|
case 'mysql':
|
|
$set('env_database.DB_HOST', $get('env_database.DB_HOST') ?? '127.0.0.1');
|
|
$set('env_database.DB_USERNAME', $get('env_database.DB_USERNAME') ?? 'pelican');
|
|
$set('env_database.DB_PORT', '3306');
|
|
break;
|
|
case 'pgsql':
|
|
$set('env_database.DB_HOST', $get('env_database.DB_HOST') ?? '127.0.0.1');
|
|
$set('env_database.DB_USERNAME', $get('env_database.DB_USERNAME') ?? 'pelican');
|
|
$set('env_database.DB_PORT', '5432');
|
|
break;
|
|
}
|
|
}),
|
|
TextInput::make('env_database.DB_DATABASE')
|
|
->label(fn (Get $get) => $get('env_database.DB_CONNECTION') === 'sqlite' ? 'Database Path' : 'Database Name')
|
|
->placeholder(fn (Get $get) => $get('env_database.DB_CONNECTION') === 'sqlite' ? 'database.sqlite' : 'panel')
|
|
->hintIcon('tabler-question-mark')
|
|
->hintIconTooltip(fn (Get $get) => $get('env_database.DB_CONNECTION') === 'sqlite' ? 'The path of your .sqlite file relative to the database folder.' : 'The name of the panel database.')
|
|
->required()
|
|
->default('database.sqlite'),
|
|
TextInput::make('env_database.DB_HOST')
|
|
->label('Database Host')
|
|
->placeholder('127.0.0.1')
|
|
->hintIcon('tabler-question-mark')
|
|
->hintIconTooltip('The host of your database. Make sure it is reachable.')
|
|
->required(fn (Get $get) => $get('env_database.DB_CONNECTION') !== 'sqlite')
|
|
->hidden(fn (Get $get) => $get('env_database.DB_CONNECTION') === 'sqlite'),
|
|
TextInput::make('env_database.DB_PORT')
|
|
->label('Database Port')
|
|
->placeholder('3306')
|
|
->hintIcon('tabler-question-mark')
|
|
->hintIconTooltip('The port of your database.')
|
|
->numeric()
|
|
->minValue(1)
|
|
->maxValue(65535)
|
|
->required(fn (Get $get) => $get('env_database.DB_CONNECTION') !== 'sqlite')
|
|
->hidden(fn (Get $get) => $get('env_database.DB_CONNECTION') === 'sqlite'),
|
|
TextInput::make('env_database.DB_USERNAME')
|
|
->label('Database Username')
|
|
->placeholder('pelican')
|
|
->hintIcon('tabler-question-mark')
|
|
->hintIconTooltip('The name of your database user.')
|
|
->required(fn (Get $get) => $get('env_database.DB_CONNECTION') !== 'sqlite')
|
|
->hidden(fn (Get $get) => $get('env_database.DB_CONNECTION') === 'sqlite'),
|
|
TextInput::make('env_database.DB_PASSWORD')
|
|
->label('Database Password')
|
|
->hintIcon('tabler-question-mark')
|
|
->hintIconTooltip('The password of your database user. Can be empty.')
|
|
->password()
|
|
->revealable()
|
|
->hidden(fn (Get $get) => $get('env_database.DB_CONNECTION') === 'sqlite'),
|
|
])
|
|
->afterValidation(function (Get $get) use ($installer) {
|
|
$driver = $get('env_database.DB_CONNECTION');
|
|
|
|
if (!self::testConnection($driver, $get('env_database.DB_HOST'), $get('env_database.DB_PORT'), $get('env_database.DB_DATABASE'), $get('env_database.DB_USERNAME'), $get('env_database.DB_PASSWORD'))) {
|
|
throw new Halt('Database connection failed');
|
|
}
|
|
|
|
$installer->writeToEnv('env_database');
|
|
});
|
|
}
|
|
|
|
private static function testConnection(string $driver, ?string $host, null|string|int $port, ?string $database, ?string $username, ?string $password): bool
|
|
{
|
|
if ($driver === 'sqlite') {
|
|
return true;
|
|
}
|
|
|
|
try {
|
|
config()->set('database.connections._panel_install_test', [
|
|
'driver' => $driver,
|
|
'host' => $host,
|
|
'port' => $port,
|
|
'database' => $database,
|
|
'username' => $username,
|
|
'password' => $password,
|
|
'collation' => 'utf8mb4_unicode_ci',
|
|
'strict' => true,
|
|
]);
|
|
|
|
DB::connection('_panel_install_test')->getPdo();
|
|
} catch (Exception $exception) {
|
|
DB::disconnect('_panel_install_test');
|
|
|
|
Notification::make()
|
|
->title('Database connection failed')
|
|
->body($exception->getMessage())
|
|
->danger()
|
|
->send();
|
|
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|