ai_analysis/src/Repositories/OfflineOrderRepository.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;
}
}