onQueue('publishing'); } /** * Execute the job. * @throws PublishException */ public function handle(ArticleFetcher $articleFetcher, ArticlePublishingService $publishingService): void { // Get the oldest approved article that hasn't been published yet $article = Article::where('approval_status', 'approved') ->whereDoesntHave('articlePublication') ->oldest('created_at') ->first(); if (! $article) { return; } logger()->info('Publishing next article from scheduled job', [ 'article_id' => $article->id, 'title' => $article->title, 'url' => $article->url, 'created_at' => $article->created_at ]); // Fetch article data $extractedData = $articleFetcher->fetchArticleData($article); try { $publishingService->publishToRoutedChannels($article, $extractedData); logger()->info('Successfully published article', [ 'article_id' => $article->id, 'title' => $article->title ]); } catch (PublishException $e) { logger()->error('Failed to publish article', [ 'article_id' => $article->id, 'error' => $e->getMessage() ]); throw $e; } } }