up
This commit is contained in:
@@ -0,0 +1,103 @@
|
||||
<?php
|
||||
/**
|
||||
* Migración - Agregar columnas para edición y eliminación de mensajes
|
||||
* Fecha: 28 de enero de 2026
|
||||
*/
|
||||
|
||||
require_once 'config/config.php';
|
||||
|
||||
echo "<h2>Migración: Columnas para editar/eliminar mensajes</h2>\n";
|
||||
echo "<pre>\n";
|
||||
|
||||
try {
|
||||
$db = Database::getInstance();
|
||||
|
||||
// Verificar si las columnas ya existen
|
||||
$columns = [];
|
||||
$result = $db->fetchAll("SHOW COLUMNS FROM conversations");
|
||||
foreach ($result as $row) {
|
||||
$columns[] = $row['Field'];
|
||||
}
|
||||
|
||||
$migrationsNeeded = [];
|
||||
|
||||
// Columna edited_at
|
||||
if (!in_array('edited_at', $columns)) {
|
||||
$migrationsNeeded[] = [
|
||||
'column' => 'edited_at',
|
||||
'sql' => "ALTER TABLE conversations ADD COLUMN edited_at DATETIME NULL DEFAULT NULL COMMENT 'Fecha de última edición'"
|
||||
];
|
||||
} else {
|
||||
echo "✅ Columna 'edited_at' ya existe\n";
|
||||
}
|
||||
|
||||
// Columna deleted_at (para soft delete)
|
||||
if (!in_array('deleted_at', $columns)) {
|
||||
$migrationsNeeded[] = [
|
||||
'column' => 'deleted_at',
|
||||
'sql' => "ALTER TABLE conversations ADD COLUMN deleted_at DATETIME NULL DEFAULT NULL COMMENT 'Fecha de eliminación (soft delete)'"
|
||||
];
|
||||
} else {
|
||||
echo "✅ Columna 'deleted_at' ya existe\n";
|
||||
}
|
||||
|
||||
// Columna original_content (para guardar contenido original antes de eliminar)
|
||||
if (!in_array('original_content', $columns)) {
|
||||
$migrationsNeeded[] = [
|
||||
'column' => 'original_content',
|
||||
'sql' => "ALTER TABLE conversations ADD COLUMN original_content TEXT NULL DEFAULT NULL COMMENT 'Contenido original (antes de eliminar)'"
|
||||
];
|
||||
} else {
|
||||
echo "✅ Columna 'original_content' ya existe\n";
|
||||
}
|
||||
|
||||
// Ejecutar migraciones pendientes
|
||||
if (count($migrationsNeeded) > 0) {
|
||||
echo "\n📦 Ejecutando " . count($migrationsNeeded) . " migración(es)...\n\n";
|
||||
|
||||
foreach ($migrationsNeeded as $migration) {
|
||||
echo "➡️ Agregando columna '{$migration['column']}'...\n";
|
||||
try {
|
||||
$db->execute($migration['sql']);
|
||||
echo " ✅ Columna '{$migration['column']}' agregada correctamente\n";
|
||||
} catch (Exception $e) {
|
||||
echo " ❌ Error: " . $e->getMessage() . "\n";
|
||||
}
|
||||
}
|
||||
|
||||
// Agregar índice para optimizar búsquedas de mensajes no eliminados
|
||||
echo "\n➡️ Verificando índices...\n";
|
||||
try {
|
||||
$indexes = $db->fetchAll("SHOW INDEX FROM conversations WHERE Key_name = 'idx_deleted_at'");
|
||||
if (empty($indexes)) {
|
||||
$db->execute("ALTER TABLE conversations ADD INDEX idx_deleted_at (deleted_at)");
|
||||
echo " ✅ Índice 'idx_deleted_at' creado\n";
|
||||
} else {
|
||||
echo " ✅ Índice 'idx_deleted_at' ya existe\n";
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
echo " ⚠️ Índice no pudo crearse: " . $e->getMessage() . "\n";
|
||||
}
|
||||
|
||||
echo "\n✅ Migración completada!\n";
|
||||
} else {
|
||||
echo "\n✅ No hay migraciones pendientes. La base de datos está actualizada.\n";
|
||||
}
|
||||
|
||||
// Mostrar estructura actual de la tabla
|
||||
echo "\n📋 Estructura actual de la tabla 'conversations':\n";
|
||||
echo str_repeat('-', 60) . "\n";
|
||||
$result = $db->fetchAll("SHOW COLUMNS FROM conversations");
|
||||
foreach ($result as $row) {
|
||||
$null = $row['Null'] === 'YES' ? 'NULL' : 'NOT NULL';
|
||||
$default = $row['Default'] !== null ? "DEFAULT '{$row['Default']}'" : '';
|
||||
echo sprintf(" %-25s %-20s %s %s\n", $row['Field'], $row['Type'], $null, $default);
|
||||
}
|
||||
|
||||
} catch (Exception $e) {
|
||||
echo "❌ Error fatal: " . $e->getMessage() . "\n";
|
||||
echo "Stack trace: " . $e->getTraceAsString() . "\n";
|
||||
}
|
||||
|
||||
echo "</pre>\n";
|
||||
echo "<p><a href='conversations.php'>← Volver a conversaciones</a></p>\n";
|
||||
Reference in New Issue
Block a user