synchronizeChapters() retournait des UUID temporaires générés en mémoire. Ces UUID n'étant jamais persistés, le Scraping domain ne pouvait pas retrouver le chapitre (SQLSTATE 22P02 : invalid input syntax for type integer). - ChapterSynchronizationServiceInterface : retourne float[] (numéros) au lieu de string[] (UUID) - MangadxChapterSynchronizationService : retourne getNumber() au lieu de getId() - RefreshMangaChaptersHandler : après save(), retrouve chaque chapitre par manga+numéro via findChapterByMangaIdAndNumber() pour obtenir le vrai PK integer avant de dispatcher ChapterReadyForScraping
52 lines
1.9 KiB
PHP
52 lines
1.9 KiB
PHP
<?php
|
|
|
|
namespace App\Domain\Manga\Application\CommandHandler;
|
|
|
|
use App\Domain\Manga\Application\Command\RefreshMangaChapters;
|
|
use App\Domain\Manga\Domain\Contract\Repository\MangaRepositoryInterface;
|
|
use App\Domain\Manga\Domain\Contract\Service\ChapterSynchronizationServiceInterface;
|
|
use App\Domain\Manga\Domain\Event\ChapterReadyForScraping;
|
|
use App\Domain\Manga\Domain\Model\ValueObject\ChapterId;
|
|
use Symfony\Component\Messenger\MessageBusInterface;
|
|
|
|
readonly class RefreshMangaChaptersHandler
|
|
{
|
|
public function __construct(
|
|
private MangaRepositoryInterface $mangaRepository,
|
|
private ChapterSynchronizationServiceInterface $chapterSynchronizationService,
|
|
private MessageBusInterface $eventBus,
|
|
) {
|
|
}
|
|
|
|
public function handle(RefreshMangaChapters $command): void
|
|
{
|
|
$manga = $this->mangaRepository->findById($command->mangaId->getValue());
|
|
|
|
if (null === $manga) {
|
|
throw new \RuntimeException('Manga not found');
|
|
}
|
|
|
|
// Synchronisation + récupération des numéros de nouveaux chapitres
|
|
$newChapterNumbers = $this->chapterSynchronizationService->synchronizeChapters($manga);
|
|
|
|
// Mise à jour de la date de monitoring
|
|
$manga->updateLastMonitoringCheck(new \DateTimeImmutable());
|
|
$this->mangaRepository->save($manga);
|
|
|
|
// Événement de scraping pour chaque nouveau chapitre
|
|
// On retrouve l'ID réel (PK integer) après save() car le chapitre n'a
|
|
// son identifiant définitif qu'une fois persisté en base.
|
|
foreach ($newChapterNumbers as $chapterNumber) {
|
|
$saved = $this->mangaRepository->findChapterByMangaIdAndNumber(
|
|
$manga->getId()->getValue(),
|
|
$chapterNumber
|
|
);
|
|
if ($saved) {
|
|
$this->eventBus->dispatch(
|
|
new ChapterReadyForScraping(new ChapterId($saved->getId()))
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|