diff --git a/app/Import/Routine/SpectreRoutine.php b/app/Import/Routine/SpectreRoutine.php index df5410bd60..fd9f0c6e03 100644 --- a/app/Import/Routine/SpectreRoutine.php +++ b/app/Import/Routine/SpectreRoutine.php @@ -23,7 +23,9 @@ declare(strict_types=1); namespace FireflyIII\Import\Routine; use FireflyIII\Models\ImportJob; +use FireflyIII\Models\SpectreProvider; use FireflyIII\Services\Spectre\Object\Customer; +use FireflyIII\Services\Spectre\Request\CreateLoginRequest; use FireflyIII\Services\Spectre\Request\ListLoginsRequest; use FireflyIII\Services\Spectre\Request\NewCustomerRequest; use Illuminate\Support\Collection; @@ -79,6 +81,7 @@ class SpectreRoutine implements RoutineInterface /** * + * @throws \FireflyIII\Exceptions\FireflyException */ public function run(): bool { @@ -103,7 +106,8 @@ class SpectreRoutine implements RoutineInterface // create new login if list is empty or no login exists. if (is_null($login)) { $login = $this->createLogin($customer); - die('new login'); + var_dump($login); + exit; } echo '
'; @@ -113,13 +117,6 @@ class SpectreRoutine implements RoutineInterface return true; } - /** - * @param Customer $customer - */ - protected function createLogin(Customer $customer) { - - } - /** * @param ImportJob $job */ @@ -143,6 +140,44 @@ class SpectreRoutine implements RoutineInterface } + /** + * @param Customer $customer + */ + protected function createLogin(Customer $customer) + { + + $providerId = intval($this->job->configuration['provider']); + $provider = $this->findProvider($providerId); + + + $createLoginRequest = new CreateLoginRequest($this->job->user); + $createLoginRequest->setCustomer($customer); + $createLoginRequest->setProvider($provider); + $createLoginRequest->setMandatoryFields($this->decrypt($this->job->configuration['mandatory-fields'])); + $createLoginRequest->call(); + echo '123'; + // country code, provider code (find by spectre ID) + // credentials + // daily_refresh=true + // fetch_type=recent + // include_fake_providers=true + // store_credentials=true + + + var_dump($this->job->configuration); + exit; + } + + /** + * @param int $providerId + * + * @return SpectreProvider|null + */ + protected function findProvider(int $providerId): ?SpectreProvider + { + return SpectreProvider::where('spectre_id', $providerId)->first(); + } + /** * @return Customer * @throws \FireflyIII\Exceptions\FireflyException @@ -157,6 +192,38 @@ class SpectreRoutine implements RoutineInterface exit; } + /** + * @param Customer $customer + * + * @return array + * @throws \FireflyIII\Exceptions\FireflyException + */ + protected function listLogins(Customer $customer): array + { + $listLoginRequest = new ListLoginsRequest($this->job->user); + $listLoginRequest->setCustomer($customer); + $listLoginRequest->call(); + + $logins = $listLoginRequest->getLogins(); + + return $logins; + } + + /** + * @param array $configuration + * + * @return array + */ + private function decrypt(array $configuration): array + { + $new = []; + foreach ($configuration as $key => $value) { + $new[$key] = app('steam')->tryDecrypt($value); + } + + return $new; + } + /** * Return login belonging to country and provider * TODO must return Login object, not array @@ -178,18 +245,4 @@ class SpectreRoutine implements RoutineInterface return null; } - - /** - * @return array - */ - private function listLogins(Customer $customer): array - { - $listLoginRequest = new ListLoginsRequest($this->job->user); - $listLoginRequest->setCustomer($customer); - $listLoginRequest->call(); - - $logins = $listLoginRequest->getLogins(); - - return $logins; - } } diff --git a/app/Services/Spectre/Object/Login.php b/app/Services/Spectre/Object/Login.php new file mode 100644 index 0000000000..6de8bed874 --- /dev/null +++ b/app/Services/Spectre/Object/Login.php @@ -0,0 +1,32 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Services\Spectre\Object; + +/** + * Class Login + */ +class Login extends SpectreObject +{ + +} \ No newline at end of file diff --git a/app/Services/Spectre/Request/CreateLoginRequest.php b/app/Services/Spectre/Request/CreateLoginRequest.php new file mode 100644 index 0000000000..1b0e3e6b79 --- /dev/null +++ b/app/Services/Spectre/Request/CreateLoginRequest.php @@ -0,0 +1,109 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Services\Spectre\Request; + +use FireflyIII\Exceptions\FireflyException; +use FireflyIII\Models\SpectreProvider; +use FireflyIII\Services\Spectre\Object\Customer; + +/** + * Class CreateLoginRequest + */ +class CreateLoginRequest extends SpectreRequest +{ + /** @var Customer */ + private $customer; + /** @var array */ + private $mandatoryFields = []; + /** @var SpectreProvider */ + private $provider; + + /** + * + * @throws FireflyException + */ + public function call(): void + { + // add mandatory fields to login object + $data = [ + 'customer_id' => $this->customer->getId(), + 'country_code' => $this->provider->country_code, + 'provider_code' => $this->provider->code, + 'credentials' => $this->buildCredentials(), + 'daily_refresh' => true, + 'fetch_type' => 'recent', + 'include_fake_providers' => true, + ]; + $uri = '/api/v3/logins'; + $response = $this->sendSignedSpectrePost($uri, $data); + echo ''; + print_r($response); + exit; + } + + /** + * @param Customer $customer + */ + public function setCustomer(Customer $customer): void + { + $this->customer = $customer; + } + + /** + * @param array $mandatoryFields + */ + public function setMandatoryFields(array $mandatoryFields): void + { + $this->mandatoryFields = $mandatoryFields; + } + + /** + * @param SpectreProvider $provider + */ + public function setProvider(SpectreProvider $provider): void + { + $this->provider = $provider; + } + + /** + * @return array + * @throws FireflyException + */ + private function buildCredentials(): array + { + $return = []; + /** @var array $requiredField */ + foreach ($this->provider->data['required_fields'] as $requiredField) { + $fieldName = $requiredField['name']; + if (!isset($this->mandatoryFields[$fieldName])) { + throw new FireflyException(sprintf('Mandatory field "%s" is missing from job.', $fieldName)); + } + $return[$fieldName] = $this->mandatoryFields[$fieldName]; + } + + return $return; + } + + +} \ No newline at end of file