diff --git a/app/Import/Routine/SpectreRoutine.php b/app/Import/Routine/SpectreRoutine.php index bfd6af5438..df5410bd60 100644 --- a/app/Import/Routine/SpectreRoutine.php +++ b/app/Import/Routine/SpectreRoutine.php @@ -24,6 +24,7 @@ namespace FireflyIII\Import\Routine; use FireflyIII\Models\ImportJob; use FireflyIII\Services\Spectre\Object\Customer; +use FireflyIII\Services\Spectre\Request\ListLoginsRequest; use FireflyIII\Services\Spectre\Request\NewCustomerRequest; use Illuminate\Support\Collection; use Log; @@ -91,9 +92,34 @@ class SpectreRoutine implements RoutineInterface // create customer if user does not have one: $customer = $this->getCustomer(); + // list all logins present at Spectre + $logins = $this->listLogins($customer); + + // use latest (depending on status, and if login exists for selected country + provider) + $country = $this->job->configuration['country']; + $providerId = $this->job->configuration['provider']; + $login = $this->filterLogins($logins, $country, $providerId); + + // create new login if list is empty or no login exists. + if (is_null($login)) { + $login = $this->createLogin($customer); + die('new login'); + } + + echo '
'; + print_r($logins); + exit; + return true; } + /** + * @param Customer $customer + */ + protected function createLogin(Customer $customer) { + + } + /** * @param ImportJob $job */ @@ -104,18 +130,22 @@ class SpectreRoutine implements RoutineInterface /** * @return Customer + * @throws \FireflyIII\Exceptions\FireflyException */ protected function createCustomer(): Customer { $newCustomerRequest = new NewCustomerRequest($this->job->user); $newCustomerRequest->call(); - echo ''; - print_r($newCustomerRequest->getCustomer()); - exit; + $customer = $newCustomerRequest->getCustomer(); + + // store customer. Not sure where. User preference? TODO + return $customer; + } /** * @return Customer + * @throws \FireflyIII\Exceptions\FireflyException */ protected function getCustomer(): Customer { @@ -126,4 +156,40 @@ class SpectreRoutine implements RoutineInterface var_dump($preference->data); exit; } + + /** + * Return login belonging to country and provider + * TODO must return Login object, not array + * + * @param array $logins + * @param string $country + * @param int $providerId + * + * @return array|null + */ + private function filterLogins(array $logins, string $country, int $providerId): ?array + { + if (count($logins) === 0) { + return null; + } + foreach ($logins as $login) { + die('do some filter'); + } + + 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/Customer.php b/app/Services/Spectre/Object/Customer.php index 218ad4d3e9..53d046a6d9 100644 --- a/app/Services/Spectre/Object/Customer.php +++ b/app/Services/Spectre/Object/Customer.php @@ -34,6 +34,18 @@ class Customer extends SpectreObject /** @var string */ private $secret; + /** + * Customer constructor. + * + * @param array $data + */ + public function __construct(array $data) + { + $this->id = intval($data['id']); + $this->identifier = $data['identifier']; + $this->secret = $data['secret']; + } + /** * @return int */ diff --git a/app/Services/Spectre/Request/ListLoginsRequest.php b/app/Services/Spectre/Request/ListLoginsRequest.php new file mode 100644 index 0000000000..d69af2a026 --- /dev/null +++ b/app/Services/Spectre/Request/ListLoginsRequest.php @@ -0,0 +1,101 @@ +. + */ +declare(strict_types=1); + +namespace FireflyIII\Services\Spectre\Request; + +use FireflyIII\Services\Spectre\Object\Customer; +use Log; + +/** + * Class ListLoginsRequest + */ +class ListLoginsRequest extends SpectreRequest +{ + /** @var Customer */ + protected $customer; + + /** @var array */ + protected $logins = []; + + /** + * + * @throws \FireflyIII\Exceptions\FireflyException + */ + public function call(): void + { + $hasNextPage = true; + $nextId = 0; + while ($hasNextPage) { + Log::debug(sprintf('Now calling list-logins for next_id %d', $nextId)); + $parameters = ['customer_id' => $this->customer->getId(), 'from_id' => $nextId]; + $uri = '/api/v3/logins?' . http_build_query($parameters); + $response = $this->sendSignedSpectreGet($uri, []); + + // count entries: + Log::debug(sprintf('Found %d entries in data-array', count($response['data']))); + + // extract next ID + $hasNextPage = false; + if (isset($response['meta']['next_id']) && intval($response['meta']['next_id']) > $nextId) { + $hasNextPage = true; + $nextId = $response['meta']['next_id']; + Log::debug(sprintf('Next ID is now %d.', $nextId)); + } else { + Log::debug('No next page.'); + } + + // store providers: + foreach ($response['data'] as $loginArray) { + var_dump($loginArray); + exit; + } + } + + return; + } + + /** + * @return Customer + */ + public function getCustomer(): Customer + { + return $this->customer; + } + + /** + * @param Customer $customer + */ + public function setCustomer(Customer $customer): void + { + $this->customer = $customer; + } + + /** + * @return array + */ + public function getLogins(): array + { + return $this->logins; + } + + +} diff --git a/app/Services/Spectre/Request/ListProvidersRequest.php b/app/Services/Spectre/Request/ListProvidersRequest.php index e523ea38f8..966023904c 100644 --- a/app/Services/Spectre/Request/ListProvidersRequest.php +++ b/app/Services/Spectre/Request/ListProvidersRequest.php @@ -25,7 +25,7 @@ namespace FireflyIII\Services\Spectre\Request; use Log; /** - * Class ListUserRequest. + * Class ListProvidersRequest */ class ListProvidersRequest extends SpectreRequest { diff --git a/app/Services/Spectre/Request/NewCustomerRequest.php b/app/Services/Spectre/Request/NewCustomerRequest.php index e7a96330ec..ff36919d70 100644 --- a/app/Services/Spectre/Request/NewCustomerRequest.php +++ b/app/Services/Spectre/Request/NewCustomerRequest.php @@ -22,37 +22,44 @@ declare(strict_types=1); namespace FireflyIII\Services\Spectre\Request; +use FireflyIII\Services\Spectre\Object\Customer; + /** * Class NewCustomerRequest */ class NewCustomerRequest extends SpectreRequest { - /** @var array */ - protected $customer = []; + /** @var Customer */ + protected $customer; /** * @throws \FireflyIII\Exceptions\FireflyException */ public function call(): void { - $data = [ + $data = [ 'data' => [ 'identifier' => 'default_ff3_customer', ], ]; - $uri = '/api/v3/customers/'; - $response = $this->sendSignedSpectrePost($uri, $data); - + $uri = '/api/v3/customers/'; + //$response = $this->sendSignedSpectrePost($uri, $data); + $response = ['data' => [ + 'id' => 527858, + 'identifier' => 'default_ff3_customer', + 'secret' => 'qpZjRPJRTb6mMcQgwDkssZ3fQVVDPIH04zBlkKC6MvI', + ], + ]; // create customer: - $this->customer = $response['data']; + $this->customer = new Customer($response['data']); return; } /** - * @return array + * @return Customer */ - public function getCustomer(): array + public function getCustomer(): Customer { return $this->customer; } diff --git a/app/Services/Spectre/Request/SpectreRequest.php b/app/Services/Spectre/Request/SpectreRequest.php index 824bd8aca8..8d87297829 100644 --- a/app/Services/Spectre/Request/SpectreRequest.php +++ b/app/Services/Spectre/Request/SpectreRequest.php @@ -29,8 +29,6 @@ use Requests; use Requests_Exception; use Requests_Response; -//use FireflyIII\Services\Bunq\Object\ServerPublicKey; - /** * Class BunqRequest. */ @@ -267,7 +265,7 @@ abstract class SpectreRequest Log::debug('Final headers for spectre signed POST request:', $headers); try { - $response = Requests::get($fullUri, $headers); + $response = Requests::post($fullUri, $headers, $body); } catch (Requests_Exception $e) { throw new FireflyException(sprintf('Request Exception: %s', $e->getMessage())); } diff --git a/app/Support/Import/Information/SpectreInformation.php b/app/Support/Import/Information/SpectreInformation.php index 4d59d6e855..0cc93f8992 100644 --- a/app/Support/Import/Information/SpectreInformation.php +++ b/app/Support/Import/Information/SpectreInformation.php @@ -63,6 +63,7 @@ class SpectreInformation implements InformationInterface * @return array * * @throws FireflyException + * @throws \Exception */ public function getAccounts(): array { diff --git a/app/User.php b/app/User.php index 32325cf6cf..d0620307ec 100644 --- a/app/User.php +++ b/app/User.php @@ -61,6 +61,7 @@ class User extends Authenticatable protected $table = 'users'; /** + * @codeCoverageIgnore * Link to accounts. * * @return HasMany @@ -95,6 +96,7 @@ class User extends Authenticatable } /** + * @codeCoverageIgnore * Link to attachments * * @return HasMany @@ -105,6 +107,7 @@ class User extends Authenticatable } /** + * @codeCoverageIgnore * Link to available budgets * * @return HasMany @@ -115,6 +118,7 @@ class User extends Authenticatable } /** + * @codeCoverageIgnore * Link to bills. * * @return HasMany @@ -125,6 +129,7 @@ class User extends Authenticatable } /** + * @codeCoverageIgnore * Link to budgets. * * @return HasMany @@ -135,6 +140,7 @@ class User extends Authenticatable } /** + * @codeCoverageIgnore * Link to categories * * @return HasMany @@ -145,6 +151,7 @@ class User extends Authenticatable } /** + * @codeCoverageIgnore * Link to currency exchange rates * * @return HasMany @@ -155,6 +162,7 @@ class User extends Authenticatable } /** + * @codeCoverageIgnore * Link to export jobs * * @return HasMany @@ -165,6 +173,7 @@ class User extends Authenticatable } /** + * @codeCoverageIgnore * Generates access token. * * @return string @@ -177,6 +186,7 @@ class User extends Authenticatable } /** + * @codeCoverageIgnore * Checks if the user has a role by its name. * * Full credit goes to: https://github.com/Zizaco/entrust @@ -197,6 +207,7 @@ class User extends Authenticatable } /** + * @codeCoverageIgnore * Link to import jobs. * * @return HasMany @@ -207,6 +218,7 @@ class User extends Authenticatable } /** + * @codeCoverageIgnore * Link to piggy banks. * * @return HasManyThrough @@ -217,6 +229,7 @@ class User extends Authenticatable } /** + * @codeCoverageIgnore * Link to preferences. * * @return HasMany @@ -227,6 +240,7 @@ class User extends Authenticatable } /** + * @codeCoverageIgnore * Link to roles. * * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany @@ -237,6 +251,7 @@ class User extends Authenticatable } /** + * @codeCoverageIgnore * Link to rule groups. * * @return HasMany @@ -247,6 +262,7 @@ class User extends Authenticatable } /** + * @codeCoverageIgnore * Link to rules. * * @return HasMany @@ -257,6 +273,7 @@ class User extends Authenticatable } /** + * @codeCoverageIgnore * Send the password reset notification. * * @param string $token @@ -269,6 +286,7 @@ class User extends Authenticatable } /** + * @codeCoverageIgnore * Link to tags. * * @return HasMany @@ -279,6 +297,7 @@ class User extends Authenticatable } /** + * @codeCoverageIgnore * Link to transaction journals. * * @return HasMany @@ -289,6 +308,7 @@ class User extends Authenticatable } /** + * @codeCoverageIgnore * Link to transactions. * * @return HasManyThrough diff --git a/resources/lang/en_US/import.php b/resources/lang/en_US/import.php index 5958cf5f42..c38b44a9ac 100644 --- a/resources/lang/en_US/import.php +++ b/resources/lang/en_US/import.php @@ -141,6 +141,9 @@ return [ 'column_opposing-number' => 'Opposing account (account number)', 'column_note' => 'Note(s)', + // prerequisites + 'prerequisites' => 'Prerequisites', + // bunq 'bunq_prerequisites_title' => 'Prerequisites for an import from bunq', 'bunq_prerequisites_text' => 'In order to import from bunq, you need to obtain an API key. You can do this through the app.', diff --git a/routes/breadcrumbs.php b/routes/breadcrumbs.php index 7c2835dd3c..757c2a548b 100644 --- a/routes/breadcrumbs.php +++ b/routes/breadcrumbs.php @@ -573,6 +573,16 @@ Breadcrumbs::register( $breadcrumbs->push(trans('import.config_sub_title', ['key' => $job->key]), route('import.configure', [$job->key])); } ); + +Breadcrumbs::register( + 'import.prerequisites', + function (BreadCrumbsGenerator $breadcrumbs, string $bank) { + $breadcrumbs->parent('import.index'); + $breadcrumbs->push(trans('import.prerequisites'), route('import.prerequisites', [$bank])); + } +); + + Breadcrumbs::register( 'import.status', function (BreadCrumbsGenerator $breadcrumbs, ImportJob $job) { @@ -581,6 +591,8 @@ Breadcrumbs::register( } ); + + // PREFERENCES Breadcrumbs::register( 'preferences.index', diff --git a/routes/web.php b/routes/web.php index f4773ece42..061c95f038 100755 --- a/routes/web.php +++ b/routes/web.php @@ -445,7 +445,7 @@ Route::group( Route::get('json/{importJob}', ['uses' => 'Import\StatusController@json', 'as' => 'status.json']); // start a job - Route::post('start/{importJob}', ['uses' => 'Import\IndexController@start', 'as' => 'start']); + Route::any('start/{importJob}', ['uses' => 'Import\IndexController@start', 'as' => 'start']); // download config Route::get('download/{importJob}', ['uses' => 'Import\IndexController@download', 'as' => 'download']);