diff --git a/app/Metrics/App/WikiMetrics.php b/app/Metrics/App/WikiMetrics.php index e66c3c885..ffe93c373 100644 --- a/app/Metrics/App/WikiMetrics.php +++ b/app/Metrics/App/WikiMetrics.php @@ -7,34 +7,37 @@ class WikiMetrics { - public function saveMetrics(Wiki $wiki): void { $today = now()->format('Y-m-d'); $oldRecord = WikiDailyMetrics::where('wiki_id', $wiki->id)->latest('date')->first(); $todayPageCount = $wiki->wikiSiteStats()->first()->pages ?? 0; $isDeleted = (bool)$wiki->deleted_at; + + $dailyMetrics = new WikiDailyMetrics([ + 'id' => $wiki->id . '_' . date('Y-m-d'), + 'pages' => $todayPageCount, + 'is_deleted' => $isDeleted, + 'date' => $today, + 'wiki_id' => $wiki->id + ]); + if ($oldRecord) { if ($oldRecord->is_deleted) { \Log::info("Wiki is deleted, no new record for WikiMetrics ID {$wiki->id}."); return; } + if (!$isDeleted) { - if ($oldRecord->pages === $todayPageCount) { - \Log::info("Page count unchanged for WikiMetrics ID {$wiki->id}, no new record added."); + if ($oldRecord->areMetricsEqual($dailyMetrics)) { + \Log::info("Record unchanged for WikiMetrics ID {$wiki->id}, no new record added."); return; } } } - WikiDailyMetrics::create([ - 'id' => $wiki->id . '_' . date('Y-m-d'), - 'pages' => $todayPageCount, - 'is_deleted' => $isDeleted, - 'date' => $today, - 'wiki_id' => $wiki->id, - ]); + + $dailyMetrics->save(); + \Log::info("New metric recorded for WikiMetrics ID {$wiki->id}"); } - } - diff --git a/app/WikiDailyMetrics.php b/app/WikiDailyMetrics.php index e29eeaf1b..db00709f6 100644 --- a/app/WikiDailyMetrics.php +++ b/app/WikiDailyMetrics.php @@ -25,5 +25,20 @@ class WikiDailyMetrics extends Model 'is_deleted', ]; + // list of properties which are actual wiki metrics + public static $metricNames = [ + 'pages', + 'is_deleted', + ]; + + public function areMetricsEqual(WikiDailyMetrics $wikiDailyMetrics): bool + { + foreach(self::$metricNames as $field) { + if ($this->$field != $wikiDailyMetrics->$field) { + return false; + } + } + return true; + } } diff --git a/tests/WikiDailyMetricsTest.php b/tests/WikiDailyMetricsTest.php new file mode 100644 index 000000000..b63581924 --- /dev/null +++ b/tests/WikiDailyMetricsTest.php @@ -0,0 +1,53 @@ + [ + new WikiDailyMetrics(["pages" => 1, "is_deleted" => false ]), + new WikiDailyMetrics(["pages" => 1, "is_deleted" => false ]), + true + ]; + + yield 'more pages' => [ + new WikiDailyMetrics(["pages" => 1, "is_deleted" => false ]), + new WikiDailyMetrics(["pages" => 20, "is_deleted" => false ]), + false + ]; + + yield 'less pages' => [ + new WikiDailyMetrics(["pages" => 10, "is_deleted" => false ]), + new WikiDailyMetrics(["pages" => 1, "is_deleted" => false ]), + false + ]; + + yield 'is deleted' => [ + new WikiDailyMetrics(["pages" => 1, "is_deleted" => false ]), + new WikiDailyMetrics(["pages" => 1, "is_deleted" => true ]), + false + ]; + } + + /** + * @dataProvider areMetricsEqualProvider + */ + public function testAreMetricsEqual( + WikiDailyMetrics $wikiDailyMetrics1, + WikiDailyMetrics $wikiDailyMetrics2, + $assertion + ): void + { + $this->assertEquals( + $wikiDailyMetrics1->areMetricsEqual($wikiDailyMetrics2), + $assertion + ); + } +}