From dca5c3491b8563aa177e75717794eb75d6e47645 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Wed, 16 Jun 2021 15:44:47 +0545 Subject: [PATCH 01/12] update bucket endpoint and test --- app/controllers/api/storage.php | 65 +++++++++++++++++-- .../Storage/StorageCustomServerTest.php | 43 ++++++++++++ 2 files changed, 104 insertions(+), 4 deletions(-) diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index 2191342102..810c84eb5b 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -48,13 +48,10 @@ App::post('/v1/storage/buckets') ->param('antiVirus', true, new Boolean(), 'Is virus scanning enabled?', true) ->inject('response') ->inject('dbForInternal') - ->inject('user') ->inject('audits') - ->action(function ($name, $read, $write, $maximumFileSize, $allowedFileExtensions, $enabled, $adapter, $encryption, $antiVirus, $response, $dbForInternal, $user, $audits) { - /** @var Utopia\Swoole\Request $request */ + ->action(function ($name, $read, $write, $maximumFileSize, $allowedFileExtensions, $enabled, $adapter, $encryption, $antiVirus, $response, $dbForInternal, $audits) { /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Database\Database $dbForInternal */ - /** @var Appwrite\Database\Document $user */ /** @var Appwrite\Event\Event $audits */ $data = $dbForInternal->createDocument('buckets', new Document([ @@ -138,6 +135,66 @@ App::get('/v1/storage/buckets/:bucketId') $response->dynamic2($bucket, Response::MODEL_BUCKET); }); +App::put('/v1/storage/buckets/:bucketId') + ->desc('Get Bucket') + ->groups(['api', 'storage']) + ->label('scope', 'buckets.read') + ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) + ->label('sdk.namespace', 'storage') + ->label('sdk.method', 'getBucket') + ->label('sdk.description', '/docs/references/storage/get-bucket.md') + ->label('sdk.response.code', Response::STATUS_CODE_OK) + ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) + ->label('sdk.response.model', Response::MODEL_BUCKET) + ->param('bucketId', '', new UID(), 'Bucket unique ID.') + ->param('name', null, new Text(128), 'Bucket name', false) + ->param('read', null, new ArrayList(new Text(64)), 'An array of strings with read permissions. By default inherits the existing read permissions. [learn more about permissions](/docs/permissions) and get a full list of available permissions.', true) + ->param('write', null, new ArrayList(new Text(64)), 'An array of strings with write permissions. By default inherits the existing write permissions. [learn more about permissions](/docs/permissions) and get a full list of available permissions.', true) + ->param('maximumFileSize', 0, new Integer(), 'Maximum file size allowed.', true) + ->param('allowedFileExtensions', ['*'], new ArrayList(new Text(64)), 'Allowed file extensions', true) + ->param('enabled', true, new Boolean(), 'Is bucket enabled?', true) + ->param('adapter', 'local', new WhiteList(['local']), 'Storage adapter.', true) + ->param('encryption', true, new Boolean(), 'Is encryption enabled?', true) + ->param('antiVirus', true, new Boolean(), 'Is virus scanning enabled?', true) + ->inject('response') + ->inject('dbForInternal') + ->inject('user') + ->inject('audits') + ->action(function ($bucketId, $name, $read, $write, $maximumFileSize, $allowedFileExtensions, $enabled, $adapter, $encryption, $antiVirus, $response, $dbForInternal, $user, $audits) { + /** @var Appwrite\Utopia\Response $response */ + /** @var Utopia\Database\Database $dbForInternal */ + /** @var Appwrite\Event\Event $audits */ + + $bucket = $dbForInternal->getDocument('buckets', $bucketId); + + if (empty($bucket->getId())) { + throw new Exception('Bucket not found', 404); + } + + $read = (is_null($read)) ? $bucket->getAttribute('$read', []) : $read; // By default inherit read permissions + $write = (is_null($write)) ? $bucket->getAttribute('$write',[]) : $write; // By default inherit write permissions + + $bucket = $dbForInternal->updateDocument('buckets', $bucket->getId(), $bucket + ->setAttribute('name',$name) + ->setAttribute('$read',$read) + ->setAttribute('$write',$write) + ->setAttribute('maximumFileSize',$maximumFileSize) + ->setAttribute('allowedFileExtensions',$allowedFileExtensions) + ->setAttribute('enabled',$enabled) + ->setAttribute('adapter',$adapter) + ->setAttribute('encryption',$encryption) + ->setAttribute('antiVirus',$antiVirus) + ); + + $audits + ->setParam('event', 'storage.buckets.update') + ->setParam('resource', 'storage/buckets/' . $bucket->getId()) + ->setParam('data', $bucket->getArrayCopy()) + ; + + $response->dynamic2($bucket, Response::MODEL_BUCKET); + }); + App::post('/v1/storage/files') ->desc('Create File') ->groups(['api', 'storage']) diff --git a/tests/e2e/Services/Storage/StorageCustomServerTest.php b/tests/e2e/Services/Storage/StorageCustomServerTest.php index 87fa92836e..c6b1428601 100644 --- a/tests/e2e/Services/Storage/StorageCustomServerTest.php +++ b/tests/e2e/Services/Storage/StorageCustomServerTest.php @@ -111,4 +111,47 @@ class StorageCustomServerTest extends Scope return $data; } + + /** + * @depends testCreateBucket + */ + public function testUpdateBucket($data):array + { + $id = $data['bucketId'] ?? ''; + /** + * Test for SUCCESS + */ + $bucket = $this->client->call(Client::METHOD_POST, '/storage/buckets/' . $id, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'name' => 'Test Bucket Updated', + 'enabled' => false, + ]); + $this->assertEquals(201, $bucket['headers']['status-code']); + $this->assertNotEmpty($bucket['body']['$id']); + $this->assertIsInt($bucket['body']['dateCreated']); + $this->assertIsArray($bucket['body']['$read']); + $this->assertIsArray($bucket['body']['$write']); + $this->assertIsArray($bucket['body']['allowedFileExtensions']); + $this->assertEquals('Test Bucket Updated', $bucket['body']['name']); + $this->assertEquals(false, $bucket['body']['enabled']); + $this->assertEquals(true, $bucket['body']['encryption']); + $this->assertEquals(true, $bucket['body']['antiVirus']); + $this->assertEquals('local', $bucket['body']['adapter']); + $bucketId = $bucket['body']['$id']; + /** + * Test for FAILURE + */ + $bucket = $this->client->call(Client::METHOD_POST, '/storage/buckets/' . $id, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'name' => '', + 'enabled' => 'false', + ]); + $this->assertEquals(400, $bucket['headers']['status-code']); + + return ['bucketId' => $bucketId]; + } } \ No newline at end of file From 1a82529e49b951ad25883cef436d32d1088a04e4 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Wed, 16 Jun 2021 15:48:44 +0545 Subject: [PATCH 02/12] fixes --- app/controllers/api/storage.php | 11 +++++------ docs/references/storage/update-bucket.md | 1 + 2 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 docs/references/storage/update-bucket.md diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index 810c84eb5b..f471978d32 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -136,13 +136,13 @@ App::get('/v1/storage/buckets/:bucketId') }); App::put('/v1/storage/buckets/:bucketId') - ->desc('Get Bucket') + ->desc('Update Bucket') ->groups(['api', 'storage']) - ->label('scope', 'buckets.read') + ->label('scope', 'buckets.write') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'storage') - ->label('sdk.method', 'getBucket') - ->label('sdk.description', '/docs/references/storage/get-bucket.md') + ->label('sdk.method', 'updateBucket') + ->label('sdk.description', '/docs/references/storage/update-bucket.md') ->label('sdk.response.code', Response::STATUS_CODE_OK) ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) ->label('sdk.response.model', Response::MODEL_BUCKET) @@ -158,9 +158,8 @@ App::put('/v1/storage/buckets/:bucketId') ->param('antiVirus', true, new Boolean(), 'Is virus scanning enabled?', true) ->inject('response') ->inject('dbForInternal') - ->inject('user') ->inject('audits') - ->action(function ($bucketId, $name, $read, $write, $maximumFileSize, $allowedFileExtensions, $enabled, $adapter, $encryption, $antiVirus, $response, $dbForInternal, $user, $audits) { + ->action(function ($bucketId, $name, $read, $write, $maximumFileSize, $allowedFileExtensions, $enabled, $adapter, $encryption, $antiVirus, $response, $dbForInternal, $audits) { /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Database\Database $dbForInternal */ /** @var Appwrite\Event\Event $audits */ diff --git a/docs/references/storage/update-bucket.md b/docs/references/storage/update-bucket.md new file mode 100644 index 0000000000..8a9ca1be7b --- /dev/null +++ b/docs/references/storage/update-bucket.md @@ -0,0 +1 @@ +Update a storage bucket by its unique ID. \ No newline at end of file From 8c30043bd3115595355756faa18d6e648b58fd96 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Wed, 16 Jun 2021 16:02:14 +0545 Subject: [PATCH 03/12] delete bucket endpoint and test --- app/controllers/api/storage.php | 45 +++++++++++++++++++ docs/references/storage/delete-bucket.md | 1 + .../Storage/StorageCustomServerTest.php | 36 ++++++++++++++- 3 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 docs/references/storage/delete-bucket.md diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index f471978d32..2791e84ee3 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -194,6 +194,51 @@ App::put('/v1/storage/buckets/:bucketId') $response->dynamic2($bucket, Response::MODEL_BUCKET); }); +App::delete('/v1/storage/buckets/:bucketId') + ->desc('Delete Bucket') + ->groups(['api', 'storage']) + ->label('scope', 'buckets.write') + ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) + ->label('sdk.namespace', 'storage') + ->label('sdk.method', 'deleteBucket') + ->label('sdk.description', '/docs/references/storage/delete-bucket.md') + ->label('sdk.response.code', Response::STATUS_CODE_NOCONTENT) + ->label('sdk.response.model', Response::MODEL_NONE) + ->param('bucketId', '', new UID(), 'Bucket unique ID.') + ->inject('response') + ->inject('dbForInternal') + ->inject('audits') + ->inject('deletes') + ->action(function ($bucketId, $response, $dbForInternal, $audits, $deletes) { + /** @var Appwrite\Utopia\Response $response */ + /** @var Utopia\Database\Database $dbForInternal */ + /** @var Appwrite\Event\Event $audits */ + /** @var Appwrite\Event\Event $deletes */ + + $bucket = $dbForInternal->getDocument('buckets', $bucketId); + + if (empty($bucket->getId())) { + throw new Exception('Bucket not found', 404); + } + + $deletes + ->setParam('type', DELETE_TYPE_DOCUMENT) + ->setParam('document', $bucket) + ; + + if(!$dbForInternal->deleteDocument('buckets', $bucketId)) { + throw new Exception('Failed to remove project from DB', 500); + } + + $audits + ->setParam('event', 'storage.buckets.delete') + ->setParam('resource', 'storage/buckets/' . $bucket->getId()) + ->setParam('data', $bucket->getArrayCopy()) + ; + + $response->noContent(); + }); + App::post('/v1/storage/files') ->desc('Create File') ->groups(['api', 'storage']) diff --git a/docs/references/storage/delete-bucket.md b/docs/references/storage/delete-bucket.md new file mode 100644 index 0000000000..99b4c792e1 --- /dev/null +++ b/docs/references/storage/delete-bucket.md @@ -0,0 +1 @@ +Delete a storage bucket by its unique ID. \ No newline at end of file diff --git a/tests/e2e/Services/Storage/StorageCustomServerTest.php b/tests/e2e/Services/Storage/StorageCustomServerTest.php index c6b1428601..8915bf5526 100644 --- a/tests/e2e/Services/Storage/StorageCustomServerTest.php +++ b/tests/e2e/Services/Storage/StorageCustomServerTest.php @@ -75,7 +75,7 @@ class StorageCustomServerTest extends Scope /** * @depends testCreateBucket */ - public function testGetBucket($data): array + public function testGetBucket(array $data): array { $id = $data['bucketId'] ?? ''; /** @@ -115,7 +115,7 @@ class StorageCustomServerTest extends Scope /** * @depends testCreateBucket */ - public function testUpdateBucket($data):array + public function testUpdateBucket(array $data):array { $id = $data['bucketId'] ?? ''; /** @@ -154,4 +154,36 @@ class StorageCustomServerTest extends Scope return ['bucketId' => $bucketId]; } + + /** + * @depends testCreateBucket + */ + public function testDeleteBucket(array $data): array + { + $id = $data['bucketId'] ?? ''; + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_DELETE, '/storage/buckets/' . $id, + array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders())); + $this->assertEquals(204, $response['headers']['status-code']); + $this->assertEmpty($response['body']); + + $response = $this->client->call(Client::METHOD_GET, '/storage/buckets/' . $id, + array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders())); + $this->assertEquals(404, $response['headers']['status-code']); + + /** + * Test for FAILURE + */ + + return $data; + } + } \ No newline at end of file From 5ebebbd0aa4d6fd0c0f47a7dbb0c111a28f02e01 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 17 Jun 2021 12:41:01 +0545 Subject: [PATCH 04/12] webhook test for update bucket --- app/config/events.php | 5 +++ tests/e2e/Scopes/ProjectCustom.php | 1 + tests/e2e/Services/Webhooks/WebhooksBase.php | 40 ++++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/app/config/events.php b/app/config/events.php index 18edf4ba4a..aa877b080c 100644 --- a/app/config/events.php +++ b/app/config/events.php @@ -157,6 +157,11 @@ return [ 'model' => Response::MODEL_BUCKET, 'note' => '', ], + 'storage.buckets.update' => [ + 'description' => 'This event triggers when a storage bucket is updated.', + 'model' => Response::MODEL_BUCKET, + 'note' => '', + ], 'users.create' => [ 'description' => 'This event triggers when a user is created from the users API.', 'model' => Response::MODEL_USER, diff --git a/tests/e2e/Scopes/ProjectCustom.php b/tests/e2e/Scopes/ProjectCustom.php index 53586162c5..c7642d2a6c 100644 --- a/tests/e2e/Scopes/ProjectCustom.php +++ b/tests/e2e/Scopes/ProjectCustom.php @@ -127,6 +127,7 @@ trait ProjectCustom 'storage.files.update', 'storage.files.delete', 'storage.buckets.create', + 'storage.buckets.update', 'users.create', 'users.update.prefs', 'users.update.status', diff --git a/tests/e2e/Services/Webhooks/WebhooksBase.php b/tests/e2e/Services/Webhooks/WebhooksBase.php index a6f3bc2785..6ef535fe49 100644 --- a/tests/e2e/Services/Webhooks/WebhooksBase.php +++ b/tests/e2e/Services/Webhooks/WebhooksBase.php @@ -587,4 +587,44 @@ trait WebhooksBase return array_merge(['bucketId' => $bucket['body']['$id']]); } + + /** + * @depends testCreateStorageBucket + */ + public function testUpdateStorageBucket(array $data): array + { + $id = $data['bucketId']; + /** + * Test for SUCCESS + */ + $bucket = $this->client->call(Client::METHOD_PUT, '/storage/buckets/' . $id, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'name' => 'Test Bucket Updated', + 'enabled' => false, + ]); + + $this->assertEquals($bucket['headers']['status-code'], 200); + $this->assertNotEmpty($bucket['body']['$id']); + + $webhook = $this->getLastRequest(); + + $this->assertEquals($webhook['method'], 'POST'); + $this->assertEquals($webhook['headers']['Content-Type'], 'application/json'); + $this->assertEquals($webhook['headers']['User-Agent'], 'Appwrite-Server vdev. Please report abuse at security@appwrite.io'); + $this->assertEquals($webhook['headers']['X-Appwrite-Webhook-Event'], 'storage.buckets.update'); + $this->assertEquals($webhook['headers']['X-Appwrite-Webhook-Signature'], 'not-yet-implemented'); + $this->assertEquals($webhook['headers']['X-Appwrite-Webhook-Id'] ?? '', $this->getProject()['webhookId']); + $this->assertEquals($webhook['headers']['X-Appwrite-Webhook-Project-Id'] ?? '', $this->getProject()['$id']); + $this->assertEquals(empty($webhook['headers']['X-Appwrite-Webhook-User-Id'] ?? ''), true); + $this->assertNotEmpty($webhook['data']['$id']); + $this->assertEquals('Test Bucket Updated', $webhook['data']['name']); + $this->assertEquals(false, $webhook['data']['enabled']); + $this->assertIsArray($webhook['data']['$read']); + $this->assertIsArray($webhook['data']['$write']); + + return array_merge(['bucketId' => $bucket['body']['$id']]); + } } \ No newline at end of file From f92fa47c0c8eff8eb543014db4c75cea61a00965 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 17 Jun 2021 13:34:49 +0545 Subject: [PATCH 05/12] fix event --- app/controllers/api/storage.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index 2791e84ee3..f42d37d3f4 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -139,6 +139,7 @@ App::put('/v1/storage/buckets/:bucketId') ->desc('Update Bucket') ->groups(['api', 'storage']) ->label('scope', 'buckets.write') + ->label('event', 'storage.buckets.update') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'storage') ->label('sdk.method', 'updateBucket') @@ -198,6 +199,7 @@ App::delete('/v1/storage/buckets/:bucketId') ->desc('Delete Bucket') ->groups(['api', 'storage']) ->label('scope', 'buckets.write') + ->label('event', 'storage.buckets.delete') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'storage') ->label('sdk.method', 'deleteBucket') From 7829ac09b37de396c26ea2fcb9a07ee09c63e7a1 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 17 Jun 2021 13:36:29 +0545 Subject: [PATCH 06/12] prevent adapter update --- app/controllers/api/storage.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index f42d37d3f4..d9817b3850 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -154,7 +154,6 @@ App::put('/v1/storage/buckets/:bucketId') ->param('maximumFileSize', 0, new Integer(), 'Maximum file size allowed.', true) ->param('allowedFileExtensions', ['*'], new ArrayList(new Text(64)), 'Allowed file extensions', true) ->param('enabled', true, new Boolean(), 'Is bucket enabled?', true) - ->param('adapter', 'local', new WhiteList(['local']), 'Storage adapter.', true) ->param('encryption', true, new Boolean(), 'Is encryption enabled?', true) ->param('antiVirus', true, new Boolean(), 'Is virus scanning enabled?', true) ->inject('response') @@ -181,7 +180,6 @@ App::put('/v1/storage/buckets/:bucketId') ->setAttribute('maximumFileSize',$maximumFileSize) ->setAttribute('allowedFileExtensions',$allowedFileExtensions) ->setAttribute('enabled',$enabled) - ->setAttribute('adapter',$adapter) ->setAttribute('encryption',$encryption) ->setAttribute('antiVirus',$antiVirus) ); From cdd83bf292e5c396b379ff2fa28a471d65a55bad Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 17 Jun 2021 13:42:38 +0545 Subject: [PATCH 07/12] storage bucket delete event --- app/config/events.php | 5 +++++ tests/e2e/Scopes/ProjectCustom.php | 1 + 2 files changed, 6 insertions(+) diff --git a/app/config/events.php b/app/config/events.php index aa877b080c..6cec0ebba7 100644 --- a/app/config/events.php +++ b/app/config/events.php @@ -162,6 +162,11 @@ return [ 'model' => Response::MODEL_BUCKET, 'note' => '', ], + 'storage.buckets.delete' => [ + 'description' => 'This event triggers when a storage bucket is deleted.', + 'model' => Response::MODEL_BUCKET, + 'note' => '', + ], 'users.create' => [ 'description' => 'This event triggers when a user is created from the users API.', 'model' => Response::MODEL_USER, diff --git a/tests/e2e/Scopes/ProjectCustom.php b/tests/e2e/Scopes/ProjectCustom.php index c7642d2a6c..2455a45f5d 100644 --- a/tests/e2e/Scopes/ProjectCustom.php +++ b/tests/e2e/Scopes/ProjectCustom.php @@ -128,6 +128,7 @@ trait ProjectCustom 'storage.files.delete', 'storage.buckets.create', 'storage.buckets.update', + 'storage.buckets.delete', 'users.create', 'users.update.prefs', 'users.update.status', From 7ec21d5c5e8d8a3148f1631d5552f23db6f42c85 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 17 Jun 2021 13:46:19 +0545 Subject: [PATCH 08/12] remove adapter --- app/controllers/api/storage.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index d9817b3850..6e0b0f4c53 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -159,7 +159,7 @@ App::put('/v1/storage/buckets/:bucketId') ->inject('response') ->inject('dbForInternal') ->inject('audits') - ->action(function ($bucketId, $name, $read, $write, $maximumFileSize, $allowedFileExtensions, $enabled, $adapter, $encryption, $antiVirus, $response, $dbForInternal, $audits) { + ->action(function ($bucketId, $name, $read, $write, $maximumFileSize, $allowedFileExtensions, $enabled, $encryption, $antiVirus, $response, $dbForInternal, $audits) { /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Database\Database $dbForInternal */ /** @var Appwrite\Event\Event $audits */ From db85577f4f4ab3666387a61ad841d1c9861e8e7c Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 17 Jun 2021 14:08:21 +0545 Subject: [PATCH 09/12] delete storage bucket webhook test --- app/controllers/api/storage.php | 8 ++++- tests/e2e/Services/Webhooks/WebhooksBase.php | 35 ++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index 6e0b0f4c53..0e200afdce 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -209,11 +209,13 @@ App::delete('/v1/storage/buckets/:bucketId') ->inject('dbForInternal') ->inject('audits') ->inject('deletes') - ->action(function ($bucketId, $response, $dbForInternal, $audits, $deletes) { + ->inject('events') + ->action(function ($bucketId, $response, $dbForInternal, $audits, $deletes, $events) { /** @var Appwrite\Utopia\Response $response */ /** @var Utopia\Database\Database $dbForInternal */ /** @var Appwrite\Event\Event $audits */ /** @var Appwrite\Event\Event $deletes */ + /** @var Appwrite\Event\Event $events */ $bucket = $dbForInternal->getDocument('buckets', $bucketId); @@ -230,6 +232,10 @@ App::delete('/v1/storage/buckets/:bucketId') throw new Exception('Failed to remove project from DB', 500); } + $events + ->setParam('eventData', $response->output2($bucket, Response::MODEL_BUCKET)) + ; + $audits ->setParam('event', 'storage.buckets.delete') ->setParam('resource', 'storage/buckets/' . $bucket->getId()) diff --git a/tests/e2e/Services/Webhooks/WebhooksBase.php b/tests/e2e/Services/Webhooks/WebhooksBase.php index 6ef535fe49..9d22230c02 100644 --- a/tests/e2e/Services/Webhooks/WebhooksBase.php +++ b/tests/e2e/Services/Webhooks/WebhooksBase.php @@ -627,4 +627,39 @@ trait WebhooksBase return array_merge(['bucketId' => $bucket['body']['$id']]); } + + /** + * @depends testCreateStorageBucket + */ + public function testDeleteStorageBucket(array $data) + { + $id = $data['bucketId']; + /** + * Test for SUCCESS + */ + $bucket = $this->client->call(Client::METHOD_DELETE, '/storage/buckets/' . $id, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ])); + + $this->assertEquals($bucket['headers']['status-code'], 204); + $this->assertEmpty($bucket['body']); + + $webhook = $this->getLastRequest(); + + $this->assertEquals($webhook['method'], 'POST'); + $this->assertEquals($webhook['headers']['Content-Type'], 'application/json'); + $this->assertEquals($webhook['headers']['User-Agent'], 'Appwrite-Server vdev. Please report abuse at security@appwrite.io'); + $this->assertEquals($webhook['headers']['X-Appwrite-Webhook-Event'], 'storage.buckets.delete'); + $this->assertEquals($webhook['headers']['X-Appwrite-Webhook-Signature'], 'not-yet-implemented'); + $this->assertEquals($webhook['headers']['X-Appwrite-Webhook-Id'] ?? '', $this->getProject()['webhookId']); + $this->assertEquals($webhook['headers']['X-Appwrite-Webhook-Project-Id'] ?? '', $this->getProject()['$id']); + $this->assertEquals(empty($webhook['headers']['X-Appwrite-Webhook-User-Id'] ?? ''), true); + $this->assertNotEmpty($webhook['data']['$id']); + $this->assertEquals('Test Bucket Updated', $webhook['data']['name']); + $this->assertEquals(false, $webhook['data']['enabled']); + $this->assertIsArray($webhook['data']['$read']); + $this->assertIsArray($webhook['data']['$write']); + } } \ No newline at end of file From abdbdeef3531382d23f783090f3493e5634bc578 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 17 Jun 2021 14:12:40 +0545 Subject: [PATCH 10/12] Update app/controllers/api/storage.php Co-authored-by: Eldad A. Fux --- app/controllers/api/storage.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index 0e200afdce..6dc883a1f0 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -219,7 +219,7 @@ App::delete('/v1/storage/buckets/:bucketId') $bucket = $dbForInternal->getDocument('buckets', $bucketId); - if (empty($bucket->getId())) { + if ($bucket->isEmpty()) { throw new Exception('Bucket not found', 404); } From 696b13388192be751418e469aa749c62c71610ce Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 17 Jun 2021 14:14:02 +0545 Subject: [PATCH 11/12] Update app/controllers/api/storage.php Co-authored-by: Eldad A. Fux --- app/controllers/api/storage.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index 6dc883a1f0..1c8d9d5021 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -166,7 +166,7 @@ App::put('/v1/storage/buckets/:bucketId') $bucket = $dbForInternal->getDocument('buckets', $bucketId); - if (empty($bucket->getId())) { + if ($bucket->isEmpty()) { throw new Exception('Bucket not found', 404); } From e530d633dc67b0f955e2de52e900287d947d6e38 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 17 Jun 2021 15:32:45 +0545 Subject: [PATCH 12/12] Update app/controllers/api/storage.php Co-authored-by: Torsten Dittmann --- app/controllers/api/storage.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index 1c8d9d5021..ed7034d805 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -170,8 +170,8 @@ App::put('/v1/storage/buckets/:bucketId') throw new Exception('Bucket not found', 404); } - $read = (is_null($read)) ? $bucket->getAttribute('$read', []) : $read; // By default inherit read permissions - $write = (is_null($write)) ? $bucket->getAttribute('$write',[]) : $write; // By default inherit write permissions + $read ??= $bucket->getAttribute('$read', []); // By default inherit read permissions + $write ??= $bucket->getAttribute('$write',[]); // By default inherit write permissions $bucket = $dbForInternal->updateDocument('buckets', $bucket->getId(), $bucket ->setAttribute('name',$name)