Spaces:
No application file
No application file
namespace Mautic\LeadBundle\Command; | |
use Mautic\CoreBundle\ProcessSignal\ProcessSignalService; | |
use Mautic\LeadBundle\Exception\ImportDelayedException; | |
use Mautic\LeadBundle\Exception\ImportFailedException; | |
use Mautic\LeadBundle\Helper\Progress; | |
use Mautic\LeadBundle\Model\ImportModel; | |
use Mautic\UserBundle\Security\UserTokenSetter; | |
use Symfony\Component\Console\Command\Command; | |
use Symfony\Component\Console\Input\InputInterface; | |
use Symfony\Component\Console\Input\InputOption; | |
use Symfony\Component\Console\Output\OutputInterface; | |
use Symfony\Contracts\Translation\TranslatorInterface; | |
/** | |
* CLI Command to import data. | |
*/ | |
class ImportCommand extends Command | |
{ | |
public const COMMAND_NAME = 'mautic:import'; | |
public function __construct( | |
private TranslatorInterface $translator, | |
private ImportModel $importModel, | |
private ProcessSignalService $processSignalService, | |
private UserTokenSetter $userTokenSetter | |
) { | |
parent::__construct(); | |
} | |
protected function configure() | |
{ | |
$this->setName(self::COMMAND_NAME) | |
->addOption('--id', '-i', InputOption::VALUE_OPTIONAL, 'Specific ID to import. Defaults to next in the queue.', false) | |
->addOption('--limit', '-l', InputOption::VALUE_OPTIONAL, 'Maximum number of records to import for this script execution.', 0) | |
->setHelp( | |
<<<'EOT' | |
The <info>%command.name%</info> command starts to import CSV files when some are created. | |
<info>php %command.full_name%</info> | |
EOT | |
); | |
} | |
protected function execute(InputInterface $input, OutputInterface $output): int | |
{ | |
$start = microtime(true); | |
$progress = new Progress($output); | |
$id = (int) $input->getOption('id'); | |
$limit = (int) $input->getOption('limit'); | |
$this->processSignalService->registerSignalHandler(fn (int $signal) => $output->writeln(sprintf('Signal %d caught.', $signal))); | |
if ($id) { | |
$import = $this->importModel->getEntity($id); | |
// This specific import was not found | |
if (!$import) { | |
$output->writeln('<error>'.$this->translator->trans('mautic.core.error.notfound', [], 'flashes').'</error>'); | |
return Command::FAILURE; | |
} | |
} else { | |
$import = $this->importModel->getImportToProcess(); | |
// No import waiting in the queue. Finish silently. | |
if (null === $import) { | |
return Command::SUCCESS; | |
} | |
} | |
$this->userTokenSetter->setUser($import->getCreatedBy()); | |
$output->writeln('<info>'.$this->translator->trans( | |
'mautic.lead.import.is.starting', | |
[ | |
'%id%' => $import->getId(), | |
'%lines%' => $import->getLineCount(), | |
] | |
).'</info>'); | |
try { | |
$this->importModel->beginImport($import, $progress, $limit); | |
} catch (ImportFailedException) { | |
$output->writeln('<error>'.$this->translator->trans( | |
'mautic.lead.import.failed', | |
[ | |
'%reason%' => $import->getStatusInfo(), | |
] | |
).'</error>'); | |
return Command::FAILURE; | |
} catch (ImportDelayedException) { | |
$output->writeln('<info>'.$this->translator->trans( | |
'mautic.lead.import.delayed', | |
[ | |
'%reason%' => $import->getStatusInfo(), | |
] | |
).'</info>'); | |
return Command::FAILURE; | |
} | |
// Success | |
$output->writeln('<info>'.$this->translator->trans( | |
'mautic.lead.import.result', | |
[ | |
'%lines%' => $import->getProcessedRows(), | |
'%created%' => $import->getInsertedCount(), | |
'%updated%' => $import->getUpdatedCount(), | |
'%ignored%' => $import->getIgnoredCount(), | |
'%time%' => round(microtime(true) - $start, 2), | |
] | |
).'</info>'); | |
return Command::SUCCESS; | |
} | |
protected static $defaultDescription = 'Imports data to Mautic'; | |
} | |