. */ namespace App\Console\Commands; use App\Models\TrackFile; use Carbon\Carbon; use Illuminate\Console\Command; use Illuminate\Support\Facades\File; class ClearTrackCache extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'track-cache:clear {--tracks=expired : Clear only [expired] (default) or [all] cached tracks.} {--force : Skip all prompts.}'; /** * The console command description. * * @var string */ protected $description = 'Clears cached tracks. Defaults to expired tracks. Usage: php artisan track-cache:clear [--tracks=expired|all]'; /** * Create a new command instance. */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return mixed */ public function handle() { if ($this->option('tracks') === 'all') { // Get all cacheable track files $trackFiles = TrackFile::where('is_cacheable', true) ->with('track.album') ->get(); } else { // Get all expired track files $trackFiles = TrackFile::where('is_cacheable', true) ->where('expires_at', '<=', Carbon::now()) ->with('track.album') ->get(); } // Delete above track files if (count($trackFiles) === 0) { $this->info('No tracks found. Exiting.'); } else { if ($this->option('force') || $this->confirm(count($trackFiles).' cacheable track files found. Proceed to delete their files if they exist? [y|N]', false)) { $count = 0; foreach ($trackFiles as $trackFile) { // Set expiration to null (so can be re-cached upon request) $trackFile->expires_at = null; $trackFile->update(); // Delete file if exists if (File::exists($trackFile->getFile())) { $count++; File::delete($trackFile->getFile()); $this->info('Deleted '.$trackFile->getFile()); } } $this->info($count.' files deleted. Deletion complete. Exiting.'); } else { $this->info('Deletion cancelled. Exiting.'); } } } }