diff --git a/app/Services/MediaWikiHostResolver.php b/app/Services/MediaWikiHostResolver.php new file mode 100644 index 000000000..38bd64383 --- /dev/null +++ b/app/Services/MediaWikiHostResolver.php @@ -0,0 +1,42 @@ + Map of DB version strings to MediaWiki backend version strings */ + private const DB_VERSION_TO_MW_VERSION = [ + 'mw1.39-wbs1' => '139-app', + 'mw1.43-wbs1' => '143-app', + ]; + + // This service could have other methods in future, e.g. getBackendHostForWiki() + // public function getBackendHostForWiki(Wiki $wiki): string { + // return $this->getBackendHostForDomain($wiki->domain); + // } + + public function getBackendHostForDomain(string $domain): string { + // TODO: Move 'backend.default.svc.cluster.local' to an env variable (e.g. PLATFORM_MW_BACKEND_HOST_SUFFIX) for flexibility. + return sprintf('mediawiki-%s-backend.default.svc.cluster.local', $this->getMwVersionForDomain($domain)); + } + + public function getMwVersionForDomain(string $domain): string { + $dbVersion = Wiki::where('domain', $domain) + ->first() + ->wikiDb + ->version; + + if (array_key_exists($dbVersion, self::DB_VERSION_TO_MW_VERSION)) { + return self::DB_VERSION_TO_MW_VERSION[$dbVersion]; + } + throw new UnknownDBVersionException("Unknown DB version '{$dbVersion}' for domain '{$domain}'."); + } +} diff --git a/tests/Services/MediaWikiHostResolverTest.php b/tests/Services/MediaWikiHostResolverTest.php new file mode 100644 index 000000000..826c5f1f7 --- /dev/null +++ b/tests/Services/MediaWikiHostResolverTest.php @@ -0,0 +1,46 @@ +create()->unique()->text(30); + $this->createWiki($domain, 'mw1.39-wbs1'); + $resolver = new MediaWikiHostResolver; + $this->assertEquals( + 'mediawiki-139-app-backend.default.svc.cluster.local', + $resolver->getBackendHostForDomain($domain) + ); + } + + private function createWiki(string $domain, string $version) { + $wiki = Wiki::factory()->create(['domain' => $domain]); + WikiDb::create([ + 'name' => $domain, + 'user' => 'someUser', + 'password' => 'somePassword', + 'version' => $version, + 'prefix' => 'somePrefix', + 'wiki_id' => $wiki->id, + ]); + } + + public function testResolverThrowsIfUnableToFindHostInMap(): void { + $domain = (new Factory)->create()->unique()->text(30); + $this->createWiki($domain, 'mw1.39-unmapped'); + $resolver = new MediaWikiHostResolver; + $this->assertThrows( + fn () => $resolver->getBackendHostForDomain($domain), + UnknownDBVersionException::class + ); + } +}