onQueue('publishing'); } /** * Execute the job. * @throws PublishException */ public function handle(): 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); /** @var ArticlePublishingService $publishingService */ $publishingService = resolve(ArticlePublishingService::class); 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; } } }