Import participants

Big refactor to create route
Import participants

Signed-off-by: Vitor Mattos <vitor@php.rio>
This commit is contained in:
Vitor Mattos
2021-07-14 23:49:31 -03:00
committed by Julius Härtl
parent fd92fc3c4d
commit c5d10dafb8
18 changed files with 868 additions and 521 deletions

View File

@@ -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;
}