option('website') ? Website::where('id', $this->option('website'))->get() : Website::all(); if ($websites->isEmpty()) { $this->warn('No websites found.'); return self::SUCCESS; } $summary = $websites->map(fn (Website $w) => [ 'id' => $w->id, 'name' => $w->name, 'retention' => $this->getRetentionDays($w) . ' days', 'cutoff' => Carbon::today()->subDays($this->getRetentionDays($w))->toDateString(), ])->toArray(); $this->table(['ID', 'Website', 'Retention', 'Delete before'], $summary); if (! $this->option('force') && ! $this->confirm('Proceed with purging old raw data?')) { $this->info('Cancelled.'); return self::SUCCESS; } foreach ($websites as $website) { $this->purgeForWebsite($website); } $this->info('Purge complete.'); return self::SUCCESS; } private function purgeForWebsite(Website $website): void { $retentionDays = $this->getRetentionDays($website); $cutoff = Carbon::today()->subDays($retentionDays); $this->info("Purging {$website->name} (data before {$cutoff->toDateString()})..."); $pvDeleted = PageView::where('website_id', $website->id) ->where('viewed_at', '<', $cutoff) ->delete(); $evDeleted = Event::where('website_id', $website->id) ->where('occurred_at', '<', $cutoff) ->delete(); $sessDeleted = AnalyticsSession::where('website_id', $website->id) ->where('started_at', '<', $cutoff) ->delete(); $this->line(" Deleted: {$pvDeleted} page views, {$evDeleted} events, {$sessDeleted} sessions"); } private function getRetentionDays(Website $website): int { return $website->settings['data_retention_days'] ?? self::DEFAULT_RETENTION_DAYS; } }