From fd9d56b3a4e15c92c073a0d06c19f4386b53deca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nu=C5=A1a=20Puk=C5=A1i=C4=8D?= Date: Mon, 19 May 2025 18:11:08 +0200 Subject: [PATCH] Refactor fetching content, og data --- src/Controller/DefaultController.php | 22 +++++++----------- src/Entity/Article.php | 4 ++-- src/Service/NostrClient.php | 18 +++++++++------ .../Components/Organisms/FeaturedList.php | 23 ++++++++++++++++++- templates/base.html.twig | 11 +++++---- templates/pages/article.html.twig | 11 +++++++++ templates/pages/category.html.twig | 8 +++++++ 7 files changed, 69 insertions(+), 28 deletions(-) diff --git a/src/Controller/DefaultController.php b/src/Controller/DefaultController.php index 1ca8b05..17b9ced 100644 --- a/src/Controller/DefaultController.php +++ b/src/Controller/DefaultController.php @@ -4,19 +4,12 @@ declare(strict_types=1); namespace App\Controller; -use App\Factory\ArticleFactory; -use App\Service\NostrClient; -use Elastica\Query; -use Elastica\Query\MatchQuery; use Elastica\Query\Terms; use FOS\ElasticaBundle\Finder\FinderInterface; use Psr\Cache\InvalidArgumentException; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; -use Symfony\Component\Serializer\Encoder\JsonEncoder; -use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; -use Symfony\Component\Serializer\Serializer; use Symfony\Contracts\Cache\CacheInterface; class DefaultController extends AbstractController @@ -54,7 +47,6 @@ class DefaultController extends AbstractController */ #[Route('/cat/{slug}', name: 'magazine-category')] public function magCategory($slug, CacheInterface $redisCache, - NostrClient $client, ArticleFactory $articleFactory, FinderInterface $finder): Response { $catIndex = $redisCache->get('magazine-' . $slug, function (){ @@ -63,9 +55,15 @@ class DefaultController extends AbstractController $list = []; $slugs = []; - $returnedSlugs = []; + $category = []; foreach ($catIndex->getTags() as $tag) { + if ($tag[0] === 'title') { + $category['title'] = $tag[1]; + } + if ($tag[0] === 'summary') { + $category['summary'] = $tag[1]; + } if ($tag[0] === 'a') { $parts = explode(':', $tag[1]); if (count($parts) === 3) { @@ -83,12 +81,10 @@ class DefaultController extends AbstractController $slugMap = []; foreach ($articles as $item) { - // $item = $articleFactory->createFromLongFormContentEvent($article); $slug = $item->getSlug(); if ($slug !== '' && !isset($slugMap[$slug])) { $slugMap[$slug] = $item; - $returnedSlugs[] = $slug; } } @@ -111,11 +107,9 @@ class DefaultController extends AbstractController $list = array_values($results); } - // if any are missing, look in index - - return $this->render('pages/category.html.twig', [ 'list' => $list, + 'category' => $category, 'index' => $catIndex ]); } diff --git a/src/Entity/Article.php b/src/Entity/Article.php index d1494b8..b342498 100644 --- a/src/Entity/Article.php +++ b/src/Entity/Article.php @@ -22,8 +22,8 @@ class Article { #[ORM\Id] #[ORM\GeneratedValue] - #[ORM\Column(length: 225, nullable: true)] - private null|int|string $id = null; + #[ORM\Column(length: 225)] + private ?int $id = null; #[ORM\Column(type: Types::JSON, nullable: true)] private $raw = null; diff --git a/src/Service/NostrClient.php b/src/Service/NostrClient.php index c10bf9f..656e529 100644 --- a/src/Service/NostrClient.php +++ b/src/Service/NostrClient.php @@ -177,22 +177,24 @@ class NostrClient * Long-form Content * NIP-23 */ - public function getLongFormContent(): void + public function getLongFormContent($from = null, $to = null): void { $subscription = new Subscription(); $subscriptionId = $subscription->setId(); $filter = new Filter(); $filter->setKinds([KindsEnum::LONGFORM]); - // TODO make filters configurable - $filter->setSince(strtotime('-1 week')); // + $filter->setSince(strtotime('-1 week')); // default + if ($from !== null) { + $filter->setSince($from); + } + if ($to !== null) { + $filter->setUntil($to); + } $requestMessage = new RequestMessage($subscriptionId, [$filter]); // if user is logged in, use their settings $user = $this->tokenStorage->getToken()?->getUser(); $relays = $this->defaultRelaySet; - if ($user) { - //$relays = new RelaySet(); - } $request = new Request($relays, $requestMessage); @@ -486,7 +488,9 @@ class NostrClient foreach ($value as $item) { switch ($item->type) { case 'EVENT': - $articles[] = $item->event; + if (!isset($articles[$item->event->id])) { + $articles[$item->event->id] = $item->event; + } break; case 'AUTH': throw new UnauthorizedHttpException('', 'Relay requires authentication'); diff --git a/src/Twig/Components/Organisms/FeaturedList.php b/src/Twig/Components/Organisms/FeaturedList.php index 3979115..9b2f9af 100644 --- a/src/Twig/Components/Organisms/FeaturedList.php +++ b/src/Twig/Components/Organisms/FeaturedList.php @@ -56,6 +56,27 @@ final class FeaturedList $query = new Terms('slug', array_values($slugs)); $res = $this->finder->find($query); - $this->list = array_slice($res, 0, 4); + + // Create a map of slug => item to remove duplicates + $slugMap = []; + + foreach ($res as $item) { + $slug = $item->getSlug(); + + if ($slug !== '' && !isset($slugMap[$slug])) { + $slugMap[$slug] = $item; + } + } + + if (!empty($res)) { + foreach ($res as $result) { + if (!isset($slugMap[$result->getSlug()])) { + $slugMap[$result->getSlug()] = $result; + } + } + } + + + $this->list = array_slice(array_values($slugMap), 0, 4); } } diff --git a/templates/base.html.twig b/templates/base.html.twig index 8b041b6..ab981c1 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -10,7 +10,10 @@ - + + + {% block ogtags %} + {% endblock %} {% block stylesheets %} {% endblock %} @@ -19,9 +22,9 @@ {% endblock %} -
- -
+ + +