123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- <?php
- namespace App\Console\Commands;
- use App\Media;
- use App\Services\MediaService;
- use App\Services\StatusService;
- use Illuminate\Console\Command;
- use Illuminate\Support\Facades\DB;
- class MediaReplaceDomainCommand extends Command
- {
- protected $signature = 'media:replacedomain {--original= : Original domain to replace} {--new= : New domain to use}';
- protected $description = 'Replace CDN domain in media URLs and clear associated caches';
- public function handle()
- {
- $originalDomain = $this->option('original');
- $newDomain = $this->option('new');
- if (! $originalDomain || ! $newDomain) {
- $this->error('Both --original and --new options are required');
- return 1;
- }
- if (! str_starts_with($originalDomain, 'https://')) {
- $this->error('Original domain must start with https://');
- return 1;
- }
- if (! str_starts_with($newDomain, 'https://')) {
- $this->error('New domain must start with https://');
- return 1;
- }
- $originalDomain = rtrim($originalDomain, '/');
- $newDomain = rtrim($newDomain, '/');
- if (preg_match('/[^a-zA-Z0-9\-\._\/:]/', $originalDomain) ||
- preg_match('/[^a-zA-Z0-9\-\._\/:]/', $newDomain)) {
- $this->error('Domains contain invalid characters');
- return 1;
- }
- $sampleMedia = Media::where('cdn_url', 'LIKE', $originalDomain.'%')->first();
- if (! $sampleMedia) {
- $this->error('No media entries found with the specified domain.');
- return 1;
- }
- $sampleNewUrl = str_replace($originalDomain, $newDomain, $sampleMedia->cdn_url);
- $this->info('Please verify this URL transformation:');
- $this->newLine();
- $this->info('Original URL:');
- $this->line($sampleMedia->cdn_url);
- $this->info('Will be changed to:');
- $this->line($sampleNewUrl);
- $this->newLine();
- $this->info('Please verify in your browser that both URLs are accessible.');
- if (! $this->confirm('Do you want to proceed with the replacement?')) {
- $this->info('Operation cancelled.');
- return 0;
- }
- $query = Media::where('cdn_url', 'LIKE', $originalDomain.'%');
- $count = $query->count();
- $this->info("Found {$count} media entries to update.");
- $bar = $this->output->createProgressBar($count);
- $errors = [];
- $query->chunkById(1000, function ($medias) use ($originalDomain, $newDomain, $bar, &$errors) {
- foreach ($medias as $media) {
- try {
- if (! str_starts_with($media->cdn_url, 'https://')) {
- $errors[] = "Media ID {$media->id} has invalid URL format: {$media->cdn_url}";
- $bar->advance();
- continue;
- }
- DB::transaction(function () use ($media, $originalDomain, $newDomain) {
- $media->cdn_url = str_replace($originalDomain, $newDomain, $media->cdn_url);
- $media->save();
- if ($media->status_id) {
- MediaService::del($media->status_id);
- StatusService::del($media->status_id);
- }
- });
- $bar->advance();
- } catch (\Exception $e) {
- $errors[] = "Failed to update Media ID {$media->id}: {$e->getMessage()}";
- $bar->advance();
- }
- }
- });
- $bar->finish();
- $this->newLine();
- if (! empty($errors)) {
- $this->newLine();
- $this->warn('Completed with errors:');
- foreach ($errors as $error) {
- $this->error($error);
- }
- return 1;
- }
- $this->info('Domain replacement completed successfully.');
- return 0;
- }
- }
|