Browse Source

Refactor fetching content, og data

imwald
Nuša Pukšič 8 months ago
parent
commit
fd9d56b3a4
  1. 22
      src/Controller/DefaultController.php
  2. 4
      src/Entity/Article.php
  3. 18
      src/Service/NostrClient.php
  4. 23
      src/Twig/Components/Organisms/FeaturedList.php
  5. 9
      templates/base.html.twig
  6. 11
      templates/pages/article.html.twig
  7. 8
      templates/pages/category.html.twig

22
src/Controller/DefaultController.php

@ -4,19 +4,12 @@ declare(strict_types=1);
namespace App\Controller; namespace App\Controller;
use App\Factory\ArticleFactory;
use App\Service\NostrClient;
use Elastica\Query;
use Elastica\Query\MatchQuery;
use Elastica\Query\Terms; use Elastica\Query\Terms;
use FOS\ElasticaBundle\Finder\FinderInterface; use FOS\ElasticaBundle\Finder\FinderInterface;
use Psr\Cache\InvalidArgumentException; use Psr\Cache\InvalidArgumentException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route; 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; use Symfony\Contracts\Cache\CacheInterface;
class DefaultController extends AbstractController class DefaultController extends AbstractController
@ -54,7 +47,6 @@ class DefaultController extends AbstractController
*/ */
#[Route('/cat/{slug}', name: 'magazine-category')] #[Route('/cat/{slug}', name: 'magazine-category')]
public function magCategory($slug, CacheInterface $redisCache, public function magCategory($slug, CacheInterface $redisCache,
NostrClient $client, ArticleFactory $articleFactory,
FinderInterface $finder): Response FinderInterface $finder): Response
{ {
$catIndex = $redisCache->get('magazine-' . $slug, function (){ $catIndex = $redisCache->get('magazine-' . $slug, function (){
@ -63,9 +55,15 @@ class DefaultController extends AbstractController
$list = []; $list = [];
$slugs = []; $slugs = [];
$returnedSlugs = []; $category = [];
foreach ($catIndex->getTags() as $tag) { 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') { if ($tag[0] === 'a') {
$parts = explode(':', $tag[1]); $parts = explode(':', $tag[1]);
if (count($parts) === 3) { if (count($parts) === 3) {
@ -83,12 +81,10 @@ class DefaultController extends AbstractController
$slugMap = []; $slugMap = [];
foreach ($articles as $item) { foreach ($articles as $item) {
// $item = $articleFactory->createFromLongFormContentEvent($article);
$slug = $item->getSlug(); $slug = $item->getSlug();
if ($slug !== '' && !isset($slugMap[$slug])) { if ($slug !== '' && !isset($slugMap[$slug])) {
$slugMap[$slug] = $item; $slugMap[$slug] = $item;
$returnedSlugs[] = $slug;
} }
} }
@ -111,11 +107,9 @@ class DefaultController extends AbstractController
$list = array_values($results); $list = array_values($results);
} }
// if any are missing, look in index
return $this->render('pages/category.html.twig', [ return $this->render('pages/category.html.twig', [
'list' => $list, 'list' => $list,
'category' => $category,
'index' => $catIndex 'index' => $catIndex
]); ]);
} }

4
src/Entity/Article.php

@ -22,8 +22,8 @@ class Article
{ {
#[ORM\Id] #[ORM\Id]
#[ORM\GeneratedValue] #[ORM\GeneratedValue]
#[ORM\Column(length: 225, nullable: true)] #[ORM\Column(length: 225)]
private null|int|string $id = null; private ?int $id = null;
#[ORM\Column(type: Types::JSON, nullable: true)] #[ORM\Column(type: Types::JSON, nullable: true)]
private $raw = null; private $raw = null;

18
src/Service/NostrClient.php

@ -177,22 +177,24 @@ class NostrClient
* Long-form Content * Long-form Content
* NIP-23 * NIP-23
*/ */
public function getLongFormContent(): void public function getLongFormContent($from = null, $to = null): void
{ {
$subscription = new Subscription(); $subscription = new Subscription();
$subscriptionId = $subscription->setId(); $subscriptionId = $subscription->setId();
$filter = new Filter(); $filter = new Filter();
$filter->setKinds([KindsEnum::LONGFORM]); $filter->setKinds([KindsEnum::LONGFORM]);
// TODO make filters configurable $filter->setSince(strtotime('-1 week')); // default
$filter->setSince(strtotime('-1 week')); // if ($from !== null) {
$filter->setSince($from);
}
if ($to !== null) {
$filter->setUntil($to);
}
$requestMessage = new RequestMessage($subscriptionId, [$filter]); $requestMessage = new RequestMessage($subscriptionId, [$filter]);
// if user is logged in, use their settings // if user is logged in, use their settings
$user = $this->tokenStorage->getToken()?->getUser(); $user = $this->tokenStorage->getToken()?->getUser();
$relays = $this->defaultRelaySet; $relays = $this->defaultRelaySet;
if ($user) {
//$relays = new RelaySet();
}
$request = new Request($relays, $requestMessage); $request = new Request($relays, $requestMessage);
@ -486,7 +488,9 @@ class NostrClient
foreach ($value as $item) { foreach ($value as $item) {
switch ($item->type) { switch ($item->type) {
case 'EVENT': case 'EVENT':
$articles[] = $item->event; if (!isset($articles[$item->event->id])) {
$articles[$item->event->id] = $item->event;
}
break; break;
case 'AUTH': case 'AUTH':
throw new UnauthorizedHttpException('', 'Relay requires authentication'); throw new UnauthorizedHttpException('', 'Relay requires authentication');

23
src/Twig/Components/Organisms/FeaturedList.php

@ -56,6 +56,27 @@ final class FeaturedList
$query = new Terms('slug', array_values($slugs)); $query = new Terms('slug', array_values($slugs));
$res = $this->finder->find($query); $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);
} }
} }

9
templates/base.html.twig

@ -10,7 +10,10 @@
<link rel="shortcut icon" href="{{ asset('icons/favicon.ico') }}" /> <link rel="shortcut icon" href="{{ asset('icons/favicon.ico') }}" />
<link rel="apple-touch-icon" href="{{ asset('icons/apple-touch-icon.png') }}"> <link rel="apple-touch-icon" href="{{ asset('icons/apple-touch-icon.png') }}">
<meta name="apple-mobile-web-app-title" content="Newsroom" /> <meta name="apple-mobile-web-app-title" content="Newsroom" />
<link rel="manifest" href="{{ asset('site.webmanifest') }}"> <link rel="manifest" href="{{ path('pwa_manifest') }}">
{% block ogtags %}
{% endblock %}
{% block stylesheets %} {% block stylesheets %}
{% endblock %} {% endblock %}
@ -19,9 +22,9 @@
{% endblock %} {% endblock %}
</head> </head>
<body data-controller="service-worker"> <body data-controller="service-worker">
<header>
<twig:Header /> <twig:Header />
</header>
<div class="layout"> <div class="layout">
<nav> <nav>

11
templates/pages/article.html.twig

@ -1,5 +1,16 @@
{% extends 'base.html.twig' %} {% extends 'base.html.twig' %}
{% block ogtags %}
<meta property="og:title" content="{{ article.title }}">
<meta property="og:type" content="article">
<meta property="og:url" content="{{ app.request.uri }}">
{% if article.image %}
<meta property="og:image" content="{{ article.image }}">
{% endif %}
<meta property="og:description" content="{{ article.summary|striptags|u.truncate(159,'…')|e }}">
<meta property="og:site_name" content="Newsroom">
{% endblock %}
{% block body %} {% block body %}
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">

8
templates/pages/category.html.twig

@ -1,5 +1,13 @@
{% extends 'base.html.twig' %} {% extends 'base.html.twig' %}
{% block ogtags %}
<meta property="og:title" content="{{ category.title }} - Newsroom">
<meta property="og:type" content="website">
<meta property="og:url" content="{{ app.request.uri }}">
<meta property="og:description" content="{{ category.summary }}">
<meta property="og:site_name" content="Newsroom">
{% endblock %}
{% block nav %} {% block nav %}
{% endblock %} {% endblock %}

Loading…
Cancel
Save