1
0
Fork 0
mirror of synced 2024-10-02 10:16:27 +13:00

Merge pull request #7010 from appwrite/review-changes-1.5.x

made review changes
This commit is contained in:
Jake Barnby 2023-10-26 21:45:39 +13:00 committed by GitHub
commit 92062a5463
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
27 changed files with 287 additions and 253 deletions

View file

@ -5,7 +5,7 @@ use Utopia\Config\Config;
use Utopia\Database\Database;
use Utopia\Database\Helpers\ID;
$providers = Config::getParam('authProviders', []);
$providers = Config::getParam('oAuthProviders', []);
$auth = Config::getParam('auth', []);
/**
@ -1629,7 +1629,7 @@ $commonCollections = [
'size' => 0,
'signed' => true,
'required' => false,
'default' => null,
'default' => 0,
'array' => false,
'filters' => [],
],
@ -1719,6 +1719,17 @@ $commonCollections = [
'array' => false,
'filters' => [],
],
[
'$id' => ID::custom('total'),
'type' => Database::VAR_INTEGER,
'format' => '',
'size' => 0,
'signed' => true,
'required' => false,
'default' => 0,
'array' => false,
'filters' => [],
],
[
'$id' => ID::custom('targets'),
'type' => Database::VAR_STRING,
@ -4008,7 +4019,7 @@ $consoleCollections = array_merge([
'filters' => ['json'],
],
[
'$id' => ID::custom('authProviders'),
'$id' => ID::custom('oAuthProviders'),
'type' => Database::VAR_STRING,
'format' => '',
'size' => 16384,

View file

@ -261,29 +261,31 @@ return [
'update' => [
'$description' => 'This event triggers when a message is updated.',
],
'topics' => [
'$model' => Response::MODEL_TOPIC,
],
'topics' => [
'$model' => Response::MODEL_TOPIC,
'$resource' => true,
'$description' => 'This event triggers on any topic event.',
'create' => [
'$description' => 'This event triggers when a topic is created.',
],
'update' => [
'$description' => 'This event triggers when a topic is updated.',
],
'delete' => [
'$description' => 'This event triggers when a topic is deleted.'
],
'subscribers' => [
'$model' => Response::MODEL_SUBSCRIBER,
'$resource' => true,
'$description' => 'This event triggers on any topic event.',
'$description' => 'This event triggers on any subscriber event.',
'create' => [
'$description' => 'This event triggers when a provider is created.',
'$description' => 'This event triggers when a subscriber is created.',
],
'delete' => [
'$description' => 'This event triggers when a provider is deleted.'
],
'subscribers' => [
'$model' => Response::MODEL_SUBSCRIBER,
'$resource' => true,
'$description' => 'This event triggers on any subscriber event.',
'create' => [
'$description' => 'This event triggers when a subscriber is created.',
],
'delete' => [
'$description' => 'This event triggers when a subscriber is deleted.'
],
'$description' => 'This event triggers when a subscriber is deleted.'
],
],
],
'providers' => [
'$model' => Response::MODEL_PROVIDER,

View file

@ -299,7 +299,7 @@ App::get('/v1/account/sessions/oauth2/:provider')
->label('sdk.methodType', 'webAuth')
->label('abuse-limit', 50)
->label('abuse-key', 'ip:{ip}')
->param('provider', '', new WhiteList(\array_keys(Config::getParam('authProviders')), true), 'OAuth2 Provider. Currently, supported providers are: ' . \implode(', ', \array_keys(\array_filter(Config::getParam('authProviders'), fn($node) => (!$node['mock'])))) . '.')
->param('provider', '', new WhiteList(\array_keys(Config::getParam('oAuthProviders')), true), 'OAuth2 Provider. Currently, supported providers are: ' . \implode(', ', \array_keys(\array_filter(Config::getParam('oAuthProviders'), fn($node) => (!$node['mock'])))) . '.')
->param('success', '', fn($clients) => new Host($clients), 'URL to redirect back to your app after a successful login attempt. Only URLs from hostnames in your project\'s platform list are allowed. This requirement helps to prevent an [open redirect](https://cheatsheetseries.owasp.org/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.html) attack against your project API.', true, ['clients'])
->param('failure', '', fn($clients) => new Host($clients), 'URL to redirect back to your app after a failed login attempt. Only URLs from hostnames in your project\'s platform list are allowed. This requirement helps to prevent an [open redirect](https://cheatsheetseries.owasp.org/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.html) attack against your project API.', true, ['clients'])
->param('scopes', [], new ArrayList(new Text(APP_LIMIT_ARRAY_ELEMENT_SIZE), APP_LIMIT_ARRAY_PARAMS_SIZE), 'A list of custom OAuth2 scopes. Check each provider internal docs for a list of supported scopes. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' scopes are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long.', true)
@ -311,14 +311,14 @@ App::get('/v1/account/sessions/oauth2/:provider')
$protocol = $request->getProtocol();
$callback = $protocol . '://' . $request->getHostname() . '/v1/account/sessions/oauth2/callback/' . $provider . '/' . $project->getId();
$providerEnabled = $project->getAttribute('authProviders', [])[$provider . 'Enabled'] ?? false;
$providerEnabled = $project->getAttribute('oAuthProviders', [])[$provider . 'Enabled'] ?? false;
if (!$providerEnabled) {
throw new Exception(Exception::PROJECT_PROVIDER_DISABLED, 'This provider is disabled. Please enable the provider from your ' . APP_NAME . ' console to continue.');
}
$appId = $project->getAttribute('authProviders', [])[$provider . 'Appid'] ?? '';
$appSecret = $project->getAttribute('authProviders', [])[$provider . 'Secret'] ?? '{}';
$appId = $project->getAttribute('oAuthProviders', [])[$provider . 'Appid'] ?? '';
$appSecret = $project->getAttribute('oAuthProviders', [])[$provider . 'Secret'] ?? '{}';
if (!empty($appSecret) && isset($appSecret['version'])) {
$key = App::getEnv('_APP_OPENSSL_KEY_V' . $appSecret['version']);
@ -358,7 +358,7 @@ App::get('/v1/account/sessions/oauth2/callback/:provider/:projectId')
->label('scope', 'public')
->label('docs', false)
->param('projectId', '', new Text(1024), 'Project ID.')
->param('provider', '', new WhiteList(\array_keys(Config::getParam('authProviders')), true), 'OAuth2 provider.')
->param('provider', '', new WhiteList(\array_keys(Config::getParam('oAuthProviders')), true), 'OAuth2 provider.')
->param('code', '', new Text(2048, 0), 'OAuth2 code. This is a temporary code that the will be later exchanged for an access token.', true)
->param('state', '', new Text(2048), 'Login state params.', true)
->param('error', '', new Text(2048, 0), 'Error code returned from the OAuth2 provider.', true)
@ -391,7 +391,7 @@ App::post('/v1/account/sessions/oauth2/callback/:provider/:projectId')
->label('origin', '*')
->label('docs', false)
->param('projectId', '', new Text(1024), 'Project ID.')
->param('provider', '', new WhiteList(\array_keys(Config::getParam('authProviders')), true), 'OAuth2 provider.')
->param('provider', '', new WhiteList(\array_keys(Config::getParam('oAuthProviders')), true), 'OAuth2 provider.')
->param('code', '', new Text(2048, 0), 'OAuth2 code. This is a temporary code that the will be later exchanged for an access token.', true)
->param('state', '', new Text(2048), 'Login state params.', true)
->param('error', '', new Text(2048, 0), 'Error code returned from the OAuth2 provider.', true)
@ -430,7 +430,7 @@ App::get('/v1/account/sessions/oauth2/:provider/redirect')
->label('docs', false)
->label('usage.metric', 'sessions.{scope}.requests.create')
->label('usage.params', ['provider:{request.provider}'])
->param('provider', '', new WhiteList(\array_keys(Config::getParam('authProviders')), true), 'OAuth2 provider.')
->param('provider', '', new WhiteList(\array_keys(Config::getParam('oAuthProviders')), true), 'OAuth2 provider.')
->param('code', '', new Text(2048, 0), 'OAuth2 code. This is a temporary code that the will be later exchanged for an access token.', true)
->param('state', '', new Text(2048), 'OAuth2 state params.', true)
->param('error', '', new Text(2048, 0), 'Error code returned from the OAuth2 provider.', true)
@ -448,9 +448,9 @@ App::get('/v1/account/sessions/oauth2/:provider/redirect')
$callback = $protocol . '://' . $request->getHostname() . '/v1/account/sessions/oauth2/callback/' . $provider . '/' . $project->getId();
$defaultState = ['success' => $project->getAttribute('url', ''), 'failure' => ''];
$validateURL = new URL();
$appId = $project->getAttribute('authProviders', [])[$provider . 'Appid'] ?? '';
$appSecret = $project->getAttribute('authProviders', [])[$provider . 'Secret'] ?? '{}';
$providerEnabled = $project->getAttribute('authProviders', [])[$provider . 'Enabled'] ?? false;
$appId = $project->getAttribute('oAuthProviders', [])[$provider . 'Appid'] ?? '';
$appSecret = $project->getAttribute('oAuthProviders', [])[$provider . 'Secret'] ?? '{}';
$providerEnabled = $project->getAttribute('oAuthProviders', [])[$provider . 'Enabled'] ?? false;
$className = 'Appwrite\\Auth\\OAuth2\\' . \ucfirst($provider);
@ -458,7 +458,7 @@ App::get('/v1/account/sessions/oauth2/:provider/redirect')
throw new Exception(Exception::PROJECT_PROVIDER_UNSUPPORTED);
}
$providers = Config::getParam('authProviders');
$providers = Config::getParam('oAuthProviders');
$providerName = $providers[$provider]['name'] ?? '';
/** @var Appwrite\Auth\OAuth2 $oauth2 */
@ -2296,8 +2296,8 @@ App::patch('/v1/account/sessions/:sessionId')
$provider = $session->getAttribute('provider');
$refreshToken = $session->getAttribute('providerRefreshToken');
$appId = $project->getAttribute('authProviders', [])[$provider . 'Appid'] ?? '';
$appSecret = $project->getAttribute('authProviders', [])[$provider . 'Secret'] ?? '{}';
$appId = $project->getAttribute('oAuthProviders', [])[$provider . 'Appid'] ?? '';
$appSecret = $project->getAttribute('oAuthProviders', [])[$provider . 'Secret'] ?? '{}';
$className = 'Appwrite\\Auth\\OAuth2\\' . \ucfirst($provider);

View file

@ -84,8 +84,8 @@ $getUserGitHub = function (string $userId, Document $project, Database $dbForPro
$accessTokenExpiry = $gitHubSession->getAttribute('providerAccessTokenExpiry');
$refreshToken = $gitHubSession->getAttribute('providerRefreshToken');
$appId = $project->getAttribute('authProviders', [])[$provider . 'Appid'] ?? '';
$appSecret = $project->getAttribute('authProviders', [])[$provider . 'Secret'] ?? '{}';
$appId = $project->getAttribute('oAuthProviders', [])[$provider . 'Appid'] ?? '';
$appSecret = $project->getAttribute('oAuthProviders', [])[$provider . 'Secret'] ?? '{}';
$className = 'Appwrite\\Auth\\OAuth2\\' . \ucfirst($provider);

View file

@ -3,6 +3,7 @@
use Appwrite\Event\Delete;
use Appwrite\Event\Messaging;
use Appwrite\Extend\Exception;
use Appwrite\Network\Validator\Email;
use Appwrite\Permission;
use Appwrite\Role;
use Appwrite\Utopia\Database\Validator\CustomId;
@ -27,10 +28,10 @@ use Utopia\Validator\Text;
use Utopia\Validator\WhiteList;
App::post('/v1/messaging/providers/mailgun')
->desc('Create Mailgun Provider')
->desc('Create Mailgun provider')
->groups(['api', 'messaging'])
->label('audits.event', 'providers.create')
->label('audits.resource', 'providers/{response.$id}')
->label('audits.event', 'provider.create')
->label('audits.resource', 'provider/{response.$id}')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -41,15 +42,14 @@ App::post('/v1/messaging/providers/mailgun')
->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('default', false, new Boolean(), 'Set as default provider.', true)
->param('enabled', true, new Boolean(), 'Set as enabled.', true)
->param('isEuRegion', false, new Boolean(), 'Set as EU region.', true)
->param('from', '', new Text(256), 'Sender Email Address.')
->param('from', '', new Email(), 'Sender email address.')
->param('apiKey', '', new Text(0), 'Mailgun API Key.')
->param('domain', '', new Text(0), 'Mailgun Domain.')
->param('isEuRegion', false, new Boolean(), 'Set as EU region.')
->param('enabled', true, new Boolean(), 'Set as enabled.', true)
->inject('dbForProject')
->inject('response')
->action(function (string $providerId, string $name, bool $default, bool $enabled, bool $isEuRegion, string $from, string $apiKey, string $domain, Database $dbForProject, Response $response) {
->action(function (string $providerId, string $name, string $from, string $apiKey, string $domain, bool $isEuRegion, bool $enabled, Database $dbForProject, Response $response) {
$providerId = $providerId == 'unique()' ? ID::unique() : $providerId;
$provider = new Document([
@ -57,7 +57,6 @@ App::post('/v1/messaging/providers/mailgun')
'name' => $name,
'provider' => 'mailgun',
'type' => 'email',
'default' => $default,
'enabled' => $enabled,
'search' => $providerId . ' ' . $name . ' ' . 'mailgun' . ' ' . 'email',
'credentials' => [
@ -92,10 +91,10 @@ App::post('/v1/messaging/providers/mailgun')
});
App::post('/v1/messaging/providers/sendgrid')
->desc('Create Sendgrid Provider')
->desc('Create Sendgrid provider')
->groups(['api', 'messaging'])
->label('audits.event', 'providers.create')
->label('audits.resource', 'providers/{response.$id}')
->label('audits.event', 'provider.create')
->label('audits.resource', 'provider/{response.$id}')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -106,20 +105,18 @@ App::post('/v1/messaging/providers/sendgrid')
->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('from', '', new Text(256), 'Sender Email Address.')
->param('from', '', new Text(256), 'Sender email address.')
->param('apiKey', '', new Text(0), 'Sendgrid API key.')
->param('default', false, new Boolean(), 'Set as default provider.', true)
->param('enabled', true, new Boolean(), 'Set as enabled.', true)
->inject('dbForProject')
->inject('response')
->action(function (string $providerId, string $name, string $from, string $apiKey, bool $default, bool $enabled, Database $dbForProject, Response $response) {
->action(function (string $providerId, string $name, string $from, string $apiKey, bool $enabled, Database $dbForProject, Response $response) {
$providerId = $providerId == 'unique()' ? ID::unique() : $providerId;
$provider = new Document([
'$id' => $providerId,
'name' => $name,
'provider' => 'sendgrid',
'type' => 'email',
'default' => $default,
'enabled' => $enabled,
'search' => $providerId . ' ' . $name . ' ' . 'sendgrid' . ' ' . 'email',
'credentials' => [
@ -152,10 +149,10 @@ App::post('/v1/messaging/providers/sendgrid')
});
App::post('/v1/messaging/providers/msg91')
->desc('Create Msg91 Provider')
->desc('Create Msg91 provider')
->groups(['api', 'messaging'])
->label('audits.event', 'providers.create')
->label('audits.resource', 'providers/{response.$id}')
->label('audits.event', 'provider.create')
->label('audits.resource', 'provider/{response.$id}')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -166,14 +163,13 @@ App::post('/v1/messaging/providers/msg91')
->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('default', false, new Boolean(), 'Set as default provider.', true)
->param('enabled', true, new Boolean(), 'Set as enabled.', true)
->param('from', '', new Text(256), 'Sender Number.')
->param('from', '', new Text(256), 'Sender number.')
->param('senderId', '', new Text(0), 'Msg91 Sender ID.')
->param('authKey', '', new Text(0), 'Msg91 Auth Key.')
->param('enabled', true, new Boolean(), 'Set as enabled.', true)
->inject('dbForProject')
->inject('response')
->action(function (string $providerId, string $name, bool $default, bool $enabled, string $from, string $senderId, string $authKey, Database $dbForProject, Response $response) {
->action(function (string $providerId, string $name, string $from, string $senderId, string $authKey, bool $enabled, Database $dbForProject, Response $response) {
$providerId = $providerId == 'unique()' ? ID::unique() : $providerId;
$provider = new Document([
'$id' => $providerId,
@ -181,7 +177,6 @@ App::post('/v1/messaging/providers/msg91')
'provider' => 'msg91',
'type' => 'sms',
'search' => $providerId . ' ' . $name . ' ' . 'msg91' . ' ' . 'sms',
'default' => $default,
'enabled' => $enabled,
'credentials' => [
'senderId' => $senderId,
@ -214,10 +209,10 @@ App::post('/v1/messaging/providers/msg91')
});
App::post('/v1/messaging/providers/telesign')
->desc('Create Telesign Provider')
->desc('Create Telesign provider')
->groups(['api', 'messaging'])
->label('audits.event', 'providers.create')
->label('audits.resource', 'providers/{response.$id}')
->label('audits.event', 'provider.create')
->label('audits.resource', 'provider/{response.$id}')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -228,14 +223,13 @@ App::post('/v1/messaging/providers/telesign')
->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('from', '', new Text(256), 'Sender Number.')
->param('from', '', new Text(256), 'Sender number.')
->param('username', '', new Text(0), 'Telesign username.')
->param('password', '', new Text(0), 'Telesign password.')
->param('default', false, new Boolean(), 'Set as default provider.', true)
->param('enabled', true, new Boolean(), 'Set as enabled.', true)
->inject('dbForProject')
->inject('response')
->action(function (string $providerId, string $name, string $from, string $username, string $password, bool $default, bool $enabled, Database $dbForProject, Response $response) {
->action(function (string $providerId, string $name, string $from, string $username, string $password, bool $enabled, Database $dbForProject, Response $response) {
$providerId = $providerId == 'unique()' ? ID::unique() : $providerId;
$provider = new Document([
'$id' => $providerId,
@ -243,7 +237,6 @@ App::post('/v1/messaging/providers/telesign')
'provider' => 'telesign',
'type' => 'sms',
'search' => $providerId . ' ' . $name . ' ' . 'telesign' . ' ' . 'sms',
'default' => $default,
'enabled' => $enabled,
'credentials' => [
'username' => $username,
@ -276,28 +269,27 @@ App::post('/v1/messaging/providers/telesign')
});
App::post('/v1/messaging/providers/textmagic')
->desc('Create Textmagic Provider')
->desc('Create TextMagic provider')
->groups(['api', 'messaging'])
->label('audits.event', 'providers.create')
->label('audits.resource', 'providers/{response.$id}')
->label('audits.event', 'provider.create')
->label('audits.resource', 'provider/{response.$id}')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
->label('sdk.method', 'createTextmagicProvider')
->label('sdk.method', 'createTextMagicProvider')
->label('sdk.description', '/docs/references/messaging/create-textmagic-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('from', '', new Text(256), 'Sender Number.')
->param('from', '', new Text(256), 'Sender number.')
->param('username', '', new Text(0), 'Textmagic username.')
->param('apiKey', '', new Text(0), 'Textmagic apiKey.')
->param('default', false, new Boolean(), 'Set as default provider.', true)
->param('enabled', true, new Boolean(), 'Set as enabled.', true)
->inject('dbForProject')
->inject('response')
->action(function (string $providerId, string $name, string $from, string $username, string $apiKey, bool $default, bool $enabled, Database $dbForProject, Response $response) {
->action(function (string $providerId, string $name, string $from, string $username, string $apiKey, bool $enabled, Database $dbForProject, Response $response) {
$providerId = $providerId == 'unique()' ? ID::unique() : $providerId;
$provider = new Document([
'$id' => $providerId,
@ -305,7 +297,6 @@ App::post('/v1/messaging/providers/textmagic')
'provider' => 'text-magic',
'type' => 'sms',
'search' => $providerId . ' ' . $name . ' ' . 'text-magic' . ' ' . 'sms',
'default' => $default,
'enabled' => $enabled,
'credentials' => [
'username' => $username,
@ -338,10 +329,10 @@ App::post('/v1/messaging/providers/textmagic')
});
App::post('/v1/messaging/providers/twilio')
->desc('Create Twilio Provider')
->desc('Create Twilio provider')
->groups(['api', 'messaging'])
->label('audits.event', 'providers.create')
->label('audits.resource', 'providers/{response.$id}')
->label('audits.event', 'provider.create')
->label('audits.resource', 'provider/{response.$id}')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -355,11 +346,10 @@ App::post('/v1/messaging/providers/twilio')
->param('from', '', new Text(256), 'Sender number.')
->param('accountSid', '', new Text(0), 'Twilio account secret ID.')
->param('authToken', '', new Text(0), 'Twilio authentication token.')
->param('default', false, new Boolean(), 'Set as default provider.', true)
->param('enabled', true, new Boolean(), 'Set as enabled.', true)
->inject('dbForProject')
->inject('response')
->action(function (string $providerId, string $name, string $from, string $accountSid, string $authToken, bool $default, bool $enabled, Database $dbForProject, Response $response) {
->action(function (string $providerId, string $name, string $from, string $accountSid, string $authToken, bool $enabled, Database $dbForProject, Response $response) {
$providerId = $providerId == 'unique()' ? ID::unique() : $providerId;
$provider = new Document([
'$id' => $providerId,
@ -367,7 +357,6 @@ App::post('/v1/messaging/providers/twilio')
'provider' => 'twilio',
'type' => 'sms',
'search' => $providerId . ' ' . $name . ' ' . 'twilio' . ' ' . 'sms',
'default' => $default,
'enabled' => $enabled,
'credentials' => [
'accountSid' => $accountSid,
@ -400,10 +389,10 @@ App::post('/v1/messaging/providers/twilio')
});
App::post('/v1/messaging/providers/vonage')
->desc('Create Vonage Provider')
->desc('Create Vonage provider')
->groups(['api', 'messaging'])
->label('audits.event', 'providers.create')
->label('audits.resource', 'providers/{response.$id}')
->label('audits.event', 'provider.create')
->label('audits.resource', 'provider/{response.$id}')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -417,11 +406,10 @@ App::post('/v1/messaging/providers/vonage')
->param('from', '', new Text(256), 'Sender number.')
->param('apiKey', '', new Text(0), 'Vonage API key.')
->param('apiSecret', '', new Text(0), 'Vonage API secret.')
->param('default', false, new Boolean(), 'Set as default provider.', true)
->param('enabled', true, new Boolean(), 'Set as enabled.', true)
->inject('dbForProject')
->inject('response')
->action(function (string $providerId, string $name, string $from, string $apiKey, string $apiSecret, bool $default, bool $enabled, Database $dbForProject, Response $response) {
->action(function (string $providerId, string $name, string $from, string $apiKey, string $apiSecret, bool $enabled, Database $dbForProject, Response $response) {
$providerId = $providerId == 'unique()' ? ID::unique() : $providerId;
$provider = new Document([
'$id' => $providerId,
@ -429,7 +417,6 @@ App::post('/v1/messaging/providers/vonage')
'provider' => 'vonage',
'type' => 'sms',
'search' => $providerId . ' ' . $name . ' ' . 'vonage' . ' ' . 'sms',
'default' => $default,
'enabled' => $enabled,
'credentials' => [
'apiKey' => $apiKey,
@ -462,10 +449,10 @@ App::post('/v1/messaging/providers/vonage')
});
App::post('/v1/messaging/providers/fcm')
->desc('Create FCM Provider')
->desc('Create FCM provider')
->groups(['api', 'messaging'])
->label('audits.event', 'providers.create')
->label('audits.resource', 'providers/{response.$id}')
->label('audits.event', 'provider.create')
->label('audits.resource', 'provider/{response.$id}')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -476,12 +463,11 @@ App::post('/v1/messaging/providers/fcm')
->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('default', false, new Boolean(), 'Set as default provider.', true)
->param('enabled', true, new Boolean(), 'Set as enabled.', true)
->param('serverKey', '', new Text(0), 'FCM Server Key.')
->param('serverKey', '', new Text(0), 'FCM server key.')
->inject('dbForProject')
->inject('response')
->action(function (string $providerId, string $name, bool $default, bool $enabled, string $serverKey, Database $dbForProject, Response $response) {
->action(function (string $providerId, string $name, bool $enabled, string $serverKey, Database $dbForProject, Response $response) {
$providerId = $providerId == 'unique()' ? ID::unique() : $providerId;
$provider = new Document([
'$id' => $providerId,
@ -489,7 +475,6 @@ App::post('/v1/messaging/providers/fcm')
'provider' => 'fcm',
'type' => 'push',
'search' => $providerId . ' ' . $name . ' ' . 'fcm' . ' ' . 'push',
'default' => $default,
'enabled' => $enabled,
'credentials' => [
'serverKey' => $serverKey,
@ -518,10 +503,10 @@ App::post('/v1/messaging/providers/fcm')
});
App::post('/v1/messaging/providers/apns')
->desc('Create APNS Provider')
->desc('Create APNS provider')
->groups(['api', 'messaging'])
->label('audits.event', 'providers.create')
->label('audits.resource', 'providers/{response.$id}')
->label('audits.event', 'provider.create')
->label('audits.resource', 'provider/{response.$id}')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -532,7 +517,6 @@ App::post('/v1/messaging/providers/apns')
->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('default', false, new Boolean(), 'Set as default provider.', true)
->param('enabled', true, new Boolean(), 'Set as enabled.', true)
->param('authKey', '', new Text(0), 'APNS authentication key.')
->param('authKeyId', '', new Text(0), 'APNS authentication key ID.')
@ -541,7 +525,7 @@ App::post('/v1/messaging/providers/apns')
->param('endpoint', '', new Text(0), 'APNS endpoint.')
->inject('dbForProject')
->inject('response')
->action(function (string $providerId, string $name, bool $default, bool $enabled, string $authKey, string $authKeyId, string $teamId, string $bundleId, string $endpoint, Database $dbForProject, Response $response) {
->action(function (string $providerId, string $name, bool $enabled, string $authKey, string $authKeyId, string $teamId, string $bundleId, string $endpoint, Database $dbForProject, Response $response) {
$providerId = $providerId == 'unique()' ? ID::unique() : $providerId;
$provider = new Document([
'$id' => $providerId,
@ -549,7 +533,6 @@ App::post('/v1/messaging/providers/apns')
'provider' => 'apns',
'type' => 'push',
'search' => $providerId . ' ' . $name . ' ' . 'apns' . ' ' . 'push',
'default' => $default,
'enabled' => $enabled,
'credentials' => [
'authKey' => $authKey,
@ -582,7 +565,7 @@ App::post('/v1/messaging/providers/apns')
});
App::get('/v1/messaging/providers')
->desc('List Providers')
->desc('List providers')
->groups(['api', 'messaging'])
->label('scope', 'providers.read')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
@ -593,11 +576,16 @@ App::get('/v1/messaging/providers')
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_PROVIDER_LIST)
->param('queries', [], new Providers(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Providers::ALLOWED_ATTRIBUTES), true)
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
->inject('dbForProject')
->inject('response')
->action(function (array $queries, Database $dbForProject, Response $response) {
->action(function (array $queries, string $search, Database $dbForProject, Response $response) {
$queries = Query::parseQueries($queries);
if (!empty($search)) {
$queries[] = Query::search('search', $search);
}
// Get cursor document if there was a cursor query
$cursor = Query::getByType($queries, [Query::TYPE_CURSORAFTER, Query::TYPE_CURSORBEFORE]);
$cursor = reset($cursor);
@ -613,15 +601,14 @@ App::get('/v1/messaging/providers')
$cursor->setValue($cursorDocument);
}
$filterQueries = Query::groupByType($queries)['filters'];
$response->dynamic(new Document([
'total' => $dbForProject->count('providers', $filterQueries, APP_LIMIT_COUNT),
'providers' => $dbForProject->find('providers', $queries),
'total' => $dbForProject->count('providers', $queries, APP_LIMIT_COUNT),
]), Response::MODEL_PROVIDER_LIST);
});
App::get('/v1/messaging/providers/:providerId')
->desc('Get Provider')
->desc('Get provider')
->groups(['api', 'messaging'])
->label('scope', 'providers.read')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
@ -645,10 +632,10 @@ App::get('/v1/messaging/providers/:providerId')
});
App::patch('/v1/messaging/providers/mailgun/:providerId')
->desc('Update Mailgun Provider')
->desc('Update Mailgun provider')
->groups(['api', 'messaging'])
->label('audits.event', 'providers.update')
->label('audits.resource', 'providers/{response.$id}')
->label('audits.event', 'provider.update')
->label('audits.resource', 'provider/{response.$id}')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -661,7 +648,7 @@ App::patch('/v1/messaging/providers/mailgun/:providerId')
->param('name', '', new Text(128), 'Provider name.', true)
->param('enabled', null, new Boolean(), 'Set as enabled.', true)
->param('isEuRegion', null, new Boolean(), 'Set as eu region.', true)
->param('from', '', new Text(256), 'Sender Email Address.', true)
->param('from', '', new Text(256), 'Sender email address.', true)
->param('apiKey', '', new Text(0), 'Mailgun API Key.', true)
->param('domain', '', new Text(0), 'Mailgun Domain.', true)
->inject('dbForProject')
@ -716,10 +703,10 @@ App::patch('/v1/messaging/providers/mailgun/:providerId')
});
App::patch('/v1/messaging/providers/sendgrid/:providerId')
->desc('Update Sendgrid Provider')
->desc('Update Sendgrid provider')
->groups(['api', 'messaging'])
->label('audits.event', 'providers.update')
->label('audits.resource', 'providers/{response.$id}')
->label('audits.event', 'provider.update')
->label('audits.resource', 'provider/{response.$id}')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -732,7 +719,7 @@ App::patch('/v1/messaging/providers/sendgrid/:providerId')
->param('name', '', new Text(128), 'Provider name.', true)
->param('enabled', null, new Boolean(), 'Set as enabled.', true)
->param('apiKey', '', new Text(0), 'Sendgrid API key.', true)
->param('from', '', new Text(256), 'Sender Email Address.', true)
->param('from', '', new Text(256), 'Sender email address.', true)
->inject('dbForProject')
->inject('response')
->action(function (string $providerId, string $name, ?bool $enabled, string $apiKey, string $from, Database $dbForProject, Response $response) {
@ -775,10 +762,10 @@ App::patch('/v1/messaging/providers/sendgrid/:providerId')
});
App::patch('/v1/messaging/providers/msg91/:providerId')
->desc('Update Msg91 Provider')
->desc('Update Msg91 provider')
->groups(['api', 'messaging'])
->label('audits.event', 'providers.update')
->label('audits.resource', 'providers/{response.$id}')
->label('audits.event', 'provider.update')
->label('audits.resource', 'provider/{response.$id}')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -792,7 +779,7 @@ App::patch('/v1/messaging/providers/msg91/:providerId')
->param('enabled', null, new Boolean(), 'Set as enabled.', true)
->param('senderId', '', new Text(0), 'Msg91 Sender ID.', true)
->param('authKey', '', new Text(0), 'Msg91 Auth Key.', true)
->param('from', '', new Text(256), 'Sender Number.', true)
->param('from', '', new Text(256), 'Sender number.', true)
->inject('dbForProject')
->inject('response')
->action(function (string $providerId, string $name, ?bool $enabled, string $senderId, string $authKey, string $from, Database $dbForProject, Response $response) {
@ -841,10 +828,10 @@ App::patch('/v1/messaging/providers/msg91/:providerId')
});
App::patch('/v1/messaging/providers/telesign/:providerId')
->desc('Update Telesign Provider')
->desc('Update Telesign provider')
->groups(['api', 'messaging'])
->label('audits.event', 'providers.update')
->label('audits.resource', 'providers/{response.$id}')
->label('audits.event', 'provider.update')
->label('audits.resource', 'provider/{response.$id}')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -858,7 +845,7 @@ App::patch('/v1/messaging/providers/telesign/:providerId')
->param('enabled', null, new Boolean(), 'Set as enabled.', true)
->param('username', '', new Text(0), 'Telesign username.', true)
->param('password', '', new Text(0), 'Telesign password.', true)
->param('from', '', new Text(256), 'Sender Number.', true)
->param('from', '', new Text(256), 'Sender number.', true)
->inject('dbForProject')
->inject('response')
->action(function (string $providerId, string $name, ?bool $enabled, string $username, string $password, string $from, Database $dbForProject, Response $response) {
@ -907,14 +894,14 @@ App::patch('/v1/messaging/providers/telesign/:providerId')
});
App::patch('/v1/messaging/providers/textmagic/:providerId')
->desc('Update Textmagic Provider')
->desc('Update TextMagic provider')
->groups(['api', 'messaging'])
->label('audits.event', 'providers.update')
->label('audits.resource', 'providers/{response.$id}')
->label('audits.event', 'provider.update')
->label('audits.resource', 'provider/{response.$id}')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
->label('sdk.method', 'updateTextmagicProvider')
->label('sdk.method', 'updateTextMagicProvider')
->label('sdk.description', '/docs/references/messaging/update-textmagic-provider.md')
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
@ -924,7 +911,7 @@ App::patch('/v1/messaging/providers/textmagic/:providerId')
->param('enabled', null, new Boolean(), 'Set as enabled.', true)
->param('username', '', new Text(0), 'Textmagic username.', true)
->param('apiKey', '', new Text(0), 'Textmagic apiKey.', true)
->param('from', '', new Text(256), 'Sender Number.', true)
->param('from', '', new Text(256), 'Sender number.', true)
->inject('dbForProject')
->inject('response')
->action(function (string $providerId, string $name, ?bool $enabled, string $username, string $apiKey, string $from, Database $dbForProject, Response $response) {
@ -973,10 +960,10 @@ App::patch('/v1/messaging/providers/textmagic/:providerId')
});
App::patch('/v1/messaging/providers/twilio/:providerId')
->desc('Update Twilio Provider')
->desc('Update Twilio provider')
->groups(['api', 'messaging'])
->label('audits.event', 'providers.update')
->label('audits.resource', 'providers/{response.$id}')
->label('audits.event', 'provider.update')
->label('audits.resource', 'provider/{response.$id}')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -990,7 +977,7 @@ App::patch('/v1/messaging/providers/twilio/:providerId')
->param('enabled', null, new Boolean(), 'Set as enabled.', true)
->param('accountSid', null, new Text(0), 'Twilio account secret ID.', true)
->param('authToken', null, new Text(0), 'Twilio authentication token.', true)
->param('from', '', new Text(256), 'Sender Number.', true)
->param('from', '', new Text(256), 'Sender number.', true)
->inject('dbForProject')
->inject('response')
->action(function (string $providerId, string $name, ?bool $enabled, string $accountSid, string $authToken, string $from, Database $dbForProject, Response $response) {
@ -1039,10 +1026,10 @@ App::patch('/v1/messaging/providers/twilio/:providerId')
});
App::patch('/v1/messaging/providers/vonage/:providerId')
->desc('Update Vonage Provider')
->desc('Update Vonage provider')
->groups(['api', 'messaging'])
->label('audits.event', 'providers.update')
->label('audits.resource', 'providers/{response.$id}')
->label('audits.event', 'provider.update')
->label('audits.resource', 'provider/{response.$id}')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -1056,7 +1043,7 @@ App::patch('/v1/messaging/providers/vonage/:providerId')
->param('enabled', null, new Boolean(), 'Set as enabled.', true)
->param('apiKey', '', new Text(0), 'Vonage API key.', true)
->param('apiSecret', '', new Text(0), 'Vonage API secret.', true)
->param('from', '', new Text(256), 'Sender Number.', true)
->param('from', '', new Text(256), 'Sender number.', true)
->inject('dbForProject')
->inject('response')
->action(function (string $providerId, string $name, ?bool $enabled, string $apiKey, string $apiSecret, string $from, Database $dbForProject, Response $response) {
@ -1105,10 +1092,10 @@ App::patch('/v1/messaging/providers/vonage/:providerId')
});
App::patch('/v1/messaging/providers/fcm/:providerId')
->desc('Update FCM Provider')
->desc('Update FCM provider')
->groups(['api', 'messaging'])
->label('audits.event', 'providers.update')
->label('audits.resource', 'providers/{response.$id}')
->label('audits.event', 'provider.update')
->label('audits.resource', 'provider/{response.$id}')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -1156,10 +1143,10 @@ App::patch('/v1/messaging/providers/fcm/:providerId')
App::patch('/v1/messaging/providers/apns/:providerId')
->desc('Update APNS Provider')
->desc('Update APNS provider')
->groups(['api', 'messaging'])
->label('audits.event', 'providers.update')
->label('audits.resource', 'providers/{response.$id}')
->label('audits.event', 'provider.update')
->label('audits.resource', 'provider/{response.$id}')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -1230,10 +1217,10 @@ App::patch('/v1/messaging/providers/apns/:providerId')
});
App::delete('/v1/messaging/providers/:providerId')
->desc('Delete Provider')
->desc('Delete provider')
->groups(['api', 'messaging'])
->label('audits.event', 'providers.delete')
->label('audits.resource', 'providers/{request.id}')
->label('audits.event', 'provider.delete')
->label('audits.resource', 'provider/{request.id}')
->label('scope', 'providers.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -1262,8 +1249,8 @@ App::delete('/v1/messaging/providers/:providerId')
App::post('/v1/messaging/topics')
->desc('Create a topic.')
->groups(['api', 'messaging'])
->label('audits.event', 'topics.create')
->label('audits.resource', 'topics/{response.$id}')
->label('audits.event', 'topic.create')
->label('audits.resource', 'topic/{response.$id}')
->label('scope', 'topics.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -1320,11 +1307,16 @@ App::get('/v1/messaging/topics')
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_TOPIC_LIST)
->param('queries', [], new Topics(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Topics::ALLOWED_ATTRIBUTES), true)
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
->inject('dbForProject')
->inject('response')
->action(function (array $queries, Database $dbForProject, Response $response) {
->action(function (array $queries, string $search, Database $dbForProject, Response $response) {
$queries = Query::parseQueries($queries);
if (!empty($search)) {
$queries[] = Query::search('search', $search);
}
// Get cursor document if there was a cursor query
$cursor = Query::getByType($queries, [Query::TYPE_CURSORAFTER, Query::TYPE_CURSORBEFORE]);
$cursor = reset($cursor);
@ -1340,10 +1332,9 @@ App::get('/v1/messaging/topics')
$cursor->setValue($cursorDocument[0]);
}
$filterQueries = Query::groupByType($queries)['filters'];
$response->dynamic(new Document([
'total' => $dbForProject->count('topics', $filterQueries, APP_LIMIT_COUNT),
'topics' => $dbForProject->find('topics', $queries),
'total' => $dbForProject->count('topics', $queries, APP_LIMIT_COUNT),
]), Response::MODEL_TOPIC_LIST);
});
@ -1377,8 +1368,8 @@ App::get('/v1/messaging/topics/:topicId')
App::patch('/v1/messaging/topics/:topicId')
->desc('Update a topic.')
->groups(['api', 'messaging'])
->label('audits.event', 'topics.update')
->label('audits.resource', 'topics/{response.$id}')
->label('audits.event', 'topic.update')
->label('audits.resource', 'topic/{response.$id}')
->label('scope', 'topics.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -1416,8 +1407,8 @@ App::patch('/v1/messaging/topics/:topicId')
App::delete('/v1/messaging/topics/:topicId')
->desc('Delete a topic.')
->groups(['api', 'messaging'])
->label('audits.event', 'topics.delete')
->label('audits.resource', 'topics/{request.topicId}')
->label('audits.event', 'topic.delete')
->label('audits.resource', 'topic/{request.topicId}')
->label('scope', 'topics.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -1440,7 +1431,7 @@ App::delete('/v1/messaging/topics/:topicId')
$dbForProject->deleteDocument('topics', $topicId);
$queueForDeletes
->setType(DELETE_TYPE_SUBSCRIBERS)
->setType(DELETE_TYPE_TOPIC)
->setDocument($topic);
$response
@ -1449,10 +1440,10 @@ App::delete('/v1/messaging/topics/:topicId')
});
App::post('/v1/messaging/topics/:topicId/subscribers')
->desc('Adds a Subscriber to a Topic.')
->desc('Adds a subscriber to a topic.')
->groups(['api', 'messaging'])
->label('audits.event', 'subscribers.create')
->label('audits.resource', 'subscribers/{response.$id}')
->label('audits.event', 'subscriber.create')
->label('audits.resource', 'subscriber/{response.$id}')
->label('scope', 'subscribers.write')
->label('sdk.auth', [APP_AUTH_TYPE_JWT, APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -1495,7 +1486,7 @@ App::post('/v1/messaging/topics/:topicId/subscribers')
try {
$subscriber = $dbForProject->createDocument('subscribers', $subscriber);
$dbForProject->deleteCachedDocument('topics', $topicId);
Authorization::skip(fn () => $dbForProject->increaseDocumentAttribute('topics', $topicId, 'total', 1));
} catch (DuplicateException) {
throw new Exception(Exception::SUBSCRIBER_ALREADY_EXISTS);
}
@ -1546,12 +1537,10 @@ App::get('/v1/messaging/topics/:topicId/subscribers')
$cursor->setValue($cursorDocument);
}
$filterQueries = Query::groupByType($queries)['filters'];
$response
->dynamic(new Document([
'subscribers' => $dbForProject->find('subscribers', $queries),
'total' => $dbForProject->count('subscribers', $filterQueries, APP_LIMIT_COUNT),
'total' => $dbForProject->count('subscribers', $queries, APP_LIMIT_COUNT),
]), Response::MODEL_SUBSCRIBER_LIST);
});
@ -1588,10 +1577,10 @@ App::get('/v1/messaging/topics/:topicId/subscriber/:subscriberId')
});
App::delete('/v1/messaging/topics/:topicId/subscriber/:subscriberId')
->desc('Delete a Subscriber from a Topic.')
->desc('Delete a subscriber from a topic.')
->groups(['api', 'messaging'])
->label('audits.event', 'subscribers.delete')
->label('audits.resource', 'subscribers/{request.subscriberId}')
->label('audits.event', 'subscriber.delete')
->label('audits.resource', 'subscriber/{request.subscriberId}')
->label('scope', 'subscribers.write')
->label('sdk.auth', [APP_AUTH_TYPE_JWT, APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -1616,8 +1605,9 @@ App::delete('/v1/messaging/topics/:topicId/subscriber/:subscriberId')
if ($subscriber->isEmpty() || $subscriber->getAttribute('topicId') !== $topicId) {
throw new Exception(Exception::SUBSCRIBER_NOT_FOUND);
}
$subscriber = $dbForProject->deleteDocument('subscribers', $subscriberId);
$dbForProject->deleteCachedDocument('topics', $topicId);
Authorization::skip(fn () => $dbForProject->decreaseDocumentAttribute('topics', $topicId, 'total', 1));
$response
->setStatusCode(Response::STATUS_CODE_NOCONTENT)
@ -1627,8 +1617,8 @@ App::delete('/v1/messaging/topics/:topicId/subscriber/:subscriberId')
App::post('/v1/messaging/messages/email')
->desc('Create an email.')
->groups(['api', 'messaging'])
->label('audits.event', 'messages.create')
->label('audits.resource', 'messages/{response.$id}')
->label('audits.event', 'message.create')
->label('audits.resource', 'message/{response.$id}')
->label('scope', 'messages.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -1642,7 +1632,7 @@ App::post('/v1/messaging/messages/email')
->param('to', [], new ArrayList(new Text(Database::LENGTH_KEY)), 'List of Topic IDs or List of User IDs or List of Target IDs.')
->param('subject', '', new Text(998), 'Email Subject.')
->param('content', '', new Text(64230), 'Email Content.')
->param('description', '', new Text(256), 'Description for Message.', true)
->param('description', '', new Text(256), 'Description for message.', true)
->param('status', 'processing', new WhiteList(['draft', 'processing']), 'Message Status. Value must be either draft or processing.', true)
->param('html', false, new Boolean(), 'Is content of type HTML', true)
->param('deliveryTime', null, new DatetimeValidator(requireDateInFuture: true), 'Delivery time for message in ISO 8601 format. DateTime value must be in future.', true)
@ -1693,8 +1683,8 @@ App::post('/v1/messaging/messages/email')
App::post('/v1/messaging/messages/sms')
->desc('Create an SMS.')
->groups(['api', 'messaging'])
->label('audits.event', 'messages.create')
->label('audits.resource', 'messages/{response.$id}')
->label('audits.event', 'message.create')
->label('audits.resource', 'message/{response.$id}')
->label('scope', 'messages.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -1756,8 +1746,8 @@ App::post('/v1/messaging/messages/sms')
App::post('/v1/messaging/messages/push')
->desc('Create a push notification.')
->groups(['api', 'messaging'])
->label('audits.event', 'messages.create')
->label('audits.resource', 'messages/{response.$id}')
->label('audits.event', 'message.create')
->label('audits.resource', 'message/{response.$id}')
->label('scope', 'messages.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -1856,7 +1846,7 @@ App::post('/v1/messaging/messages/push')
});
App::get('/v1/messaging/messages')
->desc('List Messages')
->desc('List messages')
->groups(['api', 'messaging'])
->label('scope', 'messages.read')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
@ -1867,11 +1857,16 @@ App::get('/v1/messaging/messages')
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_MESSAGE_LIST)
->param('queries', [], new Messages(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Providers::ALLOWED_ATTRIBUTES), true)
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
->inject('dbForProject')
->inject('response')
->action(function (array $queries, Database $dbForProject, Response $response) {
->action(function (array $queries, string $search, Database $dbForProject, Response $response) {
$queries = Query::parseQueries($queries);
if (!empty($search)) {
$queries[] = Query::search('search', $search);
}
// Get cursor document if there was a cursor query
$cursor = Query::getByType($queries, [Query::TYPE_CURSORAFTER, Query::TYPE_CURSORBEFORE]);
$cursor = reset($cursor);
@ -1887,15 +1882,14 @@ App::get('/v1/messaging/messages')
$cursor->setValue($cursorDocument);
}
$filterQueries = Query::groupByType($queries)['filters'];
$response->dynamic(new Document([
'total' => $dbForProject->count('messages', $filterQueries, APP_LIMIT_COUNT),
'messages' => $dbForProject->find('messages', $queries),
'total' => $dbForProject->count('messages', $queries, APP_LIMIT_COUNT),
]), Response::MODEL_MESSAGE_LIST);
});
App::get('/v1/messaging/messages/:messageId')
->desc('Get Message')
->desc('Get a message')
->groups(['api', 'messaging'])
->label('scope', 'messages.read')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
@ -1921,8 +1915,8 @@ App::get('/v1/messaging/messages/:messageId')
App::patch('/v1/messaging/messages/email/:messageId')
->desc('Update an email.')
->groups(['api', 'messaging'])
->label('audits.event', 'messages.update')
->label('audits.resource', 'messages/{response.$id}')
->label('audits.event', 'message.update')
->label('audits.resource', 'message/{response.$id}')
->label('scope', 'messages.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -2008,8 +2002,8 @@ App::patch('/v1/messaging/messages/email/:messageId')
App::patch('/v1/messaging/messages/sms/:messageId')
->desc('Update an SMS.')
->groups(['api', 'messaging'])
->label('audits.event', 'messages.update')
->label('audits.resource', 'messages/{response.$id}')
->label('audits.event', 'message.update')
->label('audits.resource', 'message/{response.$id}')
->label('scope', 'messages.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')
@ -2085,8 +2079,8 @@ App::patch('/v1/messaging/messages/sms/:messageId')
App::patch('/v1/messaging/messages/push/:messageId')
->desc('Update a push notification.')
->groups(['api', 'messaging'])
->label('audits.event', 'messages.update')
->label('audits.resource', 'messages/{response.$id}')
->label('audits.event', 'message.update')
->label('audits.resource', 'message/{response.$id}')
->label('scope', 'messages.write')
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'messaging')

View file

@ -164,7 +164,7 @@ App::post('/v1/projects')
'legalTaxId' => ID::custom($legalTaxId),
'services' => new stdClass(),
'platforms' => null,
'authProviders' => [],
'oAuthProviders' => [],
'webhooks' => null,
'keys' => null,
'auths' => $auths,
@ -613,7 +613,7 @@ App::patch('/v1/projects/:projectId/oauth2')
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_PROJECT)
->param('projectId', '', new UID(), 'Project unique ID.')
->param('provider', '', new WhiteList(\array_keys(Config::getParam('authProviders')), true), 'Provider Name')
->param('provider', '', new WhiteList(\array_keys(Config::getParam('oAuthProviders')), true), 'Provider Name')
->param('appId', null, new Text(256), 'Provider app ID. Max length: 256 chars.', true)
->param('secret', null, new text(512), 'Provider secret key. Max length: 512 chars.', true)
->param('enabled', null, new Boolean(), 'Provider status. Set to \'false\' to disable new session creation.', true)
@ -627,7 +627,7 @@ App::patch('/v1/projects/:projectId/oauth2')
throw new Exception(Exception::PROJECT_NOT_FOUND);
}
$providers = $project->getAttribute('authProviders', []);
$providers = $project->getAttribute('oAuthProviders', []);
if ($appId !== null) {
$providers[$provider . 'Appid'] = $appId;
@ -641,7 +641,7 @@ App::patch('/v1/projects/:projectId/oauth2')
$providers[$provider . 'Enabled'] = $enabled;
}
$project = $dbForConsole->updateDocument('projects', $project->getId(), $project->setAttribute('authProviders', $providers));
$project = $dbForConsole->updateDocument('projects', $project->getId(), $project->setAttribute('oAuthProviders', $providers));
$response->dynamic($project, Response::MODEL_PROJECT);
});

View file

@ -380,7 +380,6 @@ App::post('/v1/teams/:teamId/memberships')
->param('roles', [], new ArrayList(new Key(), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Array of strings. Use this param to set the user roles in the team. A role can be any string. Learn more about [roles and permissions](https://appwrite.io/docs/permissions). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' roles are allowed, each 32 characters long.')
->param('url', '', fn($clients) => new Host($clients), 'URL to redirect the user back to your app from the invitation email. Only URLs from hostnames in your project platform list are allowed. This requirement helps to prevent an [open redirect](https://cheatsheetseries.owasp.org/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.html) attack against your project API.', true, ['clients']) // TODO add our own built-in confirm page
->param('name', '', new Text(128), 'Name of the new team member. Max length: 128 chars.', true)
->param('from', '', new Text(128), 'Sender of the message. It can be alphanumeric (Ex: MyCompany20). Restrictions may apply depending of the destination.', true)
->inject('response')
->inject('project')
->inject('user')
@ -389,7 +388,7 @@ App::post('/v1/teams/:teamId/memberships')
->inject('queueForMails')
->inject('queueForMessaging')
->inject('queueForEvents')
->action(function (string $teamId, string $email, string $userId, string $phone, array $roles, string $url, string $name, string $from, Response $response, Document $project, Document $user, Database $dbForProject, Locale $locale, Mail $queueForMails, Messaging $queueForMessaging, Event $queueForEvents) {
->action(function (string $teamId, string $email, string $userId, string $phone, array $roles, string $url, string $name, Response $response, Document $project, Document $user, Database $dbForProject, Locale $locale, Mail $queueForMails, Messaging $queueForMessaging, Event $queueForEvents) {
$isAPIKey = Auth::isAppUser(Authorization::getRoles());
$isPrivilegedUser = Auth::isPrivilegedUser(Authorization::getRoles());
@ -634,7 +633,7 @@ App::post('/v1/teams/:teamId/memberships')
;
} elseif (!empty($phone)) {
$provider = Authorization::skip(fn () => $dbForProject->findOne('providers', [
Query::equal('default', [true, false]),
Query::equal('default', [true]),
Query::equal('type', ['sms'])
]));

View file

@ -382,7 +382,7 @@ App::post('/v1/users/scrypt-modified')
App::post('/v1/users/:userId/targets')
->desc('Create User Target')
->groups(['api', 'users'])
->label('audits.event', 'users.targets.create')
->label('audits.event', 'target.create')
->label('audits.resource', 'target/response.$id')
->label('scope', 'targets.write')
->label('sdk.auth', [APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_ADMIN])
@ -1201,7 +1201,7 @@ App::patch('/v1/users/:userId/prefs')
App::patch('/v1/users/:userId/targets/:targetId/identifier')
->desc('Update user target\'s identifier')
->groups(['api', 'users'])
->label('audits.event', 'users.targets.update')
->label('audits.event', 'target.update')
->label('audits.resource', 'target/{response.$id}')
->label('scope', 'targets.write')
->label('sdk.auth', [APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_ADMIN])
@ -1376,7 +1376,7 @@ App::delete('/v1/users/:userId')
App::delete('/v1/users/:userId/targets/:targetId')
->desc('Delete user target')
->groups(['api', 'users'])
->label('audits.event', 'users.targets.delete')
->label('audits.event', 'target.delete')
->label('audits.resource', 'target/{request.$targetId}')
->label('scope', 'targets.write')
->label('sdk.auth', [APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_ADMIN])
@ -1455,7 +1455,7 @@ App::get('/v1/users/usage')
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_USAGE_USERS)
->param('range', '30d', new WhiteList(['24h', '7d', '30d', '90d'], true), 'Date range.', true)
->param('provider', '', new WhiteList(\array_merge(['email', 'anonymous'], \array_map(fn ($value) => "oauth-" . $value, \array_keys(Config::getParam('authProviders', [])))), true), 'Provider Name.', true)
->param('provider', '', new WhiteList(\array_merge(['email', 'anonymous'], \array_map(fn ($value) => "oauth-" . $value, \array_keys(Config::getParam('oAuthProviders', [])))), true), 'Provider Name.', true)
->inject('response')
->inject('dbForProject')
->inject('register')

View file

@ -98,6 +98,7 @@ const APP_LIMIT_COMPRESSION = 20000000; //20MB
const APP_LIMIT_ARRAY_PARAMS_SIZE = 100; // Default maximum of how many elements can there be in API parameter that expects array value
const APP_LIMIT_ARRAY_ELEMENT_SIZE = 4096; // Default maximum length of element in array parameter represented by maximum URL length.
const APP_LIMIT_SUBQUERY = 1000;
const APP_LIMIT_SUBSCRIBERS_SUBQUERY = 1000000;
const APP_LIMIT_WRITE_RATE_DEFAULT = 60; // Default maximum write rate per rate period
const APP_LIMIT_WRITE_RATE_PERIOD_DEFAULT = 60; // Default maximum write rate period in seconds
const APP_LIMIT_LIST_DEFAULT = 25; // Default maximum number of items to return in list API calls
@ -168,7 +169,7 @@ const DELETE_TYPE_SESSIONS = 'sessions';
const DELETE_TYPE_CACHE_BY_TIMESTAMP = 'cacheByTimeStamp';
const DELETE_TYPE_CACHE_BY_RESOURCE = 'cacheByResource';
const DELETE_TYPE_SCHEDULES = 'schedules';
const DELETE_TYPE_SUBSCRIBERS = 'subscribers';
const DELETE_TYPE_TOPIC = 'topic';
// Compression type
const COMPRESSION_TYPE_NONE = 'none';
const COMPRESSION_TYPE_GZIP = 'gzip';
@ -233,7 +234,7 @@ App::setMode(App::getEnv('_APP_ENV', App::MODE_TYPE_PRODUCTION));
Config::load('events', __DIR__ . '/config/events.php');
Config::load('auth', __DIR__ . '/config/auth.php');
Config::load('errors', __DIR__ . '/config/errors.php');
Config::load('authProviders', __DIR__ . '/config/authProviders.php');
Config::load('oAuthProviders', __DIR__ . '/config/oAuthProviders.php');
Config::load('platforms', __DIR__ . '/config/platforms.php');
Config::load('collections', __DIR__ . '/config/collections.php');
Config::load('runtimes', __DIR__ . '/config/runtimes.php');
@ -531,6 +532,7 @@ Database::addFilter(
return Authorization::skip(fn() => $database
->find('targets', [
Query::equal('userInternalId', [$document->getInternalId()]),
Query::limit(APP_LIMIT_SUBQUERY)
]));
}
);
@ -546,6 +548,7 @@ Database::addFilter(
$database
->find('subscribers', [
Query::equal('topicInternalId', [$document->getInternalId()]),
Query::limit(APP_LIMIT_SUBSCRIBERS_SUBQUERY)
])
));
if (\count($targetIds) > 0) {
@ -1128,7 +1131,7 @@ App::setResource('console', function () {
],
'authWhitelistEmails' => (!empty(App::getEnv('_APP_CONSOLE_WHITELIST_EMAILS', null))) ? \explode(',', App::getEnv('_APP_CONSOLE_WHITELIST_EMAILS', null)) : [],
'authWhitelistIPs' => (!empty(App::getEnv('_APP_CONSOLE_WHITELIST_IPS', null))) ? \explode(',', App::getEnv('_APP_CONSOLE_WHITELIST_IPS', null)) : [],
'authProviders' => [
'oAuthProviders' => [
'githubEnabled' => true,
'githubSecret' => App::getEnv('_APP_CONSOLE_GITHUB_SECRET', ''),
'githubAppid' => App::getEnv('_APP_CONSOLE_GITHUB_APP_ID', '')

2
composer.lock generated
View file

@ -5822,5 +5822,5 @@
"platform-overrides": {
"php": "8.0"
},
"plugin-api-version": "2.3.0"
"plugin-api-version": "2.6.0"
}

View file

@ -37,7 +37,7 @@ Finally, you will need to create a `feat-XXX-YYY-oauth` branch based on the `mas
The first step in adding a new OAuth2 provider is to add it to the list of providers located at:
```
app/config/authProviders.php
app/config/oAuthProviders.php
```
Make sure to fill in all data needed and that your provider array key name:
@ -45,7 +45,7 @@ Make sure to fill in all data needed and that your provider array key name:
- is in [`camelCase`](https://en.wikipedia.org/wiki/Camel_case) format for sentence, but lowercase for names. `github` must be all lowercased, but `paypalSandbox` should have uppercase S
- has no spaces or special characters
> Please make sure to keep the list of providers in `authProviders.php` in the alphabetical order A-Z.
> Please make sure to keep the list of providers in `oAuthProviders.php` in the alphabetical order A-Z.
### 2.2 Add Provider Logo
@ -199,7 +199,7 @@ If you need any help with the contribution, feel free to head over to [our Disco
If your OAuth provider requires special configuration apart from `clientId` and `clientSecret` you can create a custom form. Currently this is being realized through putting all custom fields as JSON into the `clientSecret` field to keep the project API stable. You can implement your custom form following these steps:
1. Add your custom form in `app/views/console/users/oauth/[PROVIDER].phtml`. Below is a template you can use. Add the filename to `app/config/authProviders.php`.
1. Add your custom form in `app/views/console/users/oauth/[PROVIDER].phtml`. Below is a template you can use. Add the filename to `app/config/oAuthProviders.php`.
```php
<?php

View file

@ -34,7 +34,7 @@ class V15 extends Migration
['email', 'anonymous'],
\array_map(
fn ($value) => "oauth-" . $value,
\array_keys(Config::getParam('authProviders', []))
\array_keys(Config::getParam('oAuthProviders', []))
)
);

View file

@ -124,23 +124,23 @@ class V16 extends Migration
/**
* Enable OAuth providers with data
*/
$authProviders = $document->getAttribute('authProviders', []);
$oAuthProviders = $document->getAttribute('oAuthProviders', []);
foreach (Config::getParam('authProviders') as $provider => $value) {
foreach (Config::getParam('oAuthProviders') as $provider => $value) {
if (!$value['enabled']) {
continue;
}
if (($authProviders[$provider . 'Appid'] ?? false) && ($authProviders[$provider . 'Secret'] ?? false)) {
if (array_key_exists($provider . 'Enabled', $authProviders)) {
if (($oAuthProviders[$provider . 'Appid'] ?? false) && ($oAuthProviders[$provider . 'Secret'] ?? false)) {
if (array_key_exists($provider . 'Enabled', $oAuthProviders)) {
continue;
}
$authProviders[$provider . 'Enabled'] = true;
$oAuthProviders[$provider . 'Enabled'] = true;
}
}
$document->setAttribute('authProviders', $authProviders);
$document->setAttribute('oAuthProviders', $oAuthProviders);
break;
}

View file

@ -150,8 +150,8 @@ class Deletes extends Action
case DELETE_TYPE_SCHEDULES:
$this->deleteSchedules($dbForConsole, $getProjectDB, $datetime);
break;
case DELETE_TYPE_SUBSCRIBERS:
$this->deleteSubscribers($project, $getProjectDB, $document);
case DELETE_TYPE_TOPIC:
$this->deleteTopic($project, $getProjectDB, $document);
break;
default:
Console::error('No delete operation for type: ' . $type);
@ -202,7 +202,7 @@ class Deletes extends Action
* @param Document $topic
* @throws Exception
*/
protected function deleteSubscribers(Document $project, callable $getProjectDB, Document $topic)
protected function deleteTopic(Document $project, callable $getProjectDB, Document $topic)
{
if ($topic->isEmpty()) {
Console::error('Failed to delete subscribers. Topic not found');

View file

@ -31,13 +31,6 @@ use function Swoole\Coroutine\batch;
class Messaging extends Action
{
protected ?SMSAdapter $sms = null;
protected ?PushAdapter $push = null;
protected ?EmailAdapter $email = null;
protected ?Database $dbForProject = null;
public static function getName(): string
{
return "messaging";

View file

@ -12,8 +12,7 @@ class Messages extends Base
'deliveryErrors',
'status',
'description',
'data',
'search'
'data'
];
/**

View file

@ -60,8 +60,8 @@ class V13 extends Filter
protected function parseProject($content)
{
$content['providers'] = $content['authProviders'];
unset($content['authProviders']);
$content['providers'] = $content['oAuthProviders'];
unset($content['oAuthProviders']);
return $content;
}

View file

@ -88,9 +88,9 @@ class V16 extends Filter
protected function parseProject(array $content)
{
foreach ($content['authProviders'] ?? [] as $i => $provider) {
$content['authProviders'][$i]['name'] = \ucfirst($provider['key']);
unset($content['authProviders'][$i]['key']);
foreach ($content['oAuthProviders'] ?? [] as $i => $provider) {
$content['oAuthProviders'][$i]['name'] = \ucfirst($provider['key']);
unset($content['oAuthProviders'][$i]['key']);
}
$content['domains'] = [];

View file

@ -138,7 +138,7 @@ class Project extends Model
'default' => false,
'example' => true,
])
->addRule('authProviders', [
->addRule('oAuthProviders', [
'type' => Response::MODEL_AUTH_PROVIDER,
'description' => 'List of Auth Providers.',
'default' => [],
@ -328,9 +328,9 @@ class Project extends Model
$document->setAttribute('auth' . ucfirst($key), $value);
}
// Providers
$providers = Config::getParam('authProviders', []);
$providerValues = $document->getAttribute('authProviders', []);
// OAuth Providers
$providers = Config::getParam('oAuthProviders', []);
$providerValues = $document->getAttribute('oAuthProviders', []);
$projectProviders = [];
foreach ($providers as $key => $provider) {
@ -348,7 +348,7 @@ class Project extends Model
]);
}
$document->setAttribute('authProviders', $projectProviders);
$document->setAttribute('oAuthProviders', $projectProviders);
return $document;
}

View file

@ -28,6 +28,12 @@ class Topic extends Model
'default' => '',
'example' => 'events',
])
->addRule('total', [
'type' => self::TYPE_INTEGER,
'description' => 'Total count of subscribers subscribed to topic.',
'default' => 0,
'example' => 100,
])
->addRule('description', [
'type' => self::TYPE_STRING,
'description' => 'Description of the topic.',

View file

@ -1784,8 +1784,8 @@ trait Base
}
}';
case self::$CREATE_MAILGUN_PROVIDER:
return 'mutation createMailgunProvider($providerId: String!, $name: String!, $domain: String!, $apiKey: String!, $from: String!) {
messagingCreateMailgunProvider(providerId: $providerId, name: $name, domain: $domain, apiKey: $apiKey, from: $from) {
return 'mutation createMailgunProvider($providerId: String!, $name: String!, $domain: String!, $apiKey: String!, $from: String!, $isEuRegion: Boolean!) {
messagingCreateMailgunProvider(providerId: $providerId, name: $name, domain: $domain, apiKey: $apiKey, from: $from, isEuRegion: $isEuRegion) {
_id
name
provider
@ -1828,8 +1828,8 @@ trait Base
}
}';
case self::$CREATE_TEXTMAGIC_PROVIDER:
return 'mutation createTextmagicProvider($providerId: String!, $name: String!, $from: String!, $username: String!, $apiKey: String!) {
messagingCreateTextmagicProvider(providerId: $providerId, name: $name, from: $from, username: $username, apiKey: $apiKey) {
return 'mutation createTextMagicProvider($providerId: String!, $name: String!, $from: String!, $username: String!, $apiKey: String!) {
messagingCreateTextMagicProvider(providerId: $providerId, name: $name, from: $from, username: $username, apiKey: $apiKey) {
_id
name
provider
@ -1839,8 +1839,8 @@ trait Base
}
}';
case self::$CREATE_MSG91_PROVIDER:
return 'mutation createMsg91Provider($providerId: String!, $name: String!, $from: String!, $senderId: String!, $authKey: String!, $default: Boolean, $enabled: Boolean) {
messagingCreateMsg91Provider(providerId: $providerId, name: $name, from: $from, senderId: $senderId, authKey: $authKey, default: $default, enabled: $enabled) {
return 'mutation createMsg91Provider($providerId: String!, $name: String!, $from: String!, $senderId: String!, $authKey: String!, $enabled: Boolean) {
messagingCreateMsg91Provider(providerId: $providerId, name: $name, from: $from, senderId: $senderId, authKey: $authKey, enabled: $enabled) {
_id
name
provider
@ -1952,8 +1952,8 @@ trait Base
}
}';
case self::$UPDATE_TEXTMAGIC_PROVIDER:
return 'mutation updateTextmagicProvider($providerId: String!, $name: String!, $username: String!, $apiKey: String!) {
messagingUpdateTextmagicProvider(providerId: $providerId, name: $name, username: $username, apiKey: $apiKey) {
return 'mutation updateTextMagicProvider($providerId: String!, $name: String!, $username: String!, $apiKey: String!) {
messagingUpdateTextMagicProvider(providerId: $providerId, name: $name, username: $username, apiKey: $apiKey) {
_id
name
provider

View file

@ -22,14 +22,15 @@ class MessagingTest extends Scope
'providerId' => ID::unique(),
'name' => 'Sengrid1',
'apiKey' => 'my-apikey',
'from' => 'sender-email@my-domain',
'from' => 'sender-email@my-domain.com',
],
'Mailgun' => [
'providerId' => ID::unique(),
'name' => 'Mailgun1',
'apiKey' => 'my-apikey',
'domain' => 'my-domain',
'from' => 'sender-email@my-domain',
'from' => 'sender-email@my-domain.com',
'isEuRegion' => false,
],
'Twilio' => [
'providerId' => ID::unique(),
@ -45,7 +46,7 @@ class MessagingTest extends Scope
'password' => 'my-password',
'from' => '+123456789',
],
'Textmagic' => [
'TextMagic' => [
'providerId' => ID::unique(),
'name' => 'Textmagic1',
'username' => 'my-username',
@ -95,6 +96,7 @@ class MessagingTest extends Scope
'x-appwrite-project' => $this->getProject()['$id'],
'x-appwrite-key' => $this->getProject()['apiKey'],
]), $graphQLPayload);
var_dump($response['body']);
\array_push($providers, $response['body']['data']['messagingCreate' . $key . 'Provider']);
$this->assertEquals(200, $response['headers']['status-code']);
$this->assertEquals($providersParams[$key]['name'], $response['body']['data']['messagingCreate' . $key . 'Provider']['name']);
@ -132,7 +134,7 @@ class MessagingTest extends Scope
'username' => 'my-username',
'password' => 'my-password',
],
'Textmagic' => [
'TextMagic' => [
'providerId' => $providers[4]['_id'],
'name' => 'Textmagic2',
'username' => 'my-username',
@ -271,7 +273,7 @@ class MessagingTest extends Scope
'providerId' => ID::unique(),
'name' => 'Sengrid1',
'apiKey' => 'my-apikey',
'from' => 'sender-email@my-domain',
'from' => 'sender-email@my-domain.com',
]
];
$query = $this->getQuery(self::$CREATE_SENDGRID_PROVIDER);

View file

@ -60,7 +60,7 @@ class UsersTest extends Scope
'name' => 'Mailgun1',
'apiKey' => 'api-key',
'domain' => 'domain',
'from' => 'from@domain',
'from' => 'from@domain.com',
'isEuRegion' => false,
],
];

View file

@ -15,14 +15,15 @@ trait MessagingBase
'providerId' => ID::unique(),
'name' => 'Sengrid1',
'apiKey' => 'my-apikey',
'from' => 'sender-email@my-domain',
'from' => 'sender-email@my-domain.com',
],
'mailgun' => [
'providerId' => ID::unique(),
'name' => 'Mailgun1',
'apiKey' => 'my-apikey',
'domain' => 'my-domain',
'from' => 'sender-email@my-domain',
'from' => 'sender-email@my-domain.com',
'isEuRegion' => false,
],
'twilio' => [
'providerId' => ID::unique(),
@ -225,7 +226,7 @@ trait MessagingBase
'providerId' => 'unique()',
'name' => 'Sendgrid1',
'apiKey' => 'my-apikey',
'from' => 'sender-email@my-domain',
'from' => 'sender-email@my-domain.com',
]);
$this->assertEquals(201, $provider['headers']['status-code']);
$response = $this->client->call(Client::METHOD_POST, '/messaging/topics', [
@ -287,6 +288,7 @@ trait MessagingBase
$this->assertEquals(200, $response['headers']['status-code']);
$this->assertEquals('android-app', $response['body']['name']);
$this->assertEquals('updated-description', $response['body']['description']);
$this->assertEquals(0, $response['body']['total']);
}
/**
@ -310,12 +312,23 @@ trait MessagingBase
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
], $this->getHeaders()), [
'subscriberId' => 'unique()',
'subscriberId' => ID::unique(),
'targetId' => $target['body']['$id'],
]);
$this->assertEquals(201, $response['headers']['status-code']);
$topic = $this->client->call(Client::METHOD_GET, '/messaging/topics/' . $topic['$id'], [
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
'x-appwrite-key' => $this->getProject()['apiKey'],
]);
$this->assertEquals(200, $topic['headers']['status-code']);
$this->assertEquals('android-app', $topic['body']['name']);
$this->assertEquals('updated-description', $topic['body']['description']);
$this->assertEquals(1, $topic['body']['total']);
return [
'topicId' => $topic['$id'],
'topicId' => $topic['body']['$id'],
'targetId' => $target['body']['$id'],
'subscriberId' => $response['body']['$id']
];
@ -360,7 +373,19 @@ trait MessagingBase
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
], $this->getHeaders()));
$this->assertEquals(204, $response['headers']['status-code']);
$topic = $this->client->call(Client::METHOD_GET, '/messaging/topics/' . $data['topicId'], [
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
'x-appwrite-key' => $this->getProject()['apiKey'],
]);
$this->assertEquals(200, $topic['headers']['status-code']);
$this->assertEquals('android-app', $topic['body']['name']);
$this->assertEquals('updated-description', $topic['body']['description']);
$this->assertEquals(0, $topic['body']['total']);
}
/**

View file

@ -794,7 +794,7 @@ class ProjectsConsoleClientTest extends Scope
public function testUpdateProjectOAuth($data): array
{
$id = $data['projectId'] ?? '';
$providers = require('app/config/authProviders.php');
$providers = require('app/config/oAuthProviders.php');
/**
* Test for SUCCESS
@ -825,7 +825,7 @@ class ProjectsConsoleClientTest extends Scope
foreach ($providers as $key => $provider) {
$asserted = false;
foreach ($response['body']['authProviders'] as $responseProvider) {
foreach ($response['body']['oAuthProviders'] as $responseProvider) {
if ($responseProvider['key'] === $key) {
$this->assertEquals('AppId-' . ucfirst($key), $responseProvider['appId']);
$this->assertEquals('Secret-' . ucfirst($key), $responseProvider['secret']);
@ -867,7 +867,7 @@ class ProjectsConsoleClientTest extends Scope
$i = 0;
foreach ($providers as $key => $provider) {
$asserted = false;
foreach ($response['body']['authProviders'] as $responseProvider) {
foreach ($response['body']['oAuthProviders'] as $responseProvider) {
if ($responseProvider['key'] === $key) {
// On first provider, test enabled=false
$this->assertEquals($i !== 0, $responseProvider['enabled']);

View file

@ -154,9 +154,9 @@ class V16Test extends TestCase
public function projectProvider(): array
{
return [
'authProviders' => [
'oAuthProviders' => [
[
'authProviders' => [
'oAuthProviders' => [
[
'key' => 'github',
'name' => 'GitHub',
@ -167,7 +167,7 @@ class V16Test extends TestCase
],
],
[
'authProviders' => [
'oAuthProviders' => [
[
'name' => 'Github',
'appId' => 'client_id',