Criação de posts no feed

Planejamento Arquitetural do Sistema

  • View (profile.php):

    • Exibe um formulário para o usuário fazer upload de uma foto para o feed.

    • O formulário é exibido apenas para o próprio usuário (não para outros usuários).

    • O formulário envia os dados para o controller (upload-feed.php) via método POST.

  • Controller (upload-feed.php):

    • Recebe os dados do formulário (arquivo de imagem).

    • Valida e processa o upload da imagem.

    • Chama o DAO para persistir os dados no banco.

  • DAO (posts-dao.php):

    • Executa a query SQL para inserir o post no banco de dados.

Na prática

Arquivo: t06-crud-php/view/profile.php

<!-- Formulário de upload de foto (apenas para o próprio usuário) -->
<?php if ((int)$user_id === (int)$logged_in_user_id): ?>
<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>
<?php endif; ?>
  • Responsabilidade:

    • Exibe um formulário para upload de fotos no feed.

    • O formulário só é exibido se o usuário logado estiver visualizando seu próprio perfil.

    • O formulário envia o arquivo para o controller (upload-feed.php) via POST.


Arquivo: src/controllers/posts/upload-feed.php

<?php
session_start();

require_once __DIR__ . "/../../dao/posts-dao.php";
require_once __DIR__ . "/../../../dir-config.php";
require_once __DIR__ . "/../../utils/upload-handler.php";

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

$user_id = $_SESSION['user_id'];
$postsDao = new PostsDao();

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['photo'])) {
    $uploadDir = '../../../uploads/feed/';
    $allowedTypes = ['jpg', 'jpeg', 'png', 'gif'];

    $dbUpdateCallback = function ($photoUrl) use ($user_id, $postsDao) {
        return $postsDao->createPost($user_id, $photoUrl);
    };

    $uploadResult = UploadHandler::handleUpload($_FILES['photo'], $uploadDir, $allowedTypes, $dbUpdateCallback);

    if ($uploadResult['success']) {
        $_SESSION['success'] = "Foto do feed atualizada com sucesso!";
    } else {
        $_SESSION['error'] = $uploadResult['error'];
    }
    header("Location: " . BASE_URL . "view/profile.php");
    exit;
}
?>
  • Responsabilidade:

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

    • Recebe o arquivo enviado pelo formulário ($\_FILES['photo']).

    • Define o diretório de upload e os tipos de arquivo permitidos.

    • Utiliza o UploadHandler para processar o upload da imagem.

    • Após o upload bem-sucedido, chama o método createPost do DAO para inserir o post no banco de dados.

    • Redireciona o usuário de volta para a página de perfil com uma mensagem de sucesso ou erro.


Arquivo: src/dao/posts-dao.php

public function createPost($userId, $photo_url) {
    $sql = "INSERT INTO posts (user_id, photo_url) VALUES (:userId, :photo_url)";
    $stmt = $this->db->prepare($sql);
    return $stmt->execute([':userId' => $userId, ':photo_url' => $photo_url]);
}
  • Responsabilidade:

    • Executa a query SQL para inserir um novo post na tabela posts.

    • Recebe o ID do usuário e a URL da foto como parâmetros.

    • Retorna true se a inserção for bem-sucedida.


Arquivo: src/utils/upload-handler.php

public static function handleUpload($file, $uploadDir, $allowedTypes, $dbUpdateCallback) {
    if (!is_dir($uploadDir)) {
        mkdir($uploadDir, 0777, true);
    }
    $fileType = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));

    if (!in_array($fileType, $allowedTypes)) {
        return ['success' => false, 'error' => "Apenas arquivos " . implode(", ", $allowedTypes) . " são permitidos."];
    }

    $fileName = uniqid() . '_' . basename($file['name']);
    $targetFile = $uploadDir . $fileName;

    if (move_uploaded_file($file['tmp_name'], $targetFile)) {
        $photoUrl = $fileName;
        $dbUpdateResult = $dbUpdateCallback($photoUrl);

        if ($dbUpdateResult) {
            return ['success' => true, 'photoUrl' => $photoUrl];
        } else {
            return ['success' => false, 'error' => "Erro ao atualizar o banco de dados."];
        }
    } else {
        return ['success' => false, 'error' => "Erro ao fazer upload da imagem."];
    }
}
  • Responsabilidade:

    • Valida o tipo de arquivo e move o arquivo para o diretório de upload.

    • Gera um nome único para o arquivo.

    • Chama o callback ($dbUpdateCallback) para atualizar o banco de dados com a URL da foto.

    • Retorna um array com o status do upload e a URL da foto (em caso de sucesso) ou uma mensagem de erro.


Fluxo Completo

  1. O usuário acessa a página de perfil (profile.php) e vê o formulário de upload de foto (se for o próprio perfil).

  2. O usuário seleciona uma imagem e clica em "Enviar".

  3. O formulário envia a imagem para o controller (upload-feed.php).

  4. O controller processa o upload da imagem usando o UploadHandler.

  5. Após o upload, o controller chama o método createPost do DAO para inserir o post no banco de dados.

  6. O usuário é redirecionado de volta para a página de perfil com uma mensagem de sucesso ou erro.