diff --git a/app/config/providers.php b/app/config/authProviders.php similarity index 100% rename from app/config/providers.php rename to app/config/authProviders.php diff --git a/app/config/collections.php b/app/config/collections.php index 1c86a222e7..7cc9db49cc 100644 --- a/app/config/collections.php +++ b/app/config/collections.php @@ -5,7 +5,7 @@ use Utopia\Config\Config; use Utopia\Database\Database; use Utopia\Database\Helpers\ID; -$providers = Config::getParam('providers', []); +$providers = Config::getParam('authProviders', []); $auth = Config::getParam('auth', []); /** @@ -1427,6 +1427,17 @@ $commonCollections = [ 'default' => false, 'array' => false, ], + [ + '$id' => ID::custom('enabled'), + 'type' => Database::VAR_BOOLEAN, + 'signed' => true, + 'size' => 0, + 'format' => '', + 'filters' => [], + 'required' => true, + 'default' => true, + 'array' => false, + ], [ '$id' => ID::custom('credentials'), 'type' => Database::VAR_STRING, diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 87dcd95f03..836e87e910 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -298,7 +298,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('providers')), true), 'OAuth2 Provider. Currently, supported providers are: ' . \implode(', ', \array_keys(\array_filter(Config::getParam('providers'), fn($node) => (!$node['mock'])))) . '.') + ->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('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) @@ -357,7 +357,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('providers')), true), 'OAuth2 provider.') + ->param('provider', '', new WhiteList(\array_keys(Config::getParam('authProviders')), 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) @@ -390,7 +390,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('providers')), true), 'OAuth2 provider.') + ->param('provider', '', new WhiteList(\array_keys(Config::getParam('authProviders')), 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) @@ -429,7 +429,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('providers')), true), 'OAuth2 provider.') + ->param('provider', '', new WhiteList(\array_keys(Config::getParam('authProviders')), 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) @@ -457,7 +457,7 @@ App::get('/v1/account/sessions/oauth2/:provider/redirect') throw new Exception(Exception::PROJECT_PROVIDER_UNSUPPORTED); } - $providers = Config::getParam('providers'); + $providers = Config::getParam('authProviders'); $providerName = $providers[$provider]['name'] ?? ''; /** @var Appwrite\Auth\OAuth2 $oauth2 */ diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index 11a9f8c558..c8596b13ef 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -567,7 +567,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('providers')), true), 'Provider Name') + ->param('provider', '', new WhiteList(\array_keys(Config::getParam('authProviders')), 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) diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index bd3ff67662..05d8690595 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -1254,7 +1254,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('providers', [])))), true), 'Provider Name.', true) + ->param('provider', '', new WhiteList(\array_merge(['email', 'anonymous'], \array_map(fn ($value) => "oauth-" . $value, \array_keys(Config::getParam('authProviders', [])))), true), 'Provider Name.', true) ->inject('response') ->inject('dbForProject') ->inject('register') diff --git a/app/init.php b/app/init.php index d953565f62..3300c22878 100644 --- a/app/init.php +++ b/app/init.php @@ -233,7 +233,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('providers', __DIR__ . '/config/providers.php'); +Config::load('authProviders', __DIR__ . '/config/authProviders.php'); Config::load('platforms', __DIR__ . '/config/platforms.php'); Config::load('collections', __DIR__ . '/config/collections.php'); Config::load('runtimes', __DIR__ . '/config/runtimes.php'); diff --git a/docs/tutorials/add-oauth2-provider.md b/docs/tutorials/add-oauth2-provider.md index 734f199693..37c54fb41c 100644 --- a/docs/tutorials/add-oauth2-provider.md +++ b/docs/tutorials/add-oauth2-provider.md @@ -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/providers.php +app/config/authProviders.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 `providers.php` in the alphabetical order A-Z. +> Please make sure to keep the list of providers in `authProviders.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/providers.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/authProviders.php`. ```php "oauth-" . $value, - \array_keys(Config::getParam('providers', [])) + \array_keys(Config::getParam('authProviders', [])) ) ); diff --git a/src/Appwrite/Migration/Version/V16.php b/src/Appwrite/Migration/Version/V16.php index 1d56b246d6..bee2236dfb 100644 --- a/src/Appwrite/Migration/Version/V16.php +++ b/src/Appwrite/Migration/Version/V16.php @@ -126,7 +126,7 @@ class V16 extends Migration */ $authProviders = $document->getAttribute('authProviders', []); - foreach (Config::getParam('providers') as $provider => $value) { + foreach (Config::getParam('authProviders') as $provider => $value) { if (!$value['enabled']) { continue; } diff --git a/src/Appwrite/Utopia/Response.php b/src/Appwrite/Utopia/Response.php index 7e52536eed..85db23b385 100644 --- a/src/Appwrite/Utopia/Response.php +++ b/src/Appwrite/Utopia/Response.php @@ -31,6 +31,7 @@ use Appwrite\Utopia\Response\Model\AttributeIP; use Appwrite\Utopia\Response\Model\AttributeURL; use Appwrite\Utopia\Response\Model\AttributeDatetime; use Appwrite\Utopia\Response\Model\AttributeRelationship; +use Appwrite\Utopia\Response\Model\AuthProvider; use Appwrite\Utopia\Response\Model\BaseList; use Appwrite\Utopia\Response\Model\Branch; use Appwrite\Utopia\Response\Model\Collection; @@ -80,8 +81,12 @@ 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; use Appwrite\Utopia\Response\Model\TemplateSMS; use Appwrite\Utopia\Response\Model\UsageBuckets; use Appwrite\Utopia\Response\Model\UsageCollection; @@ -191,6 +196,18 @@ class Response extends SwooleResponse public const MODEL_PHONE = 'phone'; public const MODEL_PHONE_LIST = 'phoneList'; + // Messaging + public const MODEL_PROVIDER = 'provider'; + public const MODEL_PROVIDER_LIST = 'providerList'; + public const MODEL_MESSAGE = 'message'; + public const MODEL_MESSAGE_LIST = 'messageList'; + public const MODEL_TOPIC = 'topic'; + public const MODEL_TOPIC_LIST = 'topicList'; + public const MODEL_SUBSCRIBER = 'subscriber'; + public const MODEL_SUBSCRIBER_LIST = 'subscriberList'; + public const MODEL_TARGET = 'target'; + public const MODEL_TARGET_LIST = 'targetList'; + // Teams public const MODEL_TEAM = 'team'; public const MODEL_TEAM_LIST = 'teamList'; @@ -238,8 +255,8 @@ class Response extends SwooleResponse public const MODEL_WEBHOOK_LIST = 'webhookList'; public const MODEL_KEY = 'key'; public const MODEL_KEY_LIST = 'keyList'; - public const MODEL_PROVIDER = 'provider'; - public const MODEL_PROVIDER_LIST = 'providerList'; + public const MODEL_AUTH_PROVIDER = 'authProvider'; + public const MODEL_AUTH_PROVIDER_LIST = 'authProviderList'; public const MODEL_PLATFORM = 'platform'; public const MODEL_PLATFORM_LIST = 'platformList'; public const MODEL_VARIABLE = 'variable'; @@ -316,7 +333,7 @@ class Response extends SwooleResponse ->setModel(new BaseList('Projects List', self::MODEL_PROJECT_LIST, 'projects', self::MODEL_PROJECT, true, false)) ->setModel(new BaseList('Webhooks List', self::MODEL_WEBHOOK_LIST, 'webhooks', self::MODEL_WEBHOOK, true, false)) ->setModel(new BaseList('API Keys List', self::MODEL_KEY_LIST, 'keys', self::MODEL_KEY, true, false)) - ->setModel(new BaseList('Providers List', self::MODEL_PROVIDER_LIST, 'platforms', self::MODEL_PROVIDER, true, false)) + ->setModel(new BaseList('Auth Providers List', self::MODEL_AUTH_PROVIDER_LIST, 'platforms', self::MODEL_AUTH_PROVIDER, true, false)) ->setModel(new BaseList('Platforms List', self::MODEL_PLATFORM_LIST, 'platforms', self::MODEL_PLATFORM, true, false)) ->setModel(new BaseList('Countries List', self::MODEL_COUNTRY_LIST, 'countries', self::MODEL_COUNTRY)) ->setModel(new BaseList('Continents List', self::MODEL_CONTINENT_LIST, 'continents', self::MODEL_CONTINENT)) @@ -328,6 +345,11 @@ class Response extends SwooleResponse ->setModel(new BaseList('Status List', self::MODEL_HEALTH_STATUS_LIST, 'statuses', self::MODEL_HEALTH_STATUS)) ->setModel(new BaseList('Rule List', self::MODEL_PROXY_RULE_LIST, 'rules', self::MODEL_PROXY_RULE)) ->setModel(new BaseList('Locale codes list', self::MODEL_LOCALE_CODE_LIST, 'localeCodes', self::MODEL_LOCALE_CODE)) + ->setModel(new BaseList('Provider list', self::MODEL_PROVIDER_LIST, 'providers', self::MODEL_PROVIDER)) + ->setModel(new BaseList('Message list', self::MODEL_MESSAGE_LIST, 'messages', self::MODEL_MESSAGE)) + ->setModel(new BaseList('Topic list', self::MODEL_TOPIC_LIST, 'topics', self::MODEL_TOPIC)) + ->setModel(new BaseList('Subscriber list', self::MODEL_SUBSCRIBER_LIST, 'subscribers', self::MODEL_SUBSCRIBER)) + ->setModel(new BaseList('Target list', self::MODEL_TARGET_LIST, 'targets', self::MODEL_TARGET)) ->setModel(new BaseList('Migrations List', self::MODEL_MIGRATION_LIST, 'migrations', self::MODEL_MIGRATION)) ->setModel(new BaseList('Migrations Firebase Projects List', self::MODEL_MIGRATION_FIREBASE_PROJECT_LIST, 'projects', self::MODEL_MIGRATION_FIREBASE_PROJECT)) // Entities @@ -380,7 +402,7 @@ class Response extends SwooleResponse ->setModel(new Project()) ->setModel(new Webhook()) ->setModel(new Key()) - ->setModel(new Provider()) + ->setModel(new AuthProvider()) ->setModel(new Platform()) ->setModel(new Variable()) ->setModel(new Country()) @@ -408,6 +430,11 @@ class Response extends SwooleResponse ->setModel(new TemplateSMS()) ->setModel(new TemplateEmail()) ->setModel(new ConsoleVariables()) + ->setModel(new Provider()) + ->setModel(new Message()) + ->setModel(new Topic()) + ->setModel(new Subscriber()) + ->setModel(new Target()) ->setModel(new Migration()) ->setModel(new MigrationReport()) ->setModel(new MigrationFirebaseProject()) diff --git a/src/Appwrite/Utopia/Response/Filters/V16.php b/src/Appwrite/Utopia/Response/Filters/V16.php index 6943bd8f4d..66cf650a78 100644 --- a/src/Appwrite/Utopia/Response/Filters/V16.php +++ b/src/Appwrite/Utopia/Response/Filters/V16.php @@ -88,9 +88,9 @@ class V16 extends Filter protected function parseProject(array $content) { - foreach ($content['providers'] ?? [] as $i => $provider) { - $content['providers'][$i]['name'] = \ucfirst($provider['key']); - unset($content['providers'][$i]['key']); + foreach ($content['authProviders'] ?? [] as $i => $provider) { + $content['authProviders'][$i]['name'] = \ucfirst($provider['key']); + unset($content['authProviders'][$i]['key']); } $content['domains'] = []; diff --git a/src/Appwrite/Utopia/Response/Model/AuthProvider.php b/src/Appwrite/Utopia/Response/Model/AuthProvider.php new file mode 100644 index 0000000000..0171a3c152 --- /dev/null +++ b/src/Appwrite/Utopia/Response/Model/AuthProvider.php @@ -0,0 +1,69 @@ +addRule('key', [ + 'type' => self::TYPE_STRING, + 'description' => 'Auth Provider.', + 'default' => '', + 'example' => 'github', + ]) + ->addRule('name', [ + 'type' => self::TYPE_STRING, + 'description' => 'Auth Provider name.', + 'default' => '', + 'example' => 'GitHub', + ]) + ->addRule('appId', [ + 'type' => self::TYPE_STRING, + 'description' => 'OAuth 2.0 application ID.', + 'default' => '', + 'example' => '259125845563242502', + ]) + ->addRule('secret', [ + 'type' => self::TYPE_STRING, + 'description' => 'OAuth 2.0 application secret. Might be JSON string if provider requires extra configuration.', + 'default' => '', + 'example' => 'Bpw_g9c2TGXxfgLshDbSaL8tsCcqgczQ', + ]) + ->addRule('enabled', [ + 'type' => self::TYPE_BOOLEAN, + 'description' => 'Auth Provider is active and can be used to create session.', + 'example' => '', + ]) + ; + } + + /** + * Get Name + * + * @return string + */ + public function getName(): string + { + return 'AuthProvider'; + } + + /** + * Get Type + * + * @return string + */ + public function getType(): string + { + return Response::MODEL_AUTH_PROVIDER; + } +} diff --git a/src/Appwrite/Utopia/Response/Model/Message.php b/src/Appwrite/Utopia/Response/Model/Message.php new file mode 100644 index 0000000000..6eebbcd793 --- /dev/null +++ b/src/Appwrite/Utopia/Response/Model/Message.php @@ -0,0 +1,81 @@ +addRule('$id', [ + 'type' => self::TYPE_STRING, + 'description' => 'Message ID.', + 'default' => '', + 'example' => '5e5ea5c16897e', + ]) + ->addRule('providerId', [ + 'type' => self::TYPE_STRING, + 'description' => 'Provider ID for the message.', + 'default' => '', + 'example' => '5e5ea5c16897e', + ]) + ->addRule('to', [ + 'type' => self::TYPE_STRING, + 'description' => 'Message recipients.', + 'default' => '', + 'array' => true, + 'example' => ['user-1'], + ]) + ->addRule('deliveryTime', [ + 'type' => self::TYPE_DATETIME, + 'description' => 'Time the message is delivered at.', + 'required' => false, + 'default' => DateTime::now(), + 'example' => self::TYPE_DATETIME_EXAMPLE, + ]) + ->addRule('deliveryErrors', [ + 'type' => self::TYPE_STRING, + 'description' => 'Delivery errors if any.', + 'required' => false, + 'default' => '', + 'array' => true, + 'example' => ['Failed to send message to target 5e5ea5c16897e: Credentials not valid.'], + ]) + ->addRule('deliveredTo', [ + 'type' => self::TYPE_INTEGER, + 'description' => 'Number of recipients the message was delivered to.', + 'default' => 0, + 'example' => 1, + ]) + ->addRule('delivered', [ + 'type' => self::TYPE_BOOLEAN, + 'description' => 'Status of delivery.', + 'default' => false, + 'example' => true, + ]); + } + + /** + * Get Name + * + * @return string + */ + public function getName(): string + { + return 'Message'; + } + + /** + * Get Type + * + * @return string + */ + public function getType(): string + { + return Response::MODEL_MESSAGE; + } +} diff --git a/src/Appwrite/Utopia/Response/Model/Project.php b/src/Appwrite/Utopia/Response/Model/Project.php index 20703ffbeb..807c1fb574 100644 --- a/src/Appwrite/Utopia/Response/Model/Project.php +++ b/src/Appwrite/Utopia/Response/Model/Project.php @@ -138,9 +138,9 @@ class Project extends Model 'default' => false, 'example' => true, ]) - ->addRule('providers', [ - 'type' => Response::MODEL_PROVIDER, - 'description' => 'List of Providers.', + ->addRule('authProviders', [ + 'type' => Response::MODEL_AUTH_PROVIDER, + 'description' => 'List of Auth Providers.', 'default' => [], 'example' => [new \stdClass()], 'array' => true, @@ -329,7 +329,7 @@ class Project extends Model } // Providers - $providers = Config::getParam('providers', []); + $providers = Config::getParam('authProviders', []); $providerValues = $document->getAttribute('authProviders', []); $projectProviders = []; @@ -348,7 +348,7 @@ class Project extends Model ]); } - $document->setAttribute("providers", $projectProviders); + $document->setAttribute('authProviders', $projectProviders); return $document; } diff --git a/src/Appwrite/Utopia/Response/Model/Provider.php b/src/Appwrite/Utopia/Response/Model/Provider.php index c589011a46..e33e5a253d 100644 --- a/src/Appwrite/Utopia/Response/Model/Provider.php +++ b/src/Appwrite/Utopia/Response/Model/Provider.php @@ -7,44 +7,45 @@ use Appwrite\Utopia\Response\Model; class Provider extends Model { - /** - * @var bool - */ - protected bool $public = false; - public function __construct() { $this - ->addRule('key', [ + ->addRule('$id', [ 'type' => self::TYPE_STRING, - 'description' => 'Provider.', + 'description' => 'Provider ID.', 'default' => '', - 'example' => 'github', + 'example' => '5e5ea5c16897e', ]) ->addRule('name', [ 'type' => self::TYPE_STRING, - 'description' => 'Provider name.', + 'description' => 'The name for the provider instance.', 'default' => '', - 'example' => 'GitHub', + 'example' => 'Mailgun', ]) - ->addRule('appId', [ + ->addRule('provider', [ 'type' => self::TYPE_STRING, - 'description' => 'OAuth 2.0 application ID.', + 'description' => 'The name of the provider service.', 'default' => '', - 'example' => '259125845563242502', + 'example' => 'mailgun', ]) - ->addRule('secret', [ - 'type' => self::TYPE_STRING, - 'description' => 'OAuth 2.0 application secret. Might be JSON string if provider requires extra configuration.', - 'default' => '', - 'example' => 'Bpw_g9c2TGXxfgLshDbSaL8tsCcqgczQ', + ->addRule('default', [ + 'type' => self::TYPE_BOOLEAN, + 'description' => 'Is this a pre-configured provider instance?', + 'default' => false, + 'example' => true, ]) ->addRule('enabled', [ 'type' => self::TYPE_BOOLEAN, - 'description' => 'Provider is active and can be used to create session.', - 'example' => '', + 'description' => 'Is provider enabled?', + 'default' => true, + 'example' => true, ]) - ; + ->addRule('type', [ + 'type' => self::TYPE_STRING, + 'description' => 'Type of provider.', + 'default' => '', + 'example' => 'sms', + ]); } /** diff --git a/src/Appwrite/Utopia/Response/Model/Subscriber.php b/src/Appwrite/Utopia/Response/Model/Subscriber.php new file mode 100644 index 0000000000..2f34619cb4 --- /dev/null +++ b/src/Appwrite/Utopia/Response/Model/Subscriber.php @@ -0,0 +1,52 @@ +addRule('$id', [ + 'type' => self::TYPE_STRING, + 'description' => 'Subscriber ID.', + 'default' => '', + 'example' => '259125845563242502', + ]) + ->addRule('targetId', [ + 'type' => self::TYPE_STRING, + 'description' => 'Target ID.', + 'default' => '', + 'example' => '259125845563242502', + ]) + ->addRule('topicId', [ + 'type' => self::TYPE_STRING, + 'description' => 'Topic ID.', + 'default' => '', + 'example' => '259125845563242502', + ]); + } + + /** + * Get Name + * + * @return string + */ + public function getName(): string + { + return 'Subscriber'; + } + + /** + * Get Type + * + * @return string + */ + public function getType(): string + { + return Response::MODEL_SUBSCRIBER; + } +} diff --git a/src/Appwrite/Utopia/Response/Model/Target.php b/src/Appwrite/Utopia/Response/Model/Target.php new file mode 100644 index 0000000000..5750f57eba --- /dev/null +++ b/src/Appwrite/Utopia/Response/Model/Target.php @@ -0,0 +1,59 @@ +addRule('$id', [ + 'type' => self::TYPE_STRING, + 'description' => 'Target ID.', + 'default' => '', + 'example' => '259125845563242502', + ]) + ->addRule('userId', [ + 'type' => self::TYPE_STRING, + 'description' => 'User ID.', + 'default' => '', + 'example' => '259125845563242502', + ]) + ->addRule('providerId', [ + 'type' => self::TYPE_STRING, + 'description' => 'Provider ID.', + 'required' => false, + 'default' => '', + 'example' => '259125845563242502', + ]) + ->addRule('identifier', [ + 'type' => self::TYPE_STRING, + 'description' => 'The target identifier.', + 'default' => '', + 'example' => 'token', + ]); + } + + /** + * Get Name + * + * @return string + */ + public function getName(): string + { + return 'Target'; + } + + /** + * Get Type + * + * @return string + */ + public function getType(): string + { + return Response::MODEL_TARGET; + } +} diff --git a/src/Appwrite/Utopia/Response/Model/Topic.php b/src/Appwrite/Utopia/Response/Model/Topic.php new file mode 100644 index 0000000000..3a6e832f5c --- /dev/null +++ b/src/Appwrite/Utopia/Response/Model/Topic.php @@ -0,0 +1,59 @@ +addRule('$id', [ + 'type' => self::TYPE_STRING, + 'description' => 'Topic ID.', + 'default' => '', + 'example' => '259125845563242502', + ]) + ->addRule('providerId', [ + 'type' => self::TYPE_STRING, + 'description' => 'Provider ID.', + 'default' => '', + 'example' => '259125845563242502', + ]) + ->addRule('name', [ + 'type' => self::TYPE_STRING, + 'description' => 'The name of the topic.', + 'default' => '', + 'example' => 'events', + ]) + ->addRule('description', [ + 'type' => self::TYPE_STRING, + 'description' => 'Description of the topic.', + 'default' => '', + 'required' => false, + 'example' => 'All events related messages will be sent to this topic.', + ]); + } + + /** + * Get Name + * + * @return string + */ + public function getName(): string + { + return 'Topic'; + } + + /** + * Get Type + * + * @return string + */ + public function getType(): string + { + return Response::MODEL_TOPIC; + } +} diff --git a/tests/e2e/Services/Projects/ProjectsConsoleClientTest.php b/tests/e2e/Services/Projects/ProjectsConsoleClientTest.php index ff3f8e8e94..eefc766b94 100644 --- a/tests/e2e/Services/Projects/ProjectsConsoleClientTest.php +++ b/tests/e2e/Services/Projects/ProjectsConsoleClientTest.php @@ -794,7 +794,7 @@ class ProjectsConsoleClientTest extends Scope public function testUpdateProjectOAuth($data): array { $id = $data['projectId'] ?? ''; - $providers = require('app/config/providers.php'); + $providers = require('app/config/authProviders.php'); /** * Test for SUCCESS @@ -825,7 +825,7 @@ class ProjectsConsoleClientTest extends Scope foreach ($providers as $key => $provider) { $asserted = false; - foreach ($response['body']['providers'] as $responseProvider) { + foreach ($response['body']['authProviders'] 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']['providers'] as $responseProvider) { + foreach ($response['body']['authProviders'] as $responseProvider) { if ($responseProvider['key'] === $key) { // On first provider, test enabled=false $this->assertEquals($i !== 0, $responseProvider['enabled']); diff --git a/tests/unit/Utopia/Response/Filters/V16Test.php b/tests/unit/Utopia/Response/Filters/V16Test.php index fba3b69535..96c615f452 100644 --- a/tests/unit/Utopia/Response/Filters/V16Test.php +++ b/tests/unit/Utopia/Response/Filters/V16Test.php @@ -154,9 +154,9 @@ class V16Test extends TestCase public function projectProvider(): array { return [ - 'providers' => [ + 'authProviders' => [ [ - 'providers' => [ + 'authProviders' => [ [ 'key' => 'github', 'name' => 'GitHub', @@ -167,7 +167,7 @@ class V16Test extends TestCase ], ], [ - 'providers' => [ + 'authProviders' => [ [ 'name' => 'Github', 'appId' => 'client_id',