* Page-view tracking * Unique visitor and session metrics * Content-view events * Search analytics * Conversion tracking * Form-submission events * Commerce events * Site-aware analytics * Privacy-conscious visitor hashing * Optional IP anonymisation * Do Not Track support * Configurable excluded paths * Daily metric aggregation * Top-page reporting * Recent-event activity * Report definitions * Scheduled report foundation * CSV and JSON report formats * Report execution history schema * Analytics retention and pruning * Administration navigation * Analytics permissions * Module registration * Feature test
28 lines
1.4 KiB
PHP
28 lines
1.4 KiB
PHP
<?php
|
|
namespace Modules\Analytics\Services;
|
|
use Illuminate\Support\Facades\DB;
|
|
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;
|
|
}
|
|
}
|