diff --git a/src/Controller/ArticleController.php b/src/Controller/ArticleController.php index e65b40f..222d449 100644 --- a/src/Controller/ArticleController.php +++ b/src/Controller/ArticleController.php @@ -261,24 +261,9 @@ class ArticleController extends AbstractController $cacheKey = 'article_' . $article->getEventId(); $articlesCache->delete($cacheKey); - // Optionally publish to Nostr relays + // Publish to Nostr relays try { - // Get user's relays or use default ones - $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); + $nostrClient->publishEvent($eventObj, []); } catch (\Exception $e) { // Log error but don't fail the request - article is saved locally error_log('Failed to publish to Nostr relays: ' . $e->getMessage()); diff --git a/src/Service/NostrClient.php b/src/Service/NostrClient.php index faa241d..1002b04 100644 --- a/src/Service/NostrClient.php +++ b/src/Service/NostrClient.php @@ -5,6 +5,7 @@ namespace App\Service; use App\Entity\Article; use App\Enum\KindsEnum; use App\Factory\ArticleFactory; +use App\Service\RedisCacheService; use App\Util\NostrPhp\TweakedRequest; use Doctrine\ORM\EntityManagerInterface; use Doctrine\Persistence\ManagerRegistry; @@ -12,6 +13,7 @@ use nostriphant\NIP19\Data; use Psr\Log\LoggerInterface; use swentel\nostr\Event\Event; use swentel\nostr\Filter\Filter; +use swentel\nostr\Key\Key; use swentel\nostr\Message\EventMessage; use swentel\nostr\Message\RequestMessage; use swentel\nostr\Relay\Relay; @@ -38,10 +40,10 @@ class NostrClient ]; public function __construct(private readonly EntityManagerInterface $entityManager, - private readonly ManagerRegistry $managerRegistry, - private readonly ArticleFactory $articleFactory, - private readonly TokenStorageInterface $tokenStorage, - private readonly LoggerInterface $logger) + private readonly ManagerRegistry $managerRegistry, + private readonly ArticleFactory $articleFactory, + private readonly TokenStorageInterface $tokenStorage, + private readonly LoggerInterface $logger, private readonly RedisCacheService $redisCacheService) { $this->defaultRelaySet = new RelaySet(); $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 { $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(); foreach ($relays as $relayWss) { $relay = new Relay($relayWss);