onQueue('publishing'); } /** * Execute the job. * * @throws PublishException */ public function handle(ArticleFetcher $articleFetcher, ArticlePublishingService $publishingService): void { $interval = Setting::getArticlePublishingInterval(); if ($interval > 0) { $lastPublishedAt = ArticlePublication::max('published_at'); if ($lastPublishedAt && now()->diffInMinutes($lastPublishedAt, absolute: true) < $interval) { return; } } // 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; } ActionPerformed::dispatch('Publishing next article from scheduled job', LogLevelEnum::INFO, [ '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); ActionPerformed::dispatch('Successfully published article', LogLevelEnum::INFO, [ 'article_id' => $article->id, 'title' => $article->title, ]); } catch (PublishException $e) { ActionPerformed::dispatch('Failed to publish article', LogLevelEnum::ERROR, [ 'article_id' => $article->id, 'error' => $e->getMessage(), ]); throw $e; } } }