From ee2a91e4fbede7e9675b86855e24cf7a7d256f39 Mon Sep 17 00:00:00 2001 From: Niels Vanpachtenbeke <10651054+Nielsvanpach@users.noreply.github.com> Date: Fri, 18 Apr 2025 12:38:37 +0200 Subject: [PATCH] wip: use pagination --- composer.json | 1 + src/FloatClient.php | 33 ++++++++++++++++++++++++++++++++- src/Groups/ProjectsGroup.php | 9 +++++++-- src/Requests/GetAllocations.php | 3 ++- src/Requests/GetProjects.php | 3 ++- 5 files changed, 44 insertions(+), 5 deletions(-) diff --git a/composer.json b/composer.json index 041d4dd..293cdd4 100644 --- a/composer.json +++ b/composer.json @@ -19,6 +19,7 @@ "php": "^8.3", "illuminate/contracts": "^11.0|^12.0", "saloonphp/laravel-plugin": "^3.0", + "saloonphp/pagination-plugin": "^2.0", "spatie/laravel-package-tools": "^1.16" }, "require-dev": { diff --git a/src/FloatClient.php b/src/FloatClient.php index 38414ff..b87c2c2 100755 --- a/src/FloatClient.php +++ b/src/FloatClient.php @@ -4,13 +4,17 @@ use Saloon\Http\Auth\TokenAuthenticator; use Saloon\Http\Connector; +use Saloon\Http\Request; +use Saloon\Http\Response; +use Saloon\PaginationPlugin\Contracts\HasPagination; +use Saloon\PaginationPlugin\Paginator; use Spatie\FloatSdk\Groups\AllocationsGroup; use Spatie\FloatSdk\Groups\ClientsGroup; use Spatie\FloatSdk\Groups\ProjectsGroup; use Spatie\FloatSdk\Groups\TasksGroup; use Spatie\FloatSdk\Groups\UsersGroup; -class FloatClient extends Connector +class FloatClient extends Connector implements HasPagination { public function __construct( private string $apiKey, @@ -36,6 +40,33 @@ protected function defaultAuth(): TokenAuthenticator return new TokenAuthenticator($this->apiKey); } + public function paginate(Request $request): Paginator + { + return new class(connector: $this, request: $request) extends Paginator + { + protected function isLastPage(Response $response): bool + { + return is_null($response->json('next_page_url')); + } + + protected function getPageItems(Response $response, Request $request): array + { + return $response->json('items'); + } + + protected function applyPagination(Request $request): Request + { + $request->query()->add('page', $this->currentPage); + + if (isset($this->perPageLimit)) { + $request->query()->add('per-page', $this->perPageLimit); + } + + return $request; + } + }; + } + public function users(): UsersGroup { return new UsersGroup($this); diff --git a/src/Groups/ProjectsGroup.php b/src/Groups/ProjectsGroup.php index 8855e95..de38e81 100644 --- a/src/Groups/ProjectsGroup.php +++ b/src/Groups/ProjectsGroup.php @@ -2,6 +2,7 @@ namespace Spatie\FloatSdk\Groups; +use Generator; use Saloon\Http\BaseResource; use Saloon\Http\Response; use Spatie\FloatSdk\QueryParameters\GetProjectsParams; @@ -15,8 +16,12 @@ public function get(int $projectId): Response return $this->connector->send(new GetProject($projectId)); } - public function all(?GetProjectsParams $parameters = null): Response + public function all(?GetProjectsParams $parameters = null): Generator { - return $this->connector->send(new GetProjects($parameters)); + $paginator = $this->connector->paginate(new GetProjects($parameters)); + + foreach ($paginator->paginate() as $response) { + yield $response; + } } } diff --git a/src/Requests/GetAllocations.php b/src/Requests/GetAllocations.php index e8db10f..c60354e 100644 --- a/src/Requests/GetAllocations.php +++ b/src/Requests/GetAllocations.php @@ -5,10 +5,11 @@ use Saloon\Enums\Method; use Saloon\Http\Request; use Saloon\Http\Response; +use Saloon\PaginationPlugin\Contracts\Paginatable; use Spatie\FloatSdk\QueryParameters\GetAllocationsParams; use Spatie\FloatSdk\Resources\TaskResource; -class GetAllocations extends Request +class GetAllocations extends Request implements Paginatable { protected Method $method = Method::GET; diff --git a/src/Requests/GetProjects.php b/src/Requests/GetProjects.php index cfc4119..52a3fe2 100644 --- a/src/Requests/GetProjects.php +++ b/src/Requests/GetProjects.php @@ -5,10 +5,11 @@ use Saloon\Enums\Method; use Saloon\Http\Request; use Saloon\Http\Response; +use Saloon\PaginationPlugin\Contracts\Paginatable; use Spatie\FloatSdk\QueryParameters\GetProjectsParams; use Spatie\FloatSdk\Resources\ProjectResource; -class GetProjects extends Request +class GetProjects extends Request implements Paginatable { protected Method $method = Method::GET;