Import participants
Big refactor to create route Import participants Signed-off-by: Vitor Mattos <vitor@php.rio>
This commit is contained in:
committed by
Julius Härtl
parent
fd92fc3c4d
commit
c5d10dafb8
@@ -23,40 +23,28 @@
|
||||
|
||||
namespace OCA\Deck\Command;
|
||||
|
||||
use JsonSchema\Constraints\Constraint;
|
||||
use JsonSchema\Validator;
|
||||
use OCA\Deck\Command\ImportHelper\AImport;
|
||||
use OCA\Deck\Command\ImportHelper\TrelloHelper;
|
||||
use OCA\Deck\Service\BoardImportCommandService;
|
||||
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\Component\Console\Question\ChoiceQuestion;
|
||||
use Symfony\Component\Console\Question\Question;
|
||||
|
||||
class BoardImport extends Command {
|
||||
/** @var string */
|
||||
private $system;
|
||||
private $allowedSystems;
|
||||
/** @var TrelloHelper */
|
||||
private $trelloHelper;
|
||||
/** @var boardImportCommandService */
|
||||
private $boardImportCommandService;
|
||||
|
||||
public function __construct(
|
||||
TrelloHelper $trelloHelper
|
||||
BoardImportCommandService $boardImportCommandService
|
||||
) {
|
||||
$this->boardImportCommandService = $boardImportCommandService;
|
||||
parent::__construct();
|
||||
$this->trelloHelper = $trelloHelper;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
protected function configure() {
|
||||
$allowedSystems = glob(__DIR__ . '/ImportHelper/*Helper.php');
|
||||
$this->allowedSystems = array_map(function ($name) {
|
||||
preg_match('/\/(?<system>\w+)Helper\.php$/', $name, $matches);
|
||||
return lcfirst($matches['system']);
|
||||
}, $allowedSystems);
|
||||
$allowedSystems = $this->boardImportCommandService->getAllowedImportSystems();
|
||||
$this
|
||||
->setName('deck:import')
|
||||
->setDescription('Import data')
|
||||
@@ -64,7 +52,7 @@ class BoardImport extends Command {
|
||||
'system',
|
||||
null,
|
||||
InputOption::VALUE_REQUIRED,
|
||||
'Source system for import. Available options: ' . implode(', ', $this->allowedSystems) . '.',
|
||||
'Source system for import. Available options: ' . implode(', ', $allowedSystems) . '.',
|
||||
'trello'
|
||||
)
|
||||
->addOption(
|
||||
@@ -90,89 +78,10 @@ class BoardImport extends Command {
|
||||
* @return void
|
||||
*/
|
||||
protected function interact(InputInterface $input, OutputInterface $output) {
|
||||
$this->validateSystem($input, $output);
|
||||
$this->validateConfig($input, $output);
|
||||
$this->getSystemHelper()
|
||||
->validate($input, $output);
|
||||
}
|
||||
|
||||
protected function validateConfig(InputInterface $input, OutputInterface $output): void {
|
||||
$configFile = $input->getOption('config');
|
||||
if (!is_file($configFile)) {
|
||||
$helper = $this->getHelper('question');
|
||||
$question = new Question(
|
||||
'Please inform a valid config json file: ',
|
||||
'config.json'
|
||||
);
|
||||
$question->setValidator(function ($answer) {
|
||||
if (!is_file($answer)) {
|
||||
throw new \RuntimeException(
|
||||
'config file not found'
|
||||
);
|
||||
}
|
||||
return $answer;
|
||||
});
|
||||
$configFile = $helper->ask($input, $output, $question);
|
||||
$input->setOption('config', $configFile);
|
||||
}
|
||||
|
||||
$config = json_decode(file_get_contents($configFile));
|
||||
$schemaPath = __DIR__ . '/ImportHelper/fixtures/config-' . $this->getSystem() . '-schema.json';
|
||||
$validator = new Validator();
|
||||
$validator->validate(
|
||||
$config,
|
||||
(object)['$ref' => 'file://' . realpath($schemaPath)],
|
||||
Constraint::CHECK_MODE_APPLY_DEFAULTS
|
||||
);
|
||||
if (!$validator->isValid()) {
|
||||
$output->writeln('<error>Invalid config file</error>');
|
||||
$output->writeln(array_map(function ($v) {
|
||||
return $v['message'];
|
||||
}, $validator->getErrors()));
|
||||
$output->writeln('Valid schema:');
|
||||
$output->writeln(print_r(file_get_contents($schemaPath), true));
|
||||
$input->setOption('config', null);
|
||||
$this->validateConfig($input, $output);
|
||||
}
|
||||
$this->getSystemHelper()->setConfigInstance($config);
|
||||
}
|
||||
|
||||
private function setSystem(string $system): void {
|
||||
$this->system = $system;
|
||||
}
|
||||
|
||||
public function getSystem() {
|
||||
return $this->system;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return AImport
|
||||
*/
|
||||
private function getSystemHelper() {
|
||||
$helper = $this->{$this->system . 'Helper'};
|
||||
$helper->setCommand($this);
|
||||
return $helper;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
private function validateSystem(InputInterface $input, OutputInterface $output) {
|
||||
$system = $input->getOption('system');
|
||||
if (in_array($system, $this->allowedSystems)) {
|
||||
$this->setSystem($system);
|
||||
return;
|
||||
}
|
||||
$helper = $this->getHelper('question');
|
||||
$question = new ChoiceQuestion(
|
||||
'Please inform a source system',
|
||||
$this->allowedSystems,
|
||||
0
|
||||
);
|
||||
$question->setErrorMessage('System %s is invalid.');
|
||||
$system = $helper->ask($input, $output, $question);
|
||||
$input->setOption('system', $system);
|
||||
$this->setSystem($system);
|
||||
$this->boardImportCommandService
|
||||
->setInput($input)
|
||||
->setOutput($output)
|
||||
->validate();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -182,8 +91,11 @@ class BoardImport extends Command {
|
||||
* @return int
|
||||
*/
|
||||
protected function execute(InputInterface $input, OutputInterface $output): int {
|
||||
$this->getSystemHelper()
|
||||
->import($input, $output);
|
||||
$this
|
||||
->boardImportCommandService
|
||||
->setInput($input)
|
||||
->setOutput($output)
|
||||
->import();
|
||||
$output->writeln('Done!');
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user