Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions src/Payment/Application/Contract/SystemServiceContract.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

declare(strict_types=1);

namespace Paymentic\Sdk\Payment\Application\Contract;

use Paymentic\Sdk\Payment\Application\DTO\PingResponse;

interface SystemServiceContract
{
public function ping(): PingResponse;
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

use Paymentic\Sdk\Payment\Application\DTO\CreateTransactionRequest;
use Paymentic\Sdk\Payment\Application\DTO\CreateTransactionResponse;
use Paymentic\Sdk\Payment\Application\DTO\ListTransactionsRequest;
use Paymentic\Sdk\Payment\Application\DTO\ListTransactionsResponse;
use Paymentic\Sdk\Payment\Domain\Entity\Transaction;

interface TransactionServiceContract
Expand All @@ -15,4 +17,6 @@ public function create(string $pointId, CreateTransactionRequest $request): Crea
public function get(string $pointId, string $transactionId): Transaction;

public function capture(string $pointId, string $transactionId): void;

public function list(string $pointId, ?ListTransactionsRequest $request = null): ListTransactionsResponse;
}
68 changes: 68 additions & 0 deletions src/Payment/Application/DTO/ListTransactionsRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
<?php

declare(strict_types=1);

namespace Paymentic\Sdk\Payment\Application\DTO;

final readonly class ListTransactionsRequest
{
public function __construct(
public ?string $filterStatus = null,
public ?string $filterAmount = null,
public ?string $filterExternalReferenceId = null,
public ?string $filterOrderId = null,
public ?string $filterCustomerName = null,
public ?string $filterCustomerEmail = null,
public ?string $filterBlikId = null,
public ?string $filterCardBin = null,
public ?string $filterProvider = null,
public ?string $filterCreatedAt = null,
public ?string $filterPaidAt = null,
public ?string $queryFull = null,
public ?string $queryCustomerName = null,
public ?string $queryCustomerEmail = null,
public ?string $queryTitle = null,
public ?int $pageNumber = null,
public ?int $pageSize = null,
) {
}

public function toQueryString(): string
{
$params = [];

$this->addIfNotNull($params, 'filter[status]', $this->filterStatus);
$this->addIfNotNull($params, 'filter[amount]', $this->filterAmount);
$this->addIfNotNull($params, 'filter[externalReferenceId]', $this->filterExternalReferenceId);
$this->addIfNotNull($params, 'filter[orderId]', $this->filterOrderId);
$this->addIfNotNull($params, 'filter[customerName]', $this->filterCustomerName);
$this->addIfNotNull($params, 'filter[customerEmail]', $this->filterCustomerEmail);
$this->addIfNotNull($params, 'filter[blikId]', $this->filterBlikId);
$this->addIfNotNull($params, 'filter[cardBin]', $this->filterCardBin);
$this->addIfNotNull($params, 'filter[provider]', $this->filterProvider);
$this->addIfNotNull($params, 'filter[createdAt]', $this->filterCreatedAt);
$this->addIfNotNull($params, 'filter[paidAt]', $this->filterPaidAt);
$this->addIfNotNull($params, 'query[full]', $this->queryFull);
$this->addIfNotNull($params, 'query[customerName]', $this->queryCustomerName);
$this->addIfNotNull($params, 'query[customerEmail]', $this->queryCustomerEmail);
$this->addIfNotNull($params, 'query[title]', $this->queryTitle);
$this->addIfNotNull($params, 'page[number]', $this->pageNumber !== null ? (string) $this->pageNumber : null);
$this->addIfNotNull($params, 'page[size]', $this->pageSize !== null ? (string) $this->pageSize : null);

if ([] === $params) {
return '';
}

return '?' . http_build_query($params);
}

/**
* @param array<string, string> $params
*/
private function addIfNotNull(array &$params, string $key, ?string $value): void
{
if (null !== $value) {
$params[$key] = $value;
}
}
}
20 changes: 20 additions & 0 deletions src/Payment/Application/DTO/ListTransactionsResponse.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

declare(strict_types=1);

namespace Paymentic\Sdk\Payment\Application\DTO;

use Paymentic\Sdk\Payment\Domain\Entity\TransactionListItem;
use Paymentic\Sdk\Shared\ValueObject\Pagination;

final readonly class ListTransactionsResponse
{
/**
* @param TransactionListItem[] $data
*/
public function __construct(
public array $data,
public Pagination $pagination,
) {
}
}
36 changes: 36 additions & 0 deletions src/Payment/Application/DTO/PingResponse.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

declare(strict_types=1);

namespace Paymentic\Sdk\Payment\Application\DTO;

final readonly class PingResponse
{
/**
* @param string[] $scopes
*/
public function __construct(
public string $message,
public string $environment,
public string $tokenId,
public string $clientId,
public string $version,
public array $scopes = [],
) {
}

/**
* @param array<string, mixed> $data
*/
public static function fromArray(array $data): self
{
return new self(
message: $data['message'],
environment: $data['environment'],
tokenId: $data['tokenId'],
clientId: $data['clientId'],
version: $data['version'],
scopes: $data['scopes'] ?? [],
);
}
}
38 changes: 38 additions & 0 deletions src/Payment/Application/Mapper/ChannelMapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
use Paymentic\Sdk\Payment\Domain\ValueObject\ChannelAuthorization;
use Paymentic\Sdk\Payment\Domain\ValueObject\ChannelCommission;
use Paymentic\Sdk\Payment\Domain\ValueObject\ChannelImage;
use Paymentic\Sdk\Payment\Domain\ValueObject\ComplianceContent;
use Paymentic\Sdk\Payment\Domain\ValueObject\ComplianceItem;
use Paymentic\Sdk\Payment\Domain\ValueObject\ComplianceLink;

final readonly class ChannelMapper
{
Expand Down Expand Up @@ -47,6 +50,8 @@ public static function fromArray(array $data): Channel
),
),
paymentType: $data['paymentType'],
aliases: $data['aliases'] ?? null,
compliance: isset($data['compliance']) ? self::mapCompliance($data['compliance']) : null,
enablingAt: isset($data['enablingAt']) ? new DateTimeImmutable($data['enablingAt']) : null,
disablingAt: isset($data['disablingAt']) ? new DateTimeImmutable($data['disablingAt']) : null,
);
Expand All @@ -64,4 +69,37 @@ public static function fromArrayCollection(array $data): array
$data,
);
}

/**
* @param array<int, array<string, mixed>> $items
* @return ComplianceItem[]
*/
private static function mapCompliance(array $items): array
{
return array_map(static function (array $item): ComplianceItem {
$content = isset($item['content']) ? new ComplianceContent(
text: $item['content']['text'] ?? null,
html: $item['content']['html'] ?? null,
markdown: $item['content']['markdown'] ?? null,
) : null;

$links = array_map(
static fn (array $link): ComplianceLink => new ComplianceLink(
id: $link['id'] ?? null,
label: $link['label'] ?? null,
url: $link['url'] ?? null,
),
$item['links'] ?? [],
);

return new ComplianceItem(
id: $item['id'],
type: $item['type'],
required: $item['required'],
checked: $item['checked'] ?? null,
content: $content,
links: $links,
);
}, $items);
}
}
51 changes: 51 additions & 0 deletions src/Payment/Application/Mapper/TransactionListItemMapper.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<?php

declare(strict_types=1);

namespace Paymentic\Sdk\Payment\Application\Mapper;

use DateTimeImmutable;
use Exception;
use Paymentic\Sdk\Payment\Domain\Entity\TransactionListItem;
use Paymentic\Sdk\Payment\Domain\Enum\TransactionStatus;

final readonly class TransactionListItemMapper
{
/**
* @param array<string, mixed> $data
* @throws Exception
*/
public static function fromArray(array $data): TransactionListItem
{
return new TransactionListItem(
id: $data['id'],
status: TransactionStatus::from($data['status']),
amount: $data['amount'],
title: $data['title'],
commission: $data['commission'] ?? null,
customerName: $data['customerName'] ?? null,
customerEmail: $data['customerEmail'] ?? null,
externalReferenceId: $data['externalReferenceId'] ?? null,
paymentMethod: $data['paymentMethod'] ?? null,
paymentChannel: $data['paymentChannel'] ?? null,
orderId: $data['orderId'] ?? null,
blikId: $data['blikId'] ?? null,
cardBin: $data['cardBin'] ?? null,
paidAt: isset($data['paidAt']) ? new DateTimeImmutable($data['paidAt']) : null,
createdAt: isset($data['createdAt']) ? new DateTimeImmutable($data['createdAt']) : null,
);
}

/**
* @param array<int, array<string, mixed>> $data
* @return TransactionListItem[]
* @throws Exception
*/
public static function fromArrayCollection(array $data): array
{
return array_map(
static fn (array $item): TransactionListItem => self::fromArray($item),
$data,
);
}
}
32 changes: 32 additions & 0 deletions src/Payment/Application/Service/SystemService.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

declare(strict_types=1);

namespace Paymentic\Sdk\Payment\Application\Service;

use JsonException;
use Paymentic\Sdk\Payment\Application\Contract\SystemServiceContract;
use Paymentic\Sdk\Payment\Application\DTO\PingResponse;
use Paymentic\Sdk\Shared\Exception\PaymenticException;
use Paymentic\Sdk\Shared\Http\HttpClient;

final readonly class SystemService implements SystemServiceContract
{
public function __construct(
private HttpClient $httpClient,
) {
}

/**
* @throws PaymenticException
* @throws JsonException
*/
public function ping(): PingResponse
{
$response = $this->httpClient->get(
uri: '/payment/ping',
);

return PingResponse::fromArray($response['data']);
}
}
23 changes: 23 additions & 0 deletions src/Payment/Application/Service/TransactionService.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,14 @@
use Paymentic\Sdk\Payment\Application\Contract\TransactionServiceContract;
use Paymentic\Sdk\Payment\Application\DTO\CreateTransactionRequest;
use Paymentic\Sdk\Payment\Application\DTO\CreateTransactionResponse;
use Paymentic\Sdk\Payment\Application\DTO\ListTransactionsRequest;
use Paymentic\Sdk\Payment\Application\DTO\ListTransactionsResponse;
use Paymentic\Sdk\Payment\Application\Mapper\TransactionListItemMapper;
use Paymentic\Sdk\Payment\Application\Mapper\TransactionMapper;
use Paymentic\Sdk\Payment\Domain\Entity\Transaction;
use Paymentic\Sdk\Shared\Exception\PaymenticException;
use Paymentic\Sdk\Shared\Http\HttpClient;
use Paymentic\Sdk\Shared\ValueObject\Pagination;

final readonly class TransactionService implements TransactionServiceContract
{
Expand Down Expand Up @@ -59,4 +63,23 @@ public function capture(string $pointId, string $transactionId): void
uri: "/payment/points/{$pointId}/transactions/{$transactionId}/capture",
);
}

/**
* @throws PaymenticException
* @throws JsonException
* @throws Exception
*/
public function list(string $pointId, ?ListTransactionsRequest $request = null): ListTransactionsResponse
{
$queryString = $request?->toQueryString() ?? '';

$response = $this->httpClient->get(
uri: "/payment/points/{$pointId}/transactions{$queryString}",
);

return new ListTransactionsResponse(
data: TransactionListItemMapper::fromArrayCollection($response['data']),
pagination: Pagination::fromArray($response['pagination']),
);
}
}
5 changes: 5 additions & 0 deletions src/Payment/Domain/Entity/Channel.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,14 @@
use Paymentic\Sdk\Payment\Domain\ValueObject\ChannelAuthorization;
use Paymentic\Sdk\Payment\Domain\ValueObject\ChannelCommission;
use Paymentic\Sdk\Payment\Domain\ValueObject\ChannelImage;
use Paymentic\Sdk\Payment\Domain\ValueObject\ComplianceItem;

final readonly class Channel
{
/**
* @param string[] $currencies
* @param string[]|null $aliases
* @param ComplianceItem[]|null $compliance
*/
public function __construct(
public string $id,
Expand All @@ -27,6 +30,8 @@ public function __construct(
public ChannelCommission $commission,
public ChannelAuthorization $authorization,
public string $paymentType,
public ?array $aliases = null,
public ?array $compliance = null,
public ?DateTimeInterface $enablingAt = null,
public ?DateTimeInterface $disablingAt = null,
) {
Expand Down
30 changes: 30 additions & 0 deletions src/Payment/Domain/Entity/TransactionListItem.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

declare(strict_types=1);

namespace Paymentic\Sdk\Payment\Domain\Entity;

use DateTimeInterface;
use Paymentic\Sdk\Payment\Domain\Enum\TransactionStatus;

final readonly class TransactionListItem
{
public function __construct(
public string $id,
public TransactionStatus $status,
public string $amount,
public string $title,
public ?string $commission = null,
public ?string $customerName = null,
public ?string $customerEmail = null,
public ?string $externalReferenceId = null,
public ?string $paymentMethod = null,
public ?string $paymentChannel = null,
public ?string $orderId = null,
public ?string $blikId = null,
public ?string $cardBin = null,
public ?DateTimeInterface $paidAt = null,
public ?DateTimeInterface $createdAt = null,
) {
}
}
Loading