onQueue('feed-discovery'); } public function handle(LogSaver $logSaver, ArticleFetcher $articleFetcher): void { $logSaver->info('Starting feed article fetch', null, [ 'feed_id' => $this->feed->id, 'feed_name' => $this->feed->name, 'feed_url' => $this->feed->url ]); $articles = $articleFetcher->getArticlesFromFeed($this->feed); $logSaver->info('Feed article fetch completed', null, [ 'feed_id' => $this->feed->id, 'feed_name' => $this->feed->name, 'articles_count' => $articles->count() ]); $this->feed->update(['last_fetched_at' => now()]); } public static function dispatchForAllActiveFeeds(): void { $logSaver = app(LogSaver::class); Feed::where('is_active', true) ->get() ->each(function (Feed $feed, $index) use ($logSaver) { // Space jobs apart to avoid overwhelming feeds $delayMinutes = $index * self::FEED_DISCOVERY_DELAY_MINUTES; self::dispatch($feed) ->delay(now()->addMinutes($delayMinutes)) ->onQueue('feed-discovery'); $logSaver->info('Dispatched feed discovery job', null, [ 'feed_id' => $feed->id, 'feed_name' => $feed->name, 'delay_minutes' => $delayMinutes ]); }); } }