diff --git a/app/Filament/Admin/Resources/DatabaseHostResource/RelationManagers/DatabasesRelationManager.php b/app/Filament/Admin/Resources/DatabaseHostResource/RelationManagers/DatabasesRelationManager.php index de4426fdb..836778389 100644 --- a/app/Filament/Admin/Resources/DatabaseHostResource/RelationManagers/DatabasesRelationManager.php +++ b/app/Filament/Admin/Resources/DatabaseHostResource/RelationManagers/DatabasesRelationManager.php @@ -2,7 +2,6 @@ namespace App\Filament\Admin\Resources\DatabaseHostResource\RelationManagers; -use Exception; use Filament\Actions\DeleteAction; use Filament\Actions\ViewAction; use Filament\Schemas\Schema; @@ -18,9 +17,6 @@ class DatabasesRelationManager extends RelationManager { protected static string $relationship = 'databases'; - /** - * @throws Exception - */ public function form(Schema $schema): Schema { return $schema @@ -53,7 +49,7 @@ class DatabasesRelationManager extends RelationManager public function table(Table $table): Table { return $table - ->recordTitleAttribute('servers') + ->recordTitleAttribute('database') ->heading('') ->columns([ TextColumn::make('database') @@ -74,11 +70,9 @@ class DatabasesRelationManager extends RelationManager ->label(trans('admin/databasehost.table.created_at')), ]) ->recordActions([ - DeleteAction::make() - ->authorize(fn (Database $database) => auth()->user()->can('delete', $database)), ViewAction::make() - ->color('primary') - ->hidden(fn () => !auth()->user()->can('viewAny', Database::class)), + ->color('primary'), + DeleteAction::make(), ]); } } diff --git a/app/Filament/Admin/Resources/ServerResource/Pages/EditServer.php b/app/Filament/Admin/Resources/ServerResource/Pages/EditServer.php index fe51280d1..57717ff4a 100644 --- a/app/Filament/Admin/Resources/ServerResource/Pages/EditServer.php +++ b/app/Filament/Admin/Resources/ServerResource/Pages/EditServer.php @@ -5,19 +5,16 @@ namespace App\Filament\Admin\Resources\ServerResource\Pages; use App\Enums\SuspendAction; use App\Filament\Admin\Resources\ServerResource; use App\Filament\Admin\Resources\ServerResource\RelationManagers\AllocationsRelationManager; +use App\Filament\Admin\Resources\ServerResource\RelationManagers\DatabasesRelationManager; use App\Filament\Components\Actions\PreviewStartupAction; -use App\Filament\Components\Actions\RotateDatabasePasswordAction; use App\Filament\Server\Pages\Console; use App\Models\Allocation; -use App\Models\Database; -use App\Models\DatabaseHost; use App\Models\Egg; use App\Models\Node; use App\Models\Server; use App\Models\ServerVariable; use App\Models\User; use App\Repositories\Daemon\DaemonServerRepository; -use App\Services\Databases\DatabaseManagementService; use App\Services\Eggs\EggChangerService; use App\Services\Servers\RandomWordService; use App\Services\Servers\ReinstallServerService; @@ -706,136 +703,6 @@ class EditServer extends EditRecord ->schema(fn (Get $get) => [ ServerResource::getMountCheckboxList($get), ]), - Tab::make(trans('admin/server.databases')) - ->hidden(fn () => !auth()->user()->can('viewAny', Database::class)) - ->icon('tabler-database') - ->columns(4) - ->schema([ - Repeater::make('databases') - ->label('') - ->grid() - ->helperText(fn (Server $server) => $server->databases->isNotEmpty() ? '' : trans('admin/server.no_databases')) - ->columns(2) - ->schema([ - TextInput::make('host') - ->label(trans('admin/databasehost.table.host')) - ->disabled() - ->formatStateUsing(fn ($record) => $record->address()) - ->suffixCopy() - ->columnSpan(1), - TextInput::make('database') - ->label(trans('admin/databasehost.table.database')) - ->disabled() - ->formatStateUsing(fn ($record) => $record->database) - ->suffixCopy() - ->hintAction( - Action::make('Delete') - ->label(trans('filament-actions::delete.single.modal.actions.delete.label')) - //->authorize(fn (Database $database) => auth()->user()->can('delete database', $database)) - ->color('danger') - ->icon('tabler-trash') - ->requiresConfirmation() - ->modalIcon('tabler-database-x') - ->modalHeading(trans('admin/server.delete_db_heading')) - ->modalSubmitActionLabel(trans('filament-actions::delete.single.label')) - ->modalDescription(fn (Get $get) => trans('admin/server.delete_db', ['name' => $get('database')])) - ->action(function (DatabaseManagementService $databaseManagementService, $record) { - $databaseManagementService->delete($record); - $this->fillForm(); - }) - ), - TextInput::make('username') - ->label(trans('admin/databasehost.table.username')) - ->disabled() - ->formatStateUsing(fn ($record) => $record->username) - ->suffixCopy() - ->columnSpan(1), - TextInput::make('password') - ->label(trans('admin/databasehost.table.password')) - ->disabled() - ->password() - ->revealable() - ->columnSpan(1) - ->hintAction(RotateDatabasePasswordAction::make()) - ->suffixCopy() - ->formatStateUsing(fn (Database $database) => $database->password), - TextInput::make('remote') - ->disabled() - ->formatStateUsing(fn (Database $record) => $record->remote === '%' ? 'Anywhere ( % )' : $record->remote) - ->columnSpan(1) - ->label(trans('admin/databasehost.table.remote')), - TextInput::make('max_connections') - ->label(trans('admin/databasehost.table.max_connections')) - ->disabled() - ->formatStateUsing(fn (Database $record) => $record->max_connections === 0 ? 'Unlimited' : $record->max_connections) - ->columnSpan(1), - TextInput::make('jdbc') - ->disabled() - ->password() - ->revealable() - ->label(trans('admin/databasehost.table.connection_string')) - ->columnSpan(2) - ->formatStateUsing(fn (Database $record) => $record->jdbc) - ->suffixCopy(), - ]) - ->relationship('databases') - ->deletable(false) - ->addable(false) - ->columnSpan(4), - Actions::make([ - Action::make('createDatabase') - ->authorize(fn () => auth()->user()->can('create', Database::class)) - ->disabled(fn () => DatabaseHost::query()->count() < 1) - ->label(fn () => DatabaseHost::query()->count() < 1 ? trans('admin/server.no_db_hosts') : trans('admin/server.create_database')) - ->color(fn () => DatabaseHost::query()->count() < 1 ? 'danger' : 'primary') - ->modalSubmitActionLabel(trans('admin/server.create_database')) - ->action(function (array $data, DatabaseManagementService $service, Server $server, RandomWordService $randomWordService) { - if (empty($data['database'])) { - $data['database'] = $randomWordService->word() . random_int(1, 420); - } - if (empty($data['remote'])) { - $data['remote'] = '%'; - } - - $data['database'] = $service->generateUniqueDatabaseName($data['database'], $server->id); - - try { - $service->setValidateDatabaseLimit(false)->create($server, $data); - } catch (Exception $e) { - Notification::make() - ->title(trans('admin/server.failed_to_create')) - ->body($e->getMessage()) - ->danger() - ->persistent()->send(); - } - $this->fillForm(); - }) - ->schema([ - Select::make('database_host_id') - ->label(trans('admin/databasehost.table.name')) - ->required() - ->placeholder('Select Database Host') - ->options(fn (Server $server) => DatabaseHost::query() - ->whereHas('nodes', fn ($query) => $query->where('nodes.id', $server->node_id)) - ->pluck('name', 'id') - ) - ->default(fn () => (DatabaseHost::query()->first())?->id) - ->selectablePlaceholder(false), - TextInput::make('database') - ->label(trans('admin/server.name')) - ->alphaDash() - ->prefix(fn (Server $server) => 's' . $server->id . '_') - ->hintIcon('tabler-question-mark') - ->hintIconTooltip(trans('admin/databasehost.table.name_helper')), - TextInput::make('remote') - ->columnSpan(1) - ->regex('/^[\w\-\/.%:]+$/') - ->label(trans('admin/databasehost.table.remote')) - ->hintIcon('tabler-question-mark') - ->hintIconTooltip(trans('admin/databasehost.table.remote_helper')), - ]), - ])->alignCenter()->columnSpanFull(), - ]), Tab::make(trans('admin/server.actions')) ->icon('tabler-settings') ->schema([ @@ -1162,6 +1029,7 @@ class EditServer extends EditRecord { return [ AllocationsRelationManager::class, + DatabasesRelationManager::class, ]; } diff --git a/app/Filament/Admin/Resources/ServerResource/RelationManagers/DatabasesRelationManager.php b/app/Filament/Admin/Resources/ServerResource/RelationManagers/DatabasesRelationManager.php new file mode 100644 index 000000000..1b55bc840 --- /dev/null +++ b/app/Filament/Admin/Resources/ServerResource/RelationManagers/DatabasesRelationManager.php @@ -0,0 +1,143 @@ +components([ + TextInput::make('database') + ->columnSpanFull(), + TextInput::make('username') + ->label(trans('admin/databasehost.table.username')), + TextInput::make('password') + ->label(trans('admin/databasehost.table.password')) + ->password() + ->revealable() + ->hintAction(RotateDatabasePasswordAction::make()) + ->formatStateUsing(fn (Database $database) => $database->password), + TextInput::make('remote') + ->label(trans('admin/databasehost.table.remote')) + ->formatStateUsing(fn (Database $record) => $record->remote === '%' ? trans('admin/databasehost.anywhere'). ' ( % )' : $record->remote), + TextInput::make('max_connections') + ->label(trans('admin/databasehost.table.max_connections')) + ->formatStateUsing(fn (Database $record) => $record->max_connections === 0 ? trans('admin/databasehost.unlimited') : $record->max_connections), + TextInput::make('jdbc') + ->label(trans('admin/databasehost.table.connection_string')) + ->columnSpanFull() + ->password() + ->revealable() + ->formatStateUsing(fn (Database $database) => $database->jdbc), + ]); + } + + public function table(Table $table): Table + { + return $table + ->recordTitleAttribute('database') + ->columns([ + TextColumn::make('database') + ->icon('tabler-database'), + TextColumn::make('username') + ->label(trans('admin/databasehost.table.username')) + ->icon('tabler-user'), + TextColumn::make('remote') + ->label(trans('admin/databasehost.table.remote')) + ->formatStateUsing(fn (Database $record) => $record->remote === '%' ? trans('admin/databasehost.anywhere'). ' ( % )' : $record->remote), + TextColumn::make('server.name') + ->icon('tabler-brand-docker') + ->url(fn (Database $database) => route('filament.admin.resources.servers.edit', ['record' => $database->server_id])), + TextColumn::make('max_connections') + ->label(trans('admin/databasehost.table.max_connections')) + ->formatStateUsing(fn ($record) => $record->max_connections === 0 ? trans('admin/databasehost.unlimited') : $record->max_connections), + DateTimeColumn::make('created_at') + ->label(trans('admin/databasehost.table.created_at')), + ]) + ->recordActions([ + ViewAction::make() + ->color('primary'), + DeleteAction::make(), + ]) + ->headerActions([ + CreateAction::make() + ->disabled(fn () => DatabaseHost::count() < 1) + ->label(fn () => DatabaseHost::count() < 1 ? trans('admin/server.no_db_hosts') : trans('admin/server.create_database')) + ->color(fn () => DatabaseHost::count() < 1 ? 'danger' : 'primary') + ->createAnother(false) + ->action(function (array $data, DatabaseManagementService $service, RandomWordService $randomWordService) { + if (empty($data['database'])) { + $data['database'] = $randomWordService->word() . random_int(1, 420); + } + if (empty($data['remote'])) { + $data['remote'] = '%'; + } + + $data['database'] = $service->generateUniqueDatabaseName($data['database'], $this->getOwnerRecord()->id); + + try { + return $service->setValidateDatabaseLimit(false)->create($this->getOwnerRecord(), $data); + } catch (Exception $exception) { + Notification::make() + ->title(trans('admin/server.failed_to_create')) + ->body($exception->getMessage()) + ->danger() + ->persistent()->send(); + + throw new Halt(); + } + }) + ->schema([ + Select::make('database_host_id') + ->label(trans('admin/databasehost.model_label')) + ->required() + ->placeholder('Select Database Host') + ->options(fn () => DatabaseHost::query() + ->whereHas('nodes', fn ($query) => $query->where('nodes.id', $this->getOwnerRecord()->node_id)) + ->pluck('name', 'id') + ) + ->default(fn () => (DatabaseHost::query()->first())?->id) + ->selectablePlaceholder(false), + TextInput::make('database') + ->label(trans('admin/server.name')) + ->alphaDash() + ->prefix(fn () => 's' . $this->getOwnerRecord()->id . '_') + ->hintIcon('tabler-question-mark') + ->hintIconTooltip(trans('admin/databasehost.table.name_helper')), + TextInput::make('remote') + ->columnSpan(1) + ->regex('/^[\w\-\/.%:]+$/') + ->label(trans('admin/databasehost.table.remote')) + ->default('%') + ->hintIcon('tabler-question-mark') + ->hintIconTooltip(trans('admin/databasehost.table.remote_helper')), + ]), + ]); + } +}