Add SMTP provider
This commit is contained in:
parent
79c324527e
commit
d9f53cacfa
6 changed files with 301 additions and 45 deletions
|
@ -35,6 +35,7 @@ use Utopia\Validator\ArrayList;
|
||||||
use Utopia\Validator\Boolean;
|
use Utopia\Validator\Boolean;
|
||||||
use Utopia\Validator\Integer;
|
use Utopia\Validator\Integer;
|
||||||
use Utopia\Validator\JSON;
|
use Utopia\Validator\JSON;
|
||||||
|
use Utopia\Validator\Range;
|
||||||
use Utopia\Validator\Text;
|
use Utopia\Validator\Text;
|
||||||
use MaxMind\Db\Reader;
|
use MaxMind\Db\Reader;
|
||||||
use Utopia\Database\DateTime;
|
use Utopia\Database\DateTime;
|
||||||
|
@ -61,30 +62,20 @@ App::post('/v1/messaging/providers/mailgun')
|
||||||
->param('apiKey', '', new Text(0), 'Mailgun API Key.', true)
|
->param('apiKey', '', new Text(0), 'Mailgun API Key.', true)
|
||||||
->param('domain', '', new Text(0), 'Mailgun Domain.', true)
|
->param('domain', '', new Text(0), 'Mailgun Domain.', true)
|
||||||
->param('isEuRegion', null, new Boolean(), 'Set as EU region.', true)
|
->param('isEuRegion', null, new Boolean(), 'Set as EU region.', true)
|
||||||
->param('enabled', null, new Boolean(), 'Set as enabled.', true)
|
|
||||||
->param('fromName', '', new Text(128, 0), 'Sender Name.', true)
|
->param('fromName', '', new Text(128, 0), 'Sender Name.', true)
|
||||||
->param('fromEmail', '', new Email(), 'Sender email address.', true)
|
->param('fromEmail', '', new Email(), 'Sender email address.', true)
|
||||||
->param('replyToName', '', new Text(128, 0), 'Name set in the reply to field for the mail. Default value is sender name. Reply to name must have reply to email as well.', true)
|
->param('replyToName', '', new Text(128, 0), 'Name set in the reply to field for the mail. Default value is sender name. Reply to name must have reply to email as well.', true)
|
||||||
->param('replyToEmail', '', new Email(), 'Email set in the reply to field for the mail. Default value is sender email. Reply to email must have reply to name as well.', true)
|
->param('replyToEmail', '', new Email(), 'Email set in the reply to field for the mail. Default value is sender email. Reply to email must have reply to name as well.', true)
|
||||||
|
->param('enabled', null, new Boolean(), 'Set as enabled.', true)
|
||||||
->inject('queueForEvents')
|
->inject('queueForEvents')
|
||||||
->inject('dbForProject')
|
->inject('dbForProject')
|
||||||
->inject('response')
|
->inject('response')
|
||||||
->action(function (string $providerId, string $name, string $apiKey, string $domain, ?bool $isEuRegion, ?bool $enabled, string $fromName, string $fromEmail, string $replyToName, string $replyToEmail, Event $queueForEvents, Database $dbForProject, Response $response) {
|
->action(function (string $providerId, string $name, string $apiKey, string $domain, ?bool $isEuRegion, ?bool $enabled, string $fromName, string $fromEmail, string $replyToName, string $replyToEmail, Event $queueForEvents, Database $dbForProject, Response $response) {
|
||||||
$providerId = $providerId == 'unique()' ? ID::unique() : $providerId;
|
$providerId = $providerId == 'unique()' ? ID::unique() : $providerId;
|
||||||
|
|
||||||
$options = [
|
|
||||||
'fromName' => $fromName,
|
|
||||||
'fromEmail' => $fromEmail,
|
|
||||||
];
|
|
||||||
|
|
||||||
if (!empty($replyToName) && !empty($replyToEmail)) {
|
|
||||||
$options['replyToName'] = $replyToName;
|
|
||||||
$options['replyToEmail'] = $replyToEmail;
|
|
||||||
}
|
|
||||||
|
|
||||||
$credentials = [];
|
$credentials = [];
|
||||||
|
|
||||||
if ($isEuRegion === true || $isEuRegion === false) {
|
if (!\is_null($isEuRegion)) {
|
||||||
$credentials['isEuRegion'] = $isEuRegion;
|
$credentials['isEuRegion'] = $isEuRegion;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,12 +87,19 @@ App::post('/v1/messaging/providers/mailgun')
|
||||||
$credentials['domain'] = $domain;
|
$credentials['domain'] = $domain;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$options = [
|
||||||
|
'fromName' => $fromName,
|
||||||
|
'fromEmail' => $fromEmail,
|
||||||
|
'replyToName' => $replyToName,
|
||||||
|
'replyToEmail' => $replyToEmail,
|
||||||
|
];
|
||||||
|
|
||||||
if (
|
if (
|
||||||
$enabled === true &&
|
$enabled === true
|
||||||
\array_key_exists('isEuRegion', $credentials) &&
|
&& !empty($fromName)
|
||||||
\array_key_exists('apiKey', $credentials) &&
|
&& \array_key_exists('isEuRegion', $credentials)
|
||||||
\array_key_exists('domain', $credentials) &&
|
&& \array_key_exists('apiKey', $credentials)
|
||||||
\array_key_exists('fromEmail', $options)
|
&& \array_key_exists('domain', $credentials)
|
||||||
) {
|
) {
|
||||||
$enabled = true;
|
$enabled = true;
|
||||||
} else {
|
} else {
|
||||||
|
@ -149,11 +147,11 @@ App::post('/v1/messaging/providers/sendgrid')
|
||||||
->param('providerId', '', new CustomId(), 'Provider ID. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can\'t start with a special char. Max length is 36 chars.')
|
->param('providerId', '', new CustomId(), 'Provider ID. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can\'t start with a special char. Max length is 36 chars.')
|
||||||
->param('name', '', new Text(128), 'Provider name.')
|
->param('name', '', new Text(128), 'Provider name.')
|
||||||
->param('apiKey', '', new Text(0), 'Sendgrid API key.', true)
|
->param('apiKey', '', new Text(0), 'Sendgrid API key.', true)
|
||||||
->param('enabled', null, new Boolean(), 'Set as enabled.', true)
|
|
||||||
->param('fromName', '', new Text(128, 0), 'Sender Name.', true)
|
->param('fromName', '', new Text(128, 0), 'Sender Name.', true)
|
||||||
->param('fromEmail', '', new Email(), 'Sender email address.', true)
|
->param('fromEmail', '', new Email(), 'Sender email address.', true)
|
||||||
->param('replyToName', '', new Text(128, 0), 'Name set in the reply to field for the mail. Default value is sender name.', true)
|
->param('replyToName', '', new Text(128, 0), 'Name set in the reply to field for the mail. Default value is sender name.', true)
|
||||||
->param('replyToEmail', '', new Email(), 'Email set in the reply to field for the mail. Default value is sender email.', true)
|
->param('replyToEmail', '', new Email(), 'Email set in the reply to field for the mail. Default value is sender email.', true)
|
||||||
|
->param('enabled', null, new Boolean(), 'Set as enabled.', true)
|
||||||
->inject('queueForEvents')
|
->inject('queueForEvents')
|
||||||
->inject('dbForProject')
|
->inject('dbForProject')
|
||||||
->inject('response')
|
->inject('response')
|
||||||
|
@ -163,13 +161,10 @@ App::post('/v1/messaging/providers/sendgrid')
|
||||||
$options = [
|
$options = [
|
||||||
'fromName' => $fromName,
|
'fromName' => $fromName,
|
||||||
'fromEmail' => $fromEmail,
|
'fromEmail' => $fromEmail,
|
||||||
|
'replyToName' => $replyToName,
|
||||||
|
'replyToEmail' => $replyToEmail,
|
||||||
];
|
];
|
||||||
|
|
||||||
if (!empty($replyToName) && !empty($replyToEmail)) {
|
|
||||||
$options['replyToName'] = $replyToName;
|
|
||||||
$options['replyToEmail'] = $replyToEmail;
|
|
||||||
}
|
|
||||||
|
|
||||||
$credentials = [];
|
$credentials = [];
|
||||||
|
|
||||||
if (!empty($apiKey)) {
|
if (!empty($apiKey)) {
|
||||||
|
@ -178,6 +173,7 @@ App::post('/v1/messaging/providers/sendgrid')
|
||||||
|
|
||||||
if (
|
if (
|
||||||
$enabled === true
|
$enabled === true
|
||||||
|
&& !empty($fromEmail)
|
||||||
&& \array_key_exists('apiKey', $credentials)
|
&& \array_key_exists('apiKey', $credentials)
|
||||||
&& \array_key_exists('fromEmail', $options)
|
&& \array_key_exists('fromEmail', $options)
|
||||||
) {
|
) {
|
||||||
|
@ -210,6 +206,101 @@ App::post('/v1/messaging/providers/sendgrid')
|
||||||
->dynamic($provider, Response::MODEL_PROVIDER);
|
->dynamic($provider, Response::MODEL_PROVIDER);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
App::post('/v1/messaging/providers/smtp')
|
||||||
|
->desc('Create SMTP provider')
|
||||||
|
->groups(['api', 'messaging'])
|
||||||
|
->label('audits.event', 'provider.create')
|
||||||
|
->label('audits.resource', 'provider/{response.$id}')
|
||||||
|
->label('event', 'providers.[providerId].create')
|
||||||
|
->label('scope', 'providers.write')
|
||||||
|
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
|
||||||
|
->label('sdk.namespace', 'messaging')
|
||||||
|
->label('sdk.method', 'createSMTPProvider')
|
||||||
|
->label('sdk.description', '/docs/references/messaging/create-smtp-provider.md')
|
||||||
|
->label('sdk.response.code', Response::STATUS_CODE_CREATED)
|
||||||
|
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
|
||||||
|
->label('sdk.response.model', Response::MODEL_PROVIDER)
|
||||||
|
->param('providerId', '', new CustomId(), 'Provider ID. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can\'t start with a special char. Max length is 36 chars.')
|
||||||
|
->param('name', '', new Text(128), 'Provider name.')
|
||||||
|
->param('host', '', new Text(0), 'SMTP hosts. Either a single hostname or multiple semicolon-delimited hostnames. You can also specify a different port for each host by using this format: [hostname:port] (e.g. "smtp1.example.com:25;smtp2.example.com"). You can also specify encryption type, for example: (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465"). Hosts will be tried in order.')
|
||||||
|
->param('port', 587, new Range(1, 65535), 'The default SMTP server port.', true)
|
||||||
|
->param('username', '', new Text(0), 'Authentication username.', true)
|
||||||
|
->param('password', '', new Text(0), 'Authentication password.', true)
|
||||||
|
->param('encryption', 'tls', new WhiteList(['ssl', 'tls']), 'Encryption type. Can be \'ssl\' or \'tls\'', true)
|
||||||
|
->param('autoTLS', true, new Boolean(), 'Enable SMTP AutoTLS feature.', true)
|
||||||
|
->param('mailer', '', new Text(0), 'The value to use for the X-Mailer header.', true)
|
||||||
|
->param('fromName', '', new Text(128, 0), 'Sender Name.', true)
|
||||||
|
->param('fromEmail', '', new Email(), 'Sender email address.', true)
|
||||||
|
->param('replyToName', '', new Text(128, 0), 'Name set in the reply to field for the mail. Default value is sender name.', true)
|
||||||
|
->param('replyToEmail', '', new Email(), 'Email set in the reply to field for the mail. Default value is sender email.', true)
|
||||||
|
->param('enabled', null, new Boolean(), 'Set as enabled.', true)
|
||||||
|
->inject('queueForEvents')
|
||||||
|
->inject('dbForProject')
|
||||||
|
->inject('response')
|
||||||
|
->action(function (string $providerId, string $name, string $host, int $port, string $username, string $password, string $encryption, bool $autoTLS, string $mailer, ?bool $enabled, string $fromName, string $fromEmail, string $replyToName, string $replyToEmail, Event $queueForEvents, Database $dbForProject, Response $response) {
|
||||||
|
$providerId = $providerId == 'unique()' ? ID::unique() : $providerId;
|
||||||
|
|
||||||
|
$credentials = [];
|
||||||
|
|
||||||
|
if (!empty($host)) {
|
||||||
|
$credentials['host'] = $host;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($port)) {
|
||||||
|
$credentials['port'] = $port;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($username)) {
|
||||||
|
$credentials['username'] = $username;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($password)) {
|
||||||
|
$credentials['password'] = $password;
|
||||||
|
}
|
||||||
|
|
||||||
|
$options = [
|
||||||
|
'fromName' => $fromName,
|
||||||
|
'fromEmail' => $fromEmail,
|
||||||
|
'replyToName' => $replyToName,
|
||||||
|
'replyToEmail' => $replyToEmail,
|
||||||
|
'encryption' => $encryption,
|
||||||
|
'autoTLS' => $autoTLS,
|
||||||
|
'mailer' => $mailer,
|
||||||
|
];
|
||||||
|
|
||||||
|
if (
|
||||||
|
$enabled === true
|
||||||
|
&& \array_key_exists('host', $credentials)
|
||||||
|
) {
|
||||||
|
$enabled = true;
|
||||||
|
} else {
|
||||||
|
$enabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$provider = new Document([
|
||||||
|
'$id' => $providerId,
|
||||||
|
'name' => $name,
|
||||||
|
'provider' => 'smtp',
|
||||||
|
'type' => MESSAGE_TYPE_EMAIL,
|
||||||
|
'enabled' => $enabled,
|
||||||
|
'credentials' => $credentials,
|
||||||
|
'options' => $options,
|
||||||
|
]);
|
||||||
|
|
||||||
|
try {
|
||||||
|
$provider = $dbForProject->createDocument('providers', $provider);
|
||||||
|
} catch (DuplicateException) {
|
||||||
|
throw new Exception(Exception::PROVIDER_ALREADY_EXISTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
$queueForEvents
|
||||||
|
->setParam('providerId', $provider->getId());
|
||||||
|
|
||||||
|
$response
|
||||||
|
->setStatusCode(Response::STATUS_CODE_CREATED)
|
||||||
|
->dynamic($provider, Response::MODEL_PROVIDER);
|
||||||
|
});
|
||||||
|
|
||||||
App::post('/v1/messaging/providers/msg91')
|
App::post('/v1/messaging/providers/msg91')
|
||||||
->desc('Create Msg91 provider')
|
->desc('Create Msg91 provider')
|
||||||
->groups(['api', 'messaging'])
|
->groups(['api', 'messaging'])
|
||||||
|
@ -1085,6 +1176,122 @@ App::patch('/v1/messaging/providers/sendgrid/:providerId')
|
||||||
->dynamic($provider, Response::MODEL_PROVIDER);
|
->dynamic($provider, Response::MODEL_PROVIDER);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
App::patch('/v1/messaging/providers/smtp/:providerId')
|
||||||
|
->desc('Update SMTP provider')
|
||||||
|
->groups(['api', 'messaging'])
|
||||||
|
->label('audits.event', 'provider.update')
|
||||||
|
->label('audits.resource', 'provider/{response.$id}')
|
||||||
|
->label('event', 'providers.[providerId].update')
|
||||||
|
->label('scope', 'providers.write')
|
||||||
|
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
|
||||||
|
->label('sdk.namespace', 'messaging')
|
||||||
|
->label('sdk.method', 'updateSMTPProvider')
|
||||||
|
->label('sdk.description', '/docs/references/messaging/update-smtp-provider.md')
|
||||||
|
->label('sdk.response.code', Response::STATUS_CODE_OK)
|
||||||
|
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
|
||||||
|
->label('sdk.response.model', Response::MODEL_PROVIDER)
|
||||||
|
->param('providerId', '', new UID(), 'Provider ID.')
|
||||||
|
->param('name', '', new Text(128), 'Provider name.', true)
|
||||||
|
->param('host', '', new Text(0), 'SMTP hosts. Either a single hostname or multiple semicolon-delimited hostnames. You can also specify a different port for each host by using this format: [hostname:port] (e.g. "smtp1.example.com:25;smtp2.example.com"). You can also specify encryption type, for example: (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465"). Hosts will be tried in order.', true)
|
||||||
|
->param('port', null, new Range(1, 65535), 'SMTP port.', true)
|
||||||
|
->param('username', '', new Text(0), 'Authentication username.', true)
|
||||||
|
->param('password', '', new Text(0), 'Authentication password.', true)
|
||||||
|
->param('encryption', '', new WhiteList(['ssl', 'tls']), 'Encryption type. Can be \'ssl\' or \'tls\'', true)
|
||||||
|
->param('autoTLS', null, new Boolean(), 'Enable SMTP AutoTLS feature.', true)
|
||||||
|
->param('fromName', '', new Text(128), 'Sender Name.', true)
|
||||||
|
->param('fromEmail', '', new Email(), 'Sender email address.', true)
|
||||||
|
->param('replyToName', '', new Text(128), 'Name set in the Reply To field for the mail. Default value is Sender Name.', true)
|
||||||
|
->param('replyToEmail', '', new Text(128), 'Email set in the Reply To field for the mail. Default value is Sender Email.', true)
|
||||||
|
->param('enabled', null, new Boolean(), 'Set as enabled.', true)
|
||||||
|
->inject('queueForEvents')
|
||||||
|
->inject('dbForProject')
|
||||||
|
->inject('response')
|
||||||
|
->action(function (string $providerId, string $name, string $host, ?int $port, string $username, string $password, string $encryption, ?bool $autoTLS, string $fromName, string $fromEmail, string $replyToName, string $replyToEmail, ?bool $enabled, Event $queueForEvents, Database $dbForProject, Response $response) {
|
||||||
|
$provider = $dbForProject->getDocument('providers', $providerId);
|
||||||
|
|
||||||
|
if ($provider->isEmpty()) {
|
||||||
|
throw new Exception(Exception::PROVIDER_NOT_FOUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
$providerAttr = $provider->getAttribute('provider');
|
||||||
|
|
||||||
|
if ($providerAttr !== 'smtp') {
|
||||||
|
throw new Exception(Exception::PROVIDER_INCORRECT_TYPE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($name)) {
|
||||||
|
$provider->setAttribute('name', $name);
|
||||||
|
}
|
||||||
|
|
||||||
|
$options = $provider->getAttribute('options');
|
||||||
|
|
||||||
|
if (!empty($fromName)) {
|
||||||
|
$options['fromName'] = $fromName;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($fromEmail)) {
|
||||||
|
$options['fromEmail'] = $fromEmail;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($replyToName)) {
|
||||||
|
$options['replyToName'] = $replyToName;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($replyToEmail)) {
|
||||||
|
$options['replyToEmail'] = $replyToEmail;
|
||||||
|
}
|
||||||
|
|
||||||
|
$provider->setAttribute('options', $options);
|
||||||
|
|
||||||
|
$credentials = $provider->getAttribute('credentials');
|
||||||
|
|
||||||
|
if (!empty($host)) {
|
||||||
|
$credentials['host'] = $host;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!\is_null($port)) {
|
||||||
|
$credentials['port'] = $port;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($username)) {
|
||||||
|
$credentials['username'] = $username;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($password)) {
|
||||||
|
$credentials['password'] = $password;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($encryption)) {
|
||||||
|
$credentials['encryption'] = $encryption;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!\is_null($autoTLS)) {
|
||||||
|
$credentials['autoTLS'] = $autoTLS;
|
||||||
|
}
|
||||||
|
|
||||||
|
$provider->setAttribute('credentials', $credentials);
|
||||||
|
|
||||||
|
if (!\is_null($enabled)) {
|
||||||
|
if ($enabled) {
|
||||||
|
if (\array_key_exists('host', $credentials)) {
|
||||||
|
$provider->setAttribute('enabled', true);
|
||||||
|
} else {
|
||||||
|
throw new Exception(Exception::PROVIDER_MISSING_CREDENTIALS);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$provider->setAttribute('enabled', false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$provider = $dbForProject->updateDocument('providers', $provider->getId(), $provider);
|
||||||
|
|
||||||
|
$queueForEvents
|
||||||
|
->setParam('providerId', $provider->getId());
|
||||||
|
|
||||||
|
$response
|
||||||
|
->dynamic($provider, Response::MODEL_PROVIDER);
|
||||||
|
});
|
||||||
|
|
||||||
App::patch('/v1/messaging/providers/msg91/:providerId')
|
App::patch('/v1/messaging/providers/msg91/:providerId')
|
||||||
->desc('Update Msg91 provider')
|
->desc('Update Msg91 provider')
|
||||||
->groups(['api', 'messaging'])
|
->groups(['api', 'messaging'])
|
||||||
|
|
|
@ -56,7 +56,7 @@
|
||||||
"utopia-php/image": "0.5.*",
|
"utopia-php/image": "0.5.*",
|
||||||
"utopia-php/locale": "0.4.*",
|
"utopia-php/locale": "0.4.*",
|
||||||
"utopia-php/logger": "0.3.*",
|
"utopia-php/logger": "0.3.*",
|
||||||
"utopia-php/messaging": "0.8.*",
|
"utopia-php/messaging": "0.9.*",
|
||||||
"utopia-php/migration": "0.3.*",
|
"utopia-php/migration": "0.3.*",
|
||||||
"utopia-php/orchestration": "0.9.*",
|
"utopia-php/orchestration": "0.9.*",
|
||||||
"utopia-php/platform": "0.5.*",
|
"utopia-php/platform": "0.5.*",
|
||||||
|
|
14
composer.lock
generated
14
composer.lock
generated
|
@ -4,7 +4,7 @@
|
||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "463c5722b5b926ea567fe24d8b983755",
|
"content-hash": "31f56e830ac6dd8bac40a3bb3f40aea3",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "adhocore/jwt",
|
"name": "adhocore/jwt",
|
||||||
|
@ -1554,16 +1554,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "utopia-php/messaging",
|
"name": "utopia-php/messaging",
|
||||||
"version": "0.8.1",
|
"version": "0.9.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/utopia-php/messaging.git",
|
"url": "https://github.com/utopia-php/messaging.git",
|
||||||
"reference": "bfb5014d3a8752901e50da1ae21bf309a6af5006"
|
"reference": "df54ba51570e886724590edeb03dbd455bb0464d"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/utopia-php/messaging/zipball/bfb5014d3a8752901e50da1ae21bf309a6af5006",
|
"url": "https://api.github.com/repos/utopia-php/messaging/zipball/df54ba51570e886724590edeb03dbd455bb0464d",
|
||||||
"reference": "bfb5014d3a8752901e50da1ae21bf309a6af5006",
|
"reference": "df54ba51570e886724590edeb03dbd455bb0464d",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
@ -1598,9 +1598,9 @@
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/utopia-php/messaging/issues",
|
"issues": "https://github.com/utopia-php/messaging/issues",
|
||||||
"source": "https://github.com/utopia-php/messaging/tree/0.8.1"
|
"source": "https://github.com/utopia-php/messaging/tree/0.9.0"
|
||||||
},
|
},
|
||||||
"time": "2024-01-10T23:55:03+00:00"
|
"time": "2024-01-31T11:51:27+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "utopia-php/migration",
|
"name": "utopia-php/migration",
|
||||||
|
|
|
@ -18,6 +18,7 @@ use Utopia\Database\Query;
|
||||||
use Utopia\Messaging\Adapter\Email as EmailAdapter;
|
use Utopia\Messaging\Adapter\Email as EmailAdapter;
|
||||||
use Utopia\Messaging\Adapter\Email\Mailgun;
|
use Utopia\Messaging\Adapter\Email\Mailgun;
|
||||||
use Utopia\Messaging\Adapter\Email\Sendgrid;
|
use Utopia\Messaging\Adapter\Email\Sendgrid;
|
||||||
|
use Utopia\Messaging\Adapter\Email\SMTP;
|
||||||
use Utopia\Messaging\Adapter\Push as PushAdapter;
|
use Utopia\Messaging\Adapter\Push as PushAdapter;
|
||||||
use Utopia\Messaging\Adapter\Push\APNS;
|
use Utopia\Messaging\Adapter\Push\APNS;
|
||||||
use Utopia\Messaging\Adapter\Push\FCM;
|
use Utopia\Messaging\Adapter\Push\FCM;
|
||||||
|
@ -216,8 +217,8 @@ class Messaging extends Action
|
||||||
$batches = \array_chunk($identifiers, $maxBatchSize);
|
$batches = \array_chunk($identifiers, $maxBatchSize);
|
||||||
$batchIndex = 0;
|
$batchIndex = 0;
|
||||||
|
|
||||||
return batch(\array_map(function ($batch) use ($message, $provider, $adapter, $batchIndex, $dbForProject) {
|
return batch(\array_map(function ($batch) use ($message, $provider, $adapter, &$batchIndex, $dbForProject) {
|
||||||
return function () use ($batch, $message, $provider, $adapter, $batchIndex, $dbForProject) {
|
return function () use ($batch, $message, $provider, $adapter, &$batchIndex, $dbForProject) {
|
||||||
$deliveredTotal = 0;
|
$deliveredTotal = 0;
|
||||||
$deliveryErrors = [];
|
$deliveryErrors = [];
|
||||||
$messageData = clone $message;
|
$messageData = clone $message;
|
||||||
|
@ -410,7 +411,20 @@ class Messaging extends Action
|
||||||
$credentials = $provider->getAttribute('credentials');
|
$credentials = $provider->getAttribute('credentials');
|
||||||
return match ($provider->getAttribute('provider')) {
|
return match ($provider->getAttribute('provider')) {
|
||||||
'mock' => new Mock('username', 'password'),
|
'mock' => new Mock('username', 'password'),
|
||||||
'mailgun' => new Mailgun($credentials['apiKey'], $credentials['domain'], $credentials['isEuRegion']),
|
'smtp' => new SMTP(
|
||||||
|
$credentials['host'],
|
||||||
|
$credentials['port'],
|
||||||
|
$credentials['username'],
|
||||||
|
$credentials['password'],
|
||||||
|
$credentials['encryption'],
|
||||||
|
$credentials['autoTLS'],
|
||||||
|
$credentials['mailer'],
|
||||||
|
),
|
||||||
|
'mailgun' => new Mailgun(
|
||||||
|
$credentials['apiKey'],
|
||||||
|
$credentials['domain'],
|
||||||
|
$credentials['isEuRegion']
|
||||||
|
),
|
||||||
'sendgrid' => new Sendgrid($credentials['apiKey']),
|
'sendgrid' => new Sendgrid($credentials['apiKey']),
|
||||||
default => null
|
default => null
|
||||||
};
|
};
|
||||||
|
@ -418,16 +432,10 @@ class Messaging extends Action
|
||||||
|
|
||||||
private function buildEmailMessage(Database $dbForProject, Document $message, Document $provider): Email
|
private function buildEmailMessage(Database $dbForProject, Document $message, Document $provider): Email
|
||||||
{
|
{
|
||||||
$fromName = $provider['options']['fromName'];
|
$fromName = $provider['options']['fromName'] ?? null;
|
||||||
$fromEmail = $provider['options']['fromEmail'];
|
$fromEmail = $provider['options']['fromEmail'] ?? null;
|
||||||
$replyToEmail = null;
|
$replyToEmail = $provider['options']['replyToEmail'] ?? null;
|
||||||
$replyToName = null;
|
$replyToName = $provider['options']['replyToName'] ?? null;
|
||||||
|
|
||||||
if (isset($provider['options']['replyToName']) && isset($provider['options']['replyToEmail'])) {
|
|
||||||
$replyToName = $provider['options']['replyToName'];
|
|
||||||
$replyToEmail = $provider['options']['replyToEmail'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$data = $message['data'] ?? [];
|
$data = $message['data'] ?? [];
|
||||||
$ccTargets = $data['cc'] ?? [];
|
$ccTargets = $data['cc'] ?? [];
|
||||||
$bccTargets = $data['bcc'] ?? [];
|
$bccTargets = $data['bcc'] ?? [];
|
||||||
|
|
|
@ -207,6 +207,7 @@ trait Base
|
||||||
// Providers
|
// Providers
|
||||||
public static string $CREATE_MAILGUN_PROVIDER = 'create_mailgun_provider';
|
public static string $CREATE_MAILGUN_PROVIDER = 'create_mailgun_provider';
|
||||||
public static string $CREATE_SENDGRID_PROVIDER = 'create_sendgrid_provider';
|
public static string $CREATE_SENDGRID_PROVIDER = 'create_sendgrid_provider';
|
||||||
|
public static string $CREATE_SMTP_PROVIDER = 'create_smtp_provider';
|
||||||
public static string $CREATE_TWILIO_PROVIDER = 'create_twilio_provider';
|
public static string $CREATE_TWILIO_PROVIDER = 'create_twilio_provider';
|
||||||
public static string $CREATE_TELESIGN_PROVIDER = 'create_telesign_provider';
|
public static string $CREATE_TELESIGN_PROVIDER = 'create_telesign_provider';
|
||||||
public static string $CREATE_TEXTMAGIC_PROVIDER = 'create_textmagic_provider';
|
public static string $CREATE_TEXTMAGIC_PROVIDER = 'create_textmagic_provider';
|
||||||
|
@ -218,6 +219,7 @@ trait Base
|
||||||
public static string $GET_PROVIDER = 'get_provider';
|
public static string $GET_PROVIDER = 'get_provider';
|
||||||
public static string $UPDATE_MAILGUN_PROVIDER = 'update_mailgun_provider';
|
public static string $UPDATE_MAILGUN_PROVIDER = 'update_mailgun_provider';
|
||||||
public static string $UPDATE_SENDGRID_PROVIDER = 'update_sendgrid_provider';
|
public static string $UPDATE_SENDGRID_PROVIDER = 'update_sendgrid_provider';
|
||||||
|
public static string $UPDATE_SMTP_PROVIDER = 'update_smtp_provider';
|
||||||
public static string $UPDATE_TWILIO_PROVIDER = 'update_twilio_provider';
|
public static string $UPDATE_TWILIO_PROVIDER = 'update_twilio_provider';
|
||||||
public static string $UPDATE_TELESIGN_PROVIDER = 'update_telesign_provider';
|
public static string $UPDATE_TELESIGN_PROVIDER = 'update_telesign_provider';
|
||||||
public static string $UPDATE_TEXTMAGIC_PROVIDER = 'update_textmagic_provider';
|
public static string $UPDATE_TEXTMAGIC_PROVIDER = 'update_textmagic_provider';
|
||||||
|
@ -1809,6 +1811,16 @@ trait Base
|
||||||
enabled
|
enabled
|
||||||
}
|
}
|
||||||
}';
|
}';
|
||||||
|
case self::$CREATE_SMTP_PROVIDER:
|
||||||
|
return 'mutation createSMTPProvider($providerId: String!, $name: String!, $host: String!, $port: Int!, $username: String!, $password: String!, $encryption: String!, $autoTLS: Boolean! $fromName: String!, $fromEmail: String!, $replyToName: String, $replyToEmail: String) {
|
||||||
|
messagingCreateSMTPProvider(providerId: $providerId, name: $name, host: $host, port: $port, username: $username, password: $password, encryption: $encryption, autoTLS: $autoTLS, fromName: $fromName, fromEmail: $fromEmail, replyToName: $replyToName, replyToEmail: $replyToEmail) {
|
||||||
|
_id
|
||||||
|
name
|
||||||
|
provider
|
||||||
|
type
|
||||||
|
enabled
|
||||||
|
}
|
||||||
|
}';
|
||||||
case self::$CREATE_TWILIO_PROVIDER:
|
case self::$CREATE_TWILIO_PROVIDER:
|
||||||
return 'mutation createTwilioProvider($providerId: String!, $name: String!, $from: String!, $accountSid: String!, $authToken: String!) {
|
return 'mutation createTwilioProvider($providerId: String!, $name: String!, $from: String!, $accountSid: String!, $authToken: String!) {
|
||||||
messagingCreateTwilioProvider(providerId: $providerId, name: $name, from: $from, accountSid: $accountSid, authToken: $authToken) {
|
messagingCreateTwilioProvider(providerId: $providerId, name: $name, from: $from, accountSid: $accountSid, authToken: $authToken) {
|
||||||
|
@ -1923,6 +1935,16 @@ trait Base
|
||||||
enabled
|
enabled
|
||||||
}
|
}
|
||||||
}';
|
}';
|
||||||
|
case self::$UPDATE_SMTP_PROVIDER:
|
||||||
|
return 'mutation updateSMTPProvider($providerId: String!, $name: String!, $host: String!, $port: Int!, $username: String!, $password: String!, $encryption: String!, $autoTLS: Boolean!, $fromName: String, $fromEmail: String, $enabled: Boolean) {
|
||||||
|
messagingUpdateSMTPProvider(providerId: $providerId, name: $name, host: $host, port: $port, username: $username, password: $password, encryption: $encryption, autoTLS: $autoTLS, fromName: $fromName, fromEmail: $fromEmail, enabled: $enabled) {
|
||||||
|
_id
|
||||||
|
name
|
||||||
|
provider
|
||||||
|
type
|
||||||
|
enabled
|
||||||
|
}
|
||||||
|
}';
|
||||||
case self::$UPDATE_TWILIO_PROVIDER:
|
case self::$UPDATE_TWILIO_PROVIDER:
|
||||||
return 'mutation updateTwilioProvider($providerId: String!, $name: String!, $accountSid: String!, $authToken: String!) {
|
return 'mutation updateTwilioProvider($providerId: String!, $name: String!, $accountSid: String!, $authToken: String!) {
|
||||||
messagingUpdateTwilioProvider(providerId: $providerId, name: $name, accountSid: $accountSid, authToken: $authToken) {
|
messagingUpdateTwilioProvider(providerId: $providerId, name: $name, accountSid: $accountSid, authToken: $authToken) {
|
||||||
|
|
|
@ -29,6 +29,17 @@ trait MessagingBase
|
||||||
'fromEmail' => 'sender-email@my-domain.com',
|
'fromEmail' => 'sender-email@my-domain.com',
|
||||||
'isEuRegion' => false,
|
'isEuRegion' => false,
|
||||||
],
|
],
|
||||||
|
'smtp' => [
|
||||||
|
'providerId' => ID::unique(),
|
||||||
|
'name' => 'SMTP1',
|
||||||
|
'host' => 'smtp.appwrite.io',
|
||||||
|
'port' => 587,
|
||||||
|
'security' => 'tls',
|
||||||
|
'username' => 'my-username',
|
||||||
|
'password' => 'my-password',
|
||||||
|
'fromName' => 'sender name',
|
||||||
|
'fromEmail' => 'tester@appwrite.io',
|
||||||
|
],
|
||||||
'twilio' => [
|
'twilio' => [
|
||||||
'providerId' => ID::unique(),
|
'providerId' => ID::unique(),
|
||||||
'name' => 'Twilio1',
|
'name' => 'Twilio1',
|
||||||
|
@ -115,6 +126,14 @@ trait MessagingBase
|
||||||
'apiKey' => 'my-apikey',
|
'apiKey' => 'my-apikey',
|
||||||
'domain' => 'my-domain',
|
'domain' => 'my-domain',
|
||||||
],
|
],
|
||||||
|
'smtp' => [
|
||||||
|
'name' => 'SMTP2',
|
||||||
|
'host' => 'smtp.appwrite.io',
|
||||||
|
'port' => 587,
|
||||||
|
'security' => 'tls',
|
||||||
|
'username' => 'my-username',
|
||||||
|
'password' => 'my-password',
|
||||||
|
],
|
||||||
'twilio' => [
|
'twilio' => [
|
||||||
'name' => 'Twilio2',
|
'name' => 'Twilio2',
|
||||||
'accountSid' => 'my-accountSid',
|
'accountSid' => 'my-accountSid',
|
||||||
|
@ -224,7 +243,7 @@ trait MessagingBase
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->assertEquals(200, $response['headers']['status-code']);
|
$this->assertEquals(200, $response['headers']['status-code']);
|
||||||
$this->assertEquals(10, \count($response['body']['providers']));
|
$this->assertEquals(11, \count($response['body']['providers']));
|
||||||
|
|
||||||
return $providers;
|
return $providers;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue