Files
ABSDEV/Modules/Analytics/Services/AnalyticsAggregator.php
T
Mark Gregory 76e29fab03 Analytics administration dashboard
* 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
2026-07-24 13:06:48 +01:00

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;
}
}