Initial commit

This commit is contained in:
2026-01-14 23:04:53 +01:00
parent 2f7d11b7d2
commit d9b4c73baa
25 changed files with 3742 additions and 30 deletions

View File

@@ -14,8 +14,9 @@ class DatabaseController extends Controller
{
parent::__construct();
// Only logged-in users can access the database manager
// Only admin users can access the database manager
Auth::checkAuthentication();
Auth::checkAdminAuthentication();
}
/**
@@ -23,7 +24,7 @@ class DatabaseController extends Controller
*/
public function index()
{
$this->View->render('database/index', array(
$this->View->renderDbManager('database/index', array(
'databases' => DatabaseModel::getAllDatabases(),
'current_db' => Config::get('DB_NAME')
));
@@ -39,7 +40,7 @@ class DatabaseController extends Controller
$database_name = Config::get('DB_NAME');
}
$this->View->render('database/show', array(
$this->View->renderDbManager('database/show', array(
'tables' => DatabaseModel::getTablesInDatabase($database_name),
'database_name' => $database_name,
'table_info' => DatabaseModel::getTableDetails($database_name)
@@ -133,12 +134,24 @@ class DatabaseController extends Controller
]);
}
/**
* Export database as raw SQL text
* @param string $database_name
*/
public function export($database_name)
{
header('Content-Type: text/plain; charset=utf-8');
header('Content-Disposition: inline; filename="' . $database_name . '.sql"');
echo DatabaseModel::exportDatabase($database_name);
}
/**
* Check if the request is an AJAX request
*/
private function isAjaxRequest()
{
return isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
return isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
}
}

View File

@@ -24,7 +24,7 @@ class DbUserController extends Controller
*/
public function index()
{
$this->View->render('dbuser/index', array(
$this->View->renderDbManager('dbuser/index', array(
'users' => DbUserModel::getAllUsers(),
'current_user' => Config::get('DB_USER')
));
@@ -39,11 +39,15 @@ class DbUserController extends Controller
$username = Request::post('username');
$password = Request::post('password');
$host = Request::post('host');
$privileges = Request::post('privileges');
if ($this->isAjaxRequest()) {
header('Content-Type: application/json');
if (DbUserModel::createUser($username, $password, $host)) {
if (!empty($privileges)) {
DbUserModel::updateUserPrivileges($username, $host, $privileges);
}
echo json_encode([
'success' => true,
'message' => 'User created successfully',
@@ -57,8 +61,11 @@ class DbUserController extends Controller
}
return;
}
if (DbUserModel::createUser($username, $password, $host)) {
if (!empty($privileges)) {
DbUserModel::updateUserPrivileges($username, $host, $privileges);
}
Redirect::to('dbuser');
} else {
Redirect::to('dbuser');
@@ -66,8 +73,7 @@ class DbUserController extends Controller
return;
}
// Show create user form
$this->View->render('dbuser/create');
$this->View->renderDbManager('dbuser/create');
}
/**
@@ -127,7 +133,7 @@ class DbUserController extends Controller
}
// Show edit user form
$this->View->render('dbuser/edit', array(
$this->View->renderDbManager('dbuser/edit', array(
'user' => DbUserModel::getUserDetails($username, $host),
'privileges' => DbUserModel::getUserPrivileges($username, $host),
'databases' => DatabaseModel::getAllDatabases()
@@ -184,7 +190,7 @@ class DbUserController extends Controller
*/
public function privileges($username, $host)
{
$this->View->render('dbuser/privileges', array(
$this->View->renderDbManager('dbuser/privileges', array(
'user' => DbUserModel::getUserDetails($username, $host),
'privileges' => DbUserModel::getUserPrivileges($username, $host)
));

View File

@@ -14,8 +14,9 @@ class SqlController extends Controller
{
parent::__construct();
// Only logged-in users can access the SQL console
// Only admin users can access the SQL console
Auth::checkAuthentication();
Auth::checkAdminAuthentication();
}
/**
@@ -28,7 +29,7 @@ class SqlController extends Controller
$database_name = Config::get('DB_NAME');
}
$this->View->render('sql/index', array(
$this->View->renderDbManager('sql/index', array(
'database_name' => $database_name,
'databases' => DatabaseModel::getAllDatabases(),
'history' => SqlModel::getQueryHistory(Session::get('user_id'))

View File

@@ -14,8 +14,9 @@ class TableController extends Controller
{
parent::__construct();
// Only logged-in users can access the table manager
// Only admin users can access the table manager
Auth::checkAuthentication();
Auth::checkAdminAuthentication();
}
/**
@@ -38,7 +39,7 @@ class TableController extends Controller
$page = (int)$page;
$per_page = 20;
$this->View->render('table/show', array(
$this->View->renderDbManager('table/show', array(
'database_name' => $database_name,
'table_name' => $table_name,
'columns' => TableModel::getTableColumns($database_name, $table_name),
@@ -91,7 +92,7 @@ class TableController extends Controller
}
// Show create table form
$this->View->render('table/create', array(
$this->View->renderDbManager('table/create', array(
'database_name' => $database_name
));
}
@@ -112,7 +113,7 @@ class TableController extends Controller
return;
}
$this->View->render('table/structure', array(
$this->View->renderDbManager('table/structure', array(
'database_name' => $database_name,
'table_name' => $table_name,
'columns' => TableModel::getTableColumns($database_name, $table_name),
@@ -172,7 +173,7 @@ class TableController extends Controller
}
// Show add column form
$this->View->render('table/add_column', array(
$this->View->renderDbManager('table/add_column', array(
'database_name' => $database_name,
'table_name' => $table_name
));
@@ -237,12 +238,160 @@ class TableController extends Controller
Redirect::to('database/show/' . urlencode($database_name));
}
/**
* Update a row in the table (AJAX)
* @param string $database_name
* @param string $table_name
*/
public function updateRow($database_name = null, $table_name = null)
{
if (!$database_name || !$table_name) {
if ($this->isAjaxRequest()) {
header('Content-Type: application/json');
echo json_encode(['success' => false, 'message' => 'Invalid parameters']);
return;
}
Redirect::to('database/index');
return;
}
$pk_value = Request::post('pk_value');
$data = Request::post('data');
if ($this->isAjaxRequest()) {
header('Content-Type: application/json');
if (!$pk_value || !$data) {
echo json_encode(['success' => false, 'message' => 'Missing required data']);
return;
}
if (TableModel::updateRow($database_name, $table_name, $pk_value, $data)) {
echo json_encode([
'success' => true,
'message' => 'Row updated successfully'
]);
} else {
echo json_encode([
'success' => false,
'message' => 'Failed to update row'
]);
}
return;
}
Redirect::to('table/show/' . urlencode($database_name) . '/' . urlencode($table_name));
}
/**
* Delete a row from the table (AJAX)
* @param string $database_name
* @param string $table_name
*/
public function deleteRow($database_name = null, $table_name = null)
{
if (!$database_name || !$table_name) {
if ($this->isAjaxRequest()) {
header('Content-Type: application/json');
echo json_encode(['success' => false, 'message' => 'Invalid parameters']);
return;
}
Redirect::to('database/index');
return;
}
$pk_value = Request::post('pk_value');
if ($this->isAjaxRequest()) {
header('Content-Type: application/json');
if (!$pk_value) {
echo json_encode(['success' => false, 'message' => 'Missing primary key value']);
return;
}
if (TableModel::deleteRow($database_name, $table_name, $pk_value)) {
echo json_encode([
'success' => true,
'message' => 'Row deleted successfully'
]);
} else {
echo json_encode([
'success' => false,
'message' => 'Failed to delete row'
]);
}
return;
}
Redirect::to('table/show/' . urlencode($database_name) . '/' . urlencode($table_name));
}
/**
* Insert a new row into the table (AJAX)
* @param string $database_name
* @param string $table_name
*/
public function insertRow($database_name = null, $table_name = null)
{
if (!$database_name || !$table_name) {
if ($this->isAjaxRequest()) {
header('Content-Type: application/json');
echo json_encode(['success' => false, 'message' => 'Invalid parameters']);
return;
}
Redirect::to('database/index');
return;
}
$data = Request::post('data');
if ($this->isAjaxRequest()) {
header('Content-Type: application/json');
if (!$data) {
echo json_encode(['success' => false, 'message' => 'Missing row data']);
return;
}
$insertId = TableModel::insertRow($database_name, $table_name, $data);
if ($insertId !== false) {
echo json_encode([
'success' => true,
'message' => 'Row inserted successfully',
'insert_id' => $insertId
]);
} else {
echo json_encode([
'success' => false,
'message' => 'Failed to insert row'
]);
}
return;
}
Redirect::to('table/show/' . urlencode($database_name) . '/' . urlencode($table_name));
}
/**
* Check if the request is an AJAX request
*/
private function isAjaxRequest()
{
return isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
return isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
}
/**
* Export table as raw SQL text
* @param string $database_name
* @param string $table_name
*/
public function export($database_name, $table_name)
{
header('Content-Type: text/plain; charset=utf-8');
header('Content-Disposition: inline; filename="' . $table_name . '.sql"');
echo DatabaseModel::exportTable($database_name, $table_name);
}
}