Skip to content

Commit

Permalink
Merge pull request #6 from craigpotter/feature/use-new-pagination
Browse files Browse the repository at this point in the history
Implement Saloon Pagination v2
  • Loading branch information
craigpotter authored Oct 21, 2023
2 parents 2d12a51 + 55015fc commit 58e9291
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 16 deletions.
3 changes: 2 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@
"homepage": "https://github.com/craigpotter",
"require": {
"php": "^8.1",
"saloonphp/saloon": "^2.0"
"saloonphp/saloon": "^2.0",
"saloonphp/pagination-plugin": "^1.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.5",
Expand Down
66 changes: 54 additions & 12 deletions src/Fca.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@
use Saloon\Http\Connector;
use Saloon\Contracts\Request;
use Saloon\Contracts\Response;
use Saloon\Contracts\Paginator;
use Saloon\Contracts\HasPagination;
use Saloon\PaginationPlugin\Paginator;
use CraigPotter\Fca\Requests\GetEndpoint;
use Saloon\Http\Paginators\PagedPaginator;
use CraigPotter\Fca\Resources\FirmResource;
use Saloon\PaginationPlugin\PagedPaginator;
use Saloon\Traits\Plugins\AlwaysThrowOnErrors;
use Saloon\PaginationPlugin\Contracts\HasPagination;

class Fca extends Connector implements HasPagination
{
Expand Down Expand Up @@ -74,22 +74,64 @@ public function firm(int $frn): FirmResource
return new FirmResource($this, $frn);
}

/**
* Get an endpoint
*
* @param string $endpoint
* @return Paginator
*/
public function getEndpoint(string $endpoint): Paginator
{
return $this->paginate(new GetEndpoint($endpoint));
}

public function paginate(Request $request, ...$additionalArguments): Paginator
public function paginate(Request $request, ...$additionalArguments): PagedPaginator
{
/** @var PagedPaginator $paginator */
$paginator = new PagedPaginator($this, $request, 20, ...$additionalArguments);
return new class(connector: $this, request: $request) extends PagedPaginator {
protected ?int $perPageLimit = 20;

/**
* Determine if the response is the last page
*
* @param Response $response
* @return bool
*/
protected function isLastPage(Response $response): bool
{
$count = (int) $response->json('ResultInfo.total_count', 0);
$perPage = (int) $response->json('ResultInfo.per_page', $count);
$currentPage = (int) $response->json('ResultInfo.page', 1);

return $count <= ($perPage * $currentPage);

}

/**
* Get the results from the page
*
* @return array
*/
protected function getPageItems(Response $response, Request $request): array
{
return $request->createDtoFromResponse($response);
}

/**
* Apply pagination to the request
*
* @param Request $request
* @return Request
*/
protected function applyPagination(Request $request): Request
{
$request->query()->add('pgnp', $this->page);

$paginator->setTotalKeyName('ResultInfo.total_count');
$paginator->setPageKeyName('pgnp');
$paginator->setLimit(20);
$paginator->setNextPageKeyName('ResultInfo.Next');
$paginator->setCurrentPage(1);
if (isset($this->perPageLimit)) {
$request->query()->add('pageSize', $this->perPageLimit);
}

return $paginator;
return $request;
}
};
}
}
3 changes: 2 additions & 1 deletion src/Requests/Firm/GetFirmAddresses.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@
use Saloon\Http\Request;
use Saloon\Contracts\Response;
use CraigPotter\Fca\DataObjects\Address;
use Saloon\PaginationPlugin\Contracts\Paginatable;

class GetFirmAddresses extends Request
class GetFirmAddresses extends Request implements Paginatable
{
/**
* The HTTP method of the request.
Expand Down
3 changes: 2 additions & 1 deletion src/Requests/Firm/GetFirmIndividuals.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@
use Saloon\Http\Request;
use Saloon\Contracts\Response;
use CraigPotter\Fca\DataObjects\Individual;
use Saloon\PaginationPlugin\Contracts\Paginatable;

class GetFirmIndividuals extends Request
class GetFirmIndividuals extends Request implements Paginatable
{
/**
* The HTTP method of the request.
Expand Down
2 changes: 1 addition & 1 deletion src/Resources/FirmResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
namespace CraigPotter\Fca\Resources;

use Saloon\Http\Response;
use Saloon\Http\Paginators\PagedPaginator;
use Saloon\PaginationPlugin\PagedPaginator;
use Saloon\Exceptions\Request\RequestException;
use CraigPotter\Fca\Requests\Firm\GetFirmDetails;
use CraigPotter\Fca\Requests\Firm\GetFirmAddresses;
Expand Down

0 comments on commit 58e9291

Please sign in to comment.