diff --git a/app/config/roles.php b/app/config/roles.php
index a95b34d820..4bc85f7a28 100644
--- a/app/config/roles.php
+++ b/app/config/roles.php
@@ -22,6 +22,10 @@ $member = [
'execution.write',
'targets.read',
'targets.write',
+ 'providers.write',
+ 'providers.read',
+ 'messages.write',
+ 'messages.read'
];
$admins = [
@@ -57,6 +61,10 @@ $admins = [
'migrations.write',
'targets.read',
'targets.write',
+ 'providers.write',
+ 'providers.read',
+ 'messages.write',
+ 'messages.read'
];
return [
diff --git a/app/controllers/api/messaging.php b/app/controllers/api/messaging.php
index ba1d66b1ed..1ff95fbeea 100644
--- a/app/controllers/api/messaging.php
+++ b/app/controllers/api/messaging.php
@@ -70,7 +70,7 @@ App::get('/v1/messaging/providers/:id')
->param('id', null, new UID(), 'Provider ID.')
->inject('dbForProject')
->inject('response')
- ->action(function (string $id, Response $response, Database $dbForProject) {
+ ->action(function (string $id, Database $dbForProject, Response $response) {
$provider = $dbForProject->getDocument('providers', $id);
if ($provider->isEmpty()) {
@@ -86,7 +86,7 @@ App::get('/v1/messaging/providers/:id')
App::post('/v1/messaging/providers/mailgun')
->desc('Create Mailgun Provider')
->groups(['api', 'messaging'])
- ->label('event', 'messages.providers.create')
+ ->label('audits.event', 'messages.providers.create')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
->label('sdk.namespace', 'messaging')
@@ -118,7 +118,7 @@ App::post('/v1/messaging/providers/mailgun')
App::patch('/v1/messaging/providers/:id/mailgun')
->desc('Update Mailgun Provider')
->groups(['api', 'messaging'])
- ->label('event', 'messages.providers.update')
+ ->label('audits.event', 'messages.providers.update')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
->label('sdk.namespace', 'messaging')
@@ -166,14 +166,13 @@ App::patch('/v1/messaging/providers/:id/mailgun')
$dbForProject->deleteCachedDocument('providers', $provider->getId());
$response
- ->setStatusCode(Response::STATUS_CODE_CREATED)
->dynamic($provider, Response::MODEL_PROVIDER);
});
App::post('/v1/messaging/providers/sendgrid')
->desc('Create Sendgrid Provider')
->groups(['api', 'messaging'])
- ->label('event', 'messages.providers.create')
+ ->label('audits.event', 'messages.providers.create')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
->label('sdk.namespace', 'messaging')
@@ -203,7 +202,7 @@ App::post('/v1/messaging/providers/sendgrid')
App::patch('/v1/messaging/providers/:id/sendgrid')
->desc('Update Sendgrid Provider')
->groups(['api', 'messaging'])
- ->label('event', 'messages.providers.update')
+ ->label('audits.event', 'messages.providers.update')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
->label('sdk.namespace', 'messaging')
@@ -243,7 +242,6 @@ App::patch('/v1/messaging/providers/:id/sendgrid')
$dbForProject->deleteCachedDocument('providers', $provider->getId());
$response
- ->setStatusCode(Response::STATUS_CODE_CREATED)
->dynamic($provider, Response::MODEL_PROVIDER);
});
@@ -253,7 +251,7 @@ App::patch('/v1/messaging/providers/:id/sendgrid')
App::post('/v1/messaging/providers/msg91')
->desc('Create Msg91 Provider')
->groups(['api', 'messaging'])
- ->label('event', 'messages.providers.create')
+ ->label('audits.event', 'messages.providers.create')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
->label('sdk.namespace', 'messaging')
@@ -285,7 +283,7 @@ App::post('/v1/messaging/providers/msg91')
App::patch('/v1/messaging/providers/:id/msg91')
->desc('Update Msg91 Provider')
->groups(['api', 'messaging'])
- ->label('event', 'messages.providers.update')
+ ->label('audits.event', 'messages.providers.update')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
->label('sdk.namespace', 'messaging')
@@ -333,14 +331,13 @@ App::patch('/v1/messaging/providers/:id/msg91')
$dbForProject->deleteCachedDocument('providers', $provider->getId());
$response
- ->setStatusCode(Response::STATUS_CODE_CREATED)
->dynamic($provider, Response::MODEL_PROVIDER);
});
App::post('/v1/messaging/providers/telesign')
->desc('Create Telesign Provider')
->groups(['api', 'messaging'])
- ->label('event', 'messages.providers.create')
+ ->label('audits.event', 'messages.providers.create')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
->label('sdk.namespace', 'messaging')
@@ -372,7 +369,7 @@ App::post('/v1/messaging/providers/telesign')
App::patch('/v1/messaging/providers/:id/telesign')
->desc('Update Telesign Provider')
->groups(['api', 'messaging'])
- ->label('event', 'messages.providers.update')
+ ->label('audits.event', 'messages.providers.update')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
->label('sdk.namespace', 'messaging')
@@ -420,14 +417,13 @@ App::patch('/v1/messaging/providers/:id/telesign')
$dbForProject->deleteCachedDocument('providers', $provider->getId());
$response
- ->setStatusCode(Response::STATUS_CODE_CREATED)
->dynamic($provider, Response::MODEL_PROVIDER);
});
App::post('/v1/messaging/providers/textmagic')
->desc('Create Textmagic Provider')
->groups(['api', 'messaging'])
- ->label('event', 'messages.providers.create')
+ ->label('audits.event', 'messages.providers.create')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
->label('sdk.namespace', 'messaging')
@@ -459,7 +455,7 @@ App::post('/v1/messaging/providers/textmagic')
App::patch('/v1/messaging/providers/:id/textmagic')
->desc('Update Textmagic Provider')
->groups(['api', 'messaging'])
- ->label('event', 'messages.providers.update')
+ ->label('audits.event', 'messages.providers.update')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
->label('sdk.namespace', 'messaging')
@@ -507,14 +503,13 @@ App::patch('/v1/messaging/providers/:id/textmagic')
$dbForProject->deleteCachedDocument('providers', $provider->getId());
$response
- ->setStatusCode(Response::STATUS_CODE_CREATED)
->dynamic($provider, Response::MODEL_PROVIDER);
});
App::post('/v1/messaging/providers/twilio')
->desc('Create Twilio Provider')
->groups(['api', 'messaging'])
- ->label('event', 'messages.providers.create')
+ ->label('audits.event', 'messages.providers.create')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
->label('sdk.namespace', 'messaging')
@@ -546,7 +541,7 @@ App::post('/v1/messaging/providers/twilio')
App::patch('/v1/messaging/providers/:id/twilio')
->desc('Update Twilio Provider')
->groups(['api', 'messaging'])
- ->label('event', 'messages.providers.update')
+ ->label('audits.event', 'messages.providers.update')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
->label('sdk.namespace', 'messaging')
@@ -594,14 +589,13 @@ App::patch('/v1/messaging/providers/:id/twilio')
$dbForProject->deleteCachedDocument('providers', $provider->getId());
$response
- ->setStatusCode(Response::STATUS_CODE_CREATED)
->dynamic($provider, Response::MODEL_PROVIDER);
});
App::post('/v1/messaging/providers/vonage')
->desc('Create Vonage Provider')
->groups(['api', 'messaging'])
- ->label('event', 'messages.providers.create')
+ ->label('audits.event', 'messages.providers.create')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
->label('sdk.namespace', 'messaging')
@@ -633,7 +627,7 @@ App::post('/v1/messaging/providers/vonage')
App::patch('/v1/messaging/providers/:id/vonage')
->desc('Update Vonage Provider')
->groups(['api', 'messaging'])
- ->label('event', 'messages.providers.update')
+ ->label('audits.event', 'messages.providers.update')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
->label('sdk.namespace', 'messaging')
@@ -681,7 +675,6 @@ App::patch('/v1/messaging/providers/:id/vonage')
$dbForProject->deleteCachedDocument('providers', $provider->getId());
$response
- ->setStatusCode(Response::STATUS_CODE_CREATED)
->dynamic($provider, Response::MODEL_PROVIDER);
});
@@ -691,7 +684,7 @@ App::patch('/v1/messaging/providers/:id/vonage')
App::post('/v1/messaging/providers/fcm')
->desc('Create FCM Provider')
->groups(['api', 'messaging'])
- ->label('event', 'messages.providers.create')
+ ->label('audits.event', 'messages.providers.create')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
->label('sdk.namespace', 'messaging')
@@ -721,7 +714,7 @@ App::post('/v1/messaging/providers/fcm')
App::patch('/v1/messaging/providers/:id/fcm')
->desc('Update FCM Provider')
->groups(['api', 'messaging'])
- ->label('event', 'messages.providers.update')
+ ->label('audits.event', 'messages.providers.update')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
->label('sdk.namespace', 'messaging')
@@ -759,14 +752,13 @@ App::patch('/v1/messaging/providers/:id/fcm')
$dbForProject->deleteCachedDocument('providers', $provider->getId());
$response
- ->setStatusCode(Response::STATUS_CODE_CREATED)
->dynamic($provider, Response::MODEL_PROVIDER);
});
App::post('/v1/messaging/providers/apns')
->desc('Create APNS Provider')
->groups(['api', 'messaging'])
- ->label('event', 'messages.providers.create')
+ ->label('audits.event', 'messages.providers.create')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
->label('sdk.namespace', 'messaging')
@@ -804,7 +796,7 @@ App::post('/v1/messaging/providers/apns')
App::patch('/v1/messaging/providers/:id/apns')
->desc('Update APNS Provider')
->groups(['api', 'messaging'])
- ->label('event', 'messages.providers.update')
+ ->label('audits.event', 'messages.providers.update')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
->label('sdk.namespace', 'messaging')
@@ -858,27 +850,25 @@ App::patch('/v1/messaging/providers/:id/apns')
$dbForProject->deleteCachedDocument('providers', $provider->getId());
$response
- ->setStatusCode(Response::STATUS_CODE_CREATED)
->dynamic($provider, Response::MODEL_PROVIDER);
});
App::delete('/v1/messaging/providers/:id')
->desc('Delete Provider')
->groups(['api', 'messaging'])
- ->label('event', 'messages.providers.[id].delete')
+ ->label('audits.event', 'messages.providers.delete')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
->label('sdk.namespace', 'messaging')
->label('sdk.method', 'deleteProvider')
->label('sdk.description', '/docs/references/messaging/delete-provider.md')
- ->label('sdk.response.code', Response::STATUS_CODE_OK)
+ ->label('sdk.response.code', Response::STATUS_CODE_NOCONTENT)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_NONE)
->param('id', '', new UID(), 'Provider ID.')
- ->inject('response')
->inject('dbForProject')
- ->inject('events')
- ->action(function (string $id, Response $response, Database $dbForProject) {
+ ->inject('response')
+ ->action(function (string $id, Database $dbForProject, Response $response) {
$provider = $dbForProject->getDocument('providers', $id);
if ($provider->isEmpty()) {
@@ -894,7 +884,7 @@ App::delete('/v1/messaging/providers/:id')
App::post('/v1/messaging/messages/email')
->desc('Send an email.')
->groups(['api', 'messaging'])
- ->label('event', 'messages.create')
+ ->label('audits.event', 'messages.create')
->label('scope', 'messages.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
diff --git a/phpunit.xml b/phpunit.xml
index f83f9f0fae..cffe166336 100644
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -32,6 +32,7 @@
./tests/e2e/Services/Teams
./tests/e2e/Services/Users
./tests/e2e/Services/Webhooks
+ ./tests/e2e/Services/Messaging
./tests/e2e/Services/Functions/FunctionsBase.php
./tests/e2e/Services/Functions/FunctionsCustomServerTest.php
./tests/e2e/Services/Functions/FunctionsCustomClientTest.php
diff --git a/tests/e2e/Scopes/ProjectCustom.php b/tests/e2e/Scopes/ProjectCustom.php
index 1bd4de501c..ee41129fde 100644
--- a/tests/e2e/Scopes/ProjectCustom.php
+++ b/tests/e2e/Scopes/ProjectCustom.php
@@ -81,6 +81,10 @@ trait ProjectCustom
'locale.read',
'avatars.read',
'health.read',
+ 'providers.read',
+ 'providers.write',
+ 'messages.read',
+ 'messages.write',
],
]);
diff --git a/tests/e2e/Services/Messaging/MessagingServerTest.php b/tests/e2e/Services/Messaging/MessagingServerTest.php
new file mode 100644
index 0000000000..2547c8a756
--- /dev/null
+++ b/tests/e2e/Services/Messaging/MessagingServerTest.php
@@ -0,0 +1,187 @@
+ [
+ 'name' => 'Sengrid1',
+ 'apiKey' => 'my-apikey',
+ ],
+ 'mailgun' => [
+ 'name' => 'Mailgun1',
+ 'apiKey' => 'my-apikey',
+ 'domain' => 'my-domain',
+ ],
+ 'twilio' => [
+ 'name' => 'Twilio1',
+ 'accountSid' => 'my-accountSid',
+ 'authToken' => 'my-authToken',
+ ],
+ 'telesign' => [
+ 'name' => 'Telesign1',
+ 'username' => 'my-username',
+ 'password' => 'my-password',
+ ],
+ 'textmagic' => [
+ 'name' => 'Textmagic1',
+ 'username' => 'my-username',
+ 'apiKey' => 'my-apikey',
+ ],
+ 'msg91' => [
+ 'name' => 'Ms91-1',
+ 'senderId' => 'my-senderid',
+ 'authKey' => 'my-authkey',
+ ],
+ 'vonage' => [
+ 'name' => 'Vonage1',
+ 'apiKey' => 'my-apikey',
+ 'apiSecret' => 'my-apisecret',
+ ],
+ 'fcm' => [
+ 'name' => 'FCM1',
+ 'serverKey' => 'my-serverkey',
+ ],
+ 'apns' => [
+ 'name' => 'APNS1',
+ 'authKey' => 'my-authkey',
+ 'authKeyId' => 'my-authkeyid',
+ 'teamId' => 'my-teamid',
+ 'bundleId' => 'my-bundleid',
+ 'endpoint' => 'my-endpoint',
+ ],
+ ];
+ $providers = [];
+
+ foreach (\array_keys($providersParams) as $key) {
+ $response = $this->client->call(Client::METHOD_POST, '/messaging/providers/'.$key, [
+ 'content-type' => 'application/json',
+ 'x-appwrite-project' => $this->getProject()['$id'],
+ 'x-appwrite-key' => $this->getProject()['apiKey'],
+ ], $providersParams[$key]);
+ \array_push($providers, $response['body']);
+ $this->assertEquals(201, $response['headers']['status-code']);
+ $this->assertEquals($providersParams[$key]['name'], $response['body']['name']);
+ }
+
+ return $providers;
+ }
+
+ /**
+ * @depends testCreateProviders
+ */
+ public function testUpdateProviders(array $providers): array
+ {
+ $providersParams = [
+ 'sendgrid' => [
+ 'name' => 'Sengrid2',
+ 'apiKey' => 'my-apikey',
+ ],
+ 'mailgun' => [
+ 'name' => 'Mailgun2',
+ 'apiKey' => 'my-apikey',
+ 'domain' => 'my-domain',
+ ],
+ 'twilio' => [
+ 'name' => 'Twilio2',
+ 'accountSid' => 'my-accountSid',
+ 'authToken' => 'my-authToken',
+ ],
+ 'telesign' => [
+ 'name' => 'Telesign2',
+ 'username' => 'my-username',
+ 'password' => 'my-password',
+ ],
+ 'textmagic' => [
+ 'name' => 'Textmagic2',
+ 'username' => 'my-username',
+ 'apiKey' => 'my-apikey',
+ ],
+ 'msg91' => [
+ 'name' => 'Ms91-2',
+ 'senderId' => 'my-senderid',
+ 'authKey' => 'my-authkey',
+ ],
+ 'vonage' => [
+ 'name' => 'Vonage2',
+ 'apiKey' => 'my-apikey',
+ 'apiSecret' => 'my-apisecret',
+ ],
+ 'fcm' => [
+ 'name' => 'FCM2',
+ 'serverKey' => 'my-serverkey',
+ ],
+ 'apns' => [
+ 'name' => 'APNS2',
+ 'authKey' => 'my-authkey',
+ 'authKeyId' => 'my-authkeyid',
+ 'teamId' => 'my-teamid',
+ 'bundleId' => 'my-bundleid',
+ 'endpoint' => 'my-endpoint',
+ ],
+ ];
+ foreach (\array_keys($providersParams) as $index => $key) {
+ $response = $this->client->call(Client::METHOD_PATCH, '/messaging/providers/'. $providers[$index]['$id'] . '/' . $key, [
+ 'content-type' => 'application/json',
+ 'x-appwrite-project' => $this->getProject()['$id'],
+ 'x-appwrite-key' => $this->getProject()['apiKey'],
+ ], $providersParams[$key]);
+ $providers[$index] = $response['body'];
+ $this->assertEquals(200, $response['headers']['status-code']);
+ $this->assertEquals($providersParams[$key]['name'], $response['body']['name']);
+ }
+
+ return $providers;
+ }
+
+ /**
+ * @depends testUpdateProviders
+ */
+ public function testListProviders(array $providers) {
+ $response = $this->client->call(Client::METHOD_GET, '/messaging/providers/', [
+ 'content-type' => 'application/json',
+ 'x-appwrite-project' => $this->getProject()['$id'],
+ 'x-appwrite-key' => $this->getProject()['apiKey'],
+ ]);
+ $this->assertEquals(200, $response['headers']['status-code']);
+ $this->assertEquals(\count($providers), $response['body']['total']);
+ }
+
+ /**
+ * @depends testUpdateProviders
+ */
+ public function testGetProvider(array $providers) {
+ $response = $this->client->call(Client::METHOD_GET, '/messaging/providers/' .$providers[0]['$id'], [
+ 'content-type' => 'application/json',
+ 'x-appwrite-project' => $this->getProject()['$id'],
+ 'x-appwrite-key' => $this->getProject()['apiKey'],
+ ]);
+ $this->assertEquals(200, $response['headers']['status-code']);
+ $this->assertEquals($providers[0]['name'], $response['body']['name']);
+ }
+
+ /**
+ * @depends testUpdateProviders
+ */
+ public function testDeleteProvider(array $providers) {
+ foreach ($providers as $provider) {
+ $response = $this->client->call(Client::METHOD_DELETE, '/messaging/providers/'. $provider['$id'], [
+ 'content-type' => 'application/json',
+ 'x-appwrite-project' => $this->getProject()['$id'],
+ 'x-appwrite-key' => $this->getProject()['apiKey'],
+ ]);
+ $this->assertEquals(204, $response['headers']['status-code']);
+ }
+ }
+}