Exibir perfil do usuário

Planejamento Arquitetural do Sistema

  • View (profile.php):

    • Exibe as informações do perfil do usuário, como nome, foto de perfil, bio, número de seguidores, número de usuários seguidos e posts do usuário.

    • Renderiza os componentes de layout, como a barra lateral e o formulário de upload de foto (apenas para o próprio usuário).

  • Controller (profile-user.php):

    • Recupera os dados do perfil do usuário e seus posts utilizando o DAO.

    • Passa os dados para a view.

  • DAO (user-dao.php e posts-dao.php):

    • Executa as queries SQL para buscar as informações do usuário e seus posts.

Na Prática

Arquivo: view/profile.php

<?php
require_once __DIR__ . "/../dir-config.php";
require_once __DIR__ . '/../src/controllers/users/profile-user.php';
?>

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Perfil</title>
    <link rel="stylesheet" href="<?= BASE_URL ?>public/css/profile.css" />
  </head>

  <body>
    <?php include __DIR__ . '/components/side-bar.php'; ?>

    <main class="profile-container">
      <!-- Seção de informações do usuário -->
      <section class="info-section">
        <div class="photo-container">
          <!-- Exibe a foto de perfil do usuário -->
          <img
            src="<?= $profilePhoto; ?>"
            alt="Foto de Perfil"
            class="profile-picture"
          />

          <!-- Botão de edição de perfil (apenas para o próprio usuário) -->
          <?php if ((int)$user_id === (int)$logged_in_user_id): ?>
          <button class="btn-edit">
            <a href="<?= BASE_URL ?>view/profile-update.php?id=<?= $user_id; ?>"
              >Editar Perfil</a
            >
          </button>
          <?php endif; ?>
        </div>

        <div class="user-info">
          <!-- Exibe o nome do usuário -->
          <h1 class="user-name"><?php echo $userName; ?></h1>
          <div class="stats-container">
            <!-- Exibe o número de seguidores e usuários seguidos -->
            <span class="following"
              ><?= $following; ?>
              seguindo</span
            >
            <span class="followers"
              ><?= $followers; ?>
              seguidores</span
            >
          </div>

          <!-- Formulário para seguir/deixar de seguir (apenas para outros usuários) -->
          <?php if ((int)$user_id !== (int)$logged_in_user_id): ?>
          <form method="POST">
            <input
              type="hidden"
              name="action"
              value="<?= $isFollowing ? 'unfollow' : 'follow' ?>"
            />
            <button type="submit" class="btn-follow">
              <?= $isFollowing ? 'Deixar de seguir' : 'Seguir' ?>
            </button>
          </form>
          <?php endif; ?>
        </div>

        <!-- Botão de postagem (apenas para o próprio usuário) -->
        <?php if ((int)$user_id === (int)$logged_in_user_id && !empty($userPosts)): ?>
        <div class="upload-more-photos">
          <div class="upload-container">
            <form
              action="<?= BASE_URL ?>src/controllers/posts/upload-feed-photo.php"
              method="POST"
              enctype="multipart/form-data"
            >
              <label for="photo-top"> Adicionar foto </label>
              <input type="file" id="photo-top" name="photo" accept="image/*" />
              <button type="submit" class="btn-upload">Enviar</button>
            </form>
          </div>
        </div>
        <?php endif; ?>
      </section>

      <!-- Seção da foto do feed -->
      <section class="info-section">
        <div class="feed-photo-container">
          <?php if ($userPosts): ?>
          <?php
                    if (isset($userPosts[0]['photo_url'])) {
                        $relativePath = BASE_URL . "uploads/feed/" . htmlspecialchars($userPosts[0]['photo_url']);
                        ?>
          <img
            src="<?= $relativePath; ?>"
            alt="Imagem do Feed"
            class="feed-image"
          />
          <?php } ?>
          <?php endif; ?>
        </div>

        <!-- Formulário de upload de foto (apenas para o próprio usuário e se não houver foto) -->
        <?php if (empty($userPosts) && (int)$user_id === (int)$logged_in_user_id): ?>
        <div class="pai-do-upload-container">
          <div class="upload-container">
            <form
              action="<?= BASE_URL ?>src/controllers/posts/upload-feed-photo.php"
              method="POST"
              enctype="multipart/form-data"
            >
              <label for="photo">
                <img
                  src="<?= BASE_URL ?>public/img/add-photo.svg"
                  class="icon"
                />
                <br />
                Adicionar foto
              </label>
              <input type="file" id="photo" name="photo" accept="image/*" />
              <button type="submit" class="btn-upload">Enviar</button>
            </form>
          </div>
        </div>
        <?php endif; ?>
      </section>
    </main>
  </body>
</html>
  • Responsabilidade:

    • Exibe as informações do perfil do usuário, como nome, foto de perfil, bio, número de seguidores e usuários seguidos.

    • Renderiza os posts do usuário (se houver).

    • Exibe um formulário de upload de foto apenas para o próprio usuário.

    • Inclui a barra lateral e outros componentes de layout.


Arquivo: src/controllers/users/profile-user.php

<?php
require_once __DIR__ . '/../../../database.php';
require_once __DIR__ . '/../../dao/follow-dao.php';
require_once __DIR__ . '/../../dao/user-dao.php';
require_once __DIR__ . '/../../../dir-config.php';
require_once __DIR__ . '/../../dao/posts-dao.php';
require_once __DIR__ . "/../../utils/follow-handler.php";

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

$user_id = isset($_GET['id']) ? intval($_GET['id']) : $_SESSION['user_id'];
$logged_in_user_id = $_SESSION['user_id'];

$userDao = new UserDao();
$user = $userDao->getUserProfileById($user_id);

if (!$user) {
    die("<p>Usuário não encontrado.</p>");
}

$userName = $user['username'];
$profilePhoto = !empty($user['profile_pic_url'])
    ? BASE_URL . 'uploads/avatars/' . htmlspecialchars($user['profile_pic_url'])
    : BASE_URL . 'public/img/profile.svg';

$followDao = new FollowDao();
$isFollowing = $followDao->isFollowing($user_id, $logged_in_user_id);

$followers = $followDao->getFollowers($user_id);
$following = $followDao->getFollowing($user_id);

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) {
    $action = $_POST['action'];

    $followHandler = new FollowHandler();
    $followHandler->handleFollow($user_id, $logged_in_user_id, $isFollowing, $action);
}

$postsDao = new PostsDao();
$userPosts = $postsDao->getPostsById($user_id);

$userProfileData = [
    'username' => htmlspecialchars($user['username']),
    'user_id' => $user_id,
    'logged_in_user_id' => $logged_in_user_id,
    'profile_Pic_Url' => htmlspecialchars($profilePhoto ?? ''),
    'is_Following' => $isFollowing,
    'followers' => $followers,
    'following' => $following,
    'bio' => htmlspecialchars($user['bio'] ?? ''),
    'photos' => $userPosts,
];
?>
  • Responsabilidade:

    • Inicia a sessão e verifica se o usuário está logado.

    • Recupera o ID do usuário a partir da URL ou da sessão.

    • Busca as informações do perfil do usuário utilizando o UserDao.

    • Verifica se o usuário logado está seguindo o perfil exibido.

    • Busca o número de seguidores e usuários seguidos.

    • Busca os posts do usuário utilizando o PostsDao.

    • Passa os dados para a view.


Arquivo: src/dao/user-dao.php

public function getUserProfileById($id) {
    $query = "SELECT id, username, email, phone, bio, profile_pic_url, count_followers, count_following FROM users WHERE id = :id";
    $stmt = $this->db->prepare($query);
    $stmt->execute([':id' => $id]);

    return $stmt->fetch();
}
  • Responsabilidade:

    • Executa uma query SQL para buscar as informações do perfil do usuário (nome, e-mail, telefone, bio, foto de perfil, número de seguidores e usuários seguidos).

    • Retorna um array associativo com os dados do usuário.


Arquivo: src/dao/posts-dao.php

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

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

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

    • 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 perfil (profile.php).

  2. O controller (profile-user.php) é chamado para recuperar os dados do perfil e os posts do usuário.

  3. O controller utiliza o UserDao para buscar as informações do perfil e o PostsDao para buscar os posts.

  4. Os dados são passados para a view (profile.php).

  5. A view renderiza as informações do perfil e os posts do usuário