86 lines
2.6 KiB
PHP
86 lines
2.6 KiB
PHP
<?php
|
|
|
|
namespace App\Console\Commands\OneTime;
|
|
|
|
use App\Events\MoveAvatarEvent;
|
|
use App\Models\Contact\Contact;
|
|
use Illuminate\Console\Command;
|
|
use Illuminate\Support\Facades\Event;
|
|
use Illuminate\Console\ConfirmableTrait;
|
|
use App\Exceptions\FileNotFoundException;
|
|
use Symfony\Component\Console\Output\OutputInterface;
|
|
use App\Jobs\Avatars\MoveContactAvatarToPhotosDirectory;
|
|
|
|
/**
|
|
* This command moves current avatars to the new Photos directory and converts
|
|
* each avatar to a Photo object.
|
|
*/
|
|
class MoveAvatarsToPhotosDirectory extends Command
|
|
{
|
|
use ConfirmableTrait;
|
|
|
|
/**
|
|
* The name and signature of the console command.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $signature = 'monica:moveavatarstophotosdirectory
|
|
{--force : Force the operation to run when in production.}
|
|
{--dryrun : Simulate the execution but not write anything.}';
|
|
|
|
/**
|
|
* The console command description.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $description = 'Move avatars to the Photos directory, and create a photo object for each one of them';
|
|
|
|
/**
|
|
* Execute the console command.
|
|
*
|
|
* @return mixed
|
|
*/
|
|
public function handle()
|
|
{
|
|
if (! $this->confirmToProceed()) {
|
|
return;
|
|
}
|
|
|
|
Event::listen(MoveAvatarEvent::class, function ($event) {
|
|
$this->handleEvent($event->contact);
|
|
});
|
|
|
|
$delay = now();
|
|
|
|
Contact::where('has_avatar', true)
|
|
->chunk(100, function ($contacts) use ($delay) {
|
|
foreach ($contacts as $contact) {
|
|
if ($contact->avatar_source === 'default') {
|
|
$this->handleContact($contact, $delay);
|
|
}
|
|
}
|
|
// add some delay, so we treat 100 contacts each minutes
|
|
$delay = $delay->addMinutes(1);
|
|
});
|
|
}
|
|
|
|
private function handleContact($contact, $delay)
|
|
{
|
|
try {
|
|
if ($this->option('dryrun')) {
|
|
MoveContactAvatarToPhotosDirectory::dispatchNow($contact, true);
|
|
} else {
|
|
MoveContactAvatarToPhotosDirectory::dispatch($contact, false)
|
|
->delay($delay);
|
|
}
|
|
} catch (FileNotFoundException $e) {
|
|
$this->warn(' ! File not found: '.$e->fileName, OutputInterface::VERBOSITY_VERBOSE);
|
|
}
|
|
}
|
|
|
|
private function handleEvent($contact)
|
|
{
|
|
$this->info('Contact id:'.$contact->id.' | Avatar location:'.$contact->avatar_location.' | File name:'.$contact->avatar_file_name);
|
|
}
|
|
}
|