From ea35d0a5b2da4b716dae947372f229a3cb60d79b Mon Sep 17 00:00:00 2001 From: Ollie Date: Tue, 28 Oct 2025 14:32:06 +0000 Subject: [PATCH 01/11] Introduce MediaWikiHostResolver Co-authored-by: Ollie Bug: T409085 Bug: T408624 --- app/Services/MediaWikiHostResolver.php | 37 +++++++++++++++++ tests/Services/MediaWikiHostResolverTest.php | 43 ++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 app/Services/MediaWikiHostResolver.php create mode 100644 tests/Services/MediaWikiHostResolverTest.php diff --git a/app/Services/MediaWikiHostResolver.php b/app/Services/MediaWikiHostResolver.php new file mode 100644 index 000000000..54d5072ad --- /dev/null +++ b/app/Services/MediaWikiHostResolver.php @@ -0,0 +1,37 @@ + 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: should 'backend.default.svc.cluster.local' be an env var e.g. PLATFORM_MW_BACKEND_HOST_SUFFIX? + return sprintf('mediawiki-%s-backend.default.svc.cluster.local', $this->getMwVersionForDomain($domain)); + } + + public function getMwVersionForDomain(string $domain): string + { + $dbVersion = Wiki::where('domain', $domain) + ->whereNull('deleted_at') + ->leftJoin('wiki_dbs', 'wiki_id', '=', 'wikis.id') + ->pluck('version') + ->first(); + + return self::DB_VERSION_TO_MW_VERSION[$dbVersion]; + } +} diff --git a/tests/Services/MediaWikiHostResolverTest.php b/tests/Services/MediaWikiHostResolverTest.php new file mode 100644 index 000000000..403fb86f8 --- /dev/null +++ b/tests/Services/MediaWikiHostResolverTest.php @@ -0,0 +1,43 @@ +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 + { + $this->assertTrue(true); + } +} From 268a7f6c2154347a2322cdd88bab8d77d5935f4e Mon Sep 17 00:00:00 2001 From: Thomas Arrow Date: Tue, 4 Nov 2025 17:32:05 +0000 Subject: [PATCH 02/11] run pint --- app/Services/MediaWikiHostResolver.php | 11 ++++------- app/Wiki.php | 2 +- tests/Services/MediaWikiHostResolverTest.php | 16 ++++++---------- 3 files changed, 11 insertions(+), 18 deletions(-) diff --git a/app/Services/MediaWikiHostResolver.php b/app/Services/MediaWikiHostResolver.php index 54d5072ad..89c3079b8 100644 --- a/app/Services/MediaWikiHostResolver.php +++ b/app/Services/MediaWikiHostResolver.php @@ -4,13 +4,12 @@ use App\Wiki; -class MediaWikiHostResolver -{ +class MediaWikiHostResolver { // TODO: Move this mapping to a config file that doesn't require updating this code when doing a MW update? /** @var array 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' + 'mw1.43-wbs1' => '143-app', ]; // This service could have other methods in future, e.g. getBackendHostForWiki() @@ -18,14 +17,12 @@ class MediaWikiHostResolver // return $this->getBackendHostForDomain($wiki->domain); // } - public function getBackendHostForDomain(string $domain): string - { + public function getBackendHostForDomain(string $domain): string { // TODO: should 'backend.default.svc.cluster.local' be an env var e.g. PLATFORM_MW_BACKEND_HOST_SUFFIX? return sprintf('mediawiki-%s-backend.default.svc.cluster.local', $this->getMwVersionForDomain($domain)); } - public function getMwVersionForDomain(string $domain): string - { + public function getMwVersionForDomain(string $domain): string { $dbVersion = Wiki::where('domain', $domain) ->whereNull('deleted_at') ->leftJoin('wiki_dbs', 'wiki_id', '=', 'wikis.id') diff --git a/app/Wiki.php b/app/Wiki.php index e51e48af7..73723251b 100644 --- a/app/Wiki.php +++ b/app/Wiki.php @@ -73,7 +73,7 @@ public function wikiDbVersion() { /** * @psalm-suppress InvalidArgument */ - return $this->hasOne(WikiDb::class)->select(['id', 'wiki_id', 'version']); + return $this->hasOne(WikiDb::class)->version; } // TODO these should just be on the backend model? =] Or marked as a private relationship or something? diff --git a/tests/Services/MediaWikiHostResolverTest.php b/tests/Services/MediaWikiHostResolverTest.php index 403fb86f8..c4852a37b 100644 --- a/tests/Services/MediaWikiHostResolverTest.php +++ b/tests/Services/MediaWikiHostResolverTest.php @@ -5,19 +5,16 @@ use App\Services\MediaWikiHostResolver; use App\Wiki; use App\WikiDb; -use App\WikiDomain; use Faker\Factory; -use Faker\Generator; use Illuminate\Foundation\Testing\RefreshDatabase; -class MediaWikiHostResolverTest extends TestCase -{ +class MediaWikiHostResolverTest extends TestCase { use RefreshDatabase; - public function testResolverRoutesToCorrectHost(): void - { - $domain = (new Factory())->create()->unique()->text(30); + + public function testResolverRoutesToCorrectHost(): void { + $domain = (new Factory)->create()->unique()->text(30); $this->createWiki($domain, 'mw1.39-wbs1'); - $resolver = new MediaWikiHostResolver(); + $resolver = new MediaWikiHostResolver; $this->assertEquals( 'mediawiki-139-app-backend.default.svc.cluster.local', $resolver->getBackendHostForDomain($domain) @@ -36,8 +33,7 @@ private function createWiki(string $domain, string $version) { ]); } - public function testResolverThrowsIfUnableToFindHostInMap(): void - { + public function testResolverThrowsIfUnableToFindHostInMap(): void { $this->assertTrue(true); } } From bb8d713fe636f09ffca1cdcb28a921c54d26129d Mon Sep 17 00:00:00 2001 From: Thomas Arrow Date: Tue, 4 Nov 2025 17:43:54 +0000 Subject: [PATCH 03/11] revert Wiki.php changes --- app/Wiki.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Wiki.php b/app/Wiki.php index 73723251b..e51e48af7 100644 --- a/app/Wiki.php +++ b/app/Wiki.php @@ -73,7 +73,7 @@ public function wikiDbVersion() { /** * @psalm-suppress InvalidArgument */ - return $this->hasOne(WikiDb::class)->version; + return $this->hasOne(WikiDb::class)->select(['id', 'wiki_id', 'version']); } // TODO these should just be on the backend model? =] Or marked as a private relationship or something? From cf6f384befc00336ff07987e9066befbaa3c51e6 Mon Sep 17 00:00:00 2001 From: Thomas Arrow Date: Wed, 5 Nov 2025 10:23:39 +0000 Subject: [PATCH 04/11] throw if DB version isn't known --- app/Services/MediaWikiHostResolver.php | 8 +++++++- tests/Services/MediaWikiHostResolverTest.php | 9 ++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/app/Services/MediaWikiHostResolver.php b/app/Services/MediaWikiHostResolver.php index 89c3079b8..af06070a6 100644 --- a/app/Services/MediaWikiHostResolver.php +++ b/app/Services/MediaWikiHostResolver.php @@ -3,6 +3,7 @@ namespace App\Services; use App\Wiki; +use Exception; class MediaWikiHostResolver { // TODO: Move this mapping to a config file that doesn't require updating this code when doing a MW update? @@ -29,6 +30,11 @@ public function getMwVersionForDomain(string $domain): string { ->pluck('version') ->first(); - return self::DB_VERSION_TO_MW_VERSION[$dbVersion]; + if (array_key_exists($dbVersion, self::DB_VERSION_TO_MW_VERSION)) { + return self::DB_VERSION_TO_MW_VERSION[$dbVersion]; + } + throw new UnknownDBVersionException; } } + +class UnknownDBVersionException extends Exception {} diff --git a/tests/Services/MediaWikiHostResolverTest.php b/tests/Services/MediaWikiHostResolverTest.php index c4852a37b..826c5f1f7 100644 --- a/tests/Services/MediaWikiHostResolverTest.php +++ b/tests/Services/MediaWikiHostResolverTest.php @@ -3,6 +3,7 @@ namespace Tests; use App\Services\MediaWikiHostResolver; +use App\Services\UnknownDBVersionException; use App\Wiki; use App\WikiDb; use Faker\Factory; @@ -34,6 +35,12 @@ private function createWiki(string $domain, string $version) { } public function testResolverThrowsIfUnableToFindHostInMap(): void { - $this->assertTrue(true); + $domain = (new Factory)->create()->unique()->text(30); + $this->createWiki($domain, 'mw1.39-unmapped'); + $resolver = new MediaWikiHostResolver; + $this->assertThrows( + fn () => $resolver->getBackendHostForDomain($domain), + UnknownDBVersionException::class + ); } } From 3931ea33911d3732225afac0ad8348b2f416d90b Mon Sep 17 00:00:00 2001 From: Thomas Arrow Date: Wed, 5 Nov 2025 10:52:18 +0000 Subject: [PATCH 05/11] Update app/Services/MediaWikiHostResolver.php Co-authored-by: Dat WMDE --- app/Services/MediaWikiHostResolver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Services/MediaWikiHostResolver.php b/app/Services/MediaWikiHostResolver.php index af06070a6..828f63f7f 100644 --- a/app/Services/MediaWikiHostResolver.php +++ b/app/Services/MediaWikiHostResolver.php @@ -33,7 +33,7 @@ public function getMwVersionForDomain(string $domain): string { if (array_key_exists($dbVersion, self::DB_VERSION_TO_MW_VERSION)) { return self::DB_VERSION_TO_MW_VERSION[$dbVersion]; } - throw new UnknownDBVersionException; + throw new UnknownDBVersionException("Unknown DB version '{$dbVersion}' for domain '{$domain}'."); } } From 4f04370a3482617ecae7efb4aeb8134a9d994656 Mon Sep 17 00:00:00 2001 From: Thomas Arrow Date: Wed, 5 Nov 2025 10:52:29 +0000 Subject: [PATCH 06/11] Update app/Services/MediaWikiHostResolver.php Co-authored-by: Dat WMDE --- app/Services/MediaWikiHostResolver.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/Services/MediaWikiHostResolver.php b/app/Services/MediaWikiHostResolver.php index 828f63f7f..f71bd6387 100644 --- a/app/Services/MediaWikiHostResolver.php +++ b/app/Services/MediaWikiHostResolver.php @@ -37,4 +37,7 @@ public function getMwVersionForDomain(string $domain): string { } } +/** +* Exception thrown when a database version is not recognized in MediaWikiHostResolver. +*/ class UnknownDBVersionException extends Exception {} From 93380e79d05e9be1fc5069eee1fc3ce6c6576694 Mon Sep 17 00:00:00 2001 From: Thomas Arrow Date: Wed, 5 Nov 2025 11:12:14 +0000 Subject: [PATCH 07/11] use relations and accessors --- app/Services/MediaWikiHostResolver.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/Services/MediaWikiHostResolver.php b/app/Services/MediaWikiHostResolver.php index f71bd6387..aa46c384d 100644 --- a/app/Services/MediaWikiHostResolver.php +++ b/app/Services/MediaWikiHostResolver.php @@ -25,10 +25,9 @@ public function getBackendHostForDomain(string $domain): string { public function getMwVersionForDomain(string $domain): string { $dbVersion = Wiki::where('domain', $domain) - ->whereNull('deleted_at') - ->leftJoin('wiki_dbs', 'wiki_id', '=', 'wikis.id') - ->pluck('version') - ->first(); + ->first() + ->wikiDb + ->version; if (array_key_exists($dbVersion, self::DB_VERSION_TO_MW_VERSION)) { return self::DB_VERSION_TO_MW_VERSION[$dbVersion]; From 9680e42bdd8f915dae86beb488076f897fb0d9ee Mon Sep 17 00:00:00 2001 From: Thomas Arrow Date: Wed, 5 Nov 2025 11:18:24 +0000 Subject: [PATCH 08/11] fix indent --- app/Services/MediaWikiHostResolver.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Services/MediaWikiHostResolver.php b/app/Services/MediaWikiHostResolver.php index aa46c384d..b63815bda 100644 --- a/app/Services/MediaWikiHostResolver.php +++ b/app/Services/MediaWikiHostResolver.php @@ -37,6 +37,6 @@ public function getMwVersionForDomain(string $domain): string { } /** -* Exception thrown when a database version is not recognized in MediaWikiHostResolver. -*/ + * Exception thrown when a database version is not recognized in MediaWikiHostResolver. + */ class UnknownDBVersionException extends Exception {} From 560befa1835b449d7b8d166fe4097a6cb11b941a Mon Sep 17 00:00:00 2001 From: Thomas Arrow Date: Wed, 5 Nov 2025 14:03:02 +0000 Subject: [PATCH 09/11] Update app/Services/MediaWikiHostResolver.php Co-authored-by: Dat WMDE --- app/Services/MediaWikiHostResolver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Services/MediaWikiHostResolver.php b/app/Services/MediaWikiHostResolver.php index b63815bda..9177540c5 100644 --- a/app/Services/MediaWikiHostResolver.php +++ b/app/Services/MediaWikiHostResolver.php @@ -6,7 +6,7 @@ use Exception; class MediaWikiHostResolver { - // TODO: Move this mapping to a config file that doesn't require updating this code when doing a MW update? + // TODO: Move this mapping to a config file so that MW updates do not require code changes here. /** @var array Map of DB version strings to MediaWiki backend version strings */ private const DB_VERSION_TO_MW_VERSION = [ 'mw1.39-wbs1' => '139-app', From ed48825bc997a72c4f610c8d138cb293ce098a46 Mon Sep 17 00:00:00 2001 From: Thomas Arrow Date: Wed, 5 Nov 2025 14:03:30 +0000 Subject: [PATCH 10/11] Update app/Services/MediaWikiHostResolver.php Co-authored-by: Dat WMDE --- app/Services/MediaWikiHostResolver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Services/MediaWikiHostResolver.php b/app/Services/MediaWikiHostResolver.php index 9177540c5..a27f1a62a 100644 --- a/app/Services/MediaWikiHostResolver.php +++ b/app/Services/MediaWikiHostResolver.php @@ -19,7 +19,7 @@ class MediaWikiHostResolver { // } public function getBackendHostForDomain(string $domain): string { - // TODO: should 'backend.default.svc.cluster.local' be an env var e.g. PLATFORM_MW_BACKEND_HOST_SUFFIX? + // 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)); } From 1ec7671bffc7e639308f97aadebecda8eaf64abc Mon Sep 17 00:00:00 2001 From: Thomas Arrow Date: Wed, 5 Nov 2025 14:06:15 +0000 Subject: [PATCH 11/11] move exception above class --- app/Services/MediaWikiHostResolver.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/Services/MediaWikiHostResolver.php b/app/Services/MediaWikiHostResolver.php index a27f1a62a..38bd64383 100644 --- a/app/Services/MediaWikiHostResolver.php +++ b/app/Services/MediaWikiHostResolver.php @@ -5,6 +5,11 @@ use App\Wiki; use Exception; +/** + * Exception thrown when a database version is not recognized in MediaWikiHostResolver. + */ +class UnknownDBVersionException extends Exception {} + class MediaWikiHostResolver { // TODO: Move this mapping to a config file so that MW updates do not require code changes here. /** @var array Map of DB version strings to MediaWiki backend version strings */ @@ -35,8 +40,3 @@ public function getMwVersionForDomain(string $domain): string { throw new UnknownDBVersionException("Unknown DB version '{$dbVersion}' for domain '{$domain}'."); } } - -/** - * Exception thrown when a database version is not recognized in MediaWikiHostResolver. - */ -class UnknownDBVersionException extends Exception {}