daUser->username(); $prefix = $ctx->daUser->prefix(); $availableDbs = array_map(static fn(array $db): string => $db['name'], $ctx->mysql->listDatabasesForUser($daUser)); $selectedDatabases = $ctx->postArray('databases'); if (empty($selectedDatabases)) { $queryDb = $ctx->queryString('db'); if ($queryDb !== '') { $selectedDatabases = [$queryDb]; } } $selectedDatabases = array_values(array_unique(array_filter($selectedDatabases, static fn(string $v): bool => $v !== ''))); $confirmDelete = $ctx->postString('confirm_delete') === '1'; if ($ctx->isPost() && !$confirmDelete) { try { $ctx->requireCsrf('select_delete_databases'); } catch (Throwable $e) { $errors[] = $e->getMessage(); $selectedDatabases = []; } } if ($ctx->isPost() && $confirmDelete) { try { $ctx->requireCsrf('delete_databases_confirm'); if (empty($selectedDatabases)) { throw new RuntimeException('Nie wybrano baz danych do usunięcia.'); } $deleteRelatedUsers = $ctx->postString('delete_related_users') === '1'; $deletedDbs = []; $deletedUsers = []; $keptUsers = []; foreach ($selectedDatabases as $rawDb) { try { $dbName = NamePolicy::normalizeDatabaseName($rawDb, $prefix); if (!in_array($dbName, $availableDbs, true)) { $errors[] = 'Pominięto bazę spoza konta: ' . $dbName; continue; } $users = $ctx->mysql->listDatabaseUsers($daUser, $dbName); $users = array_values(array_unique($users)); foreach ($users as $roleName) { $ctx->mysql->revokePrivileges($dbName, $roleName); } $ctx->mysql->dropDatabase($dbName); $deletedDbs[] = $dbName; if ($deleteRelatedUsers) { foreach ($users as $roleName) { $assigned = $ctx->mysql->roleAssignedDatabases($roleName, $daUser); $owned = $ctx->mysql->roleOwnedDatabases($roleName, $daUser); if (empty($assigned) && empty($owned)) { try { $ctx->mysql->deleteRoleHosts($daUser, $roleName); $ctx->mysql->dropRole($roleName); $deletedUsers[] = $roleName; } catch (Throwable $dropErr) { $keptUsers[] = $roleName . ' (' . $dropErr->getMessage() . ')'; } } else { $keptUsers[] = $roleName . ' (ma nadal przypisane bazy)'; } } } } catch (Throwable $inner) { $errors[] = $rawDb . ': ' . $inner->getMessage(); } } $sync = $ctx->mysql->syncHostRules(); if (!$sync['ok']) { $errors[] = 'Operacja wykonana, ale synchronizacja hostów MySQL nie powiodła się: ' . $sync['output']; } if (!empty($deletedDbs)) { $ok[] = 'Usunięto bazy: ' . implode(', ', array_values(array_unique($deletedDbs))); } if (!empty($deletedUsers)) { $ok[] = 'Usunięto użytkowników powiązanych z usuniętymi bazami: ' . implode(', ', array_values(array_unique($deletedUsers))); } if (!empty($keptUsers)) { $errors[] = 'Użytkownicy pozostawieni: ' . implode('; ', array_values(array_unique($keptUsers))); } $selectedDatabases = []; $availableDbs = array_map(static fn(array $db): string => $db['name'], $ctx->mysql->listDatabasesForUser($daUser)); } catch (Throwable $e) { $errors[] = $e->getMessage(); } } if (empty($selectedDatabases)) { $rows = ''; foreach ($availableDbs as $dbName) { $users = $ctx->mysql->listDatabaseUsers($daUser, $dbName); $rows .= '
Brak poprawnych baz do usunięcia.
', $ok, $errors); return; } $body = ''; $body .= 'Potwierdź usunięcie baz danych. Operacja jest nieodwracalna.
'; $body .= ''; $ctx->renderPage('Potwierdzenie Usuwania Baz Danych', $body, $ok, $errors); };