feat: messaging worker
This commit is contained in:
parent
dc25883685
commit
70c98b0cfc
|
@ -301,6 +301,7 @@ RUN chmod +x /usr/local/bin/doctor && \
|
||||||
chmod +x /usr/local/bin/worker-functions && \
|
chmod +x /usr/local/bin/worker-functions && \
|
||||||
chmod +x /usr/local/bin/worker-builds && \
|
chmod +x /usr/local/bin/worker-builds && \
|
||||||
chmod +x /usr/local/bin/worker-mails && \
|
chmod +x /usr/local/bin/worker-mails && \
|
||||||
|
chmod +x /usr/local/bin/worker-messaging && \
|
||||||
chmod +x /usr/local/bin/worker-webhooks
|
chmod +x /usr/local/bin/worker-webhooks
|
||||||
|
|
||||||
# Letsencrypt Permissions
|
# Letsencrypt Permissions
|
||||||
|
|
|
@ -21,6 +21,7 @@ use Appwrite\Utopia\Database\Validator\CustomId;
|
||||||
use MaxMind\Db\Reader;
|
use MaxMind\Db\Reader;
|
||||||
use Utopia\App;
|
use Utopia\App;
|
||||||
use Appwrite\Event\Audit;
|
use Appwrite\Event\Audit;
|
||||||
|
use Appwrite\Event\Phone as EventPhone;
|
||||||
use Utopia\Audit\Audit as EventAudit;
|
use Utopia\Audit\Audit as EventAudit;
|
||||||
use Utopia\Config\Config;
|
use Utopia\Config\Config;
|
||||||
use Utopia\Database\Database;
|
use Utopia\Database\Database;
|
||||||
|
@ -848,8 +849,9 @@ App::post('/v1/account/sessions/phone')
|
||||||
->inject('dbForProject')
|
->inject('dbForProject')
|
||||||
->inject('audits')
|
->inject('audits')
|
||||||
->inject('events')
|
->inject('events')
|
||||||
|
->inject('messaging')
|
||||||
->inject('phone')
|
->inject('phone')
|
||||||
->action(function (string $userId, string $number, Request $request, Response $response, Document $project, Database $dbForProject, Audit $audits, Event $events, Phone $phone) {
|
->action(function (string $userId, string $number, Request $request, Response $response, Document $project, Database $dbForProject, Audit $audits, Event $events, EventPhone $messaging, Phone $phone) {
|
||||||
if (empty(App::getEnv('_APP_PHONE_PROVIDER'))) {
|
if (empty(App::getEnv('_APP_PHONE_PROVIDER'))) {
|
||||||
throw new Exception('Phone Disabled', 503, Exception::GENERAL_SMTP_DISABLED);
|
throw new Exception('Phone Disabled', 503, Exception::GENERAL_SMTP_DISABLED);
|
||||||
}
|
}
|
||||||
|
@ -916,7 +918,10 @@ App::post('/v1/account/sessions/phone')
|
||||||
|
|
||||||
$dbForProject->deleteCachedDocument('users', $user->getId());
|
$dbForProject->deleteCachedDocument('users', $user->getId());
|
||||||
|
|
||||||
$phone->send(APP::getEnv('_APP_PHONE_FROM'), $number, $secret);
|
$messaging
|
||||||
|
->setRecipient($number)
|
||||||
|
->setMessage($secret)
|
||||||
|
->trigger();
|
||||||
|
|
||||||
$events->setPayload(
|
$events->setPayload(
|
||||||
$response->output(
|
$response->output(
|
||||||
|
@ -2245,7 +2250,8 @@ App::post('/v1/account/verification/phone')
|
||||||
->inject('audits')
|
->inject('audits')
|
||||||
->inject('events')
|
->inject('events')
|
||||||
->inject('usage')
|
->inject('usage')
|
||||||
->action(function (Request $request, Response $response, Phone $phone, Document $user, Database $dbForProject, Audit $audits, Event $events, Stats $usage) {
|
->inject('messaging')
|
||||||
|
->action(function (Request $request, Response $response, Phone $phone, Document $user, Database $dbForProject, Audit $audits, Event $events, Stats $usage, EventPhone $messaging) {
|
||||||
|
|
||||||
if (empty(App::getEnv('_APP_SMTP_HOST'))) {
|
if (empty(App::getEnv('_APP_SMTP_HOST'))) {
|
||||||
throw new Exception('SMTP Disabled', 503, Exception::GENERAL_SMTP_DISABLED);
|
throw new Exception('SMTP Disabled', 503, Exception::GENERAL_SMTP_DISABLED);
|
||||||
|
@ -2282,7 +2288,9 @@ App::post('/v1/account/verification/phone')
|
||||||
|
|
||||||
$dbForProject->deleteCachedDocument('users', $user->getId());
|
$dbForProject->deleteCachedDocument('users', $user->getId());
|
||||||
|
|
||||||
$phone->send(APP::getEnv('_APP_PHONE_FROM'), $user->getAttribute('phone'), $secret);
|
$messaging
|
||||||
|
->setRecipient($user->getAttribute('phone'))
|
||||||
|
->setMessage($secret);
|
||||||
|
|
||||||
$events
|
$events
|
||||||
->setParam('userId', $user->getId())
|
->setParam('userId', $user->getId())
|
||||||
|
|
|
@ -32,6 +32,7 @@ use Appwrite\Event\Database as EventDatabase;
|
||||||
use Appwrite\Event\Delete;
|
use Appwrite\Event\Delete;
|
||||||
use Appwrite\Event\Event;
|
use Appwrite\Event\Event;
|
||||||
use Appwrite\Event\Mail;
|
use Appwrite\Event\Mail;
|
||||||
|
use Appwrite\Event\Phone;
|
||||||
use Appwrite\Network\Validator\Email;
|
use Appwrite\Network\Validator\Email;
|
||||||
use Appwrite\Network\Validator\IP;
|
use Appwrite\Network\Validator\IP;
|
||||||
use Appwrite\Network\Validator\URL;
|
use Appwrite\Network\Validator\URL;
|
||||||
|
@ -691,6 +692,7 @@ App::setResource('audits', fn() => new Audit());
|
||||||
App::setResource('mails', fn() => new Mail());
|
App::setResource('mails', fn() => new Mail());
|
||||||
App::setResource('deletes', fn() => new Delete());
|
App::setResource('deletes', fn() => new Delete());
|
||||||
App::setResource('database', fn() => new EventDatabase());
|
App::setResource('database', fn() => new EventDatabase());
|
||||||
|
App::setResource('messaging', fn() => new Phone());
|
||||||
App::setResource('usage', function ($register) {
|
App::setResource('usage', function ($register) {
|
||||||
return new Stats($register->get('statsd'));
|
return new Stats($register->get('statsd'));
|
||||||
}, ['register']);
|
}, ['register']);
|
||||||
|
|
68
app/workers/messaging.php
Normal file
68
app/workers/messaging.php
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Appwrite\Auth\Phone;
|
||||||
|
use Appwrite\Auth\Phone\{
|
||||||
|
Mock,
|
||||||
|
Telesign,
|
||||||
|
TextMagic,
|
||||||
|
Twilio
|
||||||
|
};
|
||||||
|
use Appwrite\Resque\Worker;
|
||||||
|
use Appwrite\Template\Template;
|
||||||
|
use Utopia\App;
|
||||||
|
use Utopia\CLI\Console;
|
||||||
|
use Utopia\Database\Document;
|
||||||
|
use Utopia\Locale\Locale;
|
||||||
|
|
||||||
|
require_once __DIR__ . '/../init.php';
|
||||||
|
|
||||||
|
Console::title('Messaging V1 Worker');
|
||||||
|
Console::success(APP_NAME . ' messaging worker v1 has started' . "\n");
|
||||||
|
|
||||||
|
class MessagingV1 extends Worker
|
||||||
|
{
|
||||||
|
protected ?Phone $phone = null;
|
||||||
|
protected ?string $from = null;
|
||||||
|
|
||||||
|
public function getName(): string
|
||||||
|
{
|
||||||
|
return "mails";
|
||||||
|
}
|
||||||
|
|
||||||
|
public function init(): void
|
||||||
|
{
|
||||||
|
$provider = App::getEnv('_APP_PHONE_PROVIDER');
|
||||||
|
$user = App::getEnv('_APP_PHONE_USER');
|
||||||
|
$secret = App::getEnv('_APP_PHONE_SECRET');
|
||||||
|
|
||||||
|
$this->from = App::getEnv('_APP_PHONE_FROM');
|
||||||
|
$this->phone = match ($provider) {
|
||||||
|
'mock' => new Mock('', ''), // used for tests
|
||||||
|
'twilio' => new Twilio($user, $secret),
|
||||||
|
'text-magic' => new TextMagic($user, $secret),
|
||||||
|
'telesign' => new Telesign($user, $secret),
|
||||||
|
default => null
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public function run(): void
|
||||||
|
{
|
||||||
|
if (empty(App::getEnv('_APP_PHONE_PROVIDER'))) {
|
||||||
|
Console::info('Skipped sms processing. No Phone provider has been set.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$recipient = $this->args['recipient'];
|
||||||
|
$message = $this->args['message'];
|
||||||
|
|
||||||
|
try {
|
||||||
|
$this->phone->send($this->from, $recipient, $message);
|
||||||
|
} catch (\Exception $error) {
|
||||||
|
throw new Exception('Error sending message: ' . $error->getMessage(), 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function shutdown(): void
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
10
bin/worker-messaging
Normal file
10
bin/worker-messaging
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
if [ -z "$_APP_REDIS_USER" ] && [ -z "$_APP_REDIS_PASS" ]
|
||||||
|
then
|
||||||
|
REDIS_BACKEND="${_APP_REDIS_HOST}:${_APP_REDIS_PORT}"
|
||||||
|
else
|
||||||
|
REDIS_BACKEND="redis://${_APP_REDIS_USER}:${_APP_REDIS_PASS}@${_APP_REDIS_HOST}:${_APP_REDIS_PORT}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
INTERVAL=1 QUEUE='v1-messaging' APP_INCLUDE='/usr/src/code/app/workers/messaging.php' php /usr/src/code/vendor/bin/resque -dopcache.preload=opcache.preload=/usr/src/code/app/preload.php
|
|
@ -528,6 +528,32 @@ services:
|
||||||
- _APP_LOGGING_PROVIDER
|
- _APP_LOGGING_PROVIDER
|
||||||
- _APP_LOGGING_CONFIG
|
- _APP_LOGGING_CONFIG
|
||||||
|
|
||||||
|
appwrite-worker-messaging:
|
||||||
|
entrypoint: worker-messaging
|
||||||
|
<<: *x-logging
|
||||||
|
container_name: appwrite-worker-messaging
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
networks:
|
||||||
|
- appwrite
|
||||||
|
volumes:
|
||||||
|
- ./app:/usr/src/code/app
|
||||||
|
- ./src:/usr/src/code/src
|
||||||
|
depends_on:
|
||||||
|
- redis
|
||||||
|
environment:
|
||||||
|
- _APP_ENV
|
||||||
|
- _APP_REDIS_HOST
|
||||||
|
- _APP_REDIS_PORT
|
||||||
|
- _APP_REDIS_USER
|
||||||
|
- _APP_REDIS_PASS
|
||||||
|
- _APP_PHONE_PROVIDER
|
||||||
|
- _APP_PHONE_USER
|
||||||
|
- _APP_PHONE_SECRET
|
||||||
|
- _APP_PHONE_FROM
|
||||||
|
- _APP_LOGGING_PROVIDER
|
||||||
|
- _APP_LOGGING_CONFIG
|
||||||
|
|
||||||
appwrite-maintenance:
|
appwrite-maintenance:
|
||||||
entrypoint: maintenance
|
entrypoint: maintenance
|
||||||
<<: *x-logging
|
<<: *x-logging
|
||||||
|
|
|
@ -32,6 +32,9 @@ class Event
|
||||||
public const BUILDS_QUEUE_NAME = 'v1-builds';
|
public const BUILDS_QUEUE_NAME = 'v1-builds';
|
||||||
public const BUILDS_CLASS_NAME = 'BuildsV1';
|
public const BUILDS_CLASS_NAME = 'BuildsV1';
|
||||||
|
|
||||||
|
public const MESSAGING_QUEUE_NAME = 'v1-messaging';
|
||||||
|
public const MESSAGING_CLASS_NAME = 'MessagingV1';
|
||||||
|
|
||||||
protected string $queue = '';
|
protected string $queue = '';
|
||||||
protected string $class = '';
|
protected string $class = '';
|
||||||
protected string $event = '';
|
protected string $event = '';
|
||||||
|
|
80
src/Appwrite/Event/Phone.php
Normal file
80
src/Appwrite/Event/Phone.php
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Appwrite\Event;
|
||||||
|
|
||||||
|
use Resque;
|
||||||
|
|
||||||
|
class Phone extends Event
|
||||||
|
{
|
||||||
|
protected string $recipient = '';
|
||||||
|
protected string $message = '';
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct(Event::MESSAGING_QUEUE_NAME, Event::MESSAGING_CLASS_NAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets recipient for the messaging event.
|
||||||
|
*
|
||||||
|
* @param string $recipient
|
||||||
|
* @return self
|
||||||
|
*/
|
||||||
|
public function setRecipient(string $recipient): self
|
||||||
|
{
|
||||||
|
$this->recipient = $recipient;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns set recipient for this messaging event.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getRecipient(): string
|
||||||
|
{
|
||||||
|
return $this->recipient;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets url for the messaging event.
|
||||||
|
*
|
||||||
|
* @param string $message
|
||||||
|
* @return self
|
||||||
|
*/
|
||||||
|
public function setMessage(string $message): self
|
||||||
|
{
|
||||||
|
$this->message = $message;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns set url for the messaging event.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getMessage(): string
|
||||||
|
{
|
||||||
|
return $this->message;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Executes the event and sends it to the messaging worker.
|
||||||
|
*
|
||||||
|
* @return string|bool
|
||||||
|
* @throws \InvalidArgumentException
|
||||||
|
*/
|
||||||
|
public function trigger(): string|bool
|
||||||
|
{
|
||||||
|
return Resque::enqueue($this->queue, $this->class, [
|
||||||
|
'project' => $this->project,
|
||||||
|
'user' => $this->user,
|
||||||
|
'payload' => $this->payload,
|
||||||
|
'recipient' => $this->recipient,
|
||||||
|
'message' => $this->message,
|
||||||
|
'events' => Event::generateEvents($this->getEvent(), $this->getParams())
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue