Finished messenger
This commit is contained in:
144
application/controller/DatabaseController.php
Normal file
144
application/controller/DatabaseController.php
Normal file
@@ -0,0 +1,144 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Class DatabaseController
|
||||
*
|
||||
* Controller for managing databases and showing their structure
|
||||
*/
|
||||
class DatabaseController extends Controller
|
||||
{
|
||||
/**
|
||||
* Construct this object by extending the basic Controller class
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
// Only logged-in users can access the database manager
|
||||
Auth::checkAuthentication();
|
||||
}
|
||||
|
||||
/**
|
||||
* Main database management interface
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$this->View->render('database/index', array(
|
||||
'databases' => DatabaseModel::getAllDatabases(),
|
||||
'current_db' => Config::get('DB_NAME')
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Show details of a specific database
|
||||
* @param string $database_name
|
||||
*/
|
||||
public function show($database_name = null)
|
||||
{
|
||||
if (!$database_name) {
|
||||
$database_name = Config::get('DB_NAME');
|
||||
}
|
||||
|
||||
$this->View->render('database/show', array(
|
||||
'tables' => DatabaseModel::getTablesInDatabase($database_name),
|
||||
'database_name' => $database_name,
|
||||
'table_info' => DatabaseModel::getTableDetails($database_name)
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new database
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
$database_name = Request::post('database_name');
|
||||
|
||||
if ($this->isAjaxRequest()) {
|
||||
header('Content-Type: application/json');
|
||||
|
||||
if (DatabaseModel::createDatabase($database_name)) {
|
||||
echo json_encode([
|
||||
'success' => true,
|
||||
'message' => 'Database created successfully'
|
||||
]);
|
||||
} else {
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => 'Failed to create database'
|
||||
]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
Redirect::to('database');
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a database
|
||||
* @param string $database_name
|
||||
*/
|
||||
public function delete($database_name)
|
||||
{
|
||||
// Prevent deletion of the current database
|
||||
if ($database_name === Config::get('DB_NAME')) {
|
||||
if ($this->isAjaxRequest()) {
|
||||
header('Content-Type: application/json');
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => 'Cannot delete the currently connected database'
|
||||
]);
|
||||
return;
|
||||
}
|
||||
Redirect::to('database');
|
||||
return;
|
||||
}
|
||||
|
||||
$success = DatabaseModel::deleteDatabase($database_name);
|
||||
|
||||
if ($this->isAjaxRequest()) {
|
||||
header('Content-Type: application/json');
|
||||
if ($success) {
|
||||
echo json_encode([
|
||||
'success' => true,
|
||||
'message' => 'Database deleted successfully'
|
||||
]);
|
||||
} else {
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => 'Failed to delete database'
|
||||
]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
Redirect::to('database');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get database structure as JSON (AJAX endpoint)
|
||||
* @param string $database_name
|
||||
*/
|
||||
public function getStructure($database_name = null)
|
||||
{
|
||||
if (!$database_name) {
|
||||
$database_name = Config::get('DB_NAME');
|
||||
}
|
||||
|
||||
$structure = DatabaseModel::getDatabaseStructure($database_name);
|
||||
|
||||
header('Content-Type: application/json');
|
||||
echo json_encode([
|
||||
'success' => true,
|
||||
'structure' => $structure
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the request is an AJAX request
|
||||
*/
|
||||
private function isAjaxRequest()
|
||||
{
|
||||
return isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
|
||||
strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
|
||||
}
|
||||
}
|
||||
201
application/controller/DbUserController.php
Normal file
201
application/controller/DbUserController.php
Normal file
@@ -0,0 +1,201 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Class UserController for Database Manager
|
||||
*
|
||||
* Controller for managing MySQL users and privileges
|
||||
*/
|
||||
class DbUserController extends Controller
|
||||
{
|
||||
/**
|
||||
* Construct this object by extending the basic Controller class
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
// Only admin users can access database user management
|
||||
Auth::checkAuthentication();
|
||||
Auth::checkAdminAuthentication();
|
||||
}
|
||||
|
||||
/**
|
||||
* List all database users
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$this->View->render('dbuser/index', array(
|
||||
'users' => DbUserModel::getAllUsers(),
|
||||
'current_user' => Config::get('DB_USER')
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new database user
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
if (Request::post('submit_create_user')) {
|
||||
$username = Request::post('username');
|
||||
$password = Request::post('password');
|
||||
$host = Request::post('host');
|
||||
|
||||
if ($this->isAjaxRequest()) {
|
||||
header('Content-Type: application/json');
|
||||
|
||||
if (DbUserModel::createUser($username, $password, $host)) {
|
||||
echo json_encode([
|
||||
'success' => true,
|
||||
'message' => 'User created successfully',
|
||||
'reload' => true
|
||||
]);
|
||||
} else {
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => 'Failed to create user'
|
||||
]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (DbUserModel::createUser($username, $password, $host)) {
|
||||
Redirect::to('dbuser');
|
||||
} else {
|
||||
Redirect::to('dbuser');
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Show create user form
|
||||
$this->View->render('dbuser/create');
|
||||
}
|
||||
|
||||
/**
|
||||
* Edit user details and privileges
|
||||
* @param string $username
|
||||
* @param string $host
|
||||
*/
|
||||
public function edit($username, $host)
|
||||
{
|
||||
if (Request::post('submit_edit_user')) {
|
||||
$new_password = Request::post('password');
|
||||
$privileges = Request::post('privileges');
|
||||
|
||||
if ($this->isAjaxRequest()) {
|
||||
header('Content-Type: application/json');
|
||||
|
||||
$success = true;
|
||||
$message = 'User updated successfully';
|
||||
|
||||
if (!empty($new_password)) {
|
||||
if (!DbUserModel::updateUserPassword($username, $host, $new_password)) {
|
||||
$success = false;
|
||||
$message = 'Failed to update user password';
|
||||
}
|
||||
}
|
||||
|
||||
if ($success && !DbUserModel::updateUserPrivileges($username, $host, $privileges)) {
|
||||
$success = false;
|
||||
$message = 'Failed to update user privileges';
|
||||
}
|
||||
|
||||
if ($success) {
|
||||
echo json_encode([
|
||||
'success' => true,
|
||||
'message' => $message
|
||||
]);
|
||||
} else {
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => $message
|
||||
]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
$success = true;
|
||||
if (!empty($new_password)) {
|
||||
$success = DbUserModel::updateUserPassword($username, $host, $new_password);
|
||||
}
|
||||
|
||||
if ($success && !DbUserModel::updateUserPrivileges($username, $host, $privileges)) {
|
||||
$success = false;
|
||||
}
|
||||
|
||||
Redirect::to('dbuser');
|
||||
return;
|
||||
}
|
||||
|
||||
// Show edit user form
|
||||
$this->View->render('dbuser/edit', array(
|
||||
'user' => DbUserModel::getUserDetails($username, $host),
|
||||
'privileges' => DbUserModel::getUserPrivileges($username, $host),
|
||||
'databases' => DatabaseModel::getAllDatabases()
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a user
|
||||
* @param string $username
|
||||
* @param string $host
|
||||
*/
|
||||
public function delete($username, $host)
|
||||
{
|
||||
// Prevent deletion of current user
|
||||
if ($username === Config::get('DB_USER')) {
|
||||
if ($this->isAjaxRequest()) {
|
||||
header('Content-Type: application/json');
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => 'Cannot delete the currently connected user'
|
||||
]);
|
||||
return;
|
||||
}
|
||||
Redirect::to('dbuser');
|
||||
return;
|
||||
}
|
||||
|
||||
$success = DbUserModel::deleteUser($username, $host);
|
||||
|
||||
if ($this->isAjaxRequest()) {
|
||||
header('Content-Type: application/json');
|
||||
|
||||
if ($success) {
|
||||
echo json_encode([
|
||||
'success' => true,
|
||||
'message' => 'User deleted successfully'
|
||||
]);
|
||||
} else {
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => 'Failed to delete user'
|
||||
]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
Redirect::to('dbuser');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show user privileges
|
||||
* @param string $username
|
||||
* @param string $host
|
||||
*/
|
||||
public function privileges($username, $host)
|
||||
{
|
||||
$this->View->render('dbuser/privileges', array(
|
||||
'user' => DbUserModel::getUserDetails($username, $host),
|
||||
'privileges' => DbUserModel::getUserPrivileges($username, $host)
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the request is an AJAX request
|
||||
*/
|
||||
private function isAjaxRequest()
|
||||
{
|
||||
return isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
|
||||
strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
|
||||
}
|
||||
}
|
||||
@@ -5,50 +5,37 @@ class MessageController extends Controller
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
// Require login for all message features
|
||||
Auth::checkAuthentication();
|
||||
}
|
||||
|
||||
/**
|
||||
* 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';
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a message to a specific user via URL parameters
|
||||
* URL format: message/send/{receiver_id}/{subject}/{message}
|
||||
*/
|
||||
|
||||
public function send()
|
||||
{
|
||||
// Handle POST request
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
$receiver_id = isset($_POST['receiver_id']) ? $_POST['receiver_id'] : null;
|
||||
$subject = isset($_POST['subject']) ? $_POST['subject'] : 'No Subject';
|
||||
$message = isset($_POST['message']) ? $_POST['message'] : null;
|
||||
|
||||
|
||||
if (!$receiver_id || !$message) {
|
||||
// Return JSON for AJAX requests
|
||||
if ($this->isAjaxRequest()) {
|
||||
header('Content-Type: application/json');
|
||||
echo json_encode(['success' => false, 'message' => 'Receiver and message are required']);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Session::add('feedback_negative', 'Receiver and message are required');
|
||||
Redirect::to('message');
|
||||
return;
|
||||
}
|
||||
|
||||
// Send the message
|
||||
|
||||
$sender_id = Session::get('user_id');
|
||||
$success = MessageModel::sendToUser($sender_id, $receiver_id, $subject, $message);
|
||||
|
||||
// Return JSON for AJAX requests
|
||||
|
||||
if ($this->isAjaxRequest()) {
|
||||
header('Content-Type: application/json');
|
||||
if ($success) {
|
||||
@@ -58,15 +45,13 @@ class MessageController extends Controller
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Regular request handling
|
||||
|
||||
if ($success) {
|
||||
Session::add('feedback_positive', 'Message sent successfully');
|
||||
} else {
|
||||
Session::add('feedback_negative', 'Failed to send message');
|
||||
}
|
||||
|
||||
// If coming from conversation view, return there
|
||||
|
||||
if (isset($_SERVER['HTTP_REFERER']) && strpos($_SERVER['HTTP_REFERER'], 'conversation') !== false) {
|
||||
Redirect::to('message/conversation/' . $receiver_id);
|
||||
} else {
|
||||
@@ -74,31 +59,29 @@ class MessageController extends Controller
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Handle GET request
|
||||
|
||||
// GET request: message/send/{receiver_id}/{subject}/{message}
|
||||
$url_parts = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
|
||||
$receiver_id = isset($url_parts[2]) ? $url_parts[2] : null;
|
||||
$subject = isset($url_parts[3]) ? urldecode($url_parts[3]) : null;
|
||||
$message = isset($url_parts[4]) ? urldecode($url_parts[4]) : null;
|
||||
|
||||
|
||||
if (!$receiver_id || !$subject || !$message) {
|
||||
header('Content-Type: application/json');
|
||||
echo json_encode(['success' => false, 'message' => 'Missing parameters. Use: message/send/{receiver_id}/{subject}/{message}']);
|
||||
return;
|
||||
}
|
||||
|
||||
// Verify receiver exists
|
||||
|
||||
$receiver = UserModel::getPublicProfileOfUser($receiver_id);
|
||||
if (!$receiver) {
|
||||
header('Content-Type: application/json');
|
||||
echo json_encode(['success' => false, 'message' => 'Receiver not found']);
|
||||
return;
|
||||
}
|
||||
|
||||
// Send the message
|
||||
|
||||
$sender_id = Session::get('user_id');
|
||||
$success = MessageModel::sendToUser($sender_id, $receiver_id, $subject, $message);
|
||||
|
||||
|
||||
header('Content-Type: application/json');
|
||||
if ($success) {
|
||||
echo json_encode(['success' => true, 'message' => 'Message sent successfully']);
|
||||
@@ -106,70 +89,60 @@ class MessageController extends Controller
|
||||
echo json_encode(['success' => false, 'message' => 'Failed to send message']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a message to a group via URL parameters
|
||||
* URL format: message/sendgroup/{group_type}/{subject}/{message}
|
||||
* group_type can be: admins, moderators, all_users
|
||||
*/
|
||||
|
||||
public function sendgroup()
|
||||
{
|
||||
// Handle POST request
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
$group_type = isset($_POST['group_type']) ? $_POST['group_type'] : null;
|
||||
$subject = isset($_POST['subject']) ? $_POST['subject'] : 'No Subject';
|
||||
$message = isset($_POST['message']) ? $_POST['message'] : null;
|
||||
|
||||
|
||||
if (!$group_type || !$message) {
|
||||
Session::add('feedback_negative', 'Group type and message are required');
|
||||
Redirect::to('message');
|
||||
return;
|
||||
}
|
||||
|
||||
// Validate group type
|
||||
|
||||
if (!in_array($group_type, ['admins', 'moderators', 'all_users'])) {
|
||||
Session::add('feedback_negative', 'Invalid group type');
|
||||
Redirect::to('message');
|
||||
return;
|
||||
}
|
||||
|
||||
// Send the message
|
||||
|
||||
$sender_id = Session::get('user_id');
|
||||
$success = MessageModel::sendToGroup($sender_id, $group_type, $subject, $message);
|
||||
|
||||
|
||||
if ($success) {
|
||||
Session::add('feedback_positive', 'Message sent to group successfully');
|
||||
} else {
|
||||
Session::add('feedback_negative', 'Failed to send message to group');
|
||||
}
|
||||
|
||||
|
||||
Redirect::to('message');
|
||||
return;
|
||||
}
|
||||
|
||||
// Handle GET request
|
||||
|
||||
// GET request: message/sendgroup/{group_type}/{subject}/{message}
|
||||
$url_parts = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
|
||||
$group_type = isset($url_parts[2]) ? $url_parts[2] : null;
|
||||
$subject = isset($url_parts[3]) ? urldecode($url_parts[3]) : null;
|
||||
$message = isset($url_parts[4]) ? urldecode($url_parts[4]) : null;
|
||||
|
||||
|
||||
if (!$group_type || !$subject || !$message) {
|
||||
header('Content-Type: application/json');
|
||||
echo json_encode(['success' => false, 'message' => 'Missing parameters. Use: message/sendgroup/{group_type}/{subject}/{message}']);
|
||||
return;
|
||||
}
|
||||
|
||||
// Validate group type
|
||||
|
||||
if (!in_array($group_type, ['admins', 'moderators', 'all_users'])) {
|
||||
header('Content-Type: application/json');
|
||||
echo json_encode(['success' => false, 'message' => 'Invalid group type. Must be: admins, moderators, or all_users']);
|
||||
return;
|
||||
}
|
||||
|
||||
// Send the message
|
||||
|
||||
$sender_id = Session::get('user_id');
|
||||
$success = MessageModel::sendToGroup($sender_id, $group_type, $subject, $message);
|
||||
|
||||
|
||||
header('Content-Type: application/json');
|
||||
if ($success) {
|
||||
echo json_encode(['success' => true, 'message' => 'Message sent to group successfully']);
|
||||
@@ -177,204 +150,156 @@ class MessageController extends Controller
|
||||
echo json_encode(['success' => false, 'message' => 'Failed to send message to group']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle reply to a message
|
||||
*/
|
||||
|
||||
public function reply()
|
||||
{
|
||||
// Always return JSON for this endpoint
|
||||
while (ob_get_level()) ob_end_clean();
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
// Start output buffering to catch any accidental output
|
||||
ob_start();
|
||||
|
||||
try {
|
||||
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
||||
echo json_encode(['success' => false, 'message' => 'Invalid request method']);
|
||||
exit();
|
||||
}
|
||||
|
||||
$receiver_id = isset($_POST['receiver_id']) ? $_POST['receiver_id'] : null;
|
||||
$message = isset($_POST['message']) ? $_POST['message'] : null;
|
||||
|
||||
if (!$receiver_id || !$message) {
|
||||
echo json_encode(['success' => false, 'message' => 'Receiver and message are required']);
|
||||
exit();
|
||||
}
|
||||
|
||||
$sender_id = Session::get('user_id');
|
||||
if (!$sender_id) {
|
||||
echo json_encode(['success' => false, 'message' => 'Not logged in']);
|
||||
exit();
|
||||
}
|
||||
|
||||
// Send the message (using sendToUser without subject)
|
||||
$success = MessageModel::sendToUser($sender_id, $receiver_id, 'Re: Message', $message);
|
||||
|
||||
if ($success) {
|
||||
echo json_encode(['success' => true, 'message' => 'Reply sent successfully']);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => 'Failed to send reply']);
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
// Catch any PHP errors
|
||||
echo json_encode(['success' => false, 'message' => 'Server error: ' . $e->getMessage()]);
|
||||
|
||||
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
||||
echo json_encode(['success' => false, 'message' => 'Invalid request method']);
|
||||
exit();
|
||||
}
|
||||
|
||||
$receiver_id = isset($_POST['receiver_id']) ? $_POST['receiver_id'] : null;
|
||||
$message = isset($_POST['message']) ? $_POST['message'] : null;
|
||||
|
||||
if (!$receiver_id || !$message) {
|
||||
echo json_encode(['success' => false, 'message' => 'Receiver and message are required']);
|
||||
exit();
|
||||
}
|
||||
|
||||
$sender_id = Session::get('user_id');
|
||||
if (!$sender_id) {
|
||||
echo json_encode(['success' => false, 'message' => 'Not logged in']);
|
||||
exit();
|
||||
}
|
||||
|
||||
$success = MessageModel::sendToUser($sender_id, $receiver_id, 'Direct Message', $message);
|
||||
|
||||
if ($success) {
|
||||
echo json_encode(['success' => true, 'message' => 'Reply sent successfully']);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => 'Failed to send reply']);
|
||||
}
|
||||
|
||||
// Clean any output buffer and exit
|
||||
ob_end_clean();
|
||||
exit();
|
||||
}
|
||||
|
||||
/**
|
||||
* Show global chat interface
|
||||
*/
|
||||
|
||||
public function global()
|
||||
{
|
||||
// Redirect to main messages page with global chat hash
|
||||
Redirect::to('message#load-global');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the messenger interface
|
||||
*/
|
||||
|
||||
public function index()
|
||||
{
|
||||
$user_id = Session::get('user_id');
|
||||
|
||||
// Get conversations and unread count
|
||||
|
||||
$conversations = MessageModel::getConversations($user_id);
|
||||
$unread_count = MessageModel::getUnreadCount($user_id);
|
||||
|
||||
|
||||
$this->View->render('message/index', array(
|
||||
'conversations' => $conversations,
|
||||
'unread_count' => $unread_count,
|
||||
'all_users' => MessageModel::getAllUsers($user_id)
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Show conversation with a specific user
|
||||
*/
|
||||
|
||||
public function conversation()
|
||||
{
|
||||
$user_id = Session::get('user_id');
|
||||
$url_parts = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
|
||||
$other_user_id = isset($url_parts[2]) ? $url_parts[2] : null;
|
||||
|
||||
|
||||
if (!$other_user_id) {
|
||||
Redirect::to('message');
|
||||
return;
|
||||
}
|
||||
|
||||
// Get user info for the other person
|
||||
|
||||
$other_user = UserModel::getPublicProfileOfUser($other_user_id);
|
||||
if (!$other_user) {
|
||||
Redirect::to('message');
|
||||
return;
|
||||
}
|
||||
|
||||
// Redirect to main messages page with conversation hash
|
||||
|
||||
Redirect::to('message#load-conversation-' . $other_user_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get conversation messages as JSON (AJAX endpoint)
|
||||
*/
|
||||
|
||||
public function getConversationMessages()
|
||||
{
|
||||
while (ob_get_level()) ob_end_clean();
|
||||
|
||||
$user_id = Session::get('user_id');
|
||||
$url_parts = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
|
||||
$other_user_id = isset($url_parts[2]) ? $url_parts[2] : null;
|
||||
|
||||
if (!$other_user_id) {
|
||||
header('Content-Type: application/json');
|
||||
echo json_encode(['success' => false, 'message' => 'Missing user ID']);
|
||||
return;
|
||||
}
|
||||
|
||||
// Get messages
|
||||
$messages = MessageModel::getMessagesWithUser($user_id, $other_user_id);
|
||||
|
||||
// Mark messages as read when loading the conversation
|
||||
MessageModel::markAsRead($user_id, $other_user_id);
|
||||
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
if (!$other_user_id) {
|
||||
echo json_encode(['success' => false, 'message' => 'Missing user ID']);
|
||||
exit();
|
||||
}
|
||||
|
||||
$messages = MessageModel::getMessagesWithUser($user_id, $other_user_id);
|
||||
MessageModel::markAsRead($user_id, $other_user_id);
|
||||
|
||||
echo json_encode(['success' => true, 'messages' => $messages]);
|
||||
exit();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get global chat messages as JSON (AJAX endpoint)
|
||||
*/
|
||||
|
||||
public function getGlobalMessages()
|
||||
{
|
||||
// Always return JSON for this endpoint
|
||||
while (ob_get_level()) ob_end_clean();
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
$messages = MessageModel::getGlobalMessages();
|
||||
echo json_encode(['success' => true, 'messages' => $messages]);
|
||||
|
||||
// Stop any further execution
|
||||
exit();
|
||||
}
|
||||
|
||||
/**
|
||||
* Send message to global chat
|
||||
*/
|
||||
|
||||
public function sendToGlobal()
|
||||
{
|
||||
// Always return JSON for this endpoint
|
||||
while (ob_get_level()) ob_end_clean();
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
// Start output buffering to catch any accidental output
|
||||
ob_start();
|
||||
|
||||
try {
|
||||
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
||||
echo json_encode(['success' => false, 'message' => 'Invalid request method']);
|
||||
exit();
|
||||
}
|
||||
|
||||
$message = isset($_POST['message']) ? $_POST['message'] : null;
|
||||
$sender_id = Session::get('user_id');
|
||||
|
||||
if (!$message) {
|
||||
echo json_encode(['success' => false, 'message' => 'Message is required']);
|
||||
exit();
|
||||
}
|
||||
|
||||
if (!$sender_id) {
|
||||
echo json_encode(['success' => false, 'message' => 'Not logged in']);
|
||||
exit();
|
||||
}
|
||||
|
||||
$success = MessageModel::sendToGlobal($sender_id, $message);
|
||||
|
||||
if ($success) {
|
||||
echo json_encode(['success' => true, 'message' => 'Message sent to global chat']);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => 'Failed to send message']);
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
// Catch any PHP errors
|
||||
echo json_encode(['success' => false, 'message' => 'Server error: ' . $e->getMessage()]);
|
||||
|
||||
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
||||
echo json_encode(['success' => false, 'message' => 'Invalid request method']);
|
||||
exit();
|
||||
}
|
||||
|
||||
$message = isset($_POST['message']) ? $_POST['message'] : null;
|
||||
$sender_id = Session::get('user_id');
|
||||
|
||||
if (!$message) {
|
||||
echo json_encode(['success' => false, 'message' => 'Message is required']);
|
||||
exit();
|
||||
}
|
||||
|
||||
if (!$sender_id) {
|
||||
echo json_encode(['success' => false, 'message' => 'Not logged in']);
|
||||
exit();
|
||||
}
|
||||
|
||||
$success = MessageModel::sendToGlobal($sender_id, $message);
|
||||
|
||||
if ($success) {
|
||||
echo json_encode(['success' => true, 'message' => 'Message sent to global chat']);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => 'Failed to send message']);
|
||||
}
|
||||
|
||||
// Clean any output buffer and exit
|
||||
ob_end_clean();
|
||||
exit();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get unread count as JSON
|
||||
*/
|
||||
|
||||
public function unreadcount()
|
||||
{
|
||||
while (ob_get_level()) ob_end_clean();
|
||||
|
||||
$user_id = Session::get('user_id');
|
||||
$unread_count = MessageModel::getUnreadCount($user_id);
|
||||
|
||||
|
||||
header('Content-Type: application/json');
|
||||
echo json_encode(['unread_count' => $unread_count]);
|
||||
exit();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
181
application/controller/SqlController.php
Normal file
181
application/controller/SqlController.php
Normal file
@@ -0,0 +1,181 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Class SqlController
|
||||
*
|
||||
* Controller for executing raw SQL queries
|
||||
*/
|
||||
class SqlController extends Controller
|
||||
{
|
||||
/**
|
||||
* Construct this object by extending the basic Controller class
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
// Only logged-in users can access the SQL console
|
||||
Auth::checkAuthentication();
|
||||
}
|
||||
|
||||
/**
|
||||
* Show SQL console interface
|
||||
* @param string $database_name
|
||||
*/
|
||||
public function index($database_name = null)
|
||||
{
|
||||
if (!$database_name) {
|
||||
$database_name = Config::get('DB_NAME');
|
||||
}
|
||||
|
||||
$this->View->render('sql/index', array(
|
||||
'database_name' => $database_name,
|
||||
'databases' => DatabaseModel::getAllDatabases(),
|
||||
'history' => SqlModel::getQueryHistory(Session::get('user_id'))
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute SQL query
|
||||
*/
|
||||
public function execute()
|
||||
{
|
||||
$database_name = Request::post('database_name') ?: Config::get('DB_NAME');
|
||||
$sql_query = Request::post('sql_query');
|
||||
|
||||
if (empty($sql_query)) {
|
||||
if ($this->isAjaxRequest()) {
|
||||
header('Content-Type: application/json');
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => 'SQL query cannot be empty'
|
||||
]);
|
||||
return;
|
||||
}
|
||||
Redirect::to('sql');
|
||||
return;
|
||||
}
|
||||
|
||||
$result = SqlModel::executeQuery($database_name, $sql_query, Session::get('user_id'));
|
||||
|
||||
if ($this->isAjaxRequest()) {
|
||||
header('Content-Type: application/json');
|
||||
|
||||
if ($result['success']) {
|
||||
echo json_encode([
|
||||
'success' => true,
|
||||
'message' => $result['message'],
|
||||
'result' => $result['result'],
|
||||
'affected_rows' => $result['affected_rows'],
|
||||
'execution_time' => $result['execution_time'],
|
||||
'query_type' => $result['query_type']
|
||||
]);
|
||||
} else {
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => $result['message'],
|
||||
'error' => $result['error']
|
||||
]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Non-AJAX: redirect with results in session
|
||||
Session::set('sql_result', $result);
|
||||
Redirect::to('sql/index/' . urlencode($database_name));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get query history as JSON (AJAX endpoint)
|
||||
*/
|
||||
public function getHistory()
|
||||
{
|
||||
$history = SqlModel::getQueryHistory(Session::get('user_id'));
|
||||
|
||||
header('Content-Type: application/json');
|
||||
echo json_encode([
|
||||
'success' => true,
|
||||
'history' => $history
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear query history
|
||||
*/
|
||||
public function clearHistory()
|
||||
{
|
||||
$success = SqlModel::clearQueryHistory(Session::get('user_id'));
|
||||
|
||||
if ($this->isAjaxRequest()) {
|
||||
header('Content-Type: application/json');
|
||||
|
||||
if ($success) {
|
||||
echo json_encode([
|
||||
'success' => true,
|
||||
'message' => 'Query history cleared successfully'
|
||||
]);
|
||||
} else {
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => 'Failed to clear query history'
|
||||
]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
Redirect::to('sql');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get database schema for autocomplete
|
||||
* @param string $database_name
|
||||
*/
|
||||
public function getSchema($database_name = null)
|
||||
{
|
||||
if (!$database_name) {
|
||||
$database_name = Config::get('DB_NAME');
|
||||
}
|
||||
|
||||
$schema = SqlModel::getDatabaseSchema($database_name);
|
||||
|
||||
header('Content-Type: application/json');
|
||||
echo json_encode([
|
||||
'success' => true,
|
||||
'schema' => $schema
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Format SQL query (AJAX endpoint)
|
||||
*/
|
||||
public function formatQuery()
|
||||
{
|
||||
$query = Request::post('query');
|
||||
|
||||
if (empty($query)) {
|
||||
header('Content-Type: application/json');
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => 'Query cannot be empty'
|
||||
]);
|
||||
return;
|
||||
}
|
||||
|
||||
$formatted = SqlModel::formatQuery($query);
|
||||
|
||||
header('Content-Type: application/json');
|
||||
echo json_encode([
|
||||
'success' => true,
|
||||
'formatted' => $formatted
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the request is an AJAX request
|
||||
*/
|
||||
private function isAjaxRequest()
|
||||
{
|
||||
return isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
|
||||
strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
|
||||
}
|
||||
}
|
||||
248
application/controller/TableController.php
Normal file
248
application/controller/TableController.php
Normal file
@@ -0,0 +1,248 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Class TableController
|
||||
*
|
||||
* Controller for managing database tables
|
||||
*/
|
||||
class TableController extends Controller
|
||||
{
|
||||
/**
|
||||
* Construct this object by extending the basic Controller class
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
// Only logged-in users can access the table manager
|
||||
Auth::checkAuthentication();
|
||||
}
|
||||
|
||||
/**
|
||||
* Show table content with pagination
|
||||
* @param string $database_name
|
||||
* @param string $table_name
|
||||
* @param int $page
|
||||
*/
|
||||
public function show($database_name = null, $table_name = null, $page = 1)
|
||||
{
|
||||
if (!$database_name) {
|
||||
$database_name = Config::get('DB_NAME');
|
||||
}
|
||||
|
||||
if (!$table_name) {
|
||||
Redirect::to('database/show/' . urlencode($database_name));
|
||||
return;
|
||||
}
|
||||
|
||||
$page = (int)$page;
|
||||
$per_page = 20;
|
||||
|
||||
$this->View->render('table/show', array(
|
||||
'database_name' => $database_name,
|
||||
'table_name' => $table_name,
|
||||
'columns' => TableModel::getTableColumns($database_name, $table_name),
|
||||
'rows' => TableModel::getTableRows($database_name, $table_name, $page, $per_page),
|
||||
'total_rows' => TableModel::getTableRowCount($database_name, $table_name),
|
||||
'current_page' => $page,
|
||||
'per_page' => $per_page,
|
||||
'table_info' => TableModel::getTableInfo($database_name, $table_name)
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new table
|
||||
* @param string $database_name
|
||||
*/
|
||||
public function create($database_name = null)
|
||||
{
|
||||
if (!$database_name) {
|
||||
$database_name = Config::get('DB_NAME');
|
||||
}
|
||||
|
||||
if (Request::post('submit_create_table')) {
|
||||
$table_name = Request::post('table_name');
|
||||
$columns = Request::post('columns');
|
||||
|
||||
if ($this->isAjaxRequest()) {
|
||||
header('Content-Type: application/json');
|
||||
|
||||
if (TableModel::createTable($database_name, $table_name, $columns)) {
|
||||
echo json_encode([
|
||||
'success' => true,
|
||||
'message' => 'Table created successfully',
|
||||
'redirect' => Config::get('URL') . 'table/show/' . urlencode($database_name) . '/' . urlencode($table_name)
|
||||
]);
|
||||
} else {
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => 'Failed to create table'
|
||||
]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (TableModel::createTable($database_name, $table_name, $columns)) {
|
||||
Redirect::to('table/show/' . urlencode($database_name) . '/' . urlencode($table_name));
|
||||
} else {
|
||||
Redirect::to('database/show/' . urlencode($database_name));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Show create table form
|
||||
$this->View->render('table/create', array(
|
||||
'database_name' => $database_name
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Show table structure
|
||||
* @param string $database_name
|
||||
* @param string $table_name
|
||||
*/
|
||||
public function structure($database_name = null, $table_name = null)
|
||||
{
|
||||
if (!$database_name) {
|
||||
$database_name = Config::get('DB_NAME');
|
||||
}
|
||||
|
||||
if (!$table_name) {
|
||||
Redirect::to('database/show/' . urlencode($database_name));
|
||||
return;
|
||||
}
|
||||
|
||||
$this->View->render('table/structure', array(
|
||||
'database_name' => $database_name,
|
||||
'table_name' => $table_name,
|
||||
'columns' => TableModel::getTableColumns($database_name, $table_name),
|
||||
'indexes' => TableModel::getTableIndexes($database_name, $table_name),
|
||||
'table_info' => TableModel::getTableInfo($database_name, $table_name)
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a column to a table
|
||||
* @param string $database_name
|
||||
* @param string $table_name
|
||||
*/
|
||||
public function addColumn($database_name = null, $table_name = null)
|
||||
{
|
||||
if (!$database_name) {
|
||||
$database_name = Config::get('DB_NAME');
|
||||
}
|
||||
|
||||
if (!$table_name) {
|
||||
Redirect::to('database/show/' . urlencode($database_name));
|
||||
return;
|
||||
}
|
||||
|
||||
if (Request::post('submit_add_column')) {
|
||||
$column_name = Request::post('column_name');
|
||||
$column_type = Request::post('column_type');
|
||||
$column_null = Request::post('column_null');
|
||||
$column_key = Request::post('column_key');
|
||||
$column_default = Request::post('column_default');
|
||||
$column_extra = Request::post('column_extra');
|
||||
|
||||
if ($this->isAjaxRequest()) {
|
||||
header('Content-Type: application/json');
|
||||
|
||||
if (TableModel::addColumn($database_name, $table_name, $column_name, $column_type, $column_null, $column_key, $column_default, $column_extra)) {
|
||||
echo json_encode([
|
||||
'success' => true,
|
||||
'message' => 'Column added successfully',
|
||||
'reload' => true
|
||||
]);
|
||||
} else {
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => 'Failed to add column'
|
||||
]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (TableModel::addColumn($database_name, $table_name, $column_name, $column_type, $column_null, $column_key, $column_default, $column_extra)) {
|
||||
Redirect::to('table/structure/' . urlencode($database_name) . '/' . urlencode($table_name));
|
||||
} else {
|
||||
Redirect::to('table/structure/' . urlencode($database_name) . '/' . urlencode($table_name));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Show add column form
|
||||
$this->View->render('table/add_column', array(
|
||||
'database_name' => $database_name,
|
||||
'table_name' => $table_name
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Drop a column from a table
|
||||
* @param string $database_name
|
||||
* @param string $table_name
|
||||
* @param string $column_name
|
||||
*/
|
||||
public function dropColumn($database_name, $table_name, $column_name)
|
||||
{
|
||||
$success = TableModel::dropColumn($database_name, $table_name, $column_name);
|
||||
|
||||
if ($this->isAjaxRequest()) {
|
||||
header('Content-Type: application/json');
|
||||
if ($success) {
|
||||
echo json_encode([
|
||||
'success' => true,
|
||||
'message' => 'Column dropped successfully',
|
||||
'reload' => true
|
||||
]);
|
||||
} else {
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => 'Failed to drop column'
|
||||
]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
Redirect::to('table/structure/' . urlencode($database_name) . '/' . urlencode($table_name));
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a table
|
||||
* @param string $database_name
|
||||
* @param string $table_name
|
||||
*/
|
||||
public function delete($database_name, $table_name)
|
||||
{
|
||||
$success = TableModel::deleteTable($database_name, $table_name);
|
||||
|
||||
if ($this->isAjaxRequest()) {
|
||||
header('Content-Type: application/json');
|
||||
if ($success) {
|
||||
echo json_encode([
|
||||
'success' => true,
|
||||
'message' => 'Table deleted successfully',
|
||||
'redirect' => Config::get('URL') . 'database/show/' . urlencode($database_name)
|
||||
]);
|
||||
} else {
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => 'Failed to delete table'
|
||||
]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
Redirect::to('database/show/' . urlencode($database_name));
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the request is an AJAX request
|
||||
*/
|
||||
private function isAjaxRequest()
|
||||
{
|
||||
return isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
|
||||
strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user