62 lines
1.6 KiB
PHP
62 lines
1.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Repositories;
|
|
|
|
use App\Http\MerchantApiClient;
|
|
|
|
final readonly class OfflineOrderRepository
|
|
{
|
|
private const PAGE_LIMIT = 100;
|
|
|
|
public function __construct(private MerchantApiClient $apiClient)
|
|
{
|
|
}
|
|
|
|
/**
|
|
* @param array<string, mixed> $query
|
|
* @return list<array<string, mixed>>
|
|
*/
|
|
public function list(array $query): array
|
|
{
|
|
$page = 1;
|
|
$orders = [];
|
|
$totalCount = null;
|
|
|
|
do {
|
|
$data = $this->apiClient->getOfflineOrders($query + [
|
|
'page' => $page,
|
|
'limit' => self::PAGE_LIMIT,
|
|
]);
|
|
$pageOrders = $data['data']['list'] ?? [];
|
|
|
|
if (!is_array($pageOrders) || $pageOrders === []) {
|
|
break;
|
|
}
|
|
|
|
if ($totalCount === null) {
|
|
$totalCount = isset($data['data']['count']) ? (int) $data['data']['count'] : null;
|
|
}
|
|
|
|
$orders = array_merge($orders, array_values(array_filter($pageOrders, is_array(...))));
|
|
$page++;
|
|
} while ($this->shouldFetchNextPage($orders, $pageOrders, $totalCount));
|
|
|
|
return $orders;
|
|
}
|
|
|
|
/**
|
|
* @param list<array<string, mixed>> $orders
|
|
* @param mixed $pageOrders
|
|
*/
|
|
private function shouldFetchNextPage(array $orders, mixed $pageOrders, ?int $totalCount): bool
|
|
{
|
|
if ($totalCount !== null) {
|
|
return count($orders) < $totalCount;
|
|
}
|
|
|
|
return is_array($pageOrders) && count($pageOrders) >= self::PAGE_LIMIT;
|
|
}
|
|
}
|