rol !== 'Admin') { http_response_code(403); echo json_encode(['success' => false, 'error' => 'Acceso denegado. Se requieren permisos de Administrador.']); exit; } if ($_SERVER['REQUEST_METHOD'] !== 'POST') { http_response_code(405); echo json_encode(['success' => false, 'error' => 'Método no permitido']); exit; } $data = json_decode(file_get_contents('php://input'), true); if (empty($data['id']) || empty($data['username']) || empty($data['rol_id'])) { http_response_code(400); echo json_encode(['success' => false, 'error' => 'Faltan datos obligatorios']); exit; } $userId = (int)$data['id']; // Evitar que se modifique a sí mismo el rol (para no quedarse sin acceso admin) // Aunque el sistema debería permitir cambiar otros datos if ($userId == $userData->userId && $data['rol_id'] != 1) { // Asumiendo rol_id 1 es Admin // Verificar si el rol actual es Admin // Mejor lógica: obtener el nombre del rol nuevo // Por simplicidad: advertencia si intenta quitarse admin } try { $db = getDB(); // Verificar si el usuario existe $stmt = $db->prepare("SELECT id FROM usuarios WHERE id = ?"); $stmt->execute([$userId]); if (!$stmt->fetch()) { http_response_code(404); echo json_encode(['success' => false, 'error' => 'Usuario no encontrado']); exit; } // Verificar nombre de usuario duplicado (excluyendo el actual) $stmt = $db->prepare("SELECT id FROM usuarios WHERE username = ? AND id != ?"); $stmt->execute([$data['username'], $userId]); if ($stmt->fetch()) { http_response_code(400); echo json_encode(['success' => false, 'error' => 'El nombre de usuario ya existe']); exit; } $db->beginTransaction(); // Actualizar datos básicos $sql = "UPDATE usuarios SET username = ?, email = ?, rol_id = ?"; $params = [$data['username'], $data['email'] ?? null, $data['rol_id']]; // Actualizar contraseña solo si se envía if (!empty($data['password'])) { $sql .= ", password = ?"; $params[] = md5($data['password']); } $sql .= " WHERE id = ?"; $params[] = $userId; $stmt = $db->prepare($sql); $stmt->execute($params); // Actualizar permisos // Primero eliminar los existentes $db->prepare("DELETE FROM usuarios_permisos WHERE usuario_id = ?")->execute([$userId]); // Insertar los nuevos if (!empty($data['permisos']) && is_array($data['permisos'])) { $stmtPerm = $db->prepare("INSERT INTO usuarios_permisos (usuario_id, permiso_id) VALUES (?, ?)"); foreach ($data['permisos'] as $permisoId) { $stmtPerm->execute([$userId, $permisoId]); } } $db->commit(); echo json_encode(['success' => true, 'message' => 'Usuario actualizado correctamente']); } catch (Exception $e) { if ($db->inTransaction()) { $db->rollBack(); } http_response_code(500); echo json_encode(['success' => false, 'error' => 'Error al actualizar usuario: ' . $e->getMessage()]); }