Add database and database users sync (#537)

* Add database and database users sync

* get mysl users

* add mariadb and postgres

* fix phpstan
This commit is contained in:
Saeed Vaziry
2025-03-12 22:59:25 +01:00
committed by GitHub
parent 493cbb0849
commit 0f06d81aac
17 changed files with 383 additions and 65 deletions

View File

@ -0,0 +1,50 @@
<?php
namespace App\Actions\Database;
use App\Enums\DatabaseUserStatus;
use App\Models\DatabaseUser;
use App\Models\Server;
use App\SSH\Services\Database\Database;
class SyncDatabaseUsers
{
public function sync(Server $server): void
{
$service = $server->database();
if (! $service) {
return;
}
/** @var Database $handler */
$handler = $service->handler();
$this->updateUsers($server, $handler);
}
private function updateUsers(Server $server, Database $handler): void
{
$users = $handler->getUsers();
foreach ($users as $user) {
$databases = $user[2] != 'NULL' ? explode(',', $user[2]) : [];
/** @var ?DatabaseUser $databaseUser */
$databaseUser = $server->databaseUsers()
->where('username', $user[0])
->first();
if ($databaseUser === null) {
$server->databaseUsers()->create([
'username' => $user[0],
'host' => $user[1],
'databases' => $databases,
'status' => DatabaseUserStatus::READY,
]);
continue;
}
$databaseUser->databases = $databases;
$databaseUser->save();
}
}
}

View File

@ -0,0 +1,63 @@
<?php
namespace App\Actions\Database;
use App\Enums\DatabaseStatus;
use App\Models\Server;
use App\Models\Service;
use App\SSH\Services\Database\Database;
class SyncDatabases
{
public function sync(Server $server): void
{
$service = $server->database();
if (! $service) {
return;
}
/** @var Database $handler */
$handler = $service->handler();
$this->updateCharsets($service, $handler);
$this->updateDatabases($server, $handler);
}
private function updateCharsets(Service $service, Database $handler): void
{
$data = $service->type_data ?? [];
$charsets = $handler->getCharsets();
$data['charsets'] = $charsets['charsets'] ?? [];
$data['defaultCharset'] = $charsets['defaultCharset'] ?? '';
$service->type_data = $data;
$service->save();
}
private function updateDatabases(Server $server, Database $handler): void
{
$databases = $handler->getDatabases();
foreach ($databases as $database) {
/** @var ?\App\Models\Database $db */
$db = $server->databases()
->where('name', $database[0])
->first();
if ($db === null) {
$server->databases()->create([
'name' => $database[0],
'collation' => $database[2],
'charset' => $database[1],
'status' => DatabaseStatus::READY,
]);
continue;
}
if ($db->collation !== $database[2] || $db->charset !== $database[1]) {
$db->update([
'collation' => $database[2],
'charset' => $database[1],
]);
}
}
}
}