From 4406c7bd554eedb63e764c03a01822ca1fd344e1 Mon Sep 17 00:00:00 2001 From: prateek banga Date: Mon, 21 Aug 2023 22:15:15 +0530 Subject: [PATCH] adds messaging worker and send an email controller --- app/controllers/api/messaging.php | 55 +++++++++++++- app/workers/messaging.php | 118 ++++++++++++++++++++---------- composer.json | 4 +- composer.lock | 67 ++++++++++------- 4 files changed, 175 insertions(+), 69 deletions(-) diff --git a/app/controllers/api/messaging.php b/app/controllers/api/messaging.php index 2f0c50348a..f5ee54c852 100644 --- a/app/controllers/api/messaging.php +++ b/app/controllers/api/messaging.php @@ -1,9 +1,13 @@ inject('dbForProject') ->inject('response') ->action(function (string $name, string $apiKey, string $domain, Database $dbForProject, Response $response) { - $provider = $dbForProject->getDocument('providers', '64e33e70dd07f0d03efb'); $provider = $dbForProject->createDocument('providers', new Document([ 'name' => $name, 'provider' => 'Mailgun', @@ -40,3 +43,53 @@ App::post('/v1/messaging/providers/mailgun') ->setStatusCode(Response::STATUS_CODE_CREATED) ->dynamic($provider, Response::MODEL_PROVIDER); }); + +App::post('/v1/messaging/messages/email') + ->desc('Send an email.') + ->groups(['api', 'messaging']) + ->label('event', 'messages.create') + ->label('scope', 'messages.write') + ->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY]) + ->label('sdk.namespace', 'messaging') + ->label('sdk.description', '/docs/references/messaging/send-email.md') + ->label('sdk.response.code', Response::STATUS_CODE_CREATED) + ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) + ->label('sdk.response.model', Response::MODEL_MESSAGE) + ->param('providerId', '', new Text(128), 'Email Provider ID.') + ->param('to', [], new ArrayList(new Text(0)), 'Email Recepient.', true) + ->param('subject', null, new Text(0), 'Email Subject.', true) + ->param('content', null, new Text(0), 'Email Content.', true) + ->param('from', null, new Text(0), 'Email from.', false) + ->param('html', null, new Text(0), 'Is content of type HTML', false) + ->param('deliveryTime', null, new Datetime(), 'Delivery time of the message', false) + ->inject('dbForProject') + ->inject('events') + ->inject('response') + ->action(function (string $providerId, string $to, string $subject, string $content, string $from, string $html, DateTime $deliveryTime, Database $dbForProject, Event $eventsInstance, Response $response) { + $provider = $dbForProject->getDocument('providers', $providerId); + + if ($provider->isEmpty()) { + throw new Exception(Exception::PROVIDER_NOT_FOUND); + } + + $message = $dbForProject->createDocument('messages', new Document([ + 'providerId' => $provider->getId(), + 'providerInternalId' => $provider->getInternalId(), + 'to' => $to, + 'data' => [ + 'subject' => $subject, + 'content' => $content, + ], + 'deliveryTime' => $deliveryTime, + 'deliveryError' => null, + 'deliveredTo' => null, + 'delivered' => false, + 'search' => null + ])); + + $eventsInstance->setParam('messageId', $message->getId()); + + $response + ->setStatusCode(Response::STATUS_CODE_CREATED) + ->dynamic($provider, Response::MODEL_MESSAGE); + }); diff --git a/app/workers/messaging.php b/app/workers/messaging.php index 5732c8c00b..3e730b120a 100644 --- a/app/workers/messaging.php +++ b/app/workers/messaging.php @@ -1,17 +1,23 @@ getAttribute('credentials'); + return match ($record->getAttribute('provider')) { + 'twilio' => new Twilio($credentials['accountSid'], $credentials['authToken']), + 'text-magic' => new TextMagic($credentials['username'], $credentials['apiKey']), + 'telesign' => new Telesign($credentials['username'], $credentials['password']), + 'msg91' => new Msg91($credentials['senderId'], $credentials['authKey']), + 'vonage' => new Vonage($credentials['apiKey'], $credentials['apiSecret']), + default => null + }; + } + + function push($record): ?PushAdapter + { + $credentials = $record->getAttribute('credentials'); + return match ($record->getAttribute('provider')) { + 'apns' => new APNS( + $credentials['authKey'], + $credentials['authKeyId'], + $credentials['teamId'], + $credentials['bundleId'], + $credentials['endpoint'] + ), + 'fcm' => new FCM($credentials['serverKey']), + default => null + }; + } + + public function email($record): ?EmailAdapter + { + $credentials = $record->getAttribute('credentials'); + return match ($record->getAttribute('provider')) { + 'mailgun' => new Mailgun($credentials['apiKey'], $credentials['domain']), + 'sendgrid' => new SendGrid($credentials['apiKey']), + default => null + }; + } + public function init(): void { - $dsn = new DSN(App::getEnv('_APP_SMS_PROVIDER')); - $user = $dsn->getUser(); - $secret = $dsn->getPassword(); - - $this->sms = match ($dsn->getHost()) { - 'mock' => new Mock($user, $secret), // used for tests - 'twilio' => new Twilio($user, $secret), - 'text-magic' => new TextMagic($user, $secret), - 'telesign' => new Telesign($user, $secret), - 'msg91' => new Msg91($user, $secret), - 'vonage' => new Vonage($user, $secret), - default => null - }; - - $this->from = App::getEnv('_APP_SMS_FROM'); } public function run(): void { - if (empty(App::getEnv('_APP_SMS_PROVIDER'))) { - Console::info('Skipped sms processing. No Phone provider has been set.'); - return; - } + $providerId = $this->args['providerId']; + $providerRecord = + $this + ->getConsoleDB() + ->getDocument('providers', $providerId); - if (empty($this->from)) { - Console::info('Skipped sms processing. No phone number has been set.'); - return; - } + $provider = match ($providerRecord->getAttribute('type')) {//stubbbbbbed. + 'sms' => $this->sms($providerRecord), + 'push' => $this->push($providerRecord), + 'email' => $this->email($providerRecord), + default => null + }; - $message = new SMS( - to: [$this->args['recipient']], - content: $this->args['message'], - from: $this->from, - ); + // Query for the provider + // switch on provider name + // call function passing needed credentials returns required provider. - try { - $this->sms->send($message); - } catch (\Exception $error) { - throw new Exception('Error sending message: ' . $error->getMessage(), 500); - } + $messageId = $this->args['messageId']; + $message = + $this + ->getConsoleDB() + ->getDocument('messages', $messageId); + + // Contrust Message Object according to each provider type. + // Send the message using respective adapter } - public function shutdown(): void + function shutdown(): void { } } diff --git a/composer.json b/composer.json index 2fd93cf510..e73d67b6a7 100644 --- a/composer.json +++ b/composer.json @@ -50,13 +50,13 @@ "utopia-php/cli": "0.15.*", "utopia-php/config": "0.2.*", "utopia-php/database": "0.42.*", - "utopia-php/domains": "1.1.*", + "utopia-php/domains": "0.3.*", "utopia-php/dsn": "0.1.*", "utopia-php/framework": "0.28.*", "utopia-php/image": "0.5.*", "utopia-php/locale": "0.4.*", "utopia-php/logger": "0.3.*", - "utopia-php/messaging": "0.1.*", + "utopia-php/messaging": "dev-feat-push as 0.1.1", "utopia-php/orchestration": "0.9.*", "utopia-php/platform": "0.4.*", "utopia-php/pools": "0.4.*", diff --git a/composer.lock b/composer.lock index cf6f442954..55e84a6e74 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2098172fc4b71eb0d41dcdbfea2f5061", + "content-hash": "d599591131c16b547bb7ad8c83a35482", "packages": [ { "name": "adhocore/jwt", @@ -1557,16 +1557,16 @@ }, { "name": "utopia-php/database", - "version": "0.42.1", + "version": "0.42.2", "source": { "type": "git", "url": "https://github.com/utopia-php/database.git", - "reference": "9ff69a9b9eadc581771798833d423829c9d8cc90" + "reference": "bc5ceb30c85fb685b0b5704d2f74886d813ebd41" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/database/zipball/9ff69a9b9eadc581771798833d423829c9d8cc90", - "reference": "9ff69a9b9eadc581771798833d423829c9d8cc90", + "url": "https://api.github.com/repos/utopia-php/database/zipball/bc5ceb30c85fb685b0b5704d2f74886d813ebd41", + "reference": "bc5ceb30c85fb685b0b5704d2f74886d813ebd41", "shasum": "" }, "require": { @@ -1607,29 +1607,31 @@ ], "support": { "issues": "https://github.com/utopia-php/database/issues", - "source": "https://github.com/utopia-php/database/tree/0.42.1" + "source": "https://github.com/utopia-php/database/tree/0.42.2" }, - "time": "2023-08-14T16:09:09+00:00" + "time": "2023-08-17T19:04:37+00:00" }, { "name": "utopia-php/domains", - "version": "v1.1.0", + "version": "0.3.2", "source": { "type": "git", "url": "https://github.com/utopia-php/domains.git", - "reference": "1665e1d9932afa3be63b5c1e0dcfe01fe77d8e73" + "reference": "aaa8c9a96c69ccb397997b1f4f2299c66f77eefb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/domains/zipball/1665e1d9932afa3be63b5c1e0dcfe01fe77d8e73", - "reference": "1665e1d9932afa3be63b5c1e0dcfe01fe77d8e73", + "url": "https://api.github.com/repos/utopia-php/domains/zipball/aaa8c9a96c69ccb397997b1f4f2299c66f77eefb", + "reference": "aaa8c9a96c69ccb397997b1f4f2299c66f77eefb", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.0", + "utopia-php/framework": "0.*.*" }, "require-dev": { - "phpunit/phpunit": "^7.0" + "laravel/pint": "1.2.*", + "phpunit/phpunit": "^9.3" }, "type": "library", "autoload": { @@ -1645,6 +1647,10 @@ { "name": "Eldad Fux", "email": "eldad@appwrite.io" + }, + { + "name": "Wess Cope", + "email": "wess@appwrite.io" } ], "description": "Utopia Domains library is simple and lite library for parsing web domains. This library is aiming to be as simple and easy to learn and use.", @@ -1661,9 +1667,9 @@ ], "support": { "issues": "https://github.com/utopia-php/domains/issues", - "source": "https://github.com/utopia-php/domains/tree/master" + "source": "https://github.com/utopia-php/domains/tree/0.3.2" }, - "time": "2020-02-23T07:40:02+00:00" + "time": "2023-07-19T16:39:24+00:00" }, { "name": "utopia-php/dsn", @@ -1915,16 +1921,16 @@ }, { "name": "utopia-php/messaging", - "version": "0.1.1", + "version": "dev-feat-push", "source": { "type": "git", "url": "https://github.com/utopia-php/messaging.git", - "reference": "a75d66ddd59b834ab500a4878a2c084e6572604a" + "reference": "5f85757316eb842e9169d318e234124ff252c404" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/messaging/zipball/a75d66ddd59b834ab500a4878a2c084e6572604a", - "reference": "a75d66ddd59b834ab500a4878a2c084e6572604a", + "url": "https://api.github.com/repos/utopia-php/messaging/zipball/5f85757316eb842e9169d318e234124ff252c404", + "reference": "5f85757316eb842e9169d318e234124ff252c404", "shasum": "" }, "require": { @@ -1933,8 +1939,8 @@ }, "require-dev": { "laravel/pint": "^1.2", - "phpmailer/phpmailer": "6.6.*", - "phpunit/phpunit": "9.5.*" + "phpmailer/phpmailer": "^6.8", + "phpunit/phpunit": "^9.6" }, "type": "library", "autoload": { @@ -1957,9 +1963,9 @@ ], "support": { "issues": "https://github.com/utopia-php/messaging/issues", - "source": "https://github.com/utopia-php/messaging/tree/0.1.1" + "source": "https://github.com/utopia-php/messaging/tree/feat-push" }, - "time": "2023-02-07T05:42:46+00:00" + "time": "2023-08-14T20:35:31+00:00" }, { "name": "utopia-php/migration", @@ -5351,9 +5357,18 @@ "time": "2023-07-26T07:16:09+00:00" } ], - "aliases": [], + "aliases": [ + { + "package": "utopia-php/messaging", + "version": "dev-feat-push", + "alias": "0.1.1", + "alias_normalized": "0.1.1.0" + } + ], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "utopia-php/messaging": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { @@ -5377,5 +5392,5 @@ "platform-overrides": { "php": "8.0" }, - "plugin-api-version": "2.2.0" + "plugin-api-version": "2.3.0" }