From 5588dfca8bc191064c26ac66d5881dc72b81fbaa Mon Sep 17 00:00:00 2001 From: Khushboo Verma <43381712+vermakhushboo@users.noreply.github.com> Date: Tue, 9 Jan 2024 01:25:24 +0530 Subject: [PATCH] WIP: Send email to user when webhook is stopped --- app/config/locale/translations/en.json | 6 +++ src/Appwrite/Platform/Workers/Webhooks.php | 48 ++++++++++++++++++++-- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/app/config/locale/translations/en.json b/app/config/locale/translations/en.json index 681c88ae94..59df64aba5 100644 --- a/app/config/locale/translations/en.json +++ b/app/config/locale/translations/en.json @@ -33,6 +33,12 @@ "emails.certificate.footer": "Your previous certificate will be valid for 30 days since the first failure. We highly recommend investigating this case, otherwise your domain will end up without a valid SSL communication.", "emails.certificate.thanks": "Thanks", "emails.certificate.signature": "{{project}} team", + "emails.webhook.subject": "Your webhook {{webhook}} has been stopped", + "emails.webhook.hello": "Hello {{user}}", + "emails.webhook.body": "Your webhook {{webhook}} on project {{project}} has been stopped after {{attempts}} consecutive failures.


Webhook endpoint: {{url}}


To restore the functionality of your webhook, please take the following steps:
1. Debug the webhook to identify and resolve the issue.
2. Re-enable the webhook from the project settings page.", + "emails.webhook.footer": "If you need any assistance, please reach out to our team on Discord.", + "emails.webhook.thanks": "Thanks", + "emails.webhook.signature": "{{project}} team", "locale.country.unknown": "Unknown", "countries.af": "Afghanistan", "countries.ao": "Angola", diff --git a/src/Appwrite/Platform/Workers/Webhooks.php b/src/Appwrite/Platform/Workers/Webhooks.php index 70440bdc9e..c54b05b718 100644 --- a/src/Appwrite/Platform/Workers/Webhooks.php +++ b/src/Appwrite/Platform/Workers/Webhooks.php @@ -2,10 +2,13 @@ namespace Appwrite\Platform\Workers; +use Appwrite\Event\Mail; +use Appwrite\Template\Template; use Exception; use Utopia\App; use Utopia\Database\Document; use Utopia\Database\Database; +use Utopia\Locale\Locale; use Utopia\Platform\Action; use Utopia\Queue\Message; @@ -28,16 +31,18 @@ class Webhooks extends Action ->desc('Webhooks worker') ->inject('message') ->inject('dbForConsole') - ->callback(fn ($message, Database $dbForConsole) => $this->action($message, $dbForConsole)); + ->inject('queueForMails') + ->callback(fn ($message, Database $dbForConsole, Mail $queueForMails) => $this->action($message, $dbForConsole, $queueForMails)); } /** * @param Message $message * @param Database $dbForConsole + * @param Mail $queueForMails * @return void * @throws Exception */ - public function action(Message $message, Database $dbForConsole): void + public function action(Message $message, Database $dbForConsole, Mail $queueForMails): void { $payload = $message->getPayload() ?? []; @@ -52,7 +57,7 @@ class Webhooks extends Action foreach ($project->getAttribute('webhooks', []) as $webhook) { if (array_intersect($webhook->getAttribute('events', []), $events)) { - $this->execute($events, $webhookPayload, $webhook, $user, $project, $dbForConsole); + $this->execute($events, $webhookPayload, $webhook, $user, $project, $dbForConsole, $queueForMails); } } @@ -68,9 +73,10 @@ class Webhooks extends Action * @param Document $user * @param Document $project * @param Database $dbForConsole + * @param Mail $queueForMails * @return void */ - private function execute(array $events, string $payload, Document $webhook, Document $user, Document $project, Database $dbForConsole): void + private function execute(array $events, string $payload, Document $webhook, Document $user, Document $project, Database $dbForConsole, Mail $queueForMails): void { if ($webhook->getAttribute('enabled') !== true) { return; @@ -146,6 +152,40 @@ class Webhooks extends Action if ($attempts >= self::MAX_FAILED_ATTEMPTS) { $webhook->setAttribute('enabled', false); + + // send an email to user + $locale = new Locale(App::getEnv('_APP_LOCALE', 'en')); + + if (!$locale->getText('emails.sender') || !$locale->getText("emails.webhook.hello") || !$locale->getText("emails.webhook.subject") || !$locale->getText("emails.webhook.body") || !$locale->getText("emails.webhook.footer") || !$locale->getText("emails.webhook.thanks") || !$locale->getText("emails.webhook.signature")) { + $locale->setDefault('en'); + } + + $subject = $locale->getText("emails.webhook.subject"); + + $message = Template::fromFile(__DIR__ . '/../../../../app/config/locale/templates/email-inner-base.tpl'); + $message + ->setParam('{{hello}}', $locale->getText("emails.webhook.hello")) + ->setParam('{{body}}', $locale->getText("emails.webhook.body")) + ->setParam('{{footer}}', $locale->getText("emails.webhook.footer")) + ->setParam('{{thanks}}', $locale->getText("emails.webhook.thanks")) + ->setParam('{{signature}}', $locale->getText("emails.webhook.signature")); + $body = $message->render(); + + $emailVariables = [ + 'user' => $user->getAttribute('name'), + 'project' => $project->getAttribute('name'), + 'redirect' => '', + 'webhook' => $webhook->getAttribute('name'), + 'attempts' => $attempts, + 'url' => $webhook->getAttribute('url'), + ]; + + $queueForMails + ->setSubject($subject) + ->setBody($body) + ->setVariables($emailVariables) + ->setRecipient($user->getAttribute('email')) + ->trigger(); } $dbForConsole->updateDocument('webhooks', $webhook->getId(), $webhook);