app/Console/Commands/ImportVCards.php (71 lines of code) (raw):

<?php namespace App\Console\Commands; use App\Models\User\User; use Illuminate\Http\File; use Illuminate\Console\Command; use App\Jobs\AddContactFromVCard; use App\Models\Account\ImportJob; use Illuminate\Filesystem\Filesystem; use Illuminate\Support\Facades\Storage; class ImportVCards extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'import:vcard {--user= : user to import the contacts} {--path= : path of the file to import}'; /** * The console command description. * * @var string */ protected $description = 'Imports contacts from vCard files for a specific user'; /** * Execute the console command. * * @param Filesystem $filesystem * @return mixed */ public function handle(Filesystem $filesystem) { $email = $this->option('user'); // if no email was passed to the option, prompt the user to enter the email if (! $email) { $email = $this->ask('what is the user\'s email?'); } // retrieve the user with the specified email $user = User::where('email', $email)->first(); if (! $user) { // show an error and exist if the user does not exist $this->error('No user with that email.'); return; } $path = $this->option('path'); // if no email was passed to the option, prompt the user to enter the email if (! $path) { $path = $this->ask('what file you want to import?'); } if (! $filesystem->exists($path) || ! $this->acceptedExtensions($filesystem, $path)) { $this->error('The provided vcard file was not found or is not valid!'); return; } $importJob = $this->import($path, $user); return $this->report($importJob) ? 0 : 1; } private function acceptedExtensions(Filesystem $filesystem, string $path): bool { switch ($filesystem->extension($path)) { case 'vcf': case 'vcard': return true; default: return false; } } private function import(string $path, User $user): ImportJob { $pathName = Storage::putFile('public', new File($path)); $importJob = $user->account->importjobs()->create([ 'user_id' => $user->id, 'type' => 'vcard', 'filename' => $pathName, ]); dispatch_now(new AddContactFromVCard($importJob)); return $importJob; } private function report(ImportJob $importJob) { $importJob->refresh(); if ($importJob->failed) { $this->warn('Error: '.$importJob->failed_reason); return false; } $this->info('Contacts found: '.$importJob->contacts_found); $this->info('Contacts skipped: '.$importJob->contacts_skipped); $this->info('Contacts imported: '.$importJob->contacts_imported); return true; } }