pageCrawl->page->url); $this->pageCrawl->update([ 'outcome' => CrawlOutcomeEnum::Success, 'completed_at' => now(), 'status_code' => 200, ]); $update = match ($result->outcome) { CrawlOutcomeEnum::Rejected => [ 'status' => PageStatusEnum::Rejected, 'fetched_at' => null, ], CrawlOutcomeEnum::Timeout => [ 'status' => PageStatusEnum::Failed, 'failed_at' => now(), ], CrawlOutcomeEnum::Blocked4xx => [ 'status' => PageStatusEnum::Failed, 'failed_at' => now(), ], default => [ 'status' => PageStatusEnum::Fetched, 'fetched_at' => now(), 'title' => $result->title, ], }; $result->outboundLinks->each(fn (string $url) => $register($url)); $this->pageCrawl->page->update($update); if (in_array($result->outcome, [ CrawlOutcomeEnum::Failed, CrawlOutcomeEnum::Timeout, CrawlOutcomeEnum::Blocked5xx, ])) { $this->scheduleRetryIfNeeded($result, $this->pageCrawl); } } private function scheduleRetryIfNeeded(FetchResult $result, PageCrawl $crawl): void { if (PageCrawl::where('page_id', $crawl->page_id)->count() >= 3) { return; } $newRow = PageCrawl::withoutEvents( fn () => PageCrawl::create( array_merge($crawl->toArray(), [ 'outcome' => null, ]) ) ); ProcessCrawlJob::dispatch($newRow)->delay(now()->addHour()); } }