33 lines
1.4 KiB
PHP
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;
|
|
}
|
|
}
|