Actualiser api/post.php

This commit is contained in:
yasss2627 2026-01-14 08:50:09 +00:00
parent c8b418118d
commit fcb30cd19f

View File

@ -1,37 +1,112 @@
<?php
session_start();
header('Content-Type: application/json');
require '../config/db.php';
require '../lib/RateLimit.php';
require '../lib/FileValidator.php';
$env = require '../config/env.php';
$rateLimit = new RateLimit($pdo);
$fileValidator = new FileValidator();
$userId = $_SESSION['user_id'] ?? null;
if(!$userId){
echo json_encode(['success'=>false,'message'=>'Vous devez être connecté']);
if (!$userId) {
http_response_code(401);
echo json_encode(['success' => false, 'message' => 'Vous devez être connecté']);
exit;
}
// Rate limiting : 1 post par minute par utilisateur
if ($rateLimit->isBlocked($userId, 'post', 1, 60)) {
http_response_code(429);
echo json_encode(['success' => false, 'message' => 'Vous ne pouvez poster qu\'une fois par minute']);
exit;
}
$content = trim($_POST['content'] ?? '');
if(!$content){
echo json_encode(['success'=>false,'message'=>'Message vide']);
if (empty($content)) {
http_response_code(400);
echo json_encode(['success' => false, 'message' => 'Le message ne peut pas être vide']);
exit;
}
// Insertion du message
$stmt = $pdo->prepare("INSERT INTO messages (id_utilisateur, contenu, date_creation)>
if (strlen($content) > 5000) {
http_response_code(400);
echo json_encode(['success' => false, 'message' => 'Le message ne doit pas dépasser 5000 caractères']);
exit;
}
// Insérer le message
$stmt = $pdo->prepare(
"INSERT INTO `{$env['TABLE_MESSAGES']}` (id_utilisateur, contenu, date_creation)
VALUES (?, ?, NOW())"
);
$stmt->execute([$userId, $content]);
$messageId = $pdo->lastInsertId();
// Upload de fichier
if(!empty($_FILES['image']['tmp_name'])){
// Traiter les fichiers
if (!empty($_FILES['image']['tmp_name'])) {
$file = $_FILES['image'];
$allowedTypes = ['image/png','image/jpeg'];
if(!in_array($file['type'],$allowedTypes) || $file['size']>2*1024*1024){
echo json_encode(['success'=>false,'message'=>'Fichier non valide']);
// Valider le fichier avec un max de 2 Mo
$validationResult = $fileValidator->validate($file, 2 * 1024 * 1024);
if (!$validationResult['valid']) {
http_response_code(400);
echo json_encode(['success' => false, 'message' => $validationResult['error']]);
exit;
}
$data = file_get_contents($file['tmp_name']);
$base64 = 'data:'.$file['type'].';base64,'.base64_encode($data);
$stmt = $pdo->prepare("INSERT INTO fichiers (id_message, nom_fichier, chemin_fic>
$stmt->execute([$messageId, $file['name'], $base64, $file['size'], $file['type']>
// Vérifier la sécurité du fichier (avant de le déplacer)
if (!$fileValidator->isSafe($file['tmp_name'])) {
http_response_code(400);
echo json_encode(['success' => false, 'message' => 'Le fichier contient du contenu dangereux']);
exit;
}
// Créer le répertoire uploads s'il n'existe pas
$uploadDir = __DIR__ . '/../uploads/';
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0755, true);
}
// Générer un nom de fichier sécurisé
$fileName = uniqid('post_', true) . '.' . $validationResult['ext'];
$filePath = $uploadDir . $fileName;
// Vérifier les permissions
if (!is_writable($uploadDir)) {
http_response_code(500);
echo json_encode(['success' => false, 'message' => 'Erreur serveur']);
exit;
}
// Déplacer le fichier
if (!move_uploaded_file($file['tmp_name'], $filePath)) {
http_response_code(500);
echo json_encode(['success' => false, 'message' => 'Erreur lors de l\'upload']);
exit;
}
// Sauvegarder dans la DB le chemin du fichier (pas le base64)
$stmt = $pdo->prepare(
"INSERT INTO `{$env['TABLE_FILES']}`
(id_message, nom_fichier, chemin_fichier, taille, type_mime, date_upload)
VALUES (?, ?, ?, ?, ?, NOW())"
);
$stmt->execute([
$messageId,
$file['name'],
'/uploads/' . $fileName, // Chemin relatif au web
$file['size'],
$validationResult['mime']
]);
}
echo json_encode(['success'=>true,'message'=>'Post publié avec succès']);
// Enregistrer l'activité
$rateLimit->recordAttempt($userId, 'post');
echo json_encode(['success' => true, 'message' => 'Post publié avec succès']);