Initial commit

This commit is contained in:
2025-10-05 13:55:28 +02:00
commit 68d521677a
767 changed files with 46947 additions and 0 deletions
@@ -0,0 +1,56 @@
<?php
declare(strict_types=1);
namespace App\Aggregator\Application\UseCase\CommandHandler;
use App\Aggregator\Application\UseCase\Command\CreateArticle;
use App\Aggregator\Domain\Exception\DuplicatedArticle;
use App\Aggregator\Domain\Model\Entity\Article;
use App\Aggregator\Domain\Model\Repository\ArticleRepository;
use App\Aggregator\Domain\Model\Repository\SourceRepository;
use App\Aggregator\Domain\Service\HashCalculator;
use App\SharedKernel\Application\Messaging\CommandHandler;
/**
* Class CreateArticlesHandler.
*
* @author bernard-ng <bernard@devscast.tech>
*/
final readonly class CreateArticleHandler implements CommandHandler
{
public function __construct(
private SourceRepository $sourceRepository,
private ArticleRepository $articleRepository,
private HashCalculator $hashCalculator
) {
}
public function __invoke(CreateArticle $command): void
{
$hash = $this->hashCalculator->calculate((string) $command->link);
$article = $this->articleRepository->getByHash($hash);
if ($article instanceof Article) {
throw DuplicatedArticle::withLink($command->link);
}
/** @var \DateTimeImmutable $publishedAt */
$publishedAt = \DateTimeImmutable::createFromFormat('U', (string) $command->timestamp);
$source = $this->sourceRepository->getByName($command->source);
$article = new Article(
title: $command->title,
link: $command->link,
body: $command->body,
hash: $hash,
categories: mb_strtolower($command->categories),
source: $source,
publishedAt: $publishedAt
);
$article
->defineOpenGraph($command->metadata)
->computeReadingTime();
$this->articleRepository->add($article);
}
}