Files
2026-07-24 14:59:44 +01:00

33 lines
1.4 KiB
PHP

<?php
namespace Modules\Analytics\Services;
use Modules\Analytics\Models\AnalyticsEvent;
use Modules\Analytics\Models\DailyMetric;
final class AnalyticsAggregator
{
public function aggregate(?string $date = null): int
{
$date = $date ?: now()->subHour()->toDateString();
$written = 0;
$base = AnalyticsEvent::query()->whereDate('occurred_at', $date);
foreach ($base->clone()->select('site_id')->distinct()->pluck('site_id') as $siteId) {
$query = $base->clone()->where('site_id', $siteId);
$metrics = [
['page_views', 'all', $query->clone()->where('event_type', 'page_view')->count()],
['visitors', 'all', $query->clone()->whereNotNull('visitor_hash')->distinct('visitor_hash')->count('visitor_hash')],
['sessions', 'all', $query->clone()->whereNotNull('session_hash')->distinct('session_hash')->count('session_hash')],
['conversions', 'all', $query->clone()->where('event_type', 'conversion')->count()],
['searches', 'all', $query->clone()->where('event_type', 'search')->count()],
];
foreach ($metrics as [$metric,$dimension,$value]) {
DailyMetric::updateOrCreate(['site_id' => $siteId, 'metric_date' => $date, 'metric' => $metric, 'dimension' => $dimension], ['value' => $value]);
$written++;
}
}
return $written;
}
}