. */ 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 Illuminate\Support\MessageBag; use Log; /** * Class ChooseLoginHandler * * @package FireflyIII\Support\Import\JobConfiguration\Spectre */ class ChooseLoginHandler implements SpectreJobConfig { /** @var ImportJob */ private $importJob; /** @var ImportJobRepositoryInterface */ private $repository; /** * Return true when this stage is complete. * * @return bool */ public function configurationComplete(): bool { $config = $this->importJob->configuration; if(isset($config['selected-login'])) { return true; } return false; } /** * Store the job configuration. * * @param array $data * * @return MessageBag * @throws FireflyException */ public function configureJob(array $data): MessageBag { $selectedLogin = (int)$data['spectre_login_id']; $config = $this->importJob->configuration; $config['selected-login'] = $selectedLogin; $this->repository->setConfiguration($this->importJob, $config); // if selected login is zero, create a new one. if ($selectedLogin === 0) { $customer = $this->getCustomer(); // get a token for the user and redirect to next stage $token = $this->getToken($customer); $config['token'] = $token->toArray(); $this->repository->setConfiguration($this->importJob, $config); // move job to correct stage to redirect to Spectre: $this->repository->setStage($this->importJob, 'authenticate'); return new MessageBag; } $this->repository->setStage($this->importJob, 'authenticated'); return new MessageBag; } /** * Get data for config view. * * @return array */ public function getNextData(): array { $config = $this->importJob->configuration; $data = ['logins' => []]; $logins = $config['all-logins'] ?? []; foreach ($logins as $login) { $data['logins'][] = new Login($login); } return $data; } /** * 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); } /** * @return Customer * @throws FireflyException */ private function getCustomer(): Customer { Log::debug('Now in stageNewHandler::getCustomer()'); $customer = $this->getExistingCustomer(); if (null === $customer) { Log::debug('The customer is NULL, will fire a newCustomerRequest.'); $newCustomerRequest = new NewCustomerRequest($this->importJob->user); $customer = $newCustomerRequest->getCustomer(); } Log::debug('The customer is not null.'); return $customer; } /** * @return Customer|null * @throws FireflyException */ private function getExistingCustomer(): ?Customer { Log::debug('Now in getExistingCustomer()'); $preference = app('preferences')->getForUser($this->importJob->user, 'spectre_customer'); if (null !== $preference) { Log::debug('Customer is in user configuration'); $customer = new Customer($preference->data); return $customer; } Log::debug('Customer is not in user config'); $customer = null; $getCustomerRequest = new ListCustomersRequest($this->importJob->user); $getCustomerRequest->call(); $customers = $getCustomerRequest->getCustomers(); Log::debug(sprintf('Found %d customer(s)', \count($customers))); /** @var Customer $current */ foreach ($customers as $current) { if ('default_ff3_customer' === $current->getIdentifier()) { $customer = $current; Log::debug('Found the correct customer.'); break; } } return $customer; } /** * @param Customer $customer * * @throws FireflyException * @return Token */ private function getToken(Customer $customer): Token { Log::debug('Now in ChooseLoginsHandler::getToken()'); $request = new CreateTokenRequest($this->importJob->user); $request->setUri(route('import.job.status.index', [$this->importJob->key])); $request->setCustomer($customer); $request->call(); Log::debug('Call to get token is finished'); return $request->getToken(); } }