first
This commit is contained in:
68
app/Console/Commands/ExportPurgeCommand.php
Normal file
68
app/Console/Commands/ExportPurgeCommand.php
Normal file
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Models\ExportLog;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
class ExportPurgeCommand extends Command
|
||||
{
|
||||
protected $signature = 'exports:purge {--days=30 : Minimum age in days before an export file is purged}';
|
||||
|
||||
protected $description = 'Purge export files older than the configured retention period and mark export_logs records as purged.';
|
||||
|
||||
public function handle(): int
|
||||
{
|
||||
$days = (int) $this->option('days');
|
||||
|
||||
if ($days < 1) {
|
||||
$this->error('--days must be at least 1.');
|
||||
|
||||
return self::FAILURE;
|
||||
}
|
||||
|
||||
$cutoff = now()->subDays($days);
|
||||
|
||||
$logs = ExportLog::query()
|
||||
->whereNull('purged_at')
|
||||
->where('created_at', '<', $cutoff)
|
||||
->get();
|
||||
|
||||
if ($logs->isEmpty()) {
|
||||
$this->info("No export files eligible for purge (older than {$days} days).");
|
||||
|
||||
return self::SUCCESS;
|
||||
}
|
||||
|
||||
$purged = 0;
|
||||
$missing = 0;
|
||||
|
||||
foreach ($logs as $log) {
|
||||
$disk = $log->disk ?? 'local';
|
||||
$path = $log->path;
|
||||
|
||||
if ($path && Storage::disk($disk)->exists($path)) {
|
||||
Storage::disk($disk)->delete($path);
|
||||
$purged++;
|
||||
} else {
|
||||
$missing++;
|
||||
}
|
||||
|
||||
$log->forceFill(['purged_at' => now()])->save();
|
||||
|
||||
activity('exports')
|
||||
->performedOn($log)
|
||||
->withProperties([
|
||||
'report_type' => $log->report_type,
|
||||
'path' => $path,
|
||||
'retention_days' => $days,
|
||||
])
|
||||
->log('export_file_purged');
|
||||
}
|
||||
|
||||
$this->info("Purged {$purged} export file(s). {$missing} record(s) had no file on disk.");
|
||||
|
||||
return self::SUCCESS;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user