// ============================================ // SISTEMA DE LIKES Y REACCIONES // ============================================ /** * Obtener conteo de likes para un contenido */ function get_likes_count($content_type, $content_id) { global $db; $stmt = $db->prepare("SELECT COUNT(*) as count FROM likes WHERE content_type = ? AND content_id = ?"); $stmt->execute([$content_type, $content_id]); $result = $stmt->fetch(); return $result['count'] ?? 0; } /** * Verificar si el usuario actual ha dado like */ function user_has_liked($content_type, $content_id, $user_id) { global $db; $stmt = $db->prepare("SELECT id FROM likes WHERE content_type = ? AND content_id = ? AND user_id = ?"); $stmt->execute([$content_type, $content_id, $user_id]); return $stmt->fetch() !== false; } /** * Toggle like (agregar o quitar) */ function toggle_like($content_type, $content_id, $user_id) { global $db; try { $db->beginTransaction(); // Verificar si ya existe $stmt = $db->prepare("SELECT id FROM likes WHERE content_type = ? AND content_id = ? AND user_id = ?"); $stmt->execute([$content_type, $content_id, $user_id]); $existing = $stmt->fetch(); if ($existing) { // Eliminar like $stmt = $db->prepare("DELETE FROM likes WHERE content_type = ? AND content_id = ? AND user_id = ?"); $stmt->execute([$content_type, $content_id, $user_id]); $action = 'removed'; } else { // Agregar like $stmt = $db->prepare("INSERT INTO likes (content_type, content_id, user_id) VALUES (?, ?, ?)"); $stmt->execute([$content_type, $content_id, $user_id]); $action = 'added'; } // Actualizar contador en la tabla principal $table_map = [ 'blog_post' => 'blog_posts', 'investigation' => 'investigations', 'esoterism' => 'esoterism_content' ]; if (isset($table_map[$content_type])) { $table = $table_map[$content_type]; $count = get_likes_count($content_type, $content_id); $stmt = $db->prepare("UPDATE {$table} SET likes_count = ? WHERE id = ?"); $stmt->execute([$count, $content_id]); } $db->commit(); return ['success' => true, 'action' => $action, 'count' => get_likes_count($content_type, $content_id)]; } catch (Exception $e) { $db->rollBack(); return ['success' => false, 'error' => $e->getMessage()]; } } // ============================================ // SISTEMA DE COMENTARIOS // ============================================ /** * Obtener comentarios de un contenido */ function get_comments($content_type, $content_id, $parent_id = null) { global $db; $sql = "SELECT c.*, u.username, u.first_name, u.last_name, u.profile_image FROM comments c INNER JOIN users u ON c.user_id = u.id WHERE c.content_type = ? AND c.content_id = ? AND c.is_approved = 1"; if ($parent_id === null) { $sql .= " AND c.parent_id IS NULL"; $params = [$content_type, $content_id]; } else { $sql .= " AND c.parent_id = ?"; $params = [$content_type, $content_id, $parent_id]; } $sql .= " ORDER BY c.created_at DESC"; $stmt = $db->prepare($sql); $stmt->execute($params); return $stmt->fetchAll(); } /** * Contar comentarios de un contenido */ function get_comments_count($content_type, $content_id) { global $db; $stmt = $db->prepare("SELECT COUNT(*) as count FROM comments WHERE content_type = ? AND content_id = ? AND is_approved = 1"); $stmt->execute([$content_type, $content_id]); $result = $stmt->fetch(); return $result['count'] ?? 0; } /** * Agregar comentario */ function add_comment($content_type, $content_id, $user_id, $comment, $parent_id = null) { global $db; try { $db->beginTransaction(); // Insertar comentario $stmt = $db->prepare(" INSERT INTO comments (content_type, content_id, user_id, comment, parent_id) VALUES (?, ?, ?, ?, ?) "); $stmt->execute([$content_type, $content_id, $user_id, $comment, $parent_id]); // Actualizar contador $table_map = [ 'blog_post' => 'blog_posts', 'investigation' => 'investigations', 'esoterism' => 'esoterism_content' ]; if (isset($table_map[$content_type])) { $table = $table_map[$content_type]; $count = get_comments_count($content_type, $content_id); $stmt = $db->prepare("UPDATE {$table} SET comments_count = ? WHERE id = ?"); $stmt->execute([$count, $content_id]); } $db->commit(); return ['success' => true, 'message' => 'Comentario agregado exitosamente']; } catch (Exception $e) { $db->rollBack(); return ['success' => false, 'error' => $e->getMessage()]; } } /** * Renderizar HTML de comentarios */ function render_comments($comments, $content_type, $content_id, $depth = 0) { $html = ''; foreach ($comments as $comment) { $author_name = !empty($comment['first_name']) ? $comment['first_name'] . ' ' . $comment['last_name'] : $comment['username']; $avatar_letter = strtoupper(substr($author_name, 0, 1)); $time_ago = time_ago($comment['created_at']); $html .= '
'; $html .= '
'; $html .= '
' . $avatar_letter . '
'; $html .= '
'; $html .= '
' . htmlspecialchars($author_name) . '
'; $html .= '
' . $time_ago . '
'; $html .= '
'; $html .= '
'; $html .= '
' . nl2br(htmlspecialchars($comment['comment'])) . '
'; if (is_logged_in()) { $html .= '
'; $html .= '💬 Responder'; $html .= '
'; $html .= ''; } // Respuestas $replies = get_comments($content_type, $content_id, $comment['id']); if (!empty($replies)) { $html .= render_comments($replies, $content_type, $content_id, $depth + 1); } $html .= '
'; } return $html; } /** * Calcular tiempo transcurrido */ function time_ago($datetime) { $timestamp = strtotime($datetime); $diff = time() - $timestamp; if ($diff < 60) { return 'Hace un momento'; } elseif ($diff < 3600) { $minutes = floor($diff / 60); return "Hace {$minutes} minuto" . ($minutes > 1 ? 's' : ''); } elseif ($diff < 86400) { $hours = floor($diff / 3600); return "Hace {$hours} hora" . ($hours > 1 ? 's' : ''); } elseif ($diff < 604800) { $days = floor($diff / 86400); return "Hace {$days} día" . ($days > 1 ? 's' : ''); } else { return date('d/m/Y', $timestamp); } } // ============================================ // GALERÍA DE IMÁGENES // ============================================ /** * Obtener imágenes de galería de una investigación */ function get_investigation_gallery($investigation_id) { global $db; $stmt = $db->prepare(" SELECT ig.*, u.username FROM investigation_gallery ig LEFT JOIN users u ON ig.uploaded_by = u.id WHERE ig.investigation_id = ? ORDER BY ig.display_order ASC, ig.created_at ASC "); $stmt->execute([$investigation_id]); return $stmt->fetchAll(); } /** * Agregar imagen a galería */ function add_gallery_image($investigation_id, $image_path, $caption, $user_id, $display_order = 0) { global $db; try { $stmt = $db->prepare(" INSERT INTO investigation_gallery (investigation_id, image_path, caption, uploaded_by, display_order) VALUES (?, ?, ?, ?, ?) "); $stmt->execute([$investigation_id, $image_path, $caption, $user_id, $display_order]); return ['success' => true, 'message' => 'Imagen agregada a la galería']; } catch (Exception $e) { return ['success' => false, 'error' => $e->getMessage()]; } } Iniciar Sesión - FakeGhost
?>

Iniciar Sesión

¿Olvidaste tu contraseña?

¿No tienes cuenta? Regístrate aquí