From d91891f29d489997f6dfbb4312d8d22810d71449 Mon Sep 17 00:00:00 2001 From: achyutkneupane Date: Thu, 30 Oct 2025 23:43:21 +0545 Subject: [PATCH 1/8] test: refactor upload tests to include delete_after functionality --- tests/UploadTest.php | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/tests/UploadTest.php b/tests/UploadTest.php index fe05ae3..8f2337a 100644 --- a/tests/UploadTest.php +++ b/tests/UploadTest.php @@ -87,20 +87,40 @@ }); }); -it('uploads a file and returns a HamroCDN object', function () { - $client = new HamroCDN('test-api-key', 'https://hamrocdn.com/api'); +describe('uploads a file and returns a HamroCDN object', function () { + test('without delete_after', function () { + $client = new HamroCDN('test-api-key', 'https://hamrocdn.com/api'); - $filePath = __DIR__.'/test.png'; - $upload = $client->upload($filePath); + $filePath = __DIR__.'/test.png'; + $upload = $client->upload($filePath); - expect($upload)->toBeUploadObject(); + expect($upload)->toBeUploadObject(); - $fetchedUpload = $client->fetch($upload->getNanoId()); + $fetchedUpload = $client->fetch($upload->getNanoId()); - expect($fetchedUpload) - ->toBeUploadObject(); + expect($fetchedUpload) + ->toBeUploadObject(); + + expect($fetchedUpload->getNanoId())->toBe($upload->getNanoId()); + }); + + test('with delete_after', function () { + $client = new HamroCDN('test-api-key', 'https://hamrocdn.com/api'); + + $filePath = __DIR__.'/test.png'; + $deleteAfter = 100; + $upload = $client->upload($filePath, $deleteAfter); + + expect($upload)->toBeUploadObject(); + expect($upload->getDeleteAt())->not->toBeNull(); - expect($fetchedUpload->getNanoId())->toBe($upload->getNanoId()); + $fetchedUpload = $client->fetch($upload->getNanoId()); + + expect($fetchedUpload) + ->toBeUploadObject(); + expect($fetchedUpload->getNanoId())->toBe($upload->getNanoId()); + expect($fetchedUpload->getDeleteAt())->not->toBeNull(); + }); }); it('uploads a file by URL and returns a HamroCDN object', function () { From 821ae901fa01d706f56ae5b1311221938cbc297f Mon Sep 17 00:00:00 2001 From: achyutkneupane Date: Fri, 31 Oct 2025 00:08:23 +0545 Subject: [PATCH 2/8] refactor: updates upload method to include optional delete_after parameter Enhances the upload functionality by allowing users to specify a time duration after which the uploaded file will be deleted. Also updates related tests to reflect changes in the method signature. --- src/Contracts/HamroCDNContract.php | 2 +- src/HamroCDN.php | 20 ++++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/Contracts/HamroCDNContract.php b/src/Contracts/HamroCDNContract.php index 2dc7904..9d563c2 100644 --- a/src/Contracts/HamroCDNContract.php +++ b/src/Contracts/HamroCDNContract.php @@ -45,7 +45,7 @@ public function fetch(string $nanoId): Upload; /** * Upload a file to HamroCDN. */ - public function upload(string $filePath): Upload; + public function upload(string $filePath, ?int $deleteAfter): Upload; /** * Upload a file to HamroCDN by URL. diff --git a/src/HamroCDN.php b/src/HamroCDN.php index 1f2ba29..9d4b00f 100644 --- a/src/HamroCDN.php +++ b/src/HamroCDN.php @@ -101,20 +101,28 @@ public function fetch(string $nanoId): Upload /** * @throws HamroCDNException */ - public function upload(string $filePath): Upload + public function upload(string $filePath, ?int $deleteAfter = null): Upload { if (! file_exists($filePath)) { throw HamroCDNException::fileError($filePath); } $response = $this->post('uploads', [ - 'multipart' => [ + 'multipart' => array_merge( [ - 'name' => 'file', - 'contents' => fopen($filePath, 'r'), - 'filename' => basename($filePath), + [ + 'name' => 'file', + 'contents' => fopen($filePath, 'r'), + 'filename' => basename($filePath), + ], ], - ], + $deleteAfter !== null ? [ + [ + 'name' => 'delete_after', + 'contents' => (string) $deleteAfter, + ], + ] : [] + ), ]); return Upload::fromArray($response['data']); From 579e7486bed8fb3785228aefe34c7138355dd0dd Mon Sep 17 00:00:00 2001 From: achyutkneupane Date: Fri, 31 Oct 2025 00:11:16 +0545 Subject: [PATCH 3/8] test: refactor url upload tests to include delete_after --- tests/UploadTest.php | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/tests/UploadTest.php b/tests/UploadTest.php index 8f2337a..39576ad 100644 --- a/tests/UploadTest.php +++ b/tests/UploadTest.php @@ -123,17 +123,36 @@ }); }); -it('uploads a file by URL and returns a HamroCDN object', function () { - $client = new HamroCDN('test-api-key', 'https://hamrocdn.com/api'); +describe('uploads a file by URL and returns a HamroCDN object', function () { + test('without delete_after', function () { + $client = new HamroCDN('test-api-key', 'https://hamrocdn.com/api'); - $fileUrl = 'https://placehold.co/1000x1000/000000/FFFFFF?text=HamroCDN'; + $fileUrl = 'https://placehold.co/1000x1000/000000/FFFFFF?text=HamroCDN'; - $upload = $client->uploadByURL($fileUrl); - expect($upload)->toBeUploadObject(); + $upload = $client->uploadByURL($fileUrl); + expect($upload)->toBeUploadObject(); + + $fetchedUpload = $client->fetch($upload->getNanoId()); + expect($fetchedUpload) + ->toBeUploadObject(); + }); + + test('with delete_after', function () { + $client = new HamroCDN('test-api-key', 'https://hamrocdn.com/api'); - $fetchedUpload = $client->fetch($upload->getNanoId()); - expect($fetchedUpload) - ->toBeUploadObject(); + $fileUrl = 'https://placehold.co/1000x1000/000000/FFFFFF?text=HamroCDN'; + $deleteAfter = 100; + + $upload = $client->uploadByURL($fileUrl, $deleteAfter); + + expect($upload)->toBeUploadObject(); + expect($upload->getDeleteAt())->not->toBeNull(); + + $fetchedUpload = $client->fetch($upload->getNanoId()); + expect($fetchedUpload) + ->toBeUploadObject(); + expect($fetchedUpload->getDeleteAt())->not->toBeNull(); + }); }); describe('exception', function () { From c561b71c57e030aa0ffa504fa5f59d9bb4529d91 Mon Sep 17 00:00:00 2001 From: achyutkneupane Date: Fri, 31 Oct 2025 00:12:11 +0545 Subject: [PATCH 4/8] refactor: updates uploadByURL method to include optional deleteAfter parameter --- src/Contracts/HamroCDNContract.php | 2 +- src/HamroCDN.php | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Contracts/HamroCDNContract.php b/src/Contracts/HamroCDNContract.php index 9d563c2..b29eaf9 100644 --- a/src/Contracts/HamroCDNContract.php +++ b/src/Contracts/HamroCDNContract.php @@ -50,5 +50,5 @@ public function upload(string $filePath, ?int $deleteAfter): Upload; /** * Upload a file to HamroCDN by URL. */ - public function uploadByURL(string $url): Upload; + public function uploadByURL(string $url, ?int $deleteAfter = null): Upload; } diff --git a/src/HamroCDN.php b/src/HamroCDN.php index 9d4b00f..d2bfafc 100644 --- a/src/HamroCDN.php +++ b/src/HamroCDN.php @@ -131,11 +131,12 @@ public function upload(string $filePath, ?int $deleteAfter = null): Upload /** * @throws HamroCDNException */ - public function uploadByURL(string $url): Upload + public function uploadByURL(string $url, ?int $deleteAfter = null): Upload { $response = $this->post('upload-from-url', [ 'json' => [ 'url' => $url, + 'delete_after' => $deleteAfter, ], ]); From bcbf64280f0d2e43c77c648fdb1686d54ec80c1e Mon Sep 17 00:00:00 2001 From: achyutkneupane Date: Fri, 31 Oct 2025 00:23:28 +0545 Subject: [PATCH 5/8] refactor: updates upload tests to include File instance validation --- tests/UploadTest.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/UploadTest.php b/tests/UploadTest.php index 39576ad..ba5c69c 100644 --- a/tests/UploadTest.php +++ b/tests/UploadTest.php @@ -4,6 +4,7 @@ use HamroCDN\Exceptions\HamroCDNException; use HamroCDN\HamroCDN; +use HamroCDN\Models\File; use HamroCDN\Models\Upload; use HamroCDN\Models\User; @@ -12,15 +13,14 @@ $upload = $this->value; expect($upload) - ->toBeInstanceOf(Upload::class); - - expect($upload) + ->toBeInstanceOf(Upload::class) ->toHaveKey('nanoId') ->toHaveKey('user') ->toHaveKey('delete_at') ->toHaveKey('original'); expect($upload->getOriginal()) + ->toBeInstanceOf(File::class) ->toHaveKey('url') ->toHaveKey('size'); From 4cb047fa27138ba5a1aa11efda0ed80254125ae5 Mon Sep 17 00:00:00 2001 From: achyutkneupane Date: Fri, 31 Oct 2025 00:25:49 +0545 Subject: [PATCH 6/8] docs: updates README to include deleteAfter parameter usage --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 6300d09..e21d1af 100644 --- a/README.md +++ b/README.md @@ -129,6 +129,14 @@ $upload = $cdn->upload('/path/to/image.png'); echo $upload->getNanoId(); // nano ID of the uploaded file ``` +> To delete the file after a certain time, use the `deleteAfter` parameter (in seconds): + +```php +$upload = $cdn->upload('/path/to/image.png', deleteAfter: 3600); // Deletes after 1 hour +``` + +> This will set the `deleteAt` property on the returned `Upload` model. + --- ### 4. Upload by Remote URL @@ -139,6 +147,8 @@ $upload = $cdn->uploadByURL('https://example.com/image.png'); echo $upload->getOriginal()->getUrl(); ``` +> Also supports the `deleteAfter` parameter. + --- ## 🧱 Models From f902607d3d33b3391d15099dba47f63044d38c8b Mon Sep 17 00:00:00 2001 From: achyutkneupane Date: Fri, 31 Oct 2025 00:26:03 +0545 Subject: [PATCH 7/8] docs: updates README to reflect change of deleteAt type to Carbon --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e21d1af..ef9bae8 100644 --- a/README.md +++ b/README.md @@ -159,13 +159,13 @@ echo $upload->getOriginal()->getUrl(); |------------|--------------------|--------------------------------------| | `nanoId` | `string` | Unique identifier of the upload | | `user` | `User` or `null` | Owner of the file (if authenticated) | -| `deleteAt` | `string` or `null` | Deletion timestamp if temporary | +| `deleteAt` | `Carbon` or `null` | Deletion timestamp if temporary | | `original` | `File` | File information (URL, size) | #### Methods - `getNanoId()`: `string` - `getUser()`: `?User` -- `getDeleteAt()`: `?string` +- `getDeleteAt()`: `?Carbon` - `getOriginal()`: `File` - `toArray()`: `array` From 29950663d23b397817dfe71adb44b1d3418a31e3 Mon Sep 17 00:00:00 2001 From: achyutkneupane Date: Fri, 31 Oct 2025 00:28:20 +0545 Subject: [PATCH 8/8] docs: updates README to include API key retrieval instructions --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index ef9bae8..fa5de50 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,8 @@ echo "Fetched: " . $fetched->getOriginal()->getUrl() . PHP_EOL; ## 🚀 Usage +This SDK make use of [public API](https://hamrocdn.com/docs/api) provided by HamroCDN. To get your API key, sign up at [hamrocdn.com](https://hamrocdn.com/dashboard) and navigate to *Edit Profile* page in your dashboard. + ### 1. List Uploads #### 1.1 Paginated