diff --git a/app/Jobs/PollForMediaWikiJobsJob.php b/app/Jobs/PollForMediaWikiJobsJob.php index 6e3ad016..ef8d8718 100644 --- a/app/Jobs/PollForMediaWikiJobsJob.php +++ b/app/Jobs/PollForMediaWikiJobsJob.php @@ -3,6 +3,8 @@ namespace App\Jobs; use App\Services\MediaWikiHostResolver; +use App\Services\UnknownDBVersionException; +use App\Services\UnknownWikiDomainException; use App\Wiki; use Illuminate\Contracts\Queue\ShouldBeUnique; use Illuminate\Contracts\Queue\ShouldQueue; @@ -16,19 +18,29 @@ class PollForMediaWikiJobsJob extends Job implements ShouldBeUnique, ShouldQueue public function handle(MediaWikiHostResolver $mwHostResolver): void { $this->mwHostResolver = $mwHostResolver; - $allWikiDomains = Wiki::all()->pluck('domain'); - foreach ($allWikiDomains as $wikiDomain) { - if ($this->hasPendingJobs($wikiDomain)) { - $this->enqueueWiki($wikiDomain); + $wikis = Wiki::with('wikiDb') + ->get(); + + foreach ($wikis as $wiki) { + try { + $backendUrl = $this->mwHostResolver->getBackendUrlForWiki($wiki); + } catch (UnknownWikiDomainException|UnknownDBVersionException $e) { + Log::warning('Skipping wiki ' . $wiki->domain . ' for pending MediaWiki jobs: ' . $e->getMessage()); + + continue; + } + + if ($this->hasPendingJobs($wiki->domain, $backendUrl)) { + $this->enqueueWiki($wiki->domain); } } } - private function hasPendingJobs(string $wikiDomain): bool { + private function hasPendingJobs(string $wikiDomain, string $backendUrl): bool { $response = Http::withHeaders([ 'host' => $wikiDomain, ])->get( - $this->mwHostResolver->getBackendUrlForDomain($wikiDomain) . '/w/api.php?action=query&meta=siteinfo&siprop=statistics&format=json' + $backendUrl . '/w/api.php?action=query&meta=siteinfo&siprop=statistics&format=json' ); if ($response->failed()) { diff --git a/app/Services/MediaWikiHostResolver.php b/app/Services/MediaWikiHostResolver.php index ef8584eb..7fa75dd3 100644 --- a/app/Services/MediaWikiHostResolver.php +++ b/app/Services/MediaWikiHostResolver.php @@ -44,6 +44,15 @@ public function getBackendUrlForDomain(string $domain): string { return 'http://' . $this->getBackendHostForDomain($domain); } + public function getBackendUrlForWiki($wiki): string { + return 'http://' . $this->getBackendHostForWiki($wiki); + } + + public function getBackendHostForWiki($wiki): string { + // TODO: Make host format configurable for flexibility + return sprintf('mediawiki-%s-app-backend.default.svc.cluster.local', $this->getMwVersionForWiki($wiki)); + } + private function getMwVersionForDomain(string $domain): string { $wiki = Wiki::where('domain', $domain)->first(); @@ -51,12 +60,20 @@ private function getMwVersionForDomain(string $domain): string { throw new UnknownWikiDomainException("Unknown Wiki Domain '{$domain}'."); } - $dbVersion = $wiki->wikiDb->version; + return $this->getMwVersionForWiki($wiki); + } + + private function getMwVersionForWiki($wiki): string { + $dbVersion = $wiki->wikiDb?->version; + + if ($dbVersion === null) { + throw new UnknownDBVersionException("Unknown DB version for domain '{$wiki->domain}'."); + } $versionMap = config('mw-db-version-map'); if (array_key_exists($dbVersion, $versionMap)) { return $versionMap[$dbVersion]; } - throw new UnknownDBVersionException("Unknown DB version '{$dbVersion}' for domain '{$domain}'."); + throw new UnknownDBVersionException("Unknown DB version '{$dbVersion}' for domain '{$wiki->domain}'."); } } diff --git a/tests/Jobs/PollForMediaWikiJobsJobTest.php b/tests/Jobs/PollForMediaWikiJobsJobTest.php index 4dd7821c..0cc21691 100644 --- a/tests/Jobs/PollForMediaWikiJobsJobTest.php +++ b/tests/Jobs/PollForMediaWikiJobsJobTest.php @@ -29,7 +29,7 @@ protected function setUp(): void { $this->mwBackendHost = 'http://mediawiki.localhost'; $this->mockMwHostResolver = $this->createMock(MediaWikiHostResolver::class); - $this->mockMwHostResolver->method('getBackendUrlForDomain')->willReturn( + $this->mockMwHostResolver->method('getBackendUrlForWiki')->willReturn( $this->mwBackendHost ); }