. */ declare(strict_types=1); namespace FireflyIII\Support\Import\JobConfiguration\Spectre; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\ImportJob; use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; use FireflyIII\Services\Spectre\Object\Customer; use FireflyIII\Services\Spectre\Object\Login; use FireflyIII\Services\Spectre\Object\Token; use FireflyIII\Services\Spectre\Request\CreateTokenRequest; use FireflyIII\Services\Spectre\Request\ListCustomersRequest; use FireflyIII\Services\Spectre\Request\NewCustomerRequest; use FireflyIII\Support\Import\Information\GetSpectreCustomerTrait; use FireflyIII\Support\Import\Information\GetSpectreTokenTrait; use Illuminate\Support\MessageBag; use Log; /** * Class ChooseLoginHandler * */ class ChooseLoginHandler implements SpectreConfigurationInterface { use GetSpectreCustomerTrait, GetSpectreTokenTrait; /** @var ImportJob */ private $importJob; /** @var ImportJobRepositoryInterface */ private $repository; /** * Return true when this stage is complete. * * @return bool */ public function configurationComplete(): bool { Log::debug('Now in ChooseLoginHandler::configurationComplete()'); $config = $this->importJob->configuration; if (isset($config['selected-login'])) { Log::debug('config[selected-login] is set, return true.'); return true; } Log::debug('config[selected-login] is not set, return false.'); return false; } /** * Store the job configuration. * * @param array $data * * @return MessageBag * @throws FireflyException */ public function configureJob(array $data): MessageBag { Log::debug('Now in ChooseLoginHandler::configureJob()'); $selectedLogin = (int)($data['spectre_login_id'] ?? 0.0); $config = $this->importJob->configuration; $config['selected-login'] = $selectedLogin; $this->repository->setConfiguration($this->importJob, $config); Log::debug(sprintf('The selected login by the user is #%d', $selectedLogin)); // if selected login is zero, create a new one. if ($selectedLogin === 0) { Log::debug('Login is zero, get Spectre customer + token and store it in config.'); $customer = $this->getCustomer($this->importJob); // get a token for the user and redirect to next stage $token = $this->getToken($this->importJob, $customer); $config['customer'] = $customer->toArray(); $config['token'] = $token->toArray(); $this->repository->setConfiguration($this->importJob, $config); // move job to correct stage to redirect to Spectre: $this->repository->setStage($this->importJob, 'do-authenticate'); return new MessageBag; } $this->repository->setStage($this->importJob, 'authenticated'); return new MessageBag; } /** * Get data for config view. * * @return array */ public function getNextData(): array { Log::debug('Now in ChooseLoginHandler::getNextData()'); $config = $this->importJob->configuration; $data = ['logins' => []]; $logins = $config['all-logins'] ?? []; Log::debug(sprintf('Count of logins in configuration is %d.', \count($logins))); foreach ($logins as $login) { $data['logins'][] = new Login($login); } return $data; } /** * @codeCoverageIgnore * Get the view for this stage. * * @return string */ public function getNextView(): string { return 'import.spectre.choose-login'; } /** * Set the import job. * * @param ImportJob $importJob */ public function setImportJob(ImportJob $importJob): void { $this->importJob = $importJob; $this->repository = app(ImportJobRepositoryInterface::class); $this->repository->setUser($importJob->user); } }