Exibição dos posts de todos os usuários no feed

Planejamento Arquitetural do Sistema

  • View (feed.php):

    • Exibe os posts de todos os usuários em um feed.

    • Itera sobre a lista de posts e renderiza cada um deles com informações como foto de perfil, nome do usuário e imagem do post.

  • Controller (get-all-posts.php):

    • Recupera todos os posts do banco de dados utilizando o DAO.

    • Passa os dados dos posts para a view.

  • DAO (posts-dao.php):

    • Executa a query SQL para buscar todos os posts, juntamente com as informações do usuário que fez o post.

Na prática

Arquivo: Arquivo: view/feed.php

<?php
require_once __DIR__ . '/../dir-config.php';
require_once __DIR__ . '/../src/controllers/posts/get-all-posts.php';
?>

<!DOCTYPE html>
<html lang="pt-br">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Página Principal</title>
    <link rel="stylesheet" href="<?= BASE_URL ?>public/css/home.css" />
  </head>

  <body class="home-page">
    <?php include __DIR__ . '/components/side-bar.php'; ?>

    <!-- Conteúdo Principal -->
    <main class="container">
      <!-- Seção de Feed de Posts -->
      <section class="feed">
        <?php if ($posts): ?>
        <!-- Itera sobre cada post -->
        <?php foreach ($posts as $post): ?>
        <article class="post">
          <!-- Cabeçalho do Post: Informações do Usuário -->
          <header class="user-info">
            <!-- Container da Foto de Perfil -->
            <div class="avatar" aria-label="Foto do Usuário">
              <?php
                                // Define a foto de perfil do usuário
                                $profilePhoto = !empty($post['profile_pic_url'])
                                    ? BASE_URL . 'uploads/' . htmlspecialchars($post['profile_pic_url'])
                                    : BASE_URL . 'public/img/profile.svg';
                                ?>
              <img
                src="<?= $profilePhoto; ?>"
                alt="Foto de Perfil"
                class="profile-picture"
              />
            </div>

            <!-- Link para o Perfil do Usuário -->
            <a
              href="<?= BASE_URL ?>view/profile.php?id=<?= htmlspecialchars($post['user_id'] ?? '') ?>"
              class="username"
            >
              <?= htmlspecialchars($post['username'] ?? '') ?>
            </a>
          </header>

          <!-- Container da Imagem do Post -->
          <div class="image-placeholder" aria-label="Imagem do Post">
            <?php if (!empty($post['photo_url'])): ?>
            <!-- Exibe a imagem do post, se houver -->
            <img
              src="<?= BASE_URL . 'uploads/feed/' . htmlspecialchars($post['photo_url']) ?>"
              alt="Imagem do post"
            />
            <?php endif; ?>
          </div>
        </article>

        <!-- Divisor entre os posts -->
        <hr class="divider" />
        <?php endforeach; ?>
        <?php else: ?>
        <p>0 postagens no seu feed</p>
        <?php endif; ?>
      </section>
    </main>
  </body>
</html>
  • Responsabilidade:

    • Exibe os posts de todos os usuários.

    • Itera sobre a lista de posts ($posts) e renderiza cada post com:

      • Foto de perfil do usuário.

      • Nome do usuário (com link para o perfil).

      • Imagem do post.

  • Se não houver posts, exibe uma mensagem informando que não há postagens.


Arquivo: src/controllers/posts/get-all-posts.php

<?php
require __DIR__ . '/../../dao/posts-dao.php';

if (!isset($_SESSION['user_id'])) {
    header("Location: " . BASE_URL . "view/login.php");
    exit;
}

try {
    $postsDao = new PostsDao();
    $posts = $postsDao->getAllPosts();
} catch (PDOException $e) {
    die("Erro ao buscar dados: " . $e->getMessage());
}
  • Responsabilidade:

    • Verifica se o usuário está logado (caso contrário, redireciona para a página de login).

    • Instancia o PostsDao e chama o método getAllPosts para recuperar todos os posts.

    • Em caso de erro, exibe uma mensagem de erro.


Arquivo: src/dao/posts-dao.php

public function getAllPosts() {
    $sql = "SELECT p.id, p.photo_url, p.user_id, p.upload_date, p.description, u.username, u.profile_pic_url
            FROM posts p
            JOIN users u ON p.user_id = u.id
            ORDER BY p.upload_date DESC";

    $stmt = $this->db->prepare($sql);
    $stmt->execute();
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
  • Responsabilidade:

    • Executa uma query SQL para buscar todos os posts, juntamente com as informações do usuário que fez o post (nome e foto de perfil).

    • Ordena os posts pela data de upload (do mais recente para o mais antigo).

    • Retorna um array associativo com os dados dos posts.


Fluxo Completo

  1. O usuário acessa a página de feed (feed.php).

  2. O controller (get-all-posts.php) é chamado para recuperar os posts do banco de dados.

  3. O controller utiliza o DAO (posts-dao.php) para buscar todos os posts.

  4. Os dados dos posts são passados para a view (feed.php).

  5. A view itera sobre os posts e renderiza cada um deles com as informações do usuário e a imagem do post.

  6. Se não houver posts, a view exibe uma mensagem informando que não há postagens.