feat: event listener sur MangaCreated pour ajouter les chapitres à la création
This commit is contained in:
parent
879b8fa2dc
commit
73774f84ff
@@ -116,3 +116,7 @@ services:
|
|||||||
arguments:
|
arguments:
|
||||||
$publicDir: '%kernel.project_dir%/public'
|
$publicDir: '%kernel.project_dir%/public'
|
||||||
$httpClient: '@GuzzleHttp\Client'
|
$httpClient: '@GuzzleHttp\Client'
|
||||||
|
|
||||||
|
App\Domain\Manga\Infrastructure\EventListener\MangaCreatedListener:
|
||||||
|
tags:
|
||||||
|
- { name: messenger.message_handler }
|
||||||
|
|||||||
@@ -6,16 +6,19 @@ use App\Domain\Manga\Application\Command\CreateMangaFromMangadex;
|
|||||||
use App\Domain\Manga\Domain\Contract\Provider\MangaProviderInterface;
|
use App\Domain\Manga\Domain\Contract\Provider\MangaProviderInterface;
|
||||||
use App\Domain\Manga\Domain\Contract\Repository\MangaRepositoryInterface;
|
use App\Domain\Manga\Domain\Contract\Repository\MangaRepositoryInterface;
|
||||||
use App\Domain\Manga\Domain\Contract\Service\ImageProcessorInterface;
|
use App\Domain\Manga\Domain\Contract\Service\ImageProcessorInterface;
|
||||||
|
use App\Domain\Manga\Domain\Event\MangaCreated;
|
||||||
use App\Domain\Manga\Domain\Exception\MangaNotFoundException;
|
use App\Domain\Manga\Domain\Exception\MangaNotFoundException;
|
||||||
use App\Domain\Manga\Domain\Model\ValueObject\ExternalId;
|
use App\Domain\Manga\Domain\Model\ValueObject\ExternalId;
|
||||||
use App\Domain\Manga\Domain\Model\ValueObject\ImageUrls;
|
use App\Domain\Manga\Domain\Model\ValueObject\ImageUrls;
|
||||||
|
use Symfony\Component\Messenger\MessageBusInterface;
|
||||||
|
|
||||||
readonly class CreateMangaFromMangadexHandler
|
readonly class CreateMangaFromMangadexHandler
|
||||||
{
|
{
|
||||||
public function __construct(
|
public function __construct(
|
||||||
private MangaProviderInterface $mangaProvider,
|
private MangaProviderInterface $mangaProvider,
|
||||||
private MangaRepositoryInterface $mangaRepository,
|
private MangaRepositoryInterface $mangaRepository,
|
||||||
private ImageProcessorInterface $imageProcessor
|
private ImageProcessorInterface $imageProcessor,
|
||||||
|
private MessageBusInterface $messageBus
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
public function handle(CreateMangaFromMangadex $command): void
|
public function handle(CreateMangaFromMangadex $command): void
|
||||||
@@ -40,5 +43,7 @@ readonly class CreateMangaFromMangadexHandler
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->mangaRepository->save($manga);
|
$this->mangaRepository->save($manga);
|
||||||
|
|
||||||
|
$this->messageBus->dispatch(new MangaCreated($command->externalId));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5,6 +5,7 @@ namespace App\Domain\Manga\Application\CommandHandler;
|
|||||||
use App\Domain\Manga\Application\Command\CreateManga;
|
use App\Domain\Manga\Application\Command\CreateManga;
|
||||||
use App\Domain\Manga\Domain\Contract\Repository\MangaRepositoryInterface;
|
use App\Domain\Manga\Domain\Contract\Repository\MangaRepositoryInterface;
|
||||||
use App\Domain\Manga\Domain\Contract\Service\ImageProcessorInterface;
|
use App\Domain\Manga\Domain\Contract\Service\ImageProcessorInterface;
|
||||||
|
use App\Domain\Manga\Domain\Event\MangaCreated;
|
||||||
use App\Domain\Manga\Domain\Model\Manga;
|
use App\Domain\Manga\Domain\Model\Manga;
|
||||||
use App\Domain\Manga\Domain\Model\ValueObject\ExternalId;
|
use App\Domain\Manga\Domain\Model\ValueObject\ExternalId;
|
||||||
use App\Domain\Manga\Domain\Model\ValueObject\ImageUrls;
|
use App\Domain\Manga\Domain\Model\ValueObject\ImageUrls;
|
||||||
@@ -12,12 +13,14 @@ use App\Domain\Manga\Domain\Model\ValueObject\MangaId;
|
|||||||
use App\Domain\Manga\Domain\Model\ValueObject\MangaSlug;
|
use App\Domain\Manga\Domain\Model\ValueObject\MangaSlug;
|
||||||
use App\Domain\Manga\Domain\Model\ValueObject\MangaTitle;
|
use App\Domain\Manga\Domain\Model\ValueObject\MangaTitle;
|
||||||
use Ramsey\Uuid\Uuid;
|
use Ramsey\Uuid\Uuid;
|
||||||
|
use Symfony\Component\Messenger\MessageBusInterface;
|
||||||
|
|
||||||
readonly class CreateMangaHandler
|
readonly class CreateMangaHandler
|
||||||
{
|
{
|
||||||
public function __construct(
|
public function __construct(
|
||||||
private MangaRepositoryInterface $mangaRepository,
|
private MangaRepositoryInterface $mangaRepository,
|
||||||
private ImageProcessorInterface $imageProcessor
|
private ImageProcessorInterface $imageProcessor,
|
||||||
|
private MessageBusInterface $messageBus
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
public function handle(CreateManga $command): void
|
public function handle(CreateManga $command): void
|
||||||
@@ -47,5 +50,9 @@ readonly class CreateMangaHandler
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->mangaRepository->save($manga);
|
$this->mangaRepository->save($manga);
|
||||||
|
|
||||||
|
if ($command->externalId) {
|
||||||
|
$this->messageBus->dispatch(new MangaCreated($command->externalId));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
10
src/Domain/Manga/Domain/Event/MangaCreated.php
Normal file
10
src/Domain/Manga/Domain/Event/MangaCreated.php
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Domain\Manga\Domain\Event;
|
||||||
|
|
||||||
|
readonly class MangaCreated
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
public string $externalId
|
||||||
|
) {}
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Domain\Manga\Infrastructure\EventListener;
|
||||||
|
|
||||||
|
use App\Domain\Manga\Application\Command\FetchMangaChapters;
|
||||||
|
use App\Domain\Manga\Domain\Event\MangaCreated;
|
||||||
|
use Symfony\Component\Messenger\MessageBusInterface;
|
||||||
|
|
||||||
|
readonly class MangaCreatedListener
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
private MessageBusInterface $messageBus
|
||||||
|
) {}
|
||||||
|
|
||||||
|
public function __invoke(MangaCreated $event): void
|
||||||
|
{
|
||||||
|
$this->messageBus->dispatch(
|
||||||
|
new FetchMangaChapters($event->externalId)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,7 +9,6 @@ class InMemoryMangadexClient implements MangadexClientInterface
|
|||||||
private array $mangas = [];
|
private array $mangas = [];
|
||||||
private array $feeds = [];
|
private array $feeds = [];
|
||||||
private array $aggregates = [];
|
private array $aggregates = [];
|
||||||
private array $mangaFeeds = [];
|
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
array $mangas = [],
|
array $mangas = [],
|
||||||
@@ -62,7 +61,22 @@ class InMemoryMangadexClient implements MangadexClientInterface
|
|||||||
|
|
||||||
public function getMangaFeed(string $mangaId, int $offset = 0, int $limit = 500, string $order = 'asc'): array
|
public function getMangaFeed(string $mangaId, int $offset = 0, int $limit = 500, string $order = 'asc'): array
|
||||||
{
|
{
|
||||||
return $this->mangaFeeds[$mangaId] ?? ['data' => []];
|
if (!isset($this->feeds[$mangaId])) {
|
||||||
|
return [
|
||||||
|
'data' => [],
|
||||||
|
'total' => 0
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
$feed = $this->feeds[$mangaId];
|
||||||
|
if ($order === 'desc') {
|
||||||
|
$feed = array_reverse($feed);
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
'data' => array_slice($feed, $offset, $limit),
|
||||||
|
'total' => count($feed)
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getMangaAggregate(string $mangaId): array
|
public function getMangaAggregate(string $mangaId): array
|
||||||
@@ -106,9 +120,4 @@ class InMemoryMangadexClient implements MangadexClientInterface
|
|||||||
{
|
{
|
||||||
$this->aggregates[$mangaId] = $aggregate;
|
$this->aggregates[$mangaId] = $aggregate;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setMangaFeed(string $mangaId, array $feed): void
|
|
||||||
{
|
|
||||||
$this->mangaFeeds[$mangaId] = $feed;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -13,6 +13,7 @@ use App\Domain\Manga\Domain\Model\ValueObject\MangaTitle;
|
|||||||
use App\Tests\Domain\Manga\Adapter\InMemoryMangaProvider;
|
use App\Tests\Domain\Manga\Adapter\InMemoryMangaProvider;
|
||||||
use App\Tests\Domain\Manga\Adapter\InMemoryMangaRepository;
|
use App\Tests\Domain\Manga\Adapter\InMemoryMangaRepository;
|
||||||
use App\Tests\Domain\Manga\Adapter\InMemoryImageProcessor;
|
use App\Tests\Domain\Manga\Adapter\InMemoryImageProcessor;
|
||||||
|
use App\Tests\Shared\Adapter\InMemoryMessageBus;
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
class CreateMangaFromMangadexHandlerTest extends TestCase
|
class CreateMangaFromMangadexHandlerTest extends TestCase
|
||||||
@@ -21,7 +22,7 @@ class CreateMangaFromMangadexHandlerTest extends TestCase
|
|||||||
private InMemoryMangaRepository $repository;
|
private InMemoryMangaRepository $repository;
|
||||||
private InMemoryImageProcessor $imageProcessor;
|
private InMemoryImageProcessor $imageProcessor;
|
||||||
private CreateMangaFromMangadexHandler $handler;
|
private CreateMangaFromMangadexHandler $handler;
|
||||||
|
private InMemoryMessageBus $messageBus;
|
||||||
protected function setUp(): void
|
protected function setUp(): void
|
||||||
{
|
{
|
||||||
$manga = new Manga(
|
$manga = new Manga(
|
||||||
@@ -40,10 +41,12 @@ class CreateMangaFromMangadexHandlerTest extends TestCase
|
|||||||
$this->provider = new InMemoryMangaProvider([$manga]);
|
$this->provider = new InMemoryMangaProvider([$manga]);
|
||||||
$this->repository = new InMemoryMangaRepository();
|
$this->repository = new InMemoryMangaRepository();
|
||||||
$this->imageProcessor = new InMemoryImageProcessor();
|
$this->imageProcessor = new InMemoryImageProcessor();
|
||||||
|
$this->messageBus = new InMemoryMessageBus();
|
||||||
$this->handler = new CreateMangaFromMangadexHandler(
|
$this->handler = new CreateMangaFromMangadexHandler(
|
||||||
$this->provider,
|
$this->provider,
|
||||||
$this->repository,
|
$this->repository,
|
||||||
$this->imageProcessor
|
$this->imageProcessor,
|
||||||
|
$this->messageBus
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ use App\Domain\Manga\Application\Command\CreateManga;
|
|||||||
use App\Domain\Manga\Application\CommandHandler\CreateMangaHandler;
|
use App\Domain\Manga\Application\CommandHandler\CreateMangaHandler;
|
||||||
use App\Tests\Domain\Manga\Adapter\InMemoryMangaRepository;
|
use App\Tests\Domain\Manga\Adapter\InMemoryMangaRepository;
|
||||||
use App\Tests\Domain\Manga\Adapter\InMemoryImageProcessor;
|
use App\Tests\Domain\Manga\Adapter\InMemoryImageProcessor;
|
||||||
|
use App\Tests\Shared\Adapter\InMemoryMessageBus;
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
class CreateMangaHandlerTest extends TestCase
|
class CreateMangaHandlerTest extends TestCase
|
||||||
@@ -13,14 +14,16 @@ class CreateMangaHandlerTest extends TestCase
|
|||||||
private InMemoryMangaRepository $repository;
|
private InMemoryMangaRepository $repository;
|
||||||
private InMemoryImageProcessor $imageProcessor;
|
private InMemoryImageProcessor $imageProcessor;
|
||||||
private CreateMangaHandler $handler;
|
private CreateMangaHandler $handler;
|
||||||
|
private InMemoryMessageBus $messageBus;
|
||||||
protected function setUp(): void
|
protected function setUp(): void
|
||||||
{
|
{
|
||||||
$this->repository = new InMemoryMangaRepository();
|
$this->repository = new InMemoryMangaRepository();
|
||||||
$this->imageProcessor = new InMemoryImageProcessor();
|
$this->imageProcessor = new InMemoryImageProcessor();
|
||||||
|
$this->messageBus = new InMemoryMessageBus();
|
||||||
$this->handler = new CreateMangaHandler(
|
$this->handler = new CreateMangaHandler(
|
||||||
$this->repository,
|
$this->repository,
|
||||||
$this->imageProcessor
|
$this->imageProcessor,
|
||||||
|
$this->messageBus
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -46,15 +46,13 @@ class FetchMangaChaptersHandlerTest extends TestCase
|
|||||||
|
|
||||||
$this->mangaRepository->save($manga);
|
$this->mangaRepository->save($manga);
|
||||||
|
|
||||||
$this->mangadexClient->setMangaFeed($externalId, [
|
$this->mangadexClient->addFeed($externalId, [
|
||||||
'data' => [
|
[
|
||||||
[
|
'id' => 'chapter-1',
|
||||||
'id' => 'chapter-1',
|
'attributes' => [
|
||||||
'attributes' => [
|
'chapter' => '1',
|
||||||
'chapter' => '1',
|
'title' => 'Chapter 1',
|
||||||
'title' => 'Chapter 1',
|
'volume' => '1'
|
||||||
'volume' => '1'
|
|
||||||
]
|
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
]);
|
]);
|
||||||
@@ -75,4 +73,4 @@ class FetchMangaChaptersHandlerTest extends TestCase
|
|||||||
$command = new FetchMangaChapters($externalId);
|
$command = new FetchMangaChapters($externalId);
|
||||||
$this->handler->handle($command);
|
$this->handler->handle($command);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
|
|
||||||
Reference in New Issue
Block a user