// use Apoloz\AlfaBank\Contracts\SignerInterface; use Apoloz\AlfaBank\Http\Middleware\RequestIdMiddleware; use Apoloz\AlfaBank\Http\Pagination\AlfaOffsetPaginator; use Apoloz\AlfaBank\Requests\Auth\GetTokenRequest; use Apoloz\AlfaBank\Traits\HasAlfaErrorHandling; use Saloon\Http\Connector; use Saloon\Http\Request; use Saloon\PaginationPlugin\Contracts\HasPagination; use Saloon\PaginationPlugin\OffsetPaginator; use Saloon\Traits\Plugins\AlwaysThrowOnErrors; use Saloon\Traits\RequestProperties\HasTries; use Saloon\Traits\Plugins\HasTimeout; class AlfaBankConnector extends Connector implements HasPagination { use HasTimeout; use HasTries; use AlwaysThrowOnErrors; use HasAlfaErrorHandling; public function __construct( protected AlfaConfig $alfaConfig, protected ?SignerInterface $signer = null ) { $this->tries = 3; $this->retryInterval = 500; } public function resolveBaseUrl(): string { return $this->alfaConfig->baseUrl; } protected function defaultConfig(): array { $config = [ 'cert' => $this->alfaConfig->certificatePath, 'ssl_key' => $this->alfaConfig->privateKeyPath, 'verify' => true, ]; if ($this->alfaConfig->caBundlePath) { $config['verify'] = $this->alfaConfig->caBundlePath; } return $config; } protected function defaultHeaders(): array { return [ 'Accept' => 'application/json', 'Content-Type' => 'application/json', ]; } protected function defaultMiddleware(): array { return [ new RequestIdMiddleware(), ]; } public function boot(\Saloon\Http\PendingRequest $pendingRequest): void { // } public function paginate(Request $request): OffsetPaginator { return new AlfaOffsetPaginator($this, $request); } public function login(?string $clientId = null, ?string $clientSecret = null): static { // Allow overriding config via method arguments $clientId = $clientId ?? $this->alfaConfig->clientId; $clientSecret = $clientSecret ?? $this->alfaConfig->clientSecret; if (!$clientId || !$clientSecret) { throw new \RuntimeException("Client ID/Secret not configured."); } $request = new GetTokenRequest( clientId: $clientId, clientSecret: $clientSecret, grantType: 'client_credentials' ); // Send request (using self to reuse cert/ssl config) // We temporarily disable auth middleware if we had any, // but here we are raw, so it's fine. $response = $this->send($request); $data = $response->dto(); $this->authenticate(new \Saloon\Http\Auth\TokenAuthenticator($data->access_token)); return $this; } // //
// public function getSigner(): SignerInterface { if (!$this->signer) { throw new \RuntimeException("No signer configured for this connector."); } return $this->signer; } //
//
// public function withLogging(\Psr\Log\LoggerInterface $logger): static { $this->middleware()->onRequest(new \Apoloz\AlfaBank\Http\Middleware\LoggingRequestMiddleware($logger)); $this->middleware()->onResponse(new \Apoloz\AlfaBank\Http\Middleware\LoggingResponseMiddleware($logger)); return $this; } /** * Enable automated JWS response verification and decoding. */ public function withJwsVerification(string $publicKeyPem): static { $this->middleware()->onResponse(new \Apoloz\AlfaBank\Http\Middleware\VerifyJwsResponseMiddleware($publicKeyPem)); return $this; } //
}