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); @@ -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 @@ -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 @@ -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 @@ -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 @@ -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
]);
}

4
src/Entity/Article.php

@ -22,8 +22,8 @@ class Article @@ -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;

18
src/Service/NostrClient.php

@ -177,22 +177,24 @@ class NostrClient @@ -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 @@ -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');

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

@ -56,6 +56,27 @@ final class FeaturedList @@ -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);
}
}

9
templates/base.html.twig

@ -10,7 +10,10 @@ @@ -10,7 +10,10 @@
<link rel="shortcut icon" href="{{ asset('icons/favicon.ico') }}" />
<link rel="apple-touch-icon" href="{{ asset('icons/apple-touch-icon.png') }}">
<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 %}
{% endblock %}
@ -19,9 +22,9 @@ @@ -19,9 +22,9 @@
{% endblock %}
</head>
<body data-controller="service-worker">
<header>
<twig:Header />
</header>
<div class="layout">
<nav>

11
templates/pages/article.html.twig

@ -1,5 +1,16 @@ @@ -1,5 +1,16 @@
{% 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 %}
<div class="card">
<div class="card-header">

8
templates/pages/category.html.twig

@ -1,5 +1,13 @@ @@ -1,5 +1,13 @@
{% 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 %}
{% endblock %}

Loading…
Cancel
Save