<?php
namespace App\Controller\flutter;
use App\Repository\ChatMessageRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
class ChatController extends AbstractController
{
/**
* @Route("/chatmessages", name="api_chat_messages", methods={"GET"})
*/
public function getMessages(Request $request, ChatMessageRepository $repository): JsonResponse
{
// 1. Récupération des Query Parameters envoyés par Flutter
$customerCode = $request->query->get('customerCode');
$lastId = $request->query->get('lastId');
// Validation de la présence du code client
if (!$customerCode) {
return new JsonResponse([
'error' => 'Le paramètre customerCode est requis pour le filtrage.'
], 400);
}
// 2. Sélection de la stratégie de récupération (Incrémentale ou Historique complet)
if ($lastId !== null && is_numeric($lastId)) {
// Récupère uniquement les messages reçus APRÈS cet ID
$messages = $repository->findNewMessages($customerCode, (int) $lastId);
} else {
// Premier chargement : récupère tout l'historique du client
$messages = $repository->findByCustomerCode($customerCode);
}
// 3. Formatage de la réponse pour correspondre exactement à l'objet Dart Flutter
$data = [];
foreach ($messages as $message) {
$data[] = [
'id' => (string) $message->getId(), // Forcé en String pour correspondre au modèle Dart
'content' => $message->getContent(),
'fileName' => $message->getFileName(),
'fileSize' => $message->getFileSize(),
'pdfUrl' => $message->getPdfUrl(),
// Format ISO 8601 standard (ex: 2026-05-23T14:32:00+02:00) pour DateTime.parse()
'timestamp' => $message->getTimestamp()->format(\DateTime::ATOM),
'isMe' => $message->isMe(),
'type' => $message->getType(), // Retourne 'text' ou 'pdf'
'managerName' => $message->getManagerName(),
'managerContact' => $message->getManagerContact(),
'comment' => $message->getComment(),
'customerCode' => $message->getCustomerCode(),
];
}
// 4. Envoi de la réponse structurée avec les en-têtes JSON appropriés
return new JsonResponse($data, 200, [
'Content-Type' => 'application/json',
'Access-Control-Allow-Origin' => '*' // Utile si vous testez sur un navigateur / Webview
]);
}
}