diff --git a/README.md b/README.md index 32d1dc8..6300d09 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,9 @@ echo "Fetched: " . $fetched->getOriginal()->getUrl() . PHP_EOL; ## 🚀 Usage -### 1. List Uploads (Paginated) +### 1. List Uploads + +#### 1.1 Paginated The `index()` method returns paginated results. You can provide pagination parameters such as `page` and `per_page`: @@ -94,6 +96,19 @@ Example of returned metadata: } ``` +#### 1.2 All Uploads + +To fetch all uploads without pagination, use the `all()` method: + +```php +$uploads = $cdn->all(); +foreach ($uploads as $upload) { + echo $upload->getNanoId() . ' - ' . $upload->getOriginal()->getUrl() . PHP_EOL; +} +``` + +> Returns an array of `Upload` models. + --- ### 2. Fetch a Single Upload diff --git a/src/Contracts/HamroCDNContract.php b/src/Contracts/HamroCDNContract.php index a8609e1..2dc7904 100644 --- a/src/Contracts/HamroCDNContract.php +++ b/src/Contracts/HamroCDNContract.php @@ -13,6 +13,9 @@ * @phpstan-type HamroCDNData array{ * data: HamroCDNObject * } + * @phpstan-type HamroCDNArrayData array{ + * data: array + * } * @phpstan-type HamroCDNObjectWithPagination array{ * data: array, * meta: array{total: int, per_page: int, page: int} @@ -21,11 +24,18 @@ interface HamroCDNContract { /** - * List all of your files in HamroCDN. + * List all your files in HamroCDN. + * + * @return array + */ + public function all(): array; + + /** + * List your files in HamroCDN with pagination. * * @return UploadWithPagination */ - public function index(): array; + public function index(?int $per_page = 20, ?int $page = 1): array; /** * Fetch a file from HamroCDN. diff --git a/src/HamroCDN.php b/src/HamroCDN.php index 5d24a66..1f2ba29 100644 --- a/src/HamroCDN.php +++ b/src/HamroCDN.php @@ -14,6 +14,7 @@ /** * @phpstan-import-type HamroCDNObject from Upload * @phpstan-import-type HamroCDNData from HamroCDNContract + * @phpstan-import-type HamroCDNArrayData from HamroCDNContract * @phpstan-import-type HamroCDNObjectWithPagination from HamroCDNContract */ final class HamroCDN implements HamroCDNContract @@ -132,4 +133,18 @@ public function uploadByURL(string $url): Upload return Upload::fromArray($response['data']); } + + public function all(): array + { + /** @var HamroCDNArrayData $response */ + $response = $this->get('uploads', [ + 'paginate' => false, + ]); + + return array_map( + /** @param HamroCDNObject $item */ + fn (array $item): Upload => Upload::fromArray($item), + $response['data'] + ); + } } diff --git a/tests/UploadTest.php b/tests/UploadTest.php index 035f6cf..fe05ae3 100644 --- a/tests/UploadTest.php +++ b/tests/UploadTest.php @@ -54,24 +54,37 @@ expect($upload->getUser()?->getEmail())->toBe('john@hamrocdn.com'); }); -it('returns an array of HamroCDN objects from index', function () { - $client = new HamroCDN('test-api-key', 'https://hamrocdn.com/api'); +describe('returns an array of HamroCDN objects from index', function () { + test('with pagination', function () { + $client = new HamroCDN('test-api-key', 'https://hamrocdn.com/api'); + + $uploads = $client->index(); + + expect($uploads)->toBeArray(); + expect($uploads) + ->toHaveKey('data') + ->toHaveKey('meta'); - $uploads = $client->index(); + expect($uploads['meta']) + ->toHaveKey('total') + ->toHaveKey('per_page') + ->toHaveKey('page'); - expect($uploads)->toBeArray(); - expect($uploads) - ->toHaveKey('data') - ->toHaveKey('meta'); + foreach ($uploads['data'] as $upload) { + expect($upload)->toBeUploadObject(); + } + }); + + test('without pagination', function () { + $client = new HamroCDN('test-api-key', 'https://hamrocdn.com/api'); - expect($uploads['meta']) - ->toHaveKey('total') - ->toHaveKey('per_page') - ->toHaveKey('page'); + $uploads = $client->all(); - foreach ($uploads['data'] as $upload) { - expect($upload)->toBeUploadObject(); - } + expect($uploads)->toBeArray(); + foreach ($uploads as $upload) { + expect($upload)->toBeUploadObject(); + } + }); }); it('uploads a file and returns a HamroCDN object', function () {