first commit

This commit is contained in:
2026-01-14 16:40:33 +03:00
commit f803480f7b
184 changed files with 5573 additions and 0 deletions

View File

@@ -0,0 +1,46 @@
<?php
namespace Gemini\AlfaBank\Requests\Auth;
use Gemini\AlfaBank\Data\Auth\TokenData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Saloon\Traits\Body\HasFormBody;
use Saloon\Contracts\Body\HasBody;
class GetTokenRequest extends Request implements HasBody
{
use HasFormBody;
protected Method $method = Method::POST;
public function __construct(
protected string $clientId,
protected string $clientSecret,
protected string $code,
protected string $redirectUri,
protected string $grantType = 'authorization_code'
) {}
public function resolveEndpoint(): string
{
return '/oidc/token';
}
protected function defaultBody(): array
{
return [
'grant_type' => $this->grantType,
'client_id' => $this->clientId,
'client_secret' => $this->clientSecret,
'code' => $this->code,
'redirect_uri' => $this->redirectUri,
];
}
public function createDtoFromResponse(Response $response): TokenData
{
return TokenData::from($response->json());
}
}

View File

@@ -0,0 +1,26 @@
<?php
namespace Gemini\AlfaBank\Requests\Auth;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
class RefreshClientSecretRequest extends Request
{
protected Method $method = Method::POST;
public function __construct(
protected string $clientId
) {}
public function resolveEndpoint(): string
{
return "/oidc/clients/{$this->clientId}/client-secret";
}
public function createDtoFromResponse(Response $response): array
{
return $response->json();
}
}

View File

@@ -0,0 +1,37 @@
<?php
namespace Gemini\AlfaBank\Requests\Auth;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Traits\Body\HasFormBody;
class RevokeTokenRequest extends Request implements HasBody
{
use HasFormBody;
protected Method $method = Method::POST;
public function __construct(
protected string $clientId,
protected string $clientSecret,
protected string $token,
protected ?string $tokenTypeHint = null
) {}
public function resolveEndpoint(): string
{
return '/oidc/revoke';
}
protected function defaultBody(): array
{
return array_filter([
'client_id' => $this->clientId,
'client_secret' => $this->clientSecret,
'token' => $this->token,
'token_type_hint' => $this->tokenTypeHint,
]);
}
}

View File

@@ -0,0 +1,44 @@
<?php
namespace Gemini\AlfaBank\Requests\Auth\UserInfo;
use Gemini\AlfaBank\Data\Auth\UserInfo\ClientConsentCollectionData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
class GetClientConsentsRequest extends Request
{
protected Method $method = Method::GET;
public function __construct(
protected ?string $clientId = null,
protected ?string $sub = null,
protected ?string $organizationIdHash = null,
protected ?bool $isActive = null,
protected ?int $limit = 1000,
protected ?int $offset = 0,
) {}
public function resolveEndpoint(): string
{
return '/oidc/client-consents';
}
protected function defaultQuery(): array
{
return array_filter([
'clientId' => $this->clientId,
'sub' => $this->sub,
'organizationIdHash' => $this->organizationIdHash,
'isActive' => $this->isActive,
'limit' => $this->limit,
'offset' => $this->offset,
], fn($value) => $value !== null);
}
public function createDtoFromResponse(Response $response): ClientConsentCollectionData
{
return ClientConsentCollectionData::from($response->json());
}
}

View File

@@ -0,0 +1,49 @@
<?php
namespace Gemini\AlfaBank\Requests\Auth\UserInfo;
use Gemini\AlfaBank\Data\Auth\UserInfo\UserInfoData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
class GetUserInfoRequest extends Request
{
protected Method $method = Method::GET;
public function resolveEndpoint(): string
{
return '/oidc/userinfo';
}
protected function defaultHeaders(): array
{
return [
'Accept' => 'application/jwt', // As per doc
];
}
/**
* The response is a JWT. We need to decode it to get the claims.
* Note: This implementation assumes the user will handle JWT verification/decoding
* or we can do a simple base64 decode of the payload if trust is established via mTLS/OIDC.
*
* For now, we will return the raw JWT string in a specific DTO or try to parse it if simple.
*/
public function createDtoFromResponse(Response $response): UserInfoData
{
$jwt = $response->body();
$parts = explode('.', $jwt);
if (count($parts) === 3) {
$payload = json_decode(base64_decode($parts[1]), true);
return UserInfoData::from($payload);
}
// Fallback or throw error?
// If the response is not a valid JWT (e.g. error json), Saloon might have handled it if we throw on error status.
// But if it's 200 OK and not a JWT, it's unexpected.
throw new \Exception("Invalid UserInfo response format. Expected JWT.");
}
}

View File

@@ -0,0 +1,24 @@
<?php
namespace Gemini\AlfaBank\Requests\Crypto;
use Gemini\AlfaBank\Data\Crypto\CertificateData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Spatie\LaravelData\DataCollection;
class GetCertificatesRequest extends Request
{
protected Method $method = Method::GET;
public function resolveEndpoint(): string
{
return '/api/gd/v1/crypto-service/certificates';
}
public function createDtoFromResponse(Response $response): DataCollection
{
return CertificateData::collect($response->json(), DataCollection::class);
}
}

View File

@@ -0,0 +1,43 @@
<?php
namespace Gemini\AlfaBank\Requests\Crypto;
use Gemini\AlfaBank\Data\Crypto\CertificateData;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Saloon\Traits\Body\HasJsonBody;
class UpdateCertificateRequest extends Request implements HasBody
{
use HasJsonBody;
protected Method $method = Method::PATCH;
public function __construct(
protected string $id,
protected string $status, // ACTIVE or REVOKED
protected string $op = 'replace',
protected string $path = '/status'
) {}
public function resolveEndpoint(): string
{
return "/api/gd/v1/crypto-service/certificates/{$this->id}";
}
protected function defaultBody(): array
{
return [
'op' => $this->op,
'path' => $this->path,
'value' => $this->status,
];
}
public function createDtoFromResponse(Response $response): CertificateData
{
return CertificateData::from($response->json());
}
}

View File

@@ -0,0 +1,40 @@
<?php
namespace Gemini\AlfaBank\Requests\Crypto;
use Gemini\AlfaBank\Data\Crypto\CertificateData;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Saloon\Traits\Body\HasJsonBody;
class UploadCertificateRequest extends Request implements HasBody
{
use HasJsonBody;
protected Method $method = Method::POST;
public function __construct(
protected string $type,
protected string $certificateBody,
) {}
public function resolveEndpoint(): string
{
return '/api/gd/v1/crypto-service/certificates';
}
protected function defaultBody(): array
{
return [
'type' => $this->type,
'certificateBody' => $this->certificateBody,
];
}
public function createDtoFromResponse(Response $response): CertificateData
{
return CertificateData::from($response->json());
}
}

View File

@@ -0,0 +1,27 @@
<?php
namespace Gemini\AlfaBank\Requests\FileExchange;
use Saloon\Enums\Method;
use Saloon\Http\Request;
class DownloadFileRequest extends Request
{
protected Method $method = Method::GET;
public function __construct(
protected string $downloadUrl
) {}
public function resolveEndpoint(): string
{
return $this->downloadUrl;
}
protected function defaultHeaders(): array
{
return [
'Accept' => '*/*',
];
}
}

View File

@@ -0,0 +1,40 @@
<?php
namespace Gemini\AlfaBank\Requests\FileExchange;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Traits\Body\HasStreamBody;
class UploadFileRequest extends Request implements HasBody
{
use HasStreamBody;
protected Method $method = Method::PUT;
public function __construct(
protected string $uploadUrl,
protected $fileStream,
protected int $fileSize
) {}
public function resolveEndpoint(): string
{
return $this->uploadUrl;
}
protected function defaultHeaders(): array
{
return [
'Accept' => '*/*',
'Content-Length' => (string)$this->fileSize,
'Content-Type' => 'application/octet-stream',
];
}
protected function defaultBody(): mixed
{
return $this->fileStream;
}
}

View File

@@ -0,0 +1,37 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Beneficiaries;
use Gemini\AlfaBank\Data\NominalAccounts\Beneficiaries\CreateBeneficiaryRequestData;
use Gemini\AlfaBank\Data\NominalAccounts\Beneficiaries\CreateBeneficiaryResponseData;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Saloon\Traits\Body\HasJsonBody;
class CreateBeneficiaryRequest extends Request implements HasBody
{
use HasJsonBody;
protected Method $method = Method::POST;
public function __construct(
protected CreateBeneficiaryRequestData $data
) {}
public function resolveEndpoint(): string
{
return '/api/na/jp/v1/beneficiaries';
}
protected function defaultBody(): array
{
return $this->data->toArray();
}
public function createDtoFromResponse(Response $response): CreateBeneficiaryResponseData
{
return CreateBeneficiaryResponseData::from($response->json());
}
}

View File

@@ -0,0 +1,52 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Beneficiaries;
use Gemini\AlfaBank\Data\NominalAccounts\BeneficiaryCollectionData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
class GetBeneficiariesRequest extends Request
{
protected Method $method = Method::GET;
public function __construct(
protected string $accountNumber,
protected string $type,
protected ?int $limit = null,
protected ?int $offset = null,
protected ?string $inn = null,
protected ?string $lastName = null,
protected ?string $firstName = null,
protected ?string $middleName = null,
protected ?string $name = null,
protected ?bool $isActive = null
) {}
public function resolveEndpoint(): string
{
return '/api/na/jp/v1/beneficiaries';
}
protected function defaultQuery(): array
{
return array_filter([
'accountNumber' => $this->accountNumber,
'type' => $this->type,
'limit' => $this->limit,
'offset' => $this->offset,
'inn' => $this->inn,
'lastName' => $this->lastName,
'firstName' => $this->firstName,
'middleName' => $this->middleName,
'name' => $this->name,
'isActive' => $this->isActive,
], fn($value) => $value !== null);
}
public function createDtoFromResponse(Response $response): BeneficiaryCollectionData
{
return BeneficiaryCollectionData::from($response->json());
}
}

View File

@@ -0,0 +1,37 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Beneficiaries;
use Gemini\AlfaBank\Data\NominalAccounts\Beneficiaries\BeneficiaryBalanceData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
class GetBeneficiaryBalanceRequest extends Request
{
protected Method $method = Method::GET;
public function __construct(
protected string $beneficiaryId,
protected string $accountNumber,
protected string $date
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/beneficiaries/{$this->beneficiaryId}/balance";
}
protected function defaultQuery(): array
{
return [
'accountNumber' => $this->accountNumber,
'date' => $this->date,
];
}
public function createDtoFromResponse(Response $response): BeneficiaryBalanceData
{
return BeneficiaryBalanceData::from($response->json());
}
}

View File

@@ -0,0 +1,41 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Beneficiaries;
use Gemini\AlfaBank\Data\NominalAccounts\Beneficiaries\BeneficiaryTransactionCollectionData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
class GetBeneficiaryTransactionsRequest extends Request
{
protected Method $method = Method::GET;
public function __construct(
protected string $beneficiaryId,
protected string $dateFrom,
protected string $dateTo,
protected ?int $limit = 100,
protected ?int $offset = 0
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/beneficiaries/{$this->beneficiaryId}/transactions";
}
protected function defaultQuery(): array
{
return [
'dateFrom' => $this->dateFrom,
'dateTo' => $this->dateTo,
'limit' => $this->limit,
'offset' => $this->offset,
];
}
public function createDtoFromResponse(Response $response): BeneficiaryTransactionCollectionData
{
return BeneficiaryTransactionCollectionData::from($response->json());
}
}

View File

@@ -0,0 +1,38 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Beneficiaries\Requisites;
use Gemini\AlfaBank\Data\NominalAccounts\Beneficiaries\Requisites\CreateRequisiteRequestData;
use Gemini\AlfaBank\Data\NominalAccounts\Beneficiaries\Requisites\RequisiteData;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Saloon\Traits\Body\HasJsonBody;
class AddRequisiteRequest extends Request implements HasBody
{
use HasJsonBody;
protected Method $method = Method::POST;
public function __construct(
protected string $beneficiaryId,
protected CreateRequisiteRequestData $data
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/beneficiaries/{$this->beneficiaryId}/requisites";
}
protected function defaultBody(): array
{
return $this->data->toArray();
}
public function createDtoFromResponse(Response $response): RequisiteData
{
return RequisiteData::from($response->json());
}
}

View File

@@ -0,0 +1,28 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Beneficiaries\Requisites;
use Gemini\AlfaBank\Data\NominalAccounts\Beneficiaries\Requisites\RequisiteData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Spatie\LaravelData\DataCollection;
class GetRequisitesRequest extends Request
{
protected Method $method = Method::GET;
public function __construct(
protected string $beneficiaryId
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/beneficiaries/{$this->beneficiaryId}/requisites";
}
public function createDtoFromResponse(Response $response): DataCollection
{
return RequisiteData::collect($response->json(), DataCollection::class);
}
}

View File

@@ -0,0 +1,32 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Beneficiaries\Requisites;
use Gemini\AlfaBank\Data\NominalAccounts\Beneficiaries\Requisites\UpdateRequisiteRequestData;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Traits\Body\HasJsonBody;
class UpdateRequisiteRequest extends Request implements HasBody
{
use HasJsonBody;
protected Method $method = Method::PATCH;
public function __construct(
protected string $beneficiaryId,
protected string $requisiteId,
protected UpdateRequisiteRequestData $data
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/beneficiaries/{$this->beneficiaryId}/requisites/{$this->requisiteId}";
}
protected function defaultBody(): array
{
return $this->data->toArray();
}
}

View File

@@ -0,0 +1,27 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Beneficiaries;
use Gemini\AlfaBank\Data\NominalAccounts\Beneficiaries\CreateBeneficiaryResponseData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
class ScoreBeneficiaryRequest extends Request
{
protected Method $method = Method::POST;
public function __construct(
protected string $beneficiaryId
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/beneficiaries/{$this->beneficiaryId}/scoring";
}
public function createDtoFromResponse(Response $response): CreateBeneficiaryResponseData
{
return CreateBeneficiaryResponseData::from($response->json());
}
}

View File

@@ -0,0 +1,38 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Beneficiaries;
use Gemini\AlfaBank\Data\NominalAccounts\Beneficiaries\CreateBeneficiaryResponseData;
use Gemini\AlfaBank\Data\NominalAccounts\Beneficiaries\UpdateBeneficiaryRequestData;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Saloon\Traits\Body\HasJsonBody;
class UpdateBeneficiaryRequest extends Request implements HasBody
{
use HasJsonBody;
protected Method $method = Method::PUT;
public function __construct(
protected string $beneficiaryId,
protected UpdateBeneficiaryRequestData $data
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/beneficiaries/{$this->beneficiaryId}";
}
protected function defaultBody(): array
{
return $this->data->toArray();
}
public function createDtoFromResponse(Response $response): CreateBeneficiaryResponseData
{
return CreateBeneficiaryResponseData::from($response->json());
}
}

View File

@@ -0,0 +1,45 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Deals;
use Gemini\AlfaBank\Data\NominalAccounts\Deals\DealData;
use Gemini\AlfaBank\Data\NominalAccounts\Payouts\DigestSignatureData;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Saloon\Traits\Body\HasJsonBody;
use Spatie\LaravelData\DataCollection;
class AddDealRequest extends Request implements HasBody
{
use HasJsonBody;
protected Method $method = Method::POST;
public function __construct(
protected string $accountNumber,
protected string $expireDate,
#[DataCollectionOf(DigestSignatureData::class)]
protected DataCollection $digestSignatures
) {}
public function resolveEndpoint(): string
{
return '/api/na/jp/v1/deals';
}
protected function defaultBody(): array
{
return [
'accountNumber' => $this->accountNumber,
'expireDate' => $this->expireDate,
'digestSignatures' => $this->digestSignatures->toArray(),
];
}
public function createDtoFromResponse(Response $response): DealData
{
return DealData::from($response->json());
}
}

View File

@@ -0,0 +1,38 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Deals;
use Gemini\AlfaBank\Data\NominalAccounts\Payouts\DigestSignatureData;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Traits\Body\HasJsonBody;
use Spatie\LaravelData\DataCollection;
class DealActionRequest extends Request implements HasBody
{
use HasJsonBody;
protected Method $method = Method::PATCH;
public function __construct(
protected string $dealId,
protected string $action, // ACCEPT, COMPLETE, CANCEL
#[DataCollectionOf(DigestSignatureData::class)]
protected DataCollection $digestSignatures
) {}
public function resolveEndpoint(): string
{
return '/api/na/jp/v1/deals/action';
}
protected function defaultBody(): array
{
return [
'dealId' => $this->dealId,
'action' => $this->action,
'digestSignatures' => $this->digestSignatures->toArray(),
];
}
}

View File

@@ -0,0 +1,28 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Deals;
use Gemini\AlfaBank\Data\NominalAccounts\Deals\DealPayoffData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Spatie\LaravelData\DataCollection;
class GetDealPayoffsRequest extends Request
{
protected Method $method = Method::GET;
public function __construct(
protected string $dealId
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/deals/{$this->dealId}/payoffs";
}
public function createDtoFromResponse(Response $response): DataCollection
{
return DealPayoffData::collect($response->json(), DataCollection::class);
}
}

View File

@@ -0,0 +1,27 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Deals;
use Gemini\AlfaBank\Data\NominalAccounts\Deals\DealData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
class GetDealRequest extends Request
{
protected Method $method = Method::GET;
public function __construct(
protected string $dealId
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/deals/{$this->dealId}";
}
public function createDtoFromResponse(Response $response): DealData
{
return DealData::from($response->json());
}
}

View File

@@ -0,0 +1,28 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Deals;
use Gemini\AlfaBank\Data\NominalAccounts\Deals\DealRequestStatusData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
class GetDealRequestStatusRequest extends Request
{
protected Method $method = Method::GET;
public function __construct(
protected string $dealId,
protected string $requestId
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/deals/{$this->dealId}/requests/{$this->requestId}/status";
}
public function createDtoFromResponse(Response $response): DealRequestStatusData
{
return DealRequestStatusData::from($response->json());
}
}

View File

@@ -0,0 +1,38 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Deals;
use Gemini\AlfaBank\Data\NominalAccounts\Deals\DealCollectionData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
class GetDealsRequest extends Request
{
protected Method $method = Method::GET;
public function __construct(
protected string $accountNumber,
protected ?int $limit = 100,
protected ?int $offset = 0
) {}
public function resolveEndpoint(): string
{
return '/api/na/jp/v1/deals';
}
protected function defaultQuery(): array
{
return [
'accountNumber' => $this->accountNumber,
'limit' => $this->limit,
'offset' => $this->offset,
];
}
public function createDtoFromResponse(Response $response): DealCollectionData
{
return DealCollectionData::from($response->json());
}
}

View File

@@ -0,0 +1,39 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Deals\Steps;
use Gemini\AlfaBank\Data\NominalAccounts\Deals\Steps\StepContractorData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Spatie\LaravelData\DataCollection;
class GetStepContractorsRequest extends Request
{
protected Method $method = Method::GET;
public function __construct(
protected string $dealId,
protected string $stepId,
protected ?string $contractorId = null,
protected ?string $role = null
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/deals/{$this->dealId}/steps/{$this->stepId}/contractors";
}
protected function defaultQuery(): array
{
return array_filter([
'contractorId' => $this->contractorId,
'role' => $this->role,
]);
}
public function createDtoFromResponse(Response $response): DataCollection
{
return StepContractorData::collect($response->json(), DataCollection::class);
}
}

View File

@@ -0,0 +1,28 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Deals\Steps;
use Gemini\AlfaBank\Data\NominalAccounts\Deals\Steps\StepData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
class GetStepRequest extends Request
{
protected Method $method = Method::GET;
public function __construct(
protected string $dealId,
protected string $stepId
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/deals/{$this->dealId}/steps/{$this->stepId}";
}
public function createDtoFromResponse(Response $response): StepData
{
return StepData::from($response->json());
}
}

View File

@@ -0,0 +1,38 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Deals\Steps;
use Gemini\AlfaBank\Data\NominalAccounts\Deals\Steps\StepData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Spatie\LaravelData\DataCollection;
class GetStepsRequest extends Request
{
protected Method $method = Method::GET;
public function __construct(
protected string $dealId,
protected ?int $limit = 50,
protected ?int $offset = 0
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/deals/{$this->dealId}/steps";
}
protected function defaultQuery(): array
{
return [
'limit' => $this->limit,
'offset' => $this->offset,
];
}
public function createDtoFromResponse(Response $response): DataCollection
{
return StepData::collect($response->json(), DataCollection::class);
}
}

View File

@@ -0,0 +1,30 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Deals\Steps;
use Gemini\AlfaBank\Data\NominalAccounts\Deals\Steps\ContractorActionRequestData;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Traits\Body\HasJsonBody;
class ManageContractorRequest extends Request implements HasBody
{
use HasJsonBody;
protected Method $method = Method::PATCH;
public function __construct(
protected ContractorActionRequestData $data
) {}
public function resolveEndpoint(): string
{
return '/api/na/jp/v1/deals/steps/contractors';
}
protected function defaultBody(): array
{
return $this->data->toArray();
}
}

View File

@@ -0,0 +1,37 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Deals\Steps;
use Gemini\AlfaBank\Data\NominalAccounts\Deals\Steps\StepActionRequestData;
use Gemini\AlfaBank\Data\NominalAccounts\Deals\Steps\StepActionResponseData;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Saloon\Traits\Body\HasJsonBody;
class ManageStepRequest extends Request implements HasBody
{
use HasJsonBody;
protected Method $method = Method::POST;
public function __construct(
protected StepActionRequestData $data
) {}
public function resolveEndpoint(): string
{
return '/api/na/jp/v1/deals/steps';
}
protected function defaultBody(): array
{
return $this->data->toArray();
}
public function createDtoFromResponse(Response $response): StepActionResponseData
{
return StepActionResponseData::from($response->json());
}
}

View File

@@ -0,0 +1,27 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Deals;
use Gemini\AlfaBank\Data\NominalAccounts\Deals\ValidateDealResponseData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
class ValidateDealRequest extends Request
{
protected Method $method = Method::PATCH;
public function __construct(
protected string $dealId
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/deals/{$this->dealId}/is-valid";
}
public function createDtoFromResponse(Response $response): ValidateDealResponseData
{
return ValidateDealResponseData::from($response->json());
}
}

View File

@@ -0,0 +1,27 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts;
use Gemini\AlfaBank\Data\NominalAccounts\CounterpartyRequestStatusData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
class GetCounterpartyRequestStatusRequest extends Request
{
protected Method $method = Method::GET;
public function __construct(
protected string $requestId
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/beneficiaries/requests/{$this->requestId}/status";
}
public function createDtoFromResponse(Response $response): CounterpartyRequestStatusData
{
return CounterpartyRequestStatusData::from($response->json());
}
}

View File

@@ -0,0 +1,24 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts;
use Gemini\AlfaBank\Data\NominalAccounts\NominalAccountData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Spatie\LaravelData\DataCollection;
class GetNominalAccountsRequest extends Request
{
protected Method $method = Method::GET;
public function resolveEndpoint(): string
{
return '/api/na/jp/v1/nominal-accounts';
}
public function createDtoFromResponse(Response $response): DataCollection
{
return NominalAccountData::collect($response->json(), DataCollection::class);
}
}

View File

@@ -0,0 +1,28 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Identification;
use Gemini\AlfaBank\Data\NominalAccounts\Identification\IdentifyResponseData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
class GetIdentifyStatusRequest extends Request
{
protected Method $method = Method::GET;
public function __construct(
protected string $id,
protected string $identifyId
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/unidentified-transactions/{$this->id}/identify/{$this->identifyId}";
}
public function createDtoFromResponse(Response $response): IdentifyResponseData
{
return IdentifyResponseData::from($response->json());
}
}

View File

@@ -0,0 +1,38 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Identification;
use Gemini\AlfaBank\Data\NominalAccounts\Identification\UnidentifiedTransactionCollectionData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
class GetUnidentifiedTransactionsRequest extends Request
{
protected Method $method = Method::GET;
public function __construct(
protected string $accountNumber,
protected ?int $limit = null,
protected ?int $offset = null,
) {}
public function resolveEndpoint(): string
{
return '/api/na/jp/v1/unidentified-transactions';
}
protected function defaultQuery(): array
{
return array_filter([
'accountNumber' => $this->accountNumber,
'limit' => $this->limit,
'offset' => $this->offset,
]);
}
public function createDtoFromResponse(Response $response): UnidentifiedTransactionCollectionData
{
return UnidentifiedTransactionCollectionData::from($response->json());
}
}

View File

@@ -0,0 +1,38 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Identification;
use Gemini\AlfaBank\Data\NominalAccounts\Identification\IdentifyRequestData;
use Gemini\AlfaBank\Data\NominalAccounts\Identification\IdentifyResponseData;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Saloon\Traits\Body\HasJsonBody;
class IdentifyTransactionRequest extends Request implements HasBody
{
use HasJsonBody;
protected Method $method = Method::POST;
public function __construct(
protected string $id,
protected IdentifyRequestData $data
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/unidentified-transactions/{$this->id}/identify";
}
protected function defaultBody(): array
{
return $this->data->toArray();
}
public function createDtoFromResponse(Response $response): IdentifyResponseData
{
return IdentifyResponseData::from($response->json());
}
}

View File

@@ -0,0 +1,38 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Identification;
use Gemini\AlfaBank\Data\NominalAccounts\Identification\RefundUnidentifiedTransactionRequestData;
use Gemini\AlfaBank\Data\NominalAccounts\Identification\RefundUnidentifiedTransactionResponseData;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Saloon\Traits\Body\HasJsonBody;
class RefundUnidentifiedTransactionRequest extends Request implements HasBody
{
use HasJsonBody;
protected Method $method = Method::POST;
public function __construct(
protected string $id,
protected RefundUnidentifiedTransactionRequestData $data
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/unidentified-transactions/{$this->id}/refunds";
}
protected function defaultBody(): array
{
return $this->data->toArray();
}
public function createDtoFromResponse(Response $response): RefundUnidentifiedTransactionResponseData
{
return RefundUnidentifiedTransactionResponseData::from($response->json());
}
}

View File

@@ -0,0 +1,37 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Payouts;
use Gemini\AlfaBank\Data\NominalAccounts\Payouts\PayoffRequestData;
use Gemini\AlfaBank\Data\NominalAccounts\Payouts\PayoffResponseData;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Saloon\Traits\Body\HasJsonBody;
class CreatePayoffRequest extends Request implements HasBody
{
use HasJsonBody;
protected Method $method = Method::POST;
public function __construct(
protected PayoffRequestData $data
) {}
public function resolveEndpoint(): string
{
return '/api/na/jp/v1/payoffs';
}
protected function defaultBody(): array
{
return $this->data->toArray();
}
public function createDtoFromResponse(Response $response): PayoffResponseData
{
return PayoffResponseData::from($response->json());
}
}

View File

@@ -0,0 +1,37 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Payouts;
use Gemini\AlfaBank\Data\NominalAccounts\Payouts\TaxRefundRequestData;
use Gemini\AlfaBank\Data\NominalAccounts\Payouts\TaxRefundResponseData;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Saloon\Traits\Body\HasJsonBody;
class CreateTaxRefundRequest extends Request implements HasBody
{
use HasJsonBody;
protected Method $method = Method::POST;
public function __construct(
protected TaxRefundRequestData $data
) {}
public function resolveEndpoint(): string
{
return '/api/na/jp/v1/tax-refund';
}
protected function defaultBody(): array
{
return $this->data->toArray();
}
public function createDtoFromResponse(Response $response): TaxRefundResponseData
{
return TaxRefundResponseData::from($response->json());
}
}

View File

@@ -0,0 +1,27 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Payouts;
use Gemini\AlfaBank\Data\NominalAccounts\Payouts\DetailedPayoffData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
class GetPayoffRequest extends Request
{
protected Method $method = Method::GET;
public function __construct(
protected string $payoffId
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/payoffs/{$this->payoffId}";
}
public function createDtoFromResponse(Response $response): DetailedPayoffData
{
return DetailedPayoffData::from($response->json());
}
}

View File

@@ -0,0 +1,27 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Payouts;
use Gemini\AlfaBank\Data\NominalAccounts\Payouts\PayoffResponseData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
class GetPayoffStatusRequest extends Request
{
protected Method $method = Method::GET;
public function __construct(
protected string $payoffId
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/payoffs/{$this->payoffId}/status";
}
public function createDtoFromResponse(Response $response): PayoffResponseData
{
return PayoffResponseData::from($response->json());
}
}

View File

@@ -0,0 +1,27 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Payouts;
use Gemini\AlfaBank\Data\NominalAccounts\Payouts\TaxRefundResponseData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
class GetTaxRefundStatusRequest extends Request
{
protected Method $method = Method::GET;
public function __construct(
protected string $taxRefundId
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/tax-refund/{$this->taxRefundId}/status";
}
public function createDtoFromResponse(Response $response): TaxRefundResponseData
{
return TaxRefundResponseData::from($response->json());
}
}

View File

@@ -0,0 +1,38 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Payouts;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Saloon\Traits\Body\HasJsonBody;
class PayoffAcceptRequest extends Request implements HasBody
{
use HasJsonBody;
protected Method $method = Method::PATCH;
public function __construct(
protected string $payoffId,
protected bool $accept = true
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/payoffs/{$this->payoffId}/accept";
}
protected function defaultBody(): array
{
return [
'accept' => $this->accept,
];
}
public function createDtoFromResponse(Response $response): bool
{
return (bool)($response->json('result') ?? false);
}
}

View File

@@ -0,0 +1,36 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\Payouts;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Saloon\Traits\Body\HasJsonBody;
class TaxRefundAcceptRequest extends Request implements HasBody
{
use HasJsonBody;
protected Method $method = Method::PATCH;
public function __construct(
protected string $taxRefundId,
protected bool $accept
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/tax-refund/{$this->taxRefundId}/accept";
}
protected function defaultQuery(): array
{
return ['accept' => $this->accept ? 'true' : 'false'];
}
public function createDtoFromResponse(Response $response): bool
{
return (bool)($response->json('result') ?? false);
}
}

View File

@@ -0,0 +1,37 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\UniversalRecipients;
use Gemini\AlfaBank\Data\NominalAccounts\UniversalRecipients\CreateUniversalRecipientRequestData;
use Gemini\AlfaBank\Data\NominalAccounts\UniversalRecipients\UniversalRecipientResponseData;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Saloon\Traits\Body\HasJsonBody;
class CreateUniversalRecipientRequest extends Request implements HasBody
{
use HasJsonBody;
protected Method $method = Method::POST;
public function __construct(
protected CreateUniversalRecipientRequestData $data
) {}
public function resolveEndpoint(): string
{
return '/api/na/jp/v1/universal-recipients';
}
protected function defaultBody(): array
{
return $this->data->toArray();
}
public function createDtoFromResponse(Response $response): UniversalRecipientResponseData
{
return UniversalRecipientResponseData::from($response->json());
}
}

View File

@@ -0,0 +1,27 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\UniversalRecipients;
use Gemini\AlfaBank\Data\NominalAccounts\UniversalRecipients\UniversalRecipientData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
class GetUniversalRecipientRequest extends Request
{
protected Method $method = Method::GET;
public function __construct(
protected string $universalRecipientId
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/universal-recipients/{$this->universalRecipientId}";
}
public function createDtoFromResponse(Response $response): UniversalRecipientData
{
return UniversalRecipientData::from($response->json());
}
}

View File

@@ -0,0 +1,45 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\UniversalRecipients;
use Gemini\AlfaBank\Data\NominalAccounts\UniversalRecipients\UniversalRecipientData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Spatie\LaravelData\DataCollection;
class GetUniversalRecipientsRequest extends Request
{
protected Method $method = Method::GET;
public function __construct(
protected string $accountNumber,
protected string $type,
protected ?int $limit = 100,
protected ?int $offset = 0,
protected ?bool $isActive = null,
protected ?string $date = null,
) {}
public function resolveEndpoint(): string
{
return '/api/na/jp/v1/universal-recipients';
}
protected function defaultQuery(): array
{
return array_filter([
'accountNumber' => $this->accountNumber,
'type' => $this->type,
'limit' => $this->limit,
'offset' => $this->offset,
'isActive' => $this->isActive,
'date' => $this->date,
], fn($val) => $val !== null);
}
public function createDtoFromResponse(Response $response): DataCollection
{
return UniversalRecipientData::collect($response->json('universalRecipients'), DataCollection::class);
}
}

View File

@@ -0,0 +1,38 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\UniversalRecipients\Requisites;
use Gemini\AlfaBank\Data\NominalAccounts\Beneficiaries\Requisites\CreateRequisiteRequestData;
use Gemini\AlfaBank\Data\NominalAccounts\Beneficiaries\Requisites\RequisiteData;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Saloon\Traits\Body\HasJsonBody;
class AddUniversalRecipientRequisiteRequest extends Request implements HasBody
{
use HasJsonBody;
protected Method $method = Method::POST;
public function __construct(
protected string $universalRecipientId,
protected CreateRequisiteRequestData $data
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/universal-recipients/{$this->universalRecipientId}/requisites";
}
protected function defaultBody(): array
{
return $this->data->toArray();
}
public function createDtoFromResponse(Response $response): RequisiteData
{
return RequisiteData::from($response->json());
}
}

View File

@@ -0,0 +1,28 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\UniversalRecipients\Requisites;
use Gemini\AlfaBank\Data\NominalAccounts\Beneficiaries\Requisites\RequisiteData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Spatie\LaravelData\DataCollection;
class GetUniversalRecipientRequisitesRequest extends Request
{
protected Method $method = Method::GET;
public function __construct(
protected string $universalRecipientId
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/universal-recipients/{$this->universalRecipientId}/requisites";
}
public function createDtoFromResponse(Response $response): DataCollection
{
return RequisiteData::collect($response->json(), DataCollection::class);
}
}

View File

@@ -0,0 +1,32 @@
<?php
namespace Gemini\AlfaBank\Requests\NominalAccounts\UniversalRecipients\Requisites;
use Gemini\AlfaBank\Data\NominalAccounts\Beneficiaries\Requisites\UpdateRequisiteRequestData;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Traits\Body\HasJsonBody;
class UpdateUniversalRecipientRequisiteRequest extends Request implements HasBody
{
use HasJsonBody;
protected Method $method = Method::PATCH;
public function __construct(
protected string $universalRecipientId,
protected string $requisiteId,
protected UpdateRequisiteRequestData $data
) {}
public function resolveEndpoint(): string
{
return "/api/na/jp/v1/universal-recipients/{$this->universalRecipientId}/requisites/{$this->requisiteId}";
}
protected function defaultBody(): array
{
return $this->data->toArray();
}
}

View File

@@ -0,0 +1,30 @@
<?php
namespace Gemini\AlfaBank\Requests\Sandbox\Payments;
use Gemini\AlfaBank\Data\Sandbox\Payments\CreateRubPaymentRequestData;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Traits\Body\HasJsonBody;
class CreateRubPaymentRequest extends Request implements HasBody
{
use HasJsonBody;
protected Method $method = Method::POST;
public function __construct(
protected CreateRubPaymentRequestData $data
) {}
public function resolveEndpoint(): string
{
return '/api/jp/v2/payments';
}
protected function defaultBody(): array
{
return $this->data->toArray();
}
}

View File

@@ -0,0 +1,41 @@
<?php
namespace Gemini\AlfaBank\Requests\Sandbox;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Traits\Body\HasStringBody;
class SignatureEncryptionTestRequest extends Request implements HasBody
{
use HasStringBody;
protected Method $method = Method::POST;
public function __construct(
protected string $jwsBody,
protected string $requestChannelSecurity = 'SIGNATURE',
protected string $responseChannelSecurity = 'SIGNATURE'
) {}
public function resolveEndpoint(): string
{
return '/api/signature-encryption-tests/json';
}
protected function defaultHeaders(): array
{
return [
'Accept' => 'application/jose',
'Content-Type' => 'application/jose',
'X-Request-ChannelSecurity' => $this->requestChannelSecurity,
'X-Response-ChannelSecurity' => $this->responseChannelSecurity,
];
}
protected function defaultBody(): ?string
{
return $this->jwsBody;
}
}

View File

@@ -0,0 +1,31 @@
<?php
namespace Gemini\AlfaBank\Requests\Sandbox;
use Saloon\Contracts\Body\HasBody;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Traits\Body\HasJsonBody;
class TriggerWebhookEventRequest extends Request implements HasBody
{
use HasJsonBody;
protected Method $method = Method::POST;
public function __construct(
protected string $object // e.g. ul_transaction_default
) {}
public function resolveEndpoint(): string
{
return '/api/v1/webhooks-events';
}
protected function defaultBody(): array
{
return [
'object' => $this->object,
];
}
}

View File

@@ -0,0 +1,49 @@
<?php
namespace Gemini\AlfaBank\Requests\Webhooks;
use Gemini\AlfaBank\Data\WebhookData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Saloon\Traits\Body\HasJsonBody;
use Saloon\Contracts\Body\HasBody;
class CreateWebhookRequest extends Request implements HasBody
{
use HasJsonBody;
protected Method $method = Method::POST;
public function __construct(
protected string $object,
protected string $callbackUri,
protected ?array $accounts = null,
protected int $version = 1
) {}
public function resolveEndpoint(): string
{
return '/api/v1/webhooks';
}
protected function defaultBody(): array
{
$body = [
'object' => $this->object,
'callbackUri' => $this->callbackUri,
'version' => $this->version,
];
if ($this->accounts !== null) {
$body['data'] = ['accounts' => $this->accounts];
}
return $body;
}
public function createDtoFromResponse(Response $response): WebhookData
{
return WebhookData::from($response->json());
}
}

View File

@@ -0,0 +1,28 @@
<?php
namespace Gemini\AlfaBank\Requests\Webhooks;
use Saloon\Enums\Method;
use Saloon\Http\Request;
class DeleteWebhookRequest extends Request
{
protected Method $method = Method::DELETE;
public function __construct(
protected string $id,
protected string $object
) {}
public function resolveEndpoint(): string
{
return "/api/v1/webhooks/{$this->id}";
}
protected function defaultQuery(): array
{
return [
'object' => $this->object,
];
}
}

View File

@@ -0,0 +1,38 @@
<?php
namespace Gemini\AlfaBank\Requests\Webhooks;
use Gemini\AlfaBank\Data\WebhookCollectionData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
class GetWebhooksRequest extends Request
{
protected Method $method = Method::GET;
public function __construct(
protected ?int $offset = 0,
protected ?int $limit = 20,
protected ?string $object = null
) {}
public function resolveEndpoint(): string
{
return '/api/v2/webhooks';
}
protected function defaultQuery(): array
{
return array_filter([
'offset' => $this->offset,
'limit' => $this->limit,
'object' => $this->object,
]);
}
public function createDtoFromResponse(Response $response): WebhookCollectionData
{
return WebhookCollectionData::from($response->json());
}
}

View File

@@ -0,0 +1,55 @@
<?php
namespace Gemini\AlfaBank\Requests\Webhooks;
use Gemini\AlfaBank\Data\WebhookData;
use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Saloon\Traits\Body\HasJsonBody;
use Saloon\Contracts\Body\HasBody;
class UpdateWebhookRequest extends Request implements HasBody
{
use HasJsonBody;
protected Method $method = Method::PUT;
public function __construct(
protected string $id,
protected string $object,
protected bool $enabled = true,
protected ?string $callbackUri = null,
protected ?array $accounts = null,
protected int $version = 1
) {}
public function resolveEndpoint(): string
{
return "/api/v2/webhooks/{$this->id}";
}
protected function defaultBody(): array
{
$body = [
'object' => $this->object,
'enabled' => $this->enabled,
'version' => $this->version,
];
if ($this->callbackUri !== null) {
$body['callbackUri'] = $this->callbackUri;
}
if ($this->accounts !== null) {
$body['data'] = ['accounts' => $this->accounts];
}
return $body;
}
public function createDtoFromResponse(Response $response): WebhookData
{
return WebhookData::from($response->json());
}
}