From 634e378907f72dfcba8350e352b0acb0f6dbf296 Mon Sep 17 00:00:00 2001 From: Ollie Date: Sat, 3 Oct 2026 01:24:06 +0100 Subject: [PATCH 1/2] Remove unused `DispatchesJobs` trait from `QueueSearchIndexBatches` Remove the no-longer-used `DispatchesJobs` trait from `QueueSearchIndexBatches`. The `$this->dispatch()` statement that was making use of this trait was removed in 00c5872 as part of the Laravel 10 upgrade. Bug: T440286 --- app/Jobs/CirrusSearch/QueueSearchIndexBatches.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/Jobs/CirrusSearch/QueueSearchIndexBatches.php b/app/Jobs/CirrusSearch/QueueSearchIndexBatches.php index 2ef3c9ea7..148ec6b84 100644 --- a/app/Jobs/CirrusSearch/QueueSearchIndexBatches.php +++ b/app/Jobs/CirrusSearch/QueueSearchIndexBatches.php @@ -2,7 +2,6 @@ namespace App\Jobs\CirrusSearch; -use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminate\Support\Facades\Log; /** @@ -13,8 +12,6 @@ * php artisan job:dispatch CirrusSearch\\QueueSearchIndexBatches 1 */ class QueueSearchIndexBatches extends CirrusSearchJob { - use DispatchesJobs; - public function apiModule(): string { return 'wbstackQueueSearchIndexBatches'; } From 025181ab5ec4bee8c5f78790c419a3c68e80036b Mon Sep 17 00:00:00 2001 From: Ollie Date: Sat, 3 Oct 2026 01:24:30 +0100 Subject: [PATCH 2/2] Standardize application job definitions * Use `Illuminate\Foundation\Queue\Queueable` in `App\Jobs\Job` so every application job receives the same dispatching, queue interaction, queue configuration, and model serialization behavior from a single source. * Convert relevant Jobs to inherit from this shared base. * Add an architecture test to check that all queueable jobs extend `App\Jobs\Job`. Bug: T440286 --- app/Jobs/ElasticSearchAliasInit.php | 3 -- app/Jobs/FailStalledEntityImportsJob.php | 6 +-- app/Jobs/GenerateOAuth2KeysJob.php | 6 +-- app/Jobs/Job.php | 16 +------ app/Jobs/PollForMediaWikiJobsJob.php | 3 +- app/Jobs/ProcessMediaWikiJobsJob.php | 7 +--- app/Jobs/SpawnQueryserviceUpdaterJob.php | 7 +--- app/Jobs/UpdateWikiDailyMetricJob.php | 3 -- app/Jobs/UpdateWikiSiteStatsJob.php | 3 -- app/Jobs/WikiEntityImportJob.php | 6 +-- .../Architecture/JobsInheritBaseClassTest.php | 42 +++++++++++++++++++ 11 files changed, 50 insertions(+), 52 deletions(-) create mode 100644 tests/Architecture/JobsInheritBaseClassTest.php diff --git a/app/Jobs/ElasticSearchAliasInit.php b/app/Jobs/ElasticSearchAliasInit.php index 784dabeaa..497c82eb4 100644 --- a/app/Jobs/ElasticSearchAliasInit.php +++ b/app/Jobs/ElasticSearchAliasInit.php @@ -4,13 +4,10 @@ use App\Http\Curl\HttpRequest; use App\WikiDb; -use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\Middleware\WithoutOverlapping; use Illuminate\Support\Facades\Log; class ElasticSearchAliasInit extends Job { - use Dispatchable; - public readonly int $wikiId; public readonly string $esHost; diff --git a/app/Jobs/FailStalledEntityImportsJob.php b/app/Jobs/FailStalledEntityImportsJob.php index 064286d64..639b1f275 100644 --- a/app/Jobs/FailStalledEntityImportsJob.php +++ b/app/Jobs/FailStalledEntityImportsJob.php @@ -5,13 +5,9 @@ use App\WikiEntityImport; use App\WikiEntityImportStatus; use Carbon\Carbon; -use Illuminate\Contracts\Queue\ShouldQueue; -use Illuminate\Foundation\Queue\Queueable; use Illuminate\Support\Facades\Log; -class FailStalledEntityImportsJob implements ShouldQueue { - use Queueable; - +class FailStalledEntityImportsJob extends Job { public function handle(): void { $deadline = Carbon::now()->subHours(24); $now = Carbon::now(); diff --git a/app/Jobs/GenerateOAuth2KeysJob.php b/app/Jobs/GenerateOAuth2KeysJob.php index 9bb9339ee..13ce0e19a 100644 --- a/app/Jobs/GenerateOAuth2KeysJob.php +++ b/app/Jobs/GenerateOAuth2KeysJob.php @@ -4,13 +4,9 @@ use App\Wiki; use App\WikiSetting; -use Illuminate\Contracts\Queue\ShouldQueue; -use Illuminate\Foundation\Queue\Queueable; use Illuminate\Support\Facades\Log; -class GenerateOAuth2KeysJob extends Job implements ShouldQueue { - use Queueable; - +class GenerateOAuth2KeysJob extends Job { public function handle() { $allWikis = Wiki::all(); diff --git a/app/Jobs/Job.php b/app/Jobs/Job.php index 869ae1aa7..51e565542 100644 --- a/app/Jobs/Job.php +++ b/app/Jobs/Job.php @@ -2,24 +2,12 @@ namespace App\Jobs; -use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; -use Illuminate\Queue\InteractsWithQueue; -use Illuminate\Queue\SerializesModels; +use Illuminate\Foundation\Queue\Queueable; use Illuminate\Support\Facades\Config; abstract class Job implements ShouldQueue { - /* - |-------------------------------------------------------------------------- - | Queueable Jobs - |-------------------------------------------------------------------------- - | - | This job base class provides a central location to place any logic that - | is shared across all of your jobs. The trait included with the class - | provides access to the "queueOn" and "delay" queue helper methods. - | - */ - use InteractsWithQueue, Queueable, SerializesModels; + use Queueable; public $timeout = 60; diff --git a/app/Jobs/PollForMediaWikiJobsJob.php b/app/Jobs/PollForMediaWikiJobsJob.php index ef8d87183..f39849f55 100644 --- a/app/Jobs/PollForMediaWikiJobsJob.php +++ b/app/Jobs/PollForMediaWikiJobsJob.php @@ -7,11 +7,10 @@ use App\Services\UnknownWikiDomainException; use App\Wiki; use Illuminate\Contracts\Queue\ShouldBeUnique; -use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Log; -class PollForMediaWikiJobsJob extends Job implements ShouldBeUnique, ShouldQueue { +class PollForMediaWikiJobsJob extends Job implements ShouldBeUnique { private MediaWikiHostResolver $mwHostResolver; public $timeout = 1800; diff --git a/app/Jobs/ProcessMediaWikiJobsJob.php b/app/Jobs/ProcessMediaWikiJobsJob.php index 7fdb32671..93f114801 100644 --- a/app/Jobs/ProcessMediaWikiJobsJob.php +++ b/app/Jobs/ProcessMediaWikiJobsJob.php @@ -3,18 +3,13 @@ namespace App\Jobs; use App\Services\MediaWikiHostResolver; -use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldBeUnique; -use Illuminate\Contracts\Queue\ShouldQueue; -use Illuminate\Queue\InteractsWithQueue; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\Log; use Maclof\Kubernetes\Client; use Maclof\Kubernetes\Models\Job as KubernetesJob; -class ProcessMediaWikiJobsJob implements ShouldBeUnique, ShouldQueue { - use InteractsWithQueue, Queueable; - +class ProcessMediaWikiJobsJob extends Job implements ShouldBeUnique { private string $wikiDomain; private string $jobsKubernetesNamespace; diff --git a/app/Jobs/SpawnQueryserviceUpdaterJob.php b/app/Jobs/SpawnQueryserviceUpdaterJob.php index 925236431..6a59016e9 100644 --- a/app/Jobs/SpawnQueryserviceUpdaterJob.php +++ b/app/Jobs/SpawnQueryserviceUpdaterJob.php @@ -2,18 +2,13 @@ namespace App\Jobs; -use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldBeUnique; -use Illuminate\Contracts\Queue\ShouldQueue; -use Illuminate\Queue\InteractsWithQueue; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\Log; use Maclof\Kubernetes\Client; use Maclof\Kubernetes\Models\Job as KubernetesJob; -class SpawnQueryserviceUpdaterJob implements ShouldBeUnique, ShouldQueue { - use InteractsWithQueue, Queueable; - +class SpawnQueryserviceUpdaterJob extends Job implements ShouldBeUnique { public string $wikiDomain; public string $entities; diff --git a/app/Jobs/UpdateWikiDailyMetricJob.php b/app/Jobs/UpdateWikiDailyMetricJob.php index 0ee709dfd..060c466f0 100755 --- a/app/Jobs/UpdateWikiDailyMetricJob.php +++ b/app/Jobs/UpdateWikiDailyMetricJob.php @@ -5,13 +5,10 @@ use App\Metrics\App\WikiMetrics; use App\Wiki; use Illuminate\Contracts\Queue\ShouldBeUnique; -use Illuminate\Foundation\Bus\Dispatchable; // This job is for the daily measurements of metrics per wikibases. // This is to help in understanding the purpose of active wikis. class UpdateWikiDailyMetricJob extends Job implements ShouldBeUnique { - use Dispatchable; - public $timeout = 3600; /** diff --git a/app/Jobs/UpdateWikiSiteStatsJob.php b/app/Jobs/UpdateWikiSiteStatsJob.php index 9abc1ee03..2cd36f7ee 100644 --- a/app/Jobs/UpdateWikiSiteStatsJob.php +++ b/app/Jobs/UpdateWikiSiteStatsJob.php @@ -8,14 +8,11 @@ use Carbon\Carbon; use Carbon\CarbonInterface; use Illuminate\Contracts\Queue\ShouldBeUnique; -use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Log; class UpdateWikiSiteStatsJob extends Job implements ShouldBeUnique { - use Dispatchable; - public $timeout = 3600; private MediaWikiHostResolver $mwHostResolver; diff --git a/app/Jobs/WikiEntityImportJob.php b/app/Jobs/WikiEntityImportJob.php index e8887426b..fd4106471 100644 --- a/app/Jobs/WikiEntityImportJob.php +++ b/app/Jobs/WikiEntityImportJob.php @@ -7,17 +7,13 @@ use App\WikiEntityImport; use App\WikiEntityImportStatus; use Carbon\Carbon; -use Illuminate\Contracts\Queue\ShouldQueue; -use Illuminate\Foundation\Queue\Queueable; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Log; use Maclof\Kubernetes\Client; use Maclof\Kubernetes\Models\Job as KubernetesJob; -class WikiEntityImportJob implements ShouldQueue { - use Queueable; - +class WikiEntityImportJob extends Job { /** * Create a new job instance. */ diff --git a/tests/Architecture/JobsInheritBaseClassTest.php b/tests/Architecture/JobsInheritBaseClassTest.php new file mode 100644 index 000000000..e541ada03 --- /dev/null +++ b/tests/Architecture/JobsInheritBaseClassTest.php @@ -0,0 +1,42 @@ +assertTrue(is_subclass_of($jobClass, Job::class)); + } + + public static function provideQueuedJobClasses(): iterable { + $jobsPath = realpath(dirname(__DIR__, 2) . '/app/Jobs'); + $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($jobsPath)); + foreach ($files as $file) { + if ($file->isFile() && $file->getExtension() === 'php') { + require_once $file->getPathname(); + } + } + + foreach (get_declared_classes() as $class) { + $reflection = new ReflectionClass($class); + $fileName = $reflection->getFileName(); + + if ( + $fileName !== false + && str_starts_with($fileName, $jobsPath . DIRECTORY_SEPARATOR) + && $class !== Job::class + && $reflection->implementsInterface(ShouldQueue::class) + ) { + yield $class => [$class]; + } + } + } +}