diff --git a/app/Http/Controllers/Import/IndexController.php b/app/Http/Controllers/Import/IndexController.php index 6e512e78e4..22508bff9b 100644 --- a/app/Http/Controllers/Import/IndexController.php +++ b/app/Http/Controllers/Import/IndexController.php @@ -74,8 +74,23 @@ class IndexController extends Controller { $importJob = $this->repository->create($importProvider); - // redirect to global prerequisites - return redirect(route('import.prerequisites.index', [$importProvider, $importJob->key])); + // if need to set prerequisites, do that first. + $class = (string)config(sprintf('import.prerequisites.%s', $importProvider)); + if (!class_exists($class)) { + throw new FireflyException(sprintf('No class to handle configuration for "%s".', $importProvider)); // @codeCoverageIgnore + } + /** @var PrerequisitesInterface $object */ + $object = app($class); + $object->setUser(auth()->user()); + + if (!$object->isComplete()) { + // redirect to global prerequisites + return redirect(route('import.prerequisites.index', [$importProvider, $importJob->key])); + } + + // Otherwise just redirect to job configuration. + return redirect(route('import.job.configuration.index', [$importJob->key])); + } // /** diff --git a/app/Http/Controllers/Import/PrerequisitesController.php b/app/Http/Controllers/Import/PrerequisitesController.php index e3633cfaab..3ec592f81a 100644 --- a/app/Http/Controllers/Import/PrerequisitesController.php +++ b/app/Http/Controllers/Import/PrerequisitesController.php @@ -27,6 +27,7 @@ use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Middleware\IsDemoUser; use FireflyIII\Import\Prerequisites\PrerequisitesInterface; use FireflyIII\Models\ImportJob; +use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; use Illuminate\Http\Request; use Log; @@ -36,6 +37,9 @@ use Log; class PrerequisitesController extends Controller { + /** @var ImportJobRepositoryInterface */ + private $repository; + /** * */ @@ -48,6 +52,8 @@ class PrerequisitesController extends Controller app('view')->share('mainTitleIcon', 'fa-archive'); app('view')->share('title', trans('firefly.import_index_title')); + $this->repository = app(ImportJobRepositoryInterface::class); + return $next($request); } ); @@ -62,29 +68,30 @@ class PrerequisitesController extends Controller * @param string $importProvider * @param ImportJob $importJob * + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @throws FireflyException */ - public function index(string $importProvider, ImportJob $importJob) + public function index(string $importProvider, ImportJob $importJob = null) { $class = (string)config(sprintf('import.prerequisites.%s', $importProvider)); if (!class_exists($class)) { throw new FireflyException(sprintf('No class to handle configuration for "%s".', $importProvider)); // @codeCoverageIgnore } - /** @var PrerequisitesInterface $object */ $object = app($class); $object->setUser(auth()->user()); - if ($object->hasPrerequisites()) { - $view = $object->getView(); - $parameters = ['title' => (string)trans('firefly.import_index_title'), 'mainTitleIcon' => 'fa-archive']; - $parameters = array_merge($object->getViewParameters(), $parameters); - - return view($view, $parameters); + // TODO if prerequisites have been met and job is not null, just skip this step. + if (null !== $importJob && $object->isComplete()) { + // set job to } - // if no (more) prerequisites, return to create a job: - return redirect(route('import.create-job', [$bank])); + + $view = $object->getView(); + $parameters = ['title' => (string)trans('firefly.import_index_title'), 'mainTitleIcon' => 'fa-archive', 'importJob' => $importJob]; + $parameters = array_merge($object->getViewParameters(), $parameters); + + return view($view, $parameters); } /** @@ -95,33 +102,25 @@ class PrerequisitesController extends Controller * * @see PrerequisitesInterface::storePrerequisites * - * @param Request $request - * @param string $bank + * @param Request $request + * @param string $importProvider + * @param ImportJob $importJob * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * * @throws FireflyException */ - public function post(Request $request, string $bank) + public function post(Request $request, string $importProvider, ImportJob $importJob = null) { - Log::debug(sprintf('Now in postPrerequisites for %s', $bank)); + Log::debug(sprintf('Now in postPrerequisites for %s', $importProvider)); - if (true === !config(sprintf('import.enabled.%s', $bank))) { - throw new FireflyException(sprintf('Cannot import from "%s" at this time.', $bank)); // @codeCoverageIgnore - } - - $class = (string)config(sprintf('import.prerequisites.%s', $bank)); + $class = (string)config(sprintf('import.prerequisites.%s', $importProvider)); if (!class_exists($class)) { throw new FireflyException(sprintf('Cannot find class %s', $class)); // @codeCoverageIgnore } /** @var PrerequisitesInterface $object */ $object = app($class); $object->setUser(auth()->user()); - if (!$object->hasPrerequisites()) { - Log::debug(sprintf('No more prerequisites for %s, move to form.', $bank)); - - return redirect(route('import.create-job', [$bank])); - } Log::debug('Going to store entered prerequisites.'); // store post data $result = $object->storePrerequisites($request); @@ -129,8 +128,23 @@ class PrerequisitesController extends Controller if ($result->count() > 0) { $request->session()->flash('error', $result->first()); + + // redirect back: + return redirect(route('import.prerequisites.index', [$importProvider, $importJob->key]))->withInput(); } - return redirect(route('import.prerequisites', [$bank])); + // session flash! + $request->session()->flash('success', (string)trans('firefly.prerequisites_saved_for_' . $importProvider)); + + // if has job, redirect to global config for provider + // if no job, back to index! + if (null === $importJob) { + return redirect(route('import.index')); + } + + // redirect to global config: + return redirect(route('import.index')); + + } } diff --git a/app/Import/Prerequisites/FakePrerequisites.php b/app/Import/Prerequisites/FakePrerequisites.php new file mode 100644 index 0000000000..e79dd3b337 --- /dev/null +++ b/app/Import/Prerequisites/FakePrerequisites.php @@ -0,0 +1,127 @@ +. + */ +declare(strict_types=1); + +namespace FireflyIII\Import\Prerequisites; + +use FireflyIII\User; +use Illuminate\Http\Request; +use Illuminate\Support\MessageBag; + +/** + * This class contains all the routines necessary for the fake import provider. + * + * Class FakePrerequisites + */ +class FakePrerequisites implements PrerequisitesInterface +{ + /** @var User */ + private $user; + + /** + * Returns view name that allows user to fill in prerequisites. Currently asks for the API key. + * + * @return string + */ + public function getView(): string + { + return 'import.fake.prerequisites'; + } + + /** + * Returns any values required for the prerequisites-view. + * + * @return array + */ + public function getViewParameters(): array + { + $apiKey = ''; + if ($this->hasApiKey()) { + $apiKey = app('preferences')->getForUser($this->user, 'fake_api_key', null)->data; + } + $oldKey = (string)\request()->old('api_key'); + if ($oldKey !== '') { + $apiKey = \request()->old('api_key'); + } + + return ['api_key' => $apiKey]; + } + + /** + * Indicate if all prerequisites have been met. + * + * @return bool + */ + public function isComplete(): bool + { + return $this->hasApiKey(); + } + + /** + * Set the user for this Prerequisites-routine. Class is expected to implement and save this. + * + * @param User $user + */ + public function setUser(User $user): void + { + $this->user = $user; + + } + + /** + * @param Request $request + * + * @return MessageBag + */ + public function storePrerequisites(Request $request): MessageBag + { + $apiKey = (string)$request->get('api_key'); + $messageBag = new MessageBag(); + if (32 !== \strlen($apiKey)) { + $messageBag->add('api_key', 'API key must be 32 chars.'); + + return $messageBag; + } + + app('preferences')->setForUser($this->user, 'fake_api_key', $apiKey); + + return $messageBag; + } + + /** + * @return bool + */ + private function hasApiKey(): bool + { + $apiKey = app('preferences')->getForUser($this->user, 'fake_api_key', false); + if (null === $apiKey) { + return false; + } + if (null === $apiKey->data) { + return false; + } + if (\strlen((string)$apiKey->data) === 32) { + return true; + } + + return false; + } +} diff --git a/app/Import/Prerequisites/PrerequisitesInterface.php b/app/Import/Prerequisites/PrerequisitesInterface.php index 84519a647a..962147be49 100644 --- a/app/Import/Prerequisites/PrerequisitesInterface.php +++ b/app/Import/Prerequisites/PrerequisitesInterface.php @@ -45,14 +45,6 @@ interface PrerequisitesInterface */ public function getViewParameters(): array; - /** - * Returns if this import method has any special prerequisites such as config - * variables or other things. - * - * @return bool - */ - public function hasPrerequisites(): bool; - /** * Indicate if all prerequisites have been met. * @@ -68,6 +60,10 @@ interface PrerequisitesInterface public function setUser(User $user): void; /** + * This method responds to the user's submission of an API key. Should do nothing but store the value. + * + * Errors must be returned in the message bag under the field name they are requested by. + * * @param Request $request * * @return MessageBag diff --git a/config/import.php b/config/import.php index eb79bb716d..0c691894c2 100644 --- a/config/import.php +++ b/config/import.php @@ -6,6 +6,7 @@ use FireflyIII\Import\Configuration\FileConfigurator; use FireflyIII\Import\Configuration\SpectreConfigurator; use FireflyIII\Import\FileProcessor\CsvProcessor; use FireflyIII\Import\Prerequisites\BunqPrerequisites; +use FireflyIII\Import\Prerequisites\FakePrerequisites; use FireflyIII\Import\Prerequisites\FilePrerequisites; use FireflyIII\Import\Prerequisites\SpectrePrerequisites; use FireflyIII\Import\Routine\BunqRoutine; @@ -53,7 +54,7 @@ return [ 'yodlee' => true, ], 'prerequisites' => [ - 'fake' => false, + 'fake' => FakePrerequisites::class, 'file' => FilePrerequisites::class, 'bunq' => BunqPrerequisites::class, 'spectre' => SpectrePrerequisites::class, diff --git a/resources/views/import/fake/prerequisites.twig b/resources/views/import/fake/prerequisites.twig new file mode 100644 index 0000000000..a6e926f932 --- /dev/null +++ b/resources/views/import/fake/prerequisites.twig @@ -0,0 +1,43 @@ +{% extends "./layout/default" %} + +{% block breadcrumbs %} + {{ Breadcrumbs.render }} +{% endblock %} +{% block content %} +
+
+ +
+
+
+

Fake prerequisites

+
+
+
+
+

+ Bla bla bla bla +

+
+
+ +
+
+ {{ ExpandedForm.text('api_key', api_key) }} +
+
+
+ +
+
+
+
+{% endblock %} +{% block scripts %} +{% endblock %} +{% block styles %} +{% endblock %} diff --git a/routes/breadcrumbs.php b/routes/breadcrumbs.php index 78a2be3167..bddd40a325 100644 --- a/routes/breadcrumbs.php +++ b/routes/breadcrumbs.php @@ -593,10 +593,10 @@ Breadcrumbs::register( ); Breadcrumbs::register( - 'import.prerequisites', - function (BreadCrumbsGenerator $breadcrumbs, string $bank) { + 'import.prerequisites.index', + function (BreadCrumbsGenerator $breadcrumbs, string $importProvider) { $breadcrumbs->parent('import.index'); - $breadcrumbs->push(trans('import.prerequisites'), route('import.prerequisites', [$bank])); + $breadcrumbs->push(trans('import.prerequisites'), route('import.prerequisites.index', [$importProvider])); } ); diff --git a/routes/web.php b/routes/web.php index 34255cbad9..e4262c26a4 100755 --- a/routes/web.php +++ b/routes/web.php @@ -449,7 +449,8 @@ Route::group( Route::get('create/{import_provider}', ['uses' => 'Import\IndexController@create', 'as' => 'create']); // set global prerequisites for an import source, possible with a job already attached. - Route::get('prerequisites/{import_provider}/{importJob}', ['uses' => 'Import\PrerequisitesController@index', 'as' => 'prerequisites.index']); + Route::get('prerequisites/{import_provider}/{importJob?}', ['uses' => 'Import\PrerequisitesController@index', 'as' => 'prerequisites.index']); + Route::post('prerequisites/{import_provider}/{importJob?}', ['uses' => 'Import\PrerequisitesController@post', 'as' => 'prerequisites.post']); // import method prerequisites: # #