Files
codecanyon-rest-api-for-per…/api/migration_web_interface.php
Oussama Douhou 23cc6629f1 license
2025-10-29 19:20:51 +01:00

275 lines
9.2 KiB
PHP

<?php
/**
* Web Interface for API Module Database Migrations
* Access this file through your browser to run migrations
*/
// Define necessary constants
define('BASEPATH', true);
define('APPPATH', '../application/');
define('ENVIRONMENT', 'production');
require_once '../../index.php';
$CI =& get_instance();
// Check if user is admin
if (!is_admin()) {
die('<div style="color: red; font-family: Arial, sans-serif; padding: 20px;">
<h2>Access Denied</h2>
<p>You must be logged in as an administrator to access this page.</p>
<a href="../admin">Go to Admin Panel</a>
</div>');
}
// Check if API module is active
if (!$CI->app_modules->is_active('api')) {
die('<div style="color: red; font-family: Arial, sans-serif; padding: 20px;">
<h2>API Module Not Active</h2>
<p>The API module must be activated before running migrations.</p>
<p>Go to <strong>Setup → Modules</strong> and activate the API module.</p>
<a href="../admin/modules">Go to Modules</a>
</div>');
}
$message = '';
$action = isset($_POST['action']) ? $_POST['action'] : '';
$target_version = isset($_POST['target_version']) ? (int)$_POST['target_version'] : null;
// Handle form submission
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
try {
require_once 'migration_runner.php';
$runner = new APIMigrationRunner();
switch ($action) {
case 'upgrade':
$success = $runner->run($target_version, false);
$message = $success ?
'<div style="color: green;">✅ All migrations completed successfully!</div>' :
'<div style="color: red;">❌ Some migrations failed. Check the output above.</div>';
break;
case 'rollback':
$success = $runner->run($target_version, true);
$message = $success ?
'<div style="color: green;">✅ Rollback completed successfully!</div>' :
'<div style="color: red;">❌ Rollback failed. Check the output above.</div>';
break;
case 'check_status':
// Just show current status
break;
}
} catch (Exception $e) {
$message = '<div style="color: red;">❌ Error: ' . htmlspecialchars($e->getMessage()) . '</div>';
}
}
// Get current status
$current_version = 0;
$migration_table = db_prefix() . 'migrations';
if ($CI->db->table_exists('migrations')) {
$result = $CI->db->select('version')->from('migrations')->where('module', 'api')->get();
if ($result->num_rows() > 0) {
$current_version = $result->row()->version;
}
}
// Get available migrations
$migrations = [];
$files = glob('migrations/*_version_*.php');
foreach ($files as $file) {
if (preg_match('/(\d+)_version_(\d+)\.php$/', basename($file), $matches)) {
$version = (int) $matches[1];
$migrations[$version] = 'Version_' . $matches[1];
}
}
ksort($migrations);
$pending_migrations = array_filter($migrations, function($version) use ($current_version) {
return $version > $current_version;
}, ARRAY_FILTER_USE_KEY);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>API Module Database Migrations</title>
<style>
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
line-height: 1.6;
color: #333;
max-width: 1200px;
margin: 0 auto;
padding: 20px;
background-color: #f5f5f5;
}
.container {
background: white;
padding: 30px;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
h1 {
color: #2c3e50;
border-bottom: 3px solid #3498db;
padding-bottom: 10px;
}
.status {
background: #ecf0f1;
padding: 15px;
border-radius: 5px;
margin: 20px 0;
}
.migration-list {
background: #f8f9fa;
border: 1px solid #dee2e6;
border-radius: 5px;
padding: 15px;
margin: 15px 0;
}
.migration-item {
padding: 5px 0;
border-bottom: 1px solid #eee;
}
.migration-item:last-child {
border-bottom: none;
}
.pending { color: #e74c3c; font-weight: bold; }
.completed { color: #27ae60; }
.form-group {
margin: 15px 0;
}
label {
display: block;
margin-bottom: 5px;
font-weight: bold;
}
select, input[type="number"] {
padding: 8px;
border: 1px solid #ddd;
border-radius: 4px;
width: 200px;
}
.btn {
background: #3498db;
color: white;
padding: 10px 20px;
border: none;
border-radius: 5px;
cursor: pointer;
margin-right: 10px;
}
.btn:hover { background: #2980b9; }
.btn-danger { background: #e74c3c; }
.btn-danger:hover { background: #c0392b; }
.btn-success { background: #27ae60; }
.btn-success:hover { background: #229954; }
.message {
padding: 15px;
margin: 15px 0;
border-radius: 5px;
}
.output {
background: #2c3e50;
color: #ecf0f1;
padding: 20px;
border-radius: 5px;
font-family: 'Courier New', monospace;
white-space: pre-wrap;
margin: 20px 0;
max-height: 400px;
overflow-y: auto;
}
</style>
</head>
<body>
<div class="container">
<h1>🚀 API Module Database Migrations</h1>
<?php if ($message): ?>
<div class="message"><?php echo $message; ?></div>
<?php endif; ?>
<div class="status">
<h3>📊 Current Status</h3>
<p><strong>Current Migration Version:</strong> <?php echo $current_version; ?></p>
<p><strong>API Module Status:</strong> ✅ Active</p>
<p><strong>Database Connection:</strong> ✅ Connected</p>
<p><strong>Pending Migrations:</strong> <?php echo count($pending_migrations); ?></p>
</div>
<div class="migration-list">
<h3>📋 Available Migrations</h3>
<?php if (empty($migrations)): ?>
<p>No migrations found.</p>
<?php else: ?>
<?php foreach ($migrations as $version => $name): ?>
<div class="migration-item <?php echo ($version <= $current_version) ? 'completed' : 'pending'; ?>">
Version <?php echo $version; ?>: <?php echo $name; ?>
<?php if ($version <= $current_version): ?>
<span style="float: right;">✅ Applied</span>
<?php else: ?>
<span style="float: right;">⏳ Pending</span>
<?php endif; ?>
</div>
<?php endforeach; ?>
<?php endif; ?>
</div>
<h3>🔧 Migration Actions</h3>
<form method="post">
<div class="form-group">
<label for="target_version">Target Version (optional):</label>
<input type="number" id="target_version" name="target_version"
placeholder="Leave empty for latest/all"
min="0" value="<?php echo $target_version ?? ''; ?>">
<small>Specify a version number to migrate to that specific version</small>
</div>
<button type="submit" name="action" value="upgrade" class="btn btn-success">
⬆️ Run Upgrade
</button>
<button type="submit" name="action" value="rollback" class="btn btn-danger">
⬇️ Run Rollback
</button>
<button type="submit" name="action" value="check_status" class="btn">
🔄 Refresh Status
</button>
</form>
<?php if (isset($runner)): ?>
<h3>📄 Migration Output</h3>
<div class="output">
<?php
// Capture and display the runner output
ob_start();
$runner->run($target_version, ($action === 'rollback'));
$output = ob_get_clean();
echo htmlspecialchars($output);
?>
</div>
<?php endif; ?>
<h3>📖 Instructions</h3>
<ul>
<li><strong>Upgrade:</strong> Runs all pending migrations to bring the database up to date</li>
<li><strong>Rollback:</strong> Reverts migrations to a previous version (use with caution!)</li>
<li><strong>Target Version:</strong> Specify a version number to migrate to that specific point</li>
<li><strong>Backup First:</strong> Always backup your database before running migrations</li>
</ul>
<p><a href="../admin/modules">← Back to Modules</a></p>
</div>
</body>
</html>