diff --git a/app/config/collections.php b/app/config/collections.php index bfc222e34f..be485316ab 100644 --- a/app/config/collections.php +++ b/app/config/collections.php @@ -1437,22 +1437,61 @@ $commonCollections = [ 'default' => null, 'array' => false, 'filters' => ['json', 'encrypt'], - ] + ], + [ + '$id' => ID::custom('search'), + 'type' => Database::VAR_STRING, + 'format' => '', + 'size' => 65535, + 'signed' => true, + 'required' => false, + 'default' => null, + 'array' => false, + 'filters' => [], + ], ], 'indexes' => [ [ '$id' => ID::custom('_key_provider'), 'type' => Database::INDEX_KEY, 'attributes' => ['provider'], - 'lengths' => [128], + 'lengths' => [], 'orders' => [Database::ORDER_ASC], ], [ '$id' => ID::custom('_key_name'), 'type' => Database::INDEX_FULLTEXT, 'attributes' => ['name'], - 'lengths' => [128], + 'lengths' => [], 'orders' => [Database::ORDER_ASC], + ], + [ + '$id' => ID::custom('_key_type'), + 'type' => Database::INDEX_KEY, + 'attributes' => ['type'], + 'lengths' => [], + 'orders' => [Database::ORDER_ASC], + ], + [ + '$id' => ID::custom('_key_default'), + 'type' => Database::INDEX_KEY, + 'attributes' => ['default'], + 'lengths' => [], + 'orders' => [Database::ORDER_ASC], + ], + [ + '$id' => ID::custom('_key_default_type'), + 'type' => Database::INDEX_KEY, + 'attributes' => ['default, type'], + 'lengths' => [], + 'orders' => [Database::ORDER_ASC], + ], + [ + '$id' => ID::custom('_key_search'), + 'type' => Database::INDEX_FULLTEXT, + 'attributes' => ['search'], + 'lengths' => [], + 'orders' => [], ] ], ], @@ -1488,7 +1527,7 @@ $commonCollections = [ '$id' => ID::custom('data'), 'type' => Database::VAR_STRING, 'format' => '', - 'size' => 16384, + 'size' => 65535, 'signed' => true, 'required' => true, 'default' => null, @@ -1499,7 +1538,7 @@ $commonCollections = [ '$id' => ID::custom('to'), 'type' => Database::VAR_STRING, 'format' => '', - 'size' => 16834, + 'size' => 65535, 'signed' => true, 'required' => true, 'default' => null, @@ -1518,14 +1557,14 @@ $commonCollections = [ 'filters' => ['datetime'], ], [ - '$id' => ID::custom('deliveryError'), + '$id' => ID::custom('deliveryErrors'), 'type' => Database::VAR_STRING, 'format' => '', - 'size' => 2048, + 'size' => 65535, 'signed' => true, 'required' => false, 'default' => null, - 'array' => false, + 'array' => true, 'filters' => [], ], [ @@ -1567,14 +1606,14 @@ $commonCollections = [ '$id' => ID::custom('_key_providerId'), 'type' => Database::INDEX_KEY, 'attributes' => ['providerId'], - 'lengths' => [128], + 'lengths' => [], 'orders' => [Database::ORDER_ASC], ], [ '$id' => ID::custom('_key_providerInternalId'), 'type' => Database::INDEX_KEY, 'attributes' => ['providerInternalId'], - 'lengths' => [128], + 'lengths' => [], 'orders' => [Database::ORDER_ASC], ], [ @@ -1646,21 +1685,32 @@ $commonCollections = [ 'default' => null, 'array' => false, 'filters' => ['subQueryTopicTargets'], - ] + ], + [ + '$id' => ID::custom('search'), + 'type' => Database::VAR_STRING, + 'format' => '', + 'size' => 16384, + 'signed' => true, + 'required' => false, + 'default' => null, + 'array' => false, + 'filters' => [], + ], ], 'indexes' => [ [ '$id' => ID::custom('_key_providerId'), 'type' => Database::INDEX_KEY, 'attributes' => ['providerId'], - 'lengths' => [128], + 'lengths' => [], 'orders' => [Database::ORDER_ASC], ], [ '$id' => ID::custom('_key_providerInternalId'), 'type' => Database::INDEX_KEY, 'attributes' => ['providerInternalId'], - 'lengths' => [128], + 'lengths' => [], 'orders' => [Database::ORDER_ASC], ], [ @@ -1671,12 +1721,12 @@ $commonCollections = [ 'orders' => [], ], [ - '$id' => ID::custom('_key_description'), + '$id' => ID::custom('_key_search'), 'type' => Database::INDEX_FULLTEXT, - 'attributes' => ['description'], + 'attributes' => ['name'], 'lengths' => [], - 'orders' => [], - ], + 'orders' => [Database::ORDER_ASC], + ] ], ], @@ -1826,7 +1876,7 @@ $commonCollections = [ '$id' => ID::custom('identifier'), 'type' => Database::VAR_STRING, 'format' => '', - 'size' => Database::LENGTH_KEY, + 'size' => 2048, 'signed' => true, 'required' => true, 'default' => null, @@ -1839,14 +1889,14 @@ $commonCollections = [ '$id' => ID::custom('_key_userId'), 'type' => Database::INDEX_KEY, 'attributes' => ['userId'], - 'lengths' => [128], + 'lengths' => [], 'orders' => [Database::ORDER_ASC], ], [ '$id' => ID::custom('_key_userInternalId'), 'type' => Database::INDEX_KEY, 'attributes' => ['userInternalId'], - 'lengths' => [128], + 'lengths' => [], 'orders' => [Database::ORDER_ASC], ], [ diff --git a/app/config/messagingProviders.php b/app/config/messagingProviders.php deleted file mode 100644 index a33665196b..0000000000 --- a/app/config/messagingProviders.php +++ /dev/null @@ -1,300 +0,0 @@ - [ - 'mailchimp' => [ - 'name' => 'Mailchimp', - 'developers' => 'https://mailchimp.com/developer/marketing/api/', - 'icon' => 'icon-mailchimp', - 'enabled' => false, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'mailgun' => [ - 'name' => 'Mailgun', - 'developers' => 'https://documentation.mailgun.com/', - 'icon' => 'icon-mailgun', - 'enabled' => true, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'mailjet' => [ - 'name' => 'Mailjet', - 'developers' => 'https://dev.mailjet.com/', - 'icon' => 'icon-mailjet', - 'enabled' => false, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'postmark' => [ - 'name' => 'Postmark', - 'developers' => 'https://postmarkapp.com/developer', - 'icon' => 'icon-postmark', - 'enabled' => false, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'sendgrid' => [ - 'name' => 'Sendgrid', - 'developers' => 'https://docs.sendgrid.com/api-reference/how-to-use-the-sendgrid-v3-api/', - 'icon' => 'icon-sendgrid', - 'enabled' => true, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'sendinblue' => [ - 'name' => 'SendinBlue', - 'developers' => 'https://developers.sendinblue.com/', - 'icon' => 'icon-sendinblue', - 'enabled' => false, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'mailslurp' => [ - 'name' => 'MailSlurp', - 'developers' => 'https://www.mailslurp.com/docs/', - 'icon' => 'icon-mailslurp', - 'enabled' => false, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'elasticemail' => [ - 'name' => 'ElasticEmail', - 'developers' => 'https://api.elasticemail.com/public/help', - 'icon' => 'icon-elasticemail', - 'enabled' => false, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'ses' => [ - 'name' => 'SES', - 'developers' => 'https://docs.aws.amazon.com/ses/latest/APIReference/', - 'icon' => 'icon-ses', - 'enabled' => false, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - ], - 'sms' => [ - 'africastalking' => [ - 'name' => 'Africa\'s Talking', - 'developers' => 'https://developers.africastalking.com/', - 'icon' => 'icon-africastalking', - 'enabled' => false, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'clickatell' => [ - 'name' => 'Clickatell', - 'developers' => 'https://www.clickatell.com/developers/api-docs/', - 'icon' => 'icon-clickatell', - 'enabled' => false, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'infobip' => [ - 'name' => 'Infobip', - 'developers' => 'https://www.infobip.com/docs/', - 'icon' => 'icon-infobip', - 'enabled' => false, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'msg91' => [ - 'name' => 'Msg91', - 'developers' => 'https://docs.msg91.com/reference/overview', - 'icon' => 'icon-msg91', - 'enabled' => true, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'plivo' => [ - 'name' => 'Plivo', - 'developers' => 'https://developers.plivo.com/', - 'icon' => 'icon-plivo', - 'enabled' => false, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'sinch' => [ - 'name' => 'Sinch', - 'developers' => 'https://developers.sinch.com/', - 'icon' => 'icon-sinch', - 'enabled' => false, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'sms77' => [ - 'name' => 'Sms77', - 'developers' => 'https://sms77.io/docs/gateway/', - 'icon' => 'icon-sms77', - 'enabled' => false, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'telesign' => [ - 'name' => 'Telesign', - 'developers' => 'https://developer.telesign.com/enterprise/docs', - 'icon' => 'icon-telesign', - 'enabled' => true, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'textmagic' => [ - 'name' => 'TextMagic', - 'developers' => 'https://www.textmagic.com/docs/api/', - 'icon' => 'icon-twilio', - 'enabled' => true, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'twilio' => [ - 'name' => 'Twilio', - 'developers' => 'https://www.twilio.com/docs/sms', - 'icon' => 'icon-twilio', - 'enabled' => true, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'twilio-notify' => [ - 'name' => 'Twilio Notify', - 'developers' => 'https://www.twilio.com/docs/notify', - 'icon' => 'icon-twilio', - 'enabled' => true, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'vonage' => [ - 'name' => 'Vonage', - 'developers' => 'https://developer.nexmo.com/', - 'icon' => 'icon-vonage', - 'enabled' => true, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - ], - 'push' => [ - 'apns' => [ - 'name' => 'APNS', - 'developers' => 'https://developer.apple.com/documentation/usernotifications', - 'icon' => 'icon-apns', - 'enabled' => false, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'fcm' => [ - 'name' => 'FCM', - 'developers' => 'https://firebase.google.com/docs/cloud-messaging', - 'icon' => 'icon-fcm', - 'enabled' => true, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'one_signal' => [ - 'name' => 'OneSignal', - 'developers' => 'https://documentation.onesignal.com/docs', - 'icon' => 'icon-onesignal', - 'enabled' => false, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'pushbullet' => [ - 'name' => 'PushBullet', - 'developers' => 'https://docs.pushbullet.com/', - 'icon' => 'icon-pushbullet', - 'enabled' => false, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'pusher' => [ - 'name' => 'Pusher', - 'developers' => 'https://pusher.com/docs', - 'icon' => 'icon-pusher', - 'enabled' => false, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'pushwoosh' => [ - 'name' => 'Pushwoosh', - 'developers' => 'https://www.pushwoosh.com/docs/', - 'icon' => 'icon-pushwoosh', - 'enabled' => false, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'urban_airship' => [ - 'name' => 'Urban Airship', - 'developers' => 'https://docs.airship.com/api/', - 'icon' => 'icon-urbanairship', - 'enabled' => false, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - 'web_push' => [ - 'name' => 'WebPush', - 'developers' => 'https://developer.mozilla.org/en-US/docs/Web/API/Push_API', - 'icon' => 'icon-webpush', - 'enabled' => false, - 'sandbox' => false, - 'form' => false, - 'beta' => false, - 'mock' => false, - ], - ] -]; diff --git a/app/init.php b/app/init.php index 48f1d6fe0f..712d949dc6 100644 --- a/app/init.php +++ b/app/init.php @@ -544,6 +544,47 @@ Database::addFilter( ])); } ); + +Database::addFilter( + 'subQueryProviderType', + function (mixed $value) { + return null; + }, + function (mixed $value, Document $document, Database $database) { + $provider = Authorization::skip(fn () => $database + ->getDocument( + 'providers', + $document->getAttribute('providerId'), + [Query::select(['type'])] + )); + if ($provider) { + return $provider->getAttribute('type'); + } + return null; + } +); + + +Database::addFilter( + 'subQueryTopicTargets', + function (mixed $value) { + return null; + }, + function (mixed $value, Document $document, Database $database) { + $targetIds = Authorization::skip(fn () => \array_map( + fn ($document) => $document->getAttribute('targetId'), + $database + ->find('subscribers', [ + Query::equal('topicInternalId', [$document->getInternalId()]), + Query::limit(APP_LIMIT_SUBQUERY), + ]) + )); + if (\count($targetIds) > 0) { + return $database->find('targets', [Query::equal('$id', $targetIds)]); + } + return []; + } +); /** * DB Formats */ diff --git a/src/Appwrite/Utopia/Response.php b/src/Appwrite/Utopia/Response.php index 90a5546548..7a2a040d94 100644 --- a/src/Appwrite/Utopia/Response.php +++ b/src/Appwrite/Utopia/Response.php @@ -2,9 +2,6 @@ namespace Appwrite\Utopia; -use Appwrite\Utopia\Response\Model\Message; -use Appwrite\Utopia\Response\Model\Subscriber; -use Appwrite\Utopia\Response\Model\Topic; use Exception; use Swoole\Http\Request as SwooleRequest; use Utopia\Swoole\Response as SwooleResponse; @@ -84,6 +81,9 @@ use Appwrite\Utopia\Response\Model\HealthVersion; use Appwrite\Utopia\Response\Model\Installation; use Appwrite\Utopia\Response\Model\LocaleCode; use Appwrite\Utopia\Response\Model\Provider; +use Appwrite\Utopia\Response\Model\Message; +use Appwrite\Utopia\Response\Model\Subscriber; +use Appwrite\Utopia\Response\Model\Topic; use Appwrite\Utopia\Response\Model\ProviderRepository; use Appwrite\Utopia\Response\Model\Runtime; use Appwrite\Utopia\Response\Model\Target; diff --git a/src/Appwrite/Utopia/Response/Model/Message.php b/src/Appwrite/Utopia/Response/Model/Message.php index 177058be9b..150e837853 100644 --- a/src/Appwrite/Utopia/Response/Model/Message.php +++ b/src/Appwrite/Utopia/Response/Model/Message.php @@ -6,7 +6,7 @@ use Appwrite\Utopia\Response; use Appwrite\Utopia\Response\Model; use Utopia\Database\DateTime; -class Message extends Model +class Message extends Any { /** * @var bool @@ -28,17 +28,11 @@ class Message extends Model 'default' => '', 'example' => '5e5ea5c16897e', ]) - ->addRule('data', [ - 'type' => self::TYPE_JSON, - 'description' => 'Message Data.', - 'default' => '', - 'required' => false, - 'example' => '', - ]) ->addRule('to', [ 'type' => self::TYPE_STRING, 'description' => 'Recipient of message.', 'default' => '', + 'array' => true, 'example' => ['user-1'], ]) ->addRule('deliveryTime', [ @@ -53,6 +47,7 @@ class Message extends Model 'description' => 'Delivery error if any.', 'required' => false, 'default' => '', + 'array' => true, 'example' => 'Provider not valid.', ]) ->addRule('deliveredTo', [ @@ -66,12 +61,6 @@ class Message extends Model 'description' => 'Status of delivery.', 'default' => '', 'example' => true, - ]) - ->addRule('search', [ - 'type' => self::TYPE_STRING, - 'description' => 'Field that can be used for searching message.', - 'default' => '', - 'example' => 'Hello everyone', ]); } diff --git a/src/Appwrite/Utopia/Response/Model/Project.php b/src/Appwrite/Utopia/Response/Model/Project.php index 885e7e9af6..5f78ff82cc 100644 --- a/src/Appwrite/Utopia/Response/Model/Project.php +++ b/src/Appwrite/Utopia/Response/Model/Project.php @@ -138,7 +138,7 @@ class Project extends Model 'default' => false, 'example' => true, ]) - ->addRule('providers', [ + ->addRule('authProviders', [ 'type' => Response::MODEL_AUTH_PROVIDER, 'description' => 'List of Auth Providers.', 'default' => [], diff --git a/src/Appwrite/Utopia/Response/Model/Provider.php b/src/Appwrite/Utopia/Response/Model/Provider.php index 0cbc233fc3..668db553fc 100644 --- a/src/Appwrite/Utopia/Response/Model/Provider.php +++ b/src/Appwrite/Utopia/Response/Model/Provider.php @@ -23,19 +23,19 @@ class Provider extends Model ]) ->addRule('name', [ 'type' => self::TYPE_STRING, - 'description' => 'The user-given name for the provider instance.', + 'description' => 'The name for the provider instance.', 'default' => '', 'example' => 'Mailgun', ]) ->addRule('provider', [ 'type' => self::TYPE_STRING, - 'description' => 'Provider name setup in Utopia.', + 'description' => 'The name of the provider service.', 'default' => '', 'example' => 'mailgun', ]) ->addRule('default', [ 'type' => self::TYPE_BOOLEAN, - 'description' => 'Default provider or not.', + 'description' => 'Is this a pre-configured provider instance?', 'default' => '', 'example' => true, ])