feat(scraping): implémenter le health check de tous les scrapers
- Commande CheckAllScrapersHealth + handler avec ports dédiés - Value Object ContentSourceHealthCheckData - Resource API Platform et State Processor - Adapters InMemory et tests unitaires + fonctionnels
This commit is contained in:
parent
795cbeccc3
commit
01474c264b
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
|
||||
namespace App\Domain\Scraping\Application\CommandHandler;
|
||||
|
||||
use App\Domain\Scraping\Application\Command\CheckAllScrapersHealth;
|
||||
use App\Domain\Scraping\Application\Command\TestScraperConfiguration;
|
||||
use App\Domain\Scraping\Domain\Contract\Repository\ContentSourceForHealthCheckInterface;
|
||||
use App\Domain\Scraping\Domain\Contract\Repository\ContentSourceHealthRepositoryInterface;
|
||||
use Psr\Log\LoggerInterface;
|
||||
|
||||
readonly class CheckAllScrapersHealthHandler
|
||||
{
|
||||
public function __construct(
|
||||
private ContentSourceForHealthCheckInterface $contentSourceForHealthCheckRepo,
|
||||
private ContentSourceHealthRepositoryInterface $contentSourceHealthRepo,
|
||||
private TestScraperConfigurationHandler $testScraperConfigurationHandler,
|
||||
private LoggerInterface $logger,
|
||||
) {
|
||||
}
|
||||
|
||||
public function handle(CheckAllScrapersHealth $command): void
|
||||
{
|
||||
$sources = $this->contentSourceForHealthCheckRepo->getAll();
|
||||
|
||||
foreach ($sources as $source) {
|
||||
if ($source->testSlug === null || $source->testChapterNumber === null) {
|
||||
$this->logger->warning('ContentSource {id} has no test config, skipping health check.', ['id' => $source->id]);
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
$this->contentSourceHealthRepo->markAsTesting($source->id);
|
||||
$testUrl = str_replace(
|
||||
['{slug}', '{chapterNumber}'],
|
||||
[$source->testSlug, $source->testChapterNumber],
|
||||
$source->chapterUrlFormat
|
||||
);
|
||||
|
||||
$testCommand = new TestScraperConfiguration(
|
||||
baseUrl: $source->baseUrl,
|
||||
chapterUrlFormat: $source->chapterUrlFormat,
|
||||
scrapingType: $source->scrapingType,
|
||||
testUrl: $testUrl,
|
||||
mangaSlug: $source->testSlug,
|
||||
chapterNumber: $source->testChapterNumber,
|
||||
imageSelector: $source->imageSelector,
|
||||
nextPageSelector: $source->nextPageSelector,
|
||||
chapterSelector: $source->chapterSelector,
|
||||
);
|
||||
|
||||
$response = $this->testScraperConfigurationHandler->handle($testCommand);
|
||||
|
||||
if ($response->success) {
|
||||
$this->contentSourceHealthRepo->markAsHealthy($source->id, new \DateTimeImmutable());
|
||||
} else {
|
||||
$firstError = $response->errors[0]['message'] ?? 'Erreur inconnue';
|
||||
$this->contentSourceHealthRepo->markAsUnhealthy($source->id, new \DateTimeImmutable(), $firstError);
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
$this->contentSourceHealthRepo->markAsUnhealthy($source->id, new \DateTimeImmutable(), $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user