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);