1
0
Fork 0
mirror of synced 2024-07-06 23:21:05 +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')));
// Queues
App::setResource('mails', fn() => new Mail());
App::setResource('messaging', fn() => new Phone());
App::setResource('queue', function (Group $pools) {
return $pools->get('queue')->pop()->getResource();
}, ['pools']);
App::setResource('mails', function (Connection $queue) {
return new Mail($queue);
}, ['queue']);
App::setResource('database', function (Connection $queue) {
return new EventDatabase($queue);
}, ['pools']);

View file

@ -5,26 +5,69 @@ use Appwrite\Template\Template;
use Utopia\App;
use Utopia\CLI\Console;
use Utopia\Database\Document;
use Utopia\Database\Validator\Authorization;
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
{
return "mails";
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
*/
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;
if (empty(App::getEnv('_APP_SMTP_HOST'))) {
@ -32,20 +75,19 @@ class MailsV1 extends Worker
return;
}
$project = new Document($this->args['project'] ?? []);
$user = new Document($this->args['user'] ?? []);
$team = new Document($this->args['team'] ?? []);
$payload = $this->args['payload'] ?? [];
$project = new Document($payload['project'] ?? []);
$user = new Document($payload['user'] ?? []);
$team = new Document($payload['team'] ?? []);
$recipient = $this->args['recipient'];
$url = $this->args['url'];
$name = $this->args['name'];
$type = $this->args['type'];
$prefix = $this->getPrefix($type);
$locale = new Locale($this->args['locale']);
$recipient = $payload['recipient'];
$url = $payload['url'];
$name = $payload['name'];
$type = $payload['type'];
$prefix = getPrefix($type);
$locale = new Locale($payload['locale']);
$projectName = $project->isEmpty() ? 'Console' : $project->getAttribute('name', '[APP-NAME]');
if (!$this->doesLocaleExist($locale, $prefix)) {
if (!doesLocaleExist($locale, $prefix)) {
$locale->setDefault('en');
}
@ -125,52 +167,7 @@ class MailsV1 extends Worker
} catch (\Exception $error) {
throw new Exception('Error sending mail: ' . $error->getMessage(), 500);
}
}
});
public function shutdown(): void
{
}
/**
* 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;
}
}
$server->workerStart();
$server->start();

View file

@ -4,6 +4,8 @@ namespace Appwrite\Event;
use Resque;
use Utopia\Database\Document;
use Utopia\Queue\Client;
use Utopia\Queue\Connection;
class Mail extends Event
{
@ -14,7 +16,7 @@ class Mail extends Event
protected string $locale = '';
protected ?Document $team = null;
public function __construct()
public function __construct(protected Connection $connection)
{
parent::__construct(Event::MAILS_QUEUE_NAME, Event::MAILS_CLASS_NAME);
}
@ -165,7 +167,11 @@ class Mail extends Event
*/
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,
'user' => $this->user,
'payload' => $this->payload,