First code for file import.

This commit is contained in:
James Cole
2018-05-03 22:20:06 +02:00
parent 480d65fc1f
commit ca14496e4e
9 changed files with 244 additions and 20 deletions

View File

@@ -30,7 +30,7 @@ use Illuminate\Support\MessageBag;
/**
* Class FakeJobConfiguration
*/
class FakeJobConfiguration implements JobConfiguratorInterface
class FakeJobConfiguration implements JobConfigurationInterface
{
/** @var ImportJob */
private $job;
@@ -60,7 +60,8 @@ class FakeJobConfiguration implements JobConfiguratorInterface
$config = $this->job->configuration;
if ($this->job->stage === 'new') {
return (isset($config['artist']) && 'david bowie' === strtolower($config['artist']))
&& (isset($config['song']) && 'golden years' === strtolower($config['song']));
&& (isset($config['song']) && 'golden years' === strtolower($config['song']))
&& isset($config['apply-rules']);
}
return isset($config['album']) && 'station to station' === strtolower($config['album']);
@@ -80,6 +81,7 @@ class FakeJobConfiguration implements JobConfiguratorInterface
$artist = strtolower($data['artist'] ?? '');
$song = strtolower($data['song'] ?? '');
$album = strtolower($data['album'] ?? '');
$applyRules = isset($data['apply-rules']) ? (int)$data['apply-rules'] === 1 : null;
$configuration = $this->job->configuration;
if ($artist === 'david bowie') {
// store artist
@@ -91,17 +93,20 @@ class FakeJobConfiguration implements JobConfiguratorInterface
$configuration['song'] = $song;
}
if ($album=== 'station to station') {
if ($album === 'station to station') {
// store album
$configuration['album'] = $album;
}
if (null !== $applyRules) {
$configuration['apply-rules'] = $applyRules;
}
$this->repository->setConfiguration($this->job, $configuration);
$messages = new MessageBag();
if (\count($configuration) !== 2) {
if (\count($configuration) !== 3) {
$messages->add('some_key', 'Ignore this error');
$messages->add('some_key', 'Ignore this error: ' . \count($configuration));
}
return $messages;
@@ -128,7 +133,11 @@ class FakeJobConfiguration implements JobConfiguratorInterface
$config = $this->job->configuration;
$artist = $config['artist'] ?? '';
$song = $config['song'] ?? '';
$album = $config['album'] ?? '';
$album = $config['album'] ?? '';
$applyRules = $config['apply-rules'] ?? null;
if (null === $applyRules) {
return 'import.fake.apply-rules';
}
if (strtolower($artist) !== 'david bowie') {
return 'import.fake.enter-artist';
}

View File

@@ -0,0 +1,157 @@
<?php
namespace FireflyIII\Import\JobConfiguration;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\ImportJob;
use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface;
use FireflyIII\Support\Import\Configuration\ConfigurationInterface;
use FireflyIII\Support\Import\Configuration\File\Initial;
use FireflyIII\Support\Import\Configuration\File\Map;
use FireflyIII\Support\Import\Configuration\File\Roles;
use FireflyIII\Support\Import\Configuration\File\UploadConfig;
use Illuminate\Support\MessageBag;
use Log;
/**
* Class FileJobConfiguration
*
* @package FireflyIII\Import\JobConfiguration
*/
class FileJobConfiguration implements JobConfigurationInterface
{
/** @var ImportJob */
private $job;
/** @var ImportJobRepositoryInterface */
private $repository;
/**
* ConfiguratorInterface constructor.
*/
public function __construct()
{
$this->repository = app(ImportJobRepositoryInterface::class);
}
/**
* Store any data from the $data array into the job. Anything in the message bag will be flashed
* as an error to the user, regardless of its content.
*
* @param array $data
*
* @return MessageBag
* @throws FireflyException
*/
public function configureJob(array $data): MessageBag
{
/** @var ConfigurationInterface $object */
$object = app($this->getConfigurationClass());
$object->setJob($this->job);
$result = $object->storeConfiguration($data);
return $result;
}
/**
* Return the data required for the next step in the job configuration.
*
* @return array
* @throws FireflyException
*/
public function getNextData(): array
{
/** @var ConfigurationInterface $object */
$object = app($this->getConfigurationClass());
$object->setJob($this->job);
return $object->getData();
}
/**
* Returns the view of the next step in the job configuration.
*
* @return string
* @throws FireflyException
*/
public function getNextView(): string
{
switch ($this->job->stage) {
case 'new': // has nothing, no file upload or anything.
return 'import.file.new';
case 'upload-config': // has file, needs file config.
return 'import.file.upload-config';
case 'roles': // has configured file, needs roles.
return 'import.file.roles';
case 'map': // has roles, needs mapping.
return 'import.file.map';
}
throw new FireflyException(sprintf('No view for stage "%s"', $this->job->stage));
}
/**
* Returns true when the initial configuration for this job is complete.
*
* @return bool
*/
public function configurationComplete(): bool
{
if ('ready' === $this->job->stage) {
Log::debug('isJobConfigured returns true');
return true;
}
Log::debug('isJobConfigured returns false');
return false;
}
/**
* @param ImportJob $job
*/
public function setJob(ImportJob $job): void
{
$this->job = $job;
$this->repository->setUser($job->user);
}
/**
* @return string
*
* @throws FireflyException
*/
private function getConfigurationClass(): string
{
$class = false;
Log::debug(sprintf('Now in getConfigurationClass() for stage "%s"', $this->job->stage));
switch ($this->job->stage) {
case 'new': // has nothing, no file upload or anything.
$class = Initial::class;
break;
case 'upload-config': // has file, needs file config.
$class = UploadConfig::class;
break;
case 'roles': // has configured file, needs roles.
$class = Roles::class;
break;
case 'map': // has roles, needs mapping.
$class = Map::class;
break;
default:
break;
}
if (false === $class || 0 === \strlen($class)) {
throw new FireflyException(sprintf('Cannot handle job stage "%s" in getConfigurationClass().', $this->job->stage));
}
if (!class_exists($class)) {
throw new FireflyException(sprintf('Class %s does not exist in getConfigurationClass().', $class)); // @codeCoverageIgnore
}
Log::debug(sprintf('Configuration class is "%s"', $class));
return $class;
}
}

View File

@@ -1,6 +1,6 @@
<?php
/**
* JobConfiguratorInterface.php
* JobConfigurationInterface.php
* Copyright (c) 2018 thegrumpydictator@gmail.com
*
* This file is part of Firefly III.
@@ -26,9 +26,9 @@ use FireflyIII\Models\ImportJob;
use Illuminate\Support\MessageBag;
/**
* Interface JobConfiguratorInterface.
* Interface JobConfigurationInterface.
*/
interface JobConfiguratorInterface
interface JobConfigurationInterface
{
/**
* ConfiguratorInterface constructor.