1
0
Fork 0
mirror of synced 2024-07-12 18:05:55 +12:00

Merge branch 'refactor-scheduler-emails' into refactor-schedulers-workers

This commit is contained in:
Bradley Schofield 2022-12-20 11:24:26 +00:00
commit 6f3a057608
3 changed files with 79 additions and 74 deletions

View file

@ -849,11 +849,13 @@ App::setResource('register', fn() => $register);
App::setResource('locale', fn() => new Locale(App::getEnv('_APP_LOCALE', 'en'))); App::setResource('locale', fn() => new Locale(App::getEnv('_APP_LOCALE', 'en')));
// Queues // Queues
App::setResource('mails', fn() => new Mail());
App::setResource('messaging', fn() => new Phone()); App::setResource('messaging', fn() => new Phone());
App::setResource('queue', function (Group $pools) { App::setResource('queue', function (Group $pools) {
return $pools->get('queue')->pop()->getResource(); return $pools->get('queue')->pop()->getResource();
}, ['pools']); }, ['pools']);
App::setResource('mails', function (Connection $queue) {
return new Mail($queue);
}, ['queue']);
App::setResource('database', function (Connection $queue) { App::setResource('database', function (Connection $queue) {
return new EventDatabase($queue); return new EventDatabase($queue);
}, ['pools']); }, ['pools']);

View file

@ -5,26 +5,69 @@ use Appwrite\Template\Template;
use Utopia\App; use Utopia\App;
use Utopia\CLI\Console; use Utopia\CLI\Console;
use Utopia\Database\Document; use Utopia\Database\Document;
use Utopia\Database\Validator\Authorization;
use Utopia\Locale\Locale; use Utopia\Locale\Locale;
use Utopia\Queue\Message;
use Utopia\Queue\Server;
require_once __DIR__ . '/../init.php'; require_once __DIR__ . '/../worker.php';
Console::title('Mails V1 Worker');
Console::success(APP_NAME . ' mails worker v1 has started' . "\n");
class MailsV1 extends Worker Authorization::disable();
Authorization::setDefaultStatus(false);
/*
* Returns a prefix from a mail type
*
* @param $type
*
* @return string
*/
function getPrefix(string $type): string
{ {
public function getName(): string switch ($type) {
{ case MAIL_TYPE_RECOVERY:
return "mails"; return 'emails.recovery';
case MAIL_TYPE_CERTIFICATE:
return 'emails.certificate';
case MAIL_TYPE_INVITATION:
return 'emails.invitation';
case MAIL_TYPE_VERIFICATION:
return 'emails.verification';
case MAIL_TYPE_MAGIC_SESSION:
return 'emails.magicSession';
default:
throw new Exception('Undefined Mail Type : ' . $type, 500);
}
}
/**
* Returns true if all the required terms in a locale exist. False otherwise
*
* @param $locale
* @param $prefix
*
* @return bool
*/
function doesLocaleExist(Locale $locale, string $prefix): bool
{
if (!$locale->getText('emails.sender') || !$locale->getText("$prefix.hello") || !$locale->getText("$prefix.subject") || !$locale->getText("$prefix.body") || !$locale->getText("$prefix.footer") || !$locale->getText("$prefix.thanks") || !$locale->getText("$prefix.signature")) {
return false;
} }
public function init(): void return true;
{ }
}
$server->job()
->inject('message')
->action(function (Message $message) {
$payload = $message->getPayload() ?? [];
if (empty($payload)) {
throw new Exception('Missing payload');
}
public function run(): void
{
global $register; global $register;
if (empty(App::getEnv('_APP_SMTP_HOST'))) { if (empty(App::getEnv('_APP_SMTP_HOST'))) {
@ -32,20 +75,19 @@ class MailsV1 extends Worker
return; return;
} }
$project = new Document($this->args['project'] ?? []); $project = new Document($payload['project'] ?? []);
$user = new Document($this->args['user'] ?? []); $user = new Document($payload['user'] ?? []);
$team = new Document($this->args['team'] ?? []); $team = new Document($payload['team'] ?? []);
$payload = $this->args['payload'] ?? [];
$recipient = $this->args['recipient']; $recipient = $payload['recipient'];
$url = $this->args['url']; $url = $payload['url'];
$name = $this->args['name']; $name = $payload['name'];
$type = $this->args['type']; $type = $payload['type'];
$prefix = $this->getPrefix($type); $prefix = getPrefix($type);
$locale = new Locale($this->args['locale']); $locale = new Locale($payload['locale']);
$projectName = $project->isEmpty() ? 'Console' : $project->getAttribute('name', '[APP-NAME]'); $projectName = $project->isEmpty() ? 'Console' : $project->getAttribute('name', '[APP-NAME]');
if (!$this->doesLocaleExist($locale, $prefix)) { if (!doesLocaleExist($locale, $prefix)) {
$locale->setDefault('en'); $locale->setDefault('en');
} }
@ -125,52 +167,7 @@ class MailsV1 extends Worker
} catch (\Exception $error) { } catch (\Exception $error) {
throw new Exception('Error sending mail: ' . $error->getMessage(), 500); throw new Exception('Error sending mail: ' . $error->getMessage(), 500);
} }
} });
public function shutdown(): void $server->workerStart();
{ $server->start();
}
/**
* Returns a prefix from a mail type
*
* @param $type
*
* @return string
*/
protected function getPrefix(string $type): string
{
switch ($type) {
case MAIL_TYPE_RECOVERY:
return 'emails.recovery';
case MAIL_TYPE_CERTIFICATE:
return 'emails.certificate';
case MAIL_TYPE_INVITATION:
return 'emails.invitation';
case MAIL_TYPE_VERIFICATION:
return 'emails.verification';
case MAIL_TYPE_MAGIC_SESSION:
return 'emails.magicSession';
default:
throw new Exception('Undefined Mail Type : ' . $type, 500);
}
}
/**
* Returns true if all the required terms in a locale exist. False otherwise
*
* @param $locale
* @param $prefix
*
* @return bool
*/
protected function doesLocaleExist(Locale $locale, string $prefix): bool
{
if (!$locale->getText('emails.sender') || !$locale->getText("$prefix.hello") || !$locale->getText("$prefix.subject") || !$locale->getText("$prefix.body") || !$locale->getText("$prefix.footer") || !$locale->getText("$prefix.thanks") || !$locale->getText("$prefix.signature")) {
return false;
}
return true;
}
}

View file

@ -4,6 +4,8 @@ namespace Appwrite\Event;
use Resque; use Resque;
use Utopia\Database\Document; use Utopia\Database\Document;
use Utopia\Queue\Client;
use Utopia\Queue\Connection;
class Mail extends Event class Mail extends Event
{ {
@ -14,7 +16,7 @@ class Mail extends Event
protected string $locale = ''; protected string $locale = '';
protected ?Document $team = null; protected ?Document $team = null;
public function __construct() public function __construct(protected Connection $connection)
{ {
parent::__construct(Event::MAILS_QUEUE_NAME, Event::MAILS_CLASS_NAME); parent::__construct(Event::MAILS_QUEUE_NAME, Event::MAILS_CLASS_NAME);
} }
@ -165,7 +167,11 @@ class Mail extends Event
*/ */
public function trigger(): string|bool public function trigger(): string|bool
{ {
return Resque::enqueue($this->queue, $this->class, [ $client = new Client($this->queue, $this->connection);
$events = $this->getEvent() ? Event::generateEvents($this->getEvent(), $this->getParams()) : null;
return $client->enqueue([
'project' => $this->project, 'project' => $this->project,
'user' => $this->user, 'user' => $this->user,
'payload' => $this->payload, 'payload' => $this->payload,