Browse Source

Publish

imwald
Nuša Pukšič 3 months ago
parent
commit
833c722751
  1. 19
      src/Controller/ArticleController.php
  2. 16
      src/Service/NostrClient.php

19
src/Controller/ArticleController.php

@ -261,24 +261,9 @@ class ArticleController extends AbstractController
$cacheKey = 'article_' . $article->getEventId(); $cacheKey = 'article_' . $article->getEventId();
$articlesCache->delete($cacheKey); $articlesCache->delete($cacheKey);
// Optionally publish to Nostr relays // Publish to Nostr relays
try { try {
// Get user's relays or use default ones $nostrClient->publishEvent($eventObj, []);
$relays = [];
if ($user && method_exists($user, 'getRelays') && $user->getRelays()) {
foreach ($user->getRelays() as $relayArr) {
if (isset($relayArr[1]) && isset($relayArr[2]) && $relayArr[2] === 'write') {
$relays[] = $relayArr[1];
}
}
}
// Fallback to default relays if no user relays found
if (empty($relays)) {
throw new \Exception('No write relays configured for user.');
}
$nostrClient->publishEvent($eventObj, $relays);
} catch (\Exception $e) { } catch (\Exception $e) {
// Log error but don't fail the request - article is saved locally // Log error but don't fail the request - article is saved locally
error_log('Failed to publish to Nostr relays: ' . $e->getMessage()); error_log('Failed to publish to Nostr relays: ' . $e->getMessage());

16
src/Service/NostrClient.php

@ -5,6 +5,7 @@ namespace App\Service;
use App\Entity\Article; use App\Entity\Article;
use App\Enum\KindsEnum; use App\Enum\KindsEnum;
use App\Factory\ArticleFactory; use App\Factory\ArticleFactory;
use App\Service\RedisCacheService;
use App\Util\NostrPhp\TweakedRequest; use App\Util\NostrPhp\TweakedRequest;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Persistence\ManagerRegistry; use Doctrine\Persistence\ManagerRegistry;
@ -12,6 +13,7 @@ use nostriphant\NIP19\Data;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
use swentel\nostr\Event\Event; use swentel\nostr\Event\Event;
use swentel\nostr\Filter\Filter; use swentel\nostr\Filter\Filter;
use swentel\nostr\Key\Key;
use swentel\nostr\Message\EventMessage; use swentel\nostr\Message\EventMessage;
use swentel\nostr\Message\RequestMessage; use swentel\nostr\Message\RequestMessage;
use swentel\nostr\Relay\Relay; use swentel\nostr\Relay\Relay;
@ -38,10 +40,10 @@ class NostrClient
]; ];
public function __construct(private readonly EntityManagerInterface $entityManager, public function __construct(private readonly EntityManagerInterface $entityManager,
private readonly ManagerRegistry $managerRegistry, private readonly ManagerRegistry $managerRegistry,
private readonly ArticleFactory $articleFactory, private readonly ArticleFactory $articleFactory,
private readonly TokenStorageInterface $tokenStorage, private readonly TokenStorageInterface $tokenStorage,
private readonly LoggerInterface $logger) private readonly LoggerInterface $logger, private readonly RedisCacheService $redisCacheService)
{ {
$this->defaultRelaySet = new RelaySet(); $this->defaultRelaySet = new RelaySet();
$this->defaultRelaySet->addRelay(new Relay('wss://theforest.nostr1.com')); // public aggregator relay $this->defaultRelaySet->addRelay(new Relay('wss://theforest.nostr1.com')); // public aggregator relay
@ -171,6 +173,12 @@ class NostrClient
public function publishEvent(Event $event, array $relays): array public function publishEvent(Event $event, array $relays): array
{ {
$eventMessage = new EventMessage($event); $eventMessage = new EventMessage($event);
// If no relays, fetch relays for user then post to those
if (empty($relays)) {
$key = new Key();
$relays = $this->redisCacheService->getRelays($key->convertPublicKeyToBech32($event->getPublicKey()));
}
$relaySet = new RelaySet(); $relaySet = new RelaySet();
foreach ($relays as $relayWss) { foreach ($relays as $relayWss) {
$relay = new Relay($relayWss); $relay = new Relay($relayWss);

Loading…
Cancel
Save