diff --git a/app/Metrics/App/WikiMetrics.php b/app/Metrics/App/WikiMetrics.php index 8dc6661e..8998debc 100644 --- a/app/Metrics/App/WikiMetrics.php +++ b/app/Metrics/App/WikiMetrics.php @@ -36,6 +36,7 @@ public function saveMetrics(Wiki $wiki): void { $quarterlyActions = $this->getNumberOfActions(self::INTERVAL_QUARTERLY); $numberOfEntities = $this->getNumberOfEntities(); $monthlyNumberOfUsersPerActivityType = $this->getNumberOfUsersPerActivityType(); + $numberOfUsersPerWiki = $this->getTotalUserCount(); $dailyMetrics = new WikiDailyMetrics([ 'id' => $wiki->id . '_' . date('Y-m-d'), @@ -54,6 +55,7 @@ public function saveMetrics(Wiki $wiki): void { 'entity_schema_count' => $numberOfEntities['640'], 'monthly_casual_users' => $monthlyNumberOfUsersPerActivityType[0], 'monthly_active_users' => $monthlyNumberOfUsersPerActivityType[1], + 'total_user_count' => $numberOfUsersPerWiki, ]); // compare current record to old record and only save if there is a change @@ -210,4 +212,17 @@ private function getNumberOfEntities(): array { return $result; } + + private function getTotalUserCount() { + $wikiDb = $this->wiki->wikiDb; + $tableUser = "{$wikiDb->name}.{$wikiDb->prefix}_user"; + $query = "SELECT COUNT(*) AS total_users FROM $tableUser"; + $manager = app()->db; + $manager->purge('mw'); + $conn = $manager->connection('mw'); + $pdo = $conn->getPdo(); + $result = $pdo->query($query)->fetch(PDO::FETCH_ASSOC); + + return $result['total_users'] ?? null; + } } diff --git a/app/WikiDailyMetrics.php b/app/WikiDailyMetrics.php index e75ec45a..94ca15b3 100644 --- a/app/WikiDailyMetrics.php +++ b/app/WikiDailyMetrics.php @@ -33,6 +33,7 @@ class WikiDailyMetrics extends Model { 'entity_schema_count', 'monthly_casual_users', 'monthly_active_users', + 'total_user_count', ]; @@ -51,6 +52,7 @@ class WikiDailyMetrics extends Model { 'entity_schema_count', 'monthly_casual_users', 'monthly_active_users', + 'total_user_count', ]; public function areMetricsEqual(WikiDailyMetrics $wikiDailyMetrics): bool { diff --git a/database/migrations/2025_12_07_204557_add_total_user_count_to_wiki_daily_metrics.php b/database/migrations/2025_12_07_204557_add_total_user_count_to_wiki_daily_metrics.php new file mode 100644 index 00000000..54fe369f --- /dev/null +++ b/database/migrations/2025_12_07_204557_add_total_user_count_to_wiki_daily_metrics.php @@ -0,0 +1,25 @@ +integer('total_user_count')->nullable()->default(null); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void { + Schema::table('wiki_daily_metrics', function (Blueprint $table) { + $table->dropColumn('total_user_count'); + }); + } +}; diff --git a/tests/Metrics/WikiMetricsTest.php b/tests/Metrics/WikiMetricsTest.php index a3df4e7b..af9d84ef 100644 --- a/tests/Metrics/WikiMetricsTest.php +++ b/tests/Metrics/WikiMetricsTest.php @@ -354,7 +354,6 @@ public function testSavesEntityCountsCorrectly($expectedItemCount, $expectedProp // clean up after the test $wiki->forceDelete(); - Schema::dropIfExists($tablePage); $this->assertDatabaseHas('wiki_daily_metrics', [ 'wiki_id' => $wiki->id, @@ -364,4 +363,63 @@ public function testSavesEntityCountsCorrectly($expectedItemCount, $expectedProp 'entity_schema_count' => $expectedEntitySchemaCount, // redirects should be ignored ]); } + + public function testSavesTotalUserCountCorrectly() { + $wiki = Wiki::factory()->create([ + 'domain' => 'usercounttest.wikibase.cloud', + ]); + + $users = [ + [ + 'user_name' => 'user1', + 'user_real_name' => 'user1', + 'user_password' => 'user1', + 'user_new_password' => 'user1', + 'user_email' => 'user1@email.com', + 'user_touched' => random_bytes(10), + ], + [ + 'user_name' => 'user2', + 'user_real_name' => 'user2', + 'user_password' => 'user2', + 'user_new_password' => 'user2', + 'user_email' => 'user2@email.com', + 'user_touched' => random_bytes(10), + ], + ]; + $wikiDb = WikiDb::first(); + $wikiDb->update(['wiki_id' => $wiki->id]); + + $tableUser = $wikiDb->name . '.' . $wikiDb->prefix . '_user'; + Schema::dropIfExists($tableUser); + Schema::create($tableUser, function (Blueprint $table) { + $table->increments('user_id'); + $table->string('user_name'); + $table->string('user_real_name')->default(0); + $table->string('user_password', 255); + $table->string('user_new_password'); + $table->string('user_email'); + $table->binary('user_touched'); + }); + + // Insert dummy data + DB::table($tableUser)->insert($users); + WikiDailyMetrics::create([ + 'id' => $wiki->id . '_' . now()->subDay()->toDateString(), + 'wiki_id' => $wiki->id, + 'date' => now()->subDay()->toDateString(), + 'pages' => 0, + 'is_deleted' => 0, + ]); + + (new WikiMetrics)->saveMetrics($wiki); + + // clean up after the test + $wiki->forceDelete(); + + $this->assertDatabaseHas('wiki_daily_metrics', [ + 'wiki_id' => $wiki->id, + 'total_user_count' => count($users), + ]); + } }