From 8c73a22eff904742ddb89b62413f2b5b671790d4 Mon Sep 17 00:00:00 2001 From: thibaud-leclere Date: Wed, 1 Apr 2026 19:25:45 +0200 Subject: [PATCH] refactor: embed film data directly in batch messages Avoid re-parsing the entire CSV file in each batch handler by including the film data in the message payload itself. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/Message/ImportFilmsBatchMessage.php | 6 +++-- .../ImportFilmsBatchMessageHandler.php | 25 ++++++++----------- .../ProcessImportMessageHandler.php | 13 +++++++--- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/Message/ImportFilmsBatchMessage.php b/src/Message/ImportFilmsBatchMessage.php index e9eb32a..79019e5 100644 --- a/src/Message/ImportFilmsBatchMessage.php +++ b/src/Message/ImportFilmsBatchMessage.php @@ -6,9 +6,11 @@ namespace App\Message; readonly class ImportFilmsBatchMessage { + /** + * @param list $films + */ public function __construct( public int $importId, - public int $offset, - public int $limit, + public array $films, ) {} } diff --git a/src/MessageHandler/ImportFilmsBatchMessageHandler.php b/src/MessageHandler/ImportFilmsBatchMessageHandler.php index 34ea99d..8e6e4c4 100644 --- a/src/MessageHandler/ImportFilmsBatchMessageHandler.php +++ b/src/MessageHandler/ImportFilmsBatchMessageHandler.php @@ -6,14 +6,13 @@ namespace App\MessageHandler; use App\Entity\Import; use App\Entity\UserMovie; -use App\Gateway\LtbxdGateway; use App\Message\ImportFilmsBatchMessage; +use App\Model\Ltbxd\LtbxdMovie; use App\Repository\ImportRepository; use App\Import\ActorSyncer; use App\Import\AwardImporter; use App\Import\FilmImporter; use Doctrine\ORM\EntityManagerInterface; -use League\Flysystem\FilesystemOperator; use Psr\Log\LoggerInterface; use Symfony\Component\Messenger\Attribute\AsMessageHandler; @@ -22,8 +21,6 @@ readonly class ImportFilmsBatchMessageHandler { public function __construct( private EntityManagerInterface $em, - private FilesystemOperator $defaultStorage, - private LtbxdGateway $ltbxdGateway, private FilmImporter $filmImporter, private ActorSyncer $actorSyncer, private ImportRepository $importRepository, @@ -40,17 +37,15 @@ readonly class ImportFilmsBatchMessageHandler return; } - $csvContent = $this->defaultStorage->read($import->getFilePath()); - $tmpFile = tempnam(sys_get_temp_dir(), 'import_'); - file_put_contents($tmpFile, $csvContent); - - try { - $ltbxdMovies = $this->ltbxdGateway->parseFileFromPath($tmpFile); - } finally { - unlink($tmpFile); - } - - $batch = array_slice($ltbxdMovies, $message->offset, $message->limit); + $batch = array_map( + fn (array $film) => new LtbxdMovie( + date: new \DateTime($film['date']), + name: $film['name'], + year: $film['year'], + ltbxdUri: $film['ltbxdUri'], + ), + $message->films, + ); $userId = $import->getUser()->getId(); $importId = $import->getId(); diff --git a/src/MessageHandler/ProcessImportMessageHandler.php b/src/MessageHandler/ProcessImportMessageHandler.php index 5fbd56a..a311761 100644 --- a/src/MessageHandler/ProcessImportMessageHandler.php +++ b/src/MessageHandler/ProcessImportMessageHandler.php @@ -56,11 +56,18 @@ readonly class ProcessImportMessageHandler $import->setStatus(Import::STATUS_PROCESSING); $this->em->flush(); - for ($i = 0; $i < $totalBatches; $i++) { + $batches = array_chunk($ltbxdMovies, self::BATCH_SIZE); + foreach ($batches as $batch) { + $films = array_map(fn ($movie) => [ + 'name' => $movie->getName(), + 'year' => $movie->getYear(), + 'ltbxdUri' => $movie->getLtbxdUri(), + 'date' => $movie->getDate()->format('Y-m-d'), + ], $batch); + $this->bus->dispatch(new ImportFilmsBatchMessage( importId: $import->getId(), - offset: $i * self::BATCH_SIZE, - limit: self::BATCH_SIZE, + films: $films, )); } } catch (\Throwable $e) {