Files
whatsapp/api/edit_message.php
T
2026-02-03 21:30:55 -05:00

161 lines
5.5 KiB
PHP

<?php
/**
* API - Editar mensaje
* Permite editar el contenido de un mensaje enviado (solo mensajes propios/outgoing)
* Fecha: 28 de enero de 2026
*/
// Habilitar display de errores para debug
ini_set('display_errors', 1);
error_reporting(E_ALL);
require_once '../config/config.php';
// Log para debug
error_log("edit_message.php: Iniciando, session_id=" . session_id() . ", admin_logged_in=" . (isset($_SESSION['admin_logged_in']) ? $_SESSION['admin_logged_in'] : 'no definido'));
requireAuthentication();
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
// Manejar preflight OPTIONS request
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(200);
exit;
}
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405);
echo json_encode(['success' => false, 'error' => 'Método no permitido. Use POST.']);
exit;
}
try {
$input = json_decode(file_get_contents('php://input'), true);
if (!$input) {
http_response_code(400);
echo json_encode(['success' => false, 'error' => 'JSON inválido']);
exit;
}
$messageId = $input['message_id'] ?? $input['id'] ?? null;
$newContent = $input['content'] ?? $input['new_content'] ?? null;
if (!$messageId) {
http_response_code(400);
echo json_encode(['success' => false, 'error' => 'message_id es requerido']);
exit;
}
if ($newContent === null || trim($newContent) === '') {
http_response_code(400);
echo json_encode(['success' => false, 'error' => 'El contenido no puede estar vacío']);
exit;
}
$db = Database::getInstance();
// Buscar el mensaje
$sql = "SELECT id, user_id, direction, message_type, content, message_id as wa_message_id
FROM conversations
WHERE id = :mid1 OR message_id = :mid2
LIMIT 1";
$message = $db->fetch($sql, ['mid1' => $messageId, 'mid2' => $messageId]);
if (!$message) {
http_response_code(404);
echo json_encode(['success' => false, 'error' => 'Mensaje no encontrado']);
exit;
}
// Solo permitir editar mensajes salientes (outgoing)
if ($message['direction'] !== 'outgoing') {
http_response_code(403);
echo json_encode(['success' => false, 'error' => 'Solo puedes editar tus propios mensajes']);
exit;
}
// Solo permitir editar mensajes de texto
if ($message['message_type'] !== 'text' && $message['message_type'] !== null) {
http_response_code(400);
echo json_encode(['success' => false, 'error' => 'Solo se pueden editar mensajes de texto']);
exit;
}
// Guardar contenido original para historial (opcional)
$originalContent = $message['content'];
// Verificar si existe la columna edited_at
$hasEditedAt = false;
try {
$columns = $db->fetchAll("SHOW COLUMNS FROM conversations WHERE Field = 'edited_at'");
$hasEditedAt = !empty($columns);
} catch (Exception $e) {
// Ignorar
}
// Actualizar el mensaje en la base de datos
if ($hasEditedAt) {
$updateSql = "UPDATE conversations SET content = :content, edited_at = NOW() WHERE id = :id";
} else {
$updateSql = "UPDATE conversations SET content = :content WHERE id = :id";
}
$db->execute($updateSql, [
'content' => trim($newContent),
'id' => $message['id']
]);
// Registrar la edición en el log
error_log("Message edited: ID={$message['id']}, User={$message['user_id']}, Original='{$originalContent}', New='{$newContent}'");
// Intentar notificar por SSE si está disponible
try {
$ssePayload = [
'type' => 'message_edited',
'user_id' => $message['user_id'],
'message_id' => $message['id'],
'wa_message_id' => $message['wa_message_id'],
'new_content' => trim($newContent),
'edited_at' => date('Y-m-d H:i:s')
];
// Llamar al endpoint push_event interno
$pushUrl = 'http://127.0.0.1' . dirname($_SERVER['SCRIPT_NAME']) . '/push_event.php';
$ch = curl_init($pushUrl);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'event_type' => 'message_edited',
'data' => $ssePayload,
'target_user_id' => 'all'
]));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 2);
curl_exec($ch);
curl_close($ch);
} catch (Exception $sseErr) {
error_log("edit_message: SSE notification failed: " . $sseErr->getMessage());
}
echo json_encode([
'success' => true,
'message' => 'Mensaje editado correctamente',
'data' => [
'id' => $message['id'],
'message_id' => $message['wa_message_id'],
'new_content' => trim($newContent),
'edited_at' => date('Y-m-d H:i:s')
]
]);
} catch (Exception $e) {
error_log('edit_message.php error: ' . $e->getMessage() . ' | Trace: ' . $e->getTraceAsString());
http_response_code(500);
echo json_encode(['success' => false, 'error' => 'Error interno del servidor', 'debug' => $e->getMessage()]);
}