From 83dc606c1489f6d11eee45c3e94ee4058ac87cf0 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Wed, 20 May 2026 16:44:10 +0530 Subject: [PATCH 01/17] Use platform enum metadata for SDK specs --- composer.json | 2 +- composer.lock | 17 +- .../Account/MFA/Authenticators/Create.php | 5 +- .../Account/MFA/Authenticators/Delete.php | 5 +- .../Account/MFA/Authenticators/Update.php | 5 +- .../Http/Account/MFA/Challenges/Create.php | 5 +- .../Modules/Avatars/Http/Browsers/Get.php | 6 +- .../Modules/Avatars/Http/CreditCards/Get.php | 6 +- .../Modules/Avatars/Http/Flags/Get.php | 6 +- .../Modules/Avatars/Http/Screenshots/Get.php | 5 +- .../Modules/Console/Http/Resources/Get.php | 5 +- .../Attributes/Relationship/Create.php | 5 +- .../Attributes/Relationship/Update.php | 3 +- .../Databases/Collections/Indexes/Create.php | 5 +- .../Http/Databases/Collections/Usage/Get.php | 10 +- .../Databases/Http/Databases/Usage/Get.php | 12 +- .../Databases/Http/Databases/Usage/XList.php | 12 +- .../Collections/Indexes/Create.php | 5 +- .../DocumentsDB/Collections/Usage/Get.php | 10 +- .../Databases/Http/DocumentsDB/Usage/Get.php | 10 +- .../Http/DocumentsDB/Usage/XList.php | 10 +- .../Tables/Columns/Relationship/Create.php | 5 +- .../Tables/Columns/Relationship/Update.php | 3 +- .../Http/TablesDB/Tables/Indexes/Create.php | 5 +- .../Http/TablesDB/Tables/Usage/Get.php | 10 +- .../Databases/Http/TablesDB/Usage/Get.php | 10 +- .../Databases/Http/TablesDB/Usage/XList.php | 10 +- .../VectorsDB/Collections/Indexes/Create.php | 5 +- .../Http/VectorsDB/Collections/Usage/Get.php | 10 +- .../Databases/Http/VectorsDB/Usage/Get.php | 10 +- .../Databases/Http/VectorsDB/Usage/XList.php | 10 +- .../Http/Deployments/Download/Get.php | 5 +- .../Http/Deployments/Template/Create.php | 5 +- .../Functions/Http/Deployments/Vcs/Create.php | 5 +- .../Functions/Http/Functions/Create.php | 3 +- .../Functions/Http/Functions/Update.php | 3 +- .../Modules/Functions/Http/Usage/Get.php | 12 +- .../Modules/Functions/Http/Usage/XList.php | 12 +- .../Http/Migrations/Appwrite/Create.php | 5 +- .../Http/Migrations/Appwrite/Report/Get.php | 5 +- .../Http/Migrations/Firebase/Create.php | 5 +- .../Http/Migrations/Firebase/Report/Get.php | 5 +- .../Http/Migrations/NHost/Create.php | 5 +- .../Http/Migrations/NHost/Report/Get.php | 5 +- .../Http/Migrations/Supabase/Create.php | 5 +- .../Http/Migrations/Supabase/Report/Get.php | 5 +- .../Modules/Presences/HTTP/Usage/Get.php | 12 +- .../Project/Http/Project/Keys/Create.php | 5 +- .../Http/Project/Keys/Ephemeral/Create.php | 5 +- .../Project/Http/Project/Keys/Update.php | 5 +- .../Proxy/Http/Rules/Redirect/Create.php | 9 +- .../Sites/Http/Deployments/Download/Get.php | 5 +- .../Http/Deployments/Template/Create.php | 5 +- .../Sites/Http/Deployments/Vcs/Create.php | 5 +- .../Platform/Modules/Sites/Http/Usage/Get.php | 12 +- .../Modules/Sites/Http/Usage/XList.php | 12 +- .../Http/Buckets/Files/Preview/Get.php | 7 +- .../Modules/Storage/Http/Usage/Get.php | 12 +- .../Modules/Storage/Http/Usage/XList.php | 12 +- .../Repositories/Detections/Create.php | 3 +- .../Http/Installations/Repositories/XList.php | 3 +- src/Appwrite/SDK/Specification/Format.php | 750 +----------------- .../SDK/Specification/Format/OpenAPI3.php | 150 ++-- .../SDK/Specification/Format/Swagger2.php | 141 ++-- .../Utopia/Response/Model/Attribute.php | 1 + src/Appwrite/Utopia/Response/Model/Column.php | 1 + .../Utopia/Response/Model/HealthStatus.php | 1 + .../Utopia/Response/Model/PlatformBase.php | 1 + 68 files changed, 453 insertions(+), 1016 deletions(-) diff --git a/composer.json b/composer.json index d4472c6868..961eb60e48 100644 --- a/composer.json +++ b/composer.json @@ -76,7 +76,7 @@ "utopia-php/logger": "0.8.*", "utopia-php/messaging": "0.22.*", "utopia-php/migration": "1.*", - "utopia-php/platform": "1.0.0-rc2", + "utopia-php/platform": "dev-feat/action-param-meta", "utopia-php/pools": "1.*", "utopia-php/span": "1.1.*", "utopia-php/preloader": "0.2.*", diff --git a/composer.lock b/composer.lock index 1d71d75447..379a6e05bf 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "b645c7da1728536497fe8186b158f9c6", + "content-hash": "87677413cb65fd4688a9a56a896dad08", "packages": [ { "name": "adhocore/jwt", @@ -4773,16 +4773,16 @@ }, { "name": "utopia-php/platform", - "version": "1.0.0-rc2", + "version": "dev-feat/action-param-meta", "source": { "type": "git", "url": "https://github.com/utopia-php/platform.git", - "reference": "a67e5037007ee7fdca5359ab4577b82917e55452" + "reference": "2e3d957f4f9f672edede820c1815c81976f6606b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/platform/zipball/a67e5037007ee7fdca5359ab4577b82917e55452", - "reference": "a67e5037007ee7fdca5359ab4577b82917e55452", + "url": "https://api.github.com/repos/utopia-php/platform/zipball/2e3d957f4f9f672edede820c1815c81976f6606b", + "reference": "2e3d957f4f9f672edede820c1815c81976f6606b", "shasum": "" }, "require": { @@ -4818,9 +4818,9 @@ ], "support": { "issues": "https://github.com/utopia-php/platform/issues", - "source": "https://github.com/utopia-php/platform/tree/1.0.0-rc2" + "source": "https://github.com/utopia-php/platform/tree/feat/action-param-meta" }, - "time": "2026-05-15T06:19:20+00:00" + "time": "2026-05-20T11:39:39+00:00" }, { "name": "utopia-php/pools", @@ -8618,7 +8618,8 @@ "aliases": [], "minimum-stability": "dev", "stability-flags": { - "utopia-php/http": 5 + "utopia-php/http": 5, + "utopia-php/platform": 20 }, "prefer-stable": true, "prefer-lowest": false, diff --git a/src/Appwrite/Platform/Modules/Account/Http/Account/MFA/Authenticators/Create.php b/src/Appwrite/Platform/Modules/Account/Http/Account/MFA/Authenticators/Create.php index 93b2b640ff..6aa13e4cd0 100644 --- a/src/Appwrite/Platform/Modules/Account/Http/Account/MFA/Authenticators/Create.php +++ b/src/Appwrite/Platform/Modules/Account/Http/Account/MFA/Authenticators/Create.php @@ -6,6 +6,7 @@ use Appwrite\Auth\MFA\Type; use Appwrite\Auth\MFA\Type\TOTP; use Appwrite\Event\Event; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\SDK\AuthType; use Appwrite\SDK\ContentType; use Appwrite\SDK\Deprecated; @@ -17,7 +18,7 @@ use Utopia\Database\Document; use Utopia\Database\Helpers\ID; use Utopia\Database\Helpers\Permission; use Utopia\Database\Helpers\Role; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\WhiteList; @@ -77,7 +78,7 @@ class Create extends Action contentType: ContentType::JSON ) ]) - ->param('type', null, new WhiteList([Type::TOTP]), 'Type of authenticator. Must be `' . Type::TOTP . '`') + ->param('type', null, new WhiteList([Type::TOTP]), 'Type of authenticator. Must be `' . Type::TOTP . '`', enum: new Enum(name: 'AuthenticatorType')) ->inject('response') ->inject('project') ->inject('user') diff --git a/src/Appwrite/Platform/Modules/Account/Http/Account/MFA/Authenticators/Delete.php b/src/Appwrite/Platform/Modules/Account/Http/Account/MFA/Authenticators/Delete.php index 5765c5bf6e..ce0e8d266e 100644 --- a/src/Appwrite/Platform/Modules/Account/Http/Account/MFA/Authenticators/Delete.php +++ b/src/Appwrite/Platform/Modules/Account/Http/Account/MFA/Authenticators/Delete.php @@ -6,6 +6,7 @@ use Appwrite\Auth\MFA\Type; use Appwrite\Auth\MFA\Type\TOTP; use Appwrite\Event\Event; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\SDK\AuthType; use Appwrite\SDK\ContentType; use Appwrite\SDK\Deprecated; @@ -14,7 +15,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response; use Utopia\Database\Database; use Utopia\Database\Document; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\WhiteList; @@ -74,7 +75,7 @@ class Delete extends Action contentType: ContentType::NONE ) ]) - ->param('type', null, new WhiteList([Type::TOTP]), 'Type of authenticator.') + ->param('type', null, new WhiteList([Type::TOTP]), 'Type of authenticator.', enum: new Enum(name: 'AuthenticatorType')) ->inject('response') ->inject('user') ->inject('dbForProject') diff --git a/src/Appwrite/Platform/Modules/Account/Http/Account/MFA/Authenticators/Update.php b/src/Appwrite/Platform/Modules/Account/Http/Account/MFA/Authenticators/Update.php index f7226d915e..11f044b507 100644 --- a/src/Appwrite/Platform/Modules/Account/Http/Account/MFA/Authenticators/Update.php +++ b/src/Appwrite/Platform/Modules/Account/Http/Account/MFA/Authenticators/Update.php @@ -7,6 +7,7 @@ use Appwrite\Auth\MFA\Type; use Appwrite\Auth\MFA\Type\TOTP; use Appwrite\Event\Event; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\SDK\AuthType; use Appwrite\SDK\ContentType; use Appwrite\SDK\Deprecated; @@ -15,7 +16,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response; use Utopia\Database\Database; use Utopia\Database\Document; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\Text; use Utopia\Validator\WhiteList; @@ -76,7 +77,7 @@ class Update extends Action contentType: ContentType::JSON ) ]) - ->param('type', null, new WhiteList([Type::TOTP]), 'Type of authenticator.') + ->param('type', null, new WhiteList([Type::TOTP]), 'Type of authenticator.', enum: new Enum(name: 'AuthenticatorType')) ->param('otp', '', new Text(256), 'Valid verification token.') ->inject('response') ->inject('user') diff --git a/src/Appwrite/Platform/Modules/Account/Http/Account/MFA/Challenges/Create.php b/src/Appwrite/Platform/Modules/Account/Http/Account/MFA/Challenges/Create.php index 285875eb35..27d6f3e088 100644 --- a/src/Appwrite/Platform/Modules/Account/Http/Account/MFA/Challenges/Create.php +++ b/src/Appwrite/Platform/Modules/Account/Http/Account/MFA/Challenges/Create.php @@ -10,6 +10,7 @@ use Appwrite\Event\Message\Messaging as MessagingMessage; use Appwrite\Event\Publisher\Mail as MailPublisher; use Appwrite\Event\Publisher\Messaging as MessagingPublisher; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\SDK\AuthType; use Appwrite\SDK\ContentType; use Appwrite\SDK\Deprecated; @@ -29,7 +30,7 @@ use Utopia\Database\Document; use Utopia\Database\Helpers\Permission; use Utopia\Database\Helpers\Role; use Utopia\Locale\Locale; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Storage\Validator\FileName; use Utopia\System\System; @@ -94,7 +95,7 @@ class Create extends Action ]) ->label('abuse-limit', 10) ->label('abuse-key', 'url:{url},userId:{userId}') - ->param('factor', '', new WhiteList([Type::EMAIL, Type::PHONE, Type::TOTP, Type::RECOVERY_CODE]), 'Factor used for verification. Must be one of following: `' . Type::EMAIL . '`, `' . Type::PHONE . '`, `' . Type::TOTP . '`, `' . Type::RECOVERY_CODE . '`.') + ->param('factor', '', new WhiteList([Type::EMAIL, Type::PHONE, Type::TOTP, Type::RECOVERY_CODE]), 'Factor used for verification. Must be one of following: `' . Type::EMAIL . '`, `' . Type::PHONE . '`, `' . Type::TOTP . '`, `' . Type::RECOVERY_CODE . '`.', enum: new Enum(name: 'AuthenticationFactor')) ->inject('response') ->inject('dbForProject') ->inject('user') diff --git a/src/Appwrite/Platform/Modules/Avatars/Http/Browsers/Get.php b/src/Appwrite/Platform/Modules/Avatars/Http/Browsers/Get.php index 637ea647ef..cc30f014bc 100644 --- a/src/Appwrite/Platform/Modules/Avatars/Http/Browsers/Get.php +++ b/src/Appwrite/Platform/Modules/Avatars/Http/Browsers/Get.php @@ -11,6 +11,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response; use Utopia\Config\Config; use Utopia\Platform\Action as UtopiaAction; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\Range; use Utopia\Validator\WhiteList; @@ -49,7 +50,10 @@ class Get extends Action ], contentType: ContentType::IMAGE_PNG )) - ->param('code', '', new WhiteList(\array_keys(Config::getParam('avatar-browsers'))), 'Browser Code.') + ->param('code', '', new WhiteList(\array_keys(Config::getParam('avatar-browsers'))), 'Browser Code.', enum: new Enum( + name: 'Browser', + map: \array_map(fn (array $browser) => $browser['name'], Config::getParam('avatar-browsers')), + )) ->param('width', 100, new Range(0, 2000), 'Image width. Pass an integer between 0 to 2000. Defaults to 100.', true) ->param('height', 100, new Range(0, 2000), 'Image height. Pass an integer between 0 to 2000. Defaults to 100.', true) ->param('quality', -1, new Range(-1, 100), 'Image quality. Pass an integer between 0 to 100. Defaults to keep existing image quality.', true) diff --git a/src/Appwrite/Platform/Modules/Avatars/Http/CreditCards/Get.php b/src/Appwrite/Platform/Modules/Avatars/Http/CreditCards/Get.php index 87357f14c7..3bae32c862 100644 --- a/src/Appwrite/Platform/Modules/Avatars/Http/CreditCards/Get.php +++ b/src/Appwrite/Platform/Modules/Avatars/Http/CreditCards/Get.php @@ -11,6 +11,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response; use Utopia\Config\Config; use Utopia\Platform\Action as UtopiaAction; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\Range; use Utopia\Validator\WhiteList; @@ -49,7 +50,10 @@ class Get extends Action ], contentType: ContentType::IMAGE_PNG )) - ->param('code', '', new WhiteList(\array_keys(Config::getParam('avatar-credit-cards'))), 'Credit Card Code. Possible values: ' . \implode(', ', \array_keys(Config::getParam('avatar-credit-cards'))) . '.') + ->param('code', '', new WhiteList(\array_keys(Config::getParam('avatar-credit-cards'))), 'Credit Card Code. Possible values: ' . \implode(', ', \array_keys(Config::getParam('avatar-credit-cards'))) . '.', enum: new Enum( + name: 'CreditCard', + map: \array_map(fn (array $creditCard) => $creditCard['name'], Config::getParam('avatar-credit-cards')), + )) ->param('width', 100, new Range(0, 2000), 'Image width. Pass an integer between 0 to 2000. Defaults to 100.', true) ->param('height', 100, new Range(0, 2000), 'Image height. Pass an integer between 0 to 2000. Defaults to 100.', true) ->param('quality', -1, new Range(-1, 100), 'Image quality. Pass an integer between 0 to 100. Defaults to keep existing image quality.', true) diff --git a/src/Appwrite/Platform/Modules/Avatars/Http/Flags/Get.php b/src/Appwrite/Platform/Modules/Avatars/Http/Flags/Get.php index 8230b15f50..ef9f8c0e47 100644 --- a/src/Appwrite/Platform/Modules/Avatars/Http/Flags/Get.php +++ b/src/Appwrite/Platform/Modules/Avatars/Http/Flags/Get.php @@ -11,6 +11,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response; use Utopia\Config\Config; use Utopia\Platform\Action as UtopiaAction; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\Range; use Utopia\Validator\WhiteList; @@ -49,7 +50,10 @@ class Get extends Action ], contentType: ContentType::IMAGE_PNG )) - ->param('code', '', new WhiteList(\array_keys(Config::getParam('avatar-flags'))), 'Country Code. ISO Alpha-2 country code format.') + ->param('code', '', new WhiteList(\array_keys(Config::getParam('avatar-flags'))), 'Country Code. ISO Alpha-2 country code format.', enum: new Enum( + name: 'Flag', + map: \array_map(fn (array $flag) => $flag['name'], Config::getParam('avatar-flags')), + )) ->param('width', 100, new Range(0, 2000), 'Image width. Pass an integer between 0 to 2000. Defaults to 100.', true) ->param('height', 100, new Range(0, 2000), 'Image height. Pass an integer between 0 to 2000. Defaults to 100.', true) ->param('quality', -1, new Range(-1, 100), 'Image quality. Pass an integer between 0 to 100. Defaults to keep existing image quality.', true) diff --git a/src/Appwrite/Platform/Modules/Avatars/Http/Screenshots/Get.php b/src/Appwrite/Platform/Modules/Avatars/Http/Screenshots/Get.php index f33bfa938a..69a4101711 100644 --- a/src/Appwrite/Platform/Modules/Avatars/Http/Screenshots/Get.php +++ b/src/Appwrite/Platform/Modules/Avatars/Http/Screenshots/Get.php @@ -16,6 +16,7 @@ use Utopia\Domains\Domain; use Utopia\Fetch\Client; use Utopia\Image\Image; use Utopia\Platform\Action as UtopiaAction; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\System\System; use Utopia\Validator\ArrayList; @@ -77,12 +78,12 @@ class Get extends Action ->param('longitude', 0, new Range(-180, 180, Range::TYPE_FLOAT), 'Geolocation longitude. Pass a number between -180 to 180. Defaults to 0.', true, example: '-122.4194') ->param('accuracy', 0, new Range(0, 100000, Range::TYPE_FLOAT), 'Geolocation accuracy in meters. Pass a number between 0 to 100000. Defaults to 0.', true, example: '100') ->param('touch', false, new Boolean(true), 'Enable touch support. Pass 0 for no touch, or 1 for touch enabled. Defaults to 0.', true, example: 'true') - ->param('permissions', [], new ArrayList(new WhiteList(['geolocation', 'camera', 'microphone', 'notifications', 'midi', 'push', 'clipboard-read', 'clipboard-write', 'payment-handler', 'usb', 'bluetooth', 'accelerometer', 'gyroscope', 'magnetometer', 'ambient-light-sensor', 'background-sync', 'persistent-storage', 'screen-wake-lock', 'web-share', 'xr-spatial-tracking'])), 'Browser permissions to grant. Pass an array of permission names like ["geolocation", "camera", "microphone"]. Defaults to empty.', true, example: '["geolocation","notifications"]') + ->param('permissions', [], new ArrayList(new WhiteList(['geolocation', 'camera', 'microphone', 'notifications', 'midi', 'push', 'clipboard-read', 'clipboard-write', 'payment-handler', 'usb', 'bluetooth', 'accelerometer', 'gyroscope', 'magnetometer', 'ambient-light-sensor', 'background-sync', 'persistent-storage', 'screen-wake-lock', 'web-share', 'xr-spatial-tracking'])), 'Browser permissions to grant. Pass an array of permission names like ["geolocation", "camera", "microphone"]. Defaults to empty.', true, example: '["geolocation","notifications"]', enum: new Enum(name: 'BrowserPermission')) ->param('sleep', 0, new Range(0, 10), 'Wait time in seconds before taking the screenshot. Pass an integer between 0 to 10. Defaults to 0.', true, example: '3') ->param('width', 0, new Range(0, 2000), 'Output image width. Pass 0 to use original width, or an integer between 1 to 2000. Defaults to 0 (original width).', true, example: '800') ->param('height', 0, new Range(0, 2000), 'Output image height. Pass 0 to use original height, or an integer between 1 to 2000. Defaults to 0 (original height).', true, example: '600') ->param('quality', -1, new Range(-1, 100), 'Screenshot quality. Pass an integer between 0 to 100. Defaults to keep existing image quality.', true, example: '85') - ->param('output', '', new WhiteList(\array_keys(Config::getParam('storage-outputs')), true), 'Output format type (jpeg, jpg, png, gif and webp).', true, example: 'jpeg') + ->param('output', '', new WhiteList(\array_keys(Config::getParam('storage-outputs')), true), 'Output format type (jpeg, jpg, png, gif and webp).', true, example: 'jpeg', enum: new Enum(name: 'ImageFormat')) ->inject('response') ->inject('usage') ->callback($this->action(...)); diff --git a/src/Appwrite/Platform/Modules/Console/Http/Resources/Get.php b/src/Appwrite/Platform/Modules/Console/Http/Resources/Get.php index 3e4320716b..f7849e8320 100644 --- a/src/Appwrite/Platform/Modules/Console/Http/Resources/Get.php +++ b/src/Appwrite/Platform/Modules/Console/Http/Resources/Get.php @@ -3,6 +3,7 @@ namespace Appwrite\Platform\Modules\Console\Http\Resources; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\SDK\AuthType; use Appwrite\SDK\ContentType; use Appwrite\SDK\Method; @@ -12,7 +13,7 @@ use Utopia\Database\Database; use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\Domains\Domain as Domain; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\System\System; use Utopia\Validator\Domain as DomainValidator; @@ -56,7 +57,7 @@ class Get extends Action ->label('abuse-key', 'userId:{userId}, url:{url}') ->label('abuse-time', 60) ->param('value', '', new Text(256), 'Resource value.') - ->param('type', '', new WhiteList(['rules']), 'Resource type.') + ->param('type', '', new WhiteList(['rules']), 'Resource type.', enum: new Enum(name: 'ConsoleResourceType')) ->inject('response') ->inject('dbForPlatform') ->inject('platform') diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Relationship/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Relationship/Create.php index ace48a5c56..f94a60b9de 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Relationship/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Relationship/Create.php @@ -17,6 +17,7 @@ use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; +use Utopia\Platform\Enum; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; use Utopia\Validator\WhiteList; @@ -70,7 +71,7 @@ class Create extends Action Database::RELATION_MANY_TO_ONE, Database::RELATION_MANY_TO_MANY, Database::RELATION_ONE_TO_MANY - ], true), 'Relation type') + ], true), 'Relation type', enum: new Enum(name: 'RelationshipType')) ->param('twoWay', false, new Boolean(), 'Is Two Way?', true) ->param('key', null, fn (Database $dbForProject) => new Nullable(new Key(false, $dbForProject->getAdapter()->getMaxUIDLength())), 'Attribute Key.', true, ['dbForProject']) ->param('twoWayKey', null, fn (Database $dbForProject) => new Nullable(new Key(false, $dbForProject->getAdapter()->getMaxUIDLength())), 'Two Way Attribute Key.', true, ['dbForProject']) @@ -78,7 +79,7 @@ class Create extends Action Database::RELATION_MUTATE_CASCADE, Database::RELATION_MUTATE_RESTRICT, Database::RELATION_MUTATE_SET_NULL - ], true), 'Constraints option', true) + ], true), 'Constraints option', true, enum: new Enum(name: 'RelationMutate')) ->inject('response') ->inject('dbForProject') ->inject('publisherForDatabase') diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Relationship/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Relationship/Update.php index 1e9d38a190..f173afd4b2 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Relationship/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Relationship/Update.php @@ -16,6 +16,7 @@ use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; +use Utopia\Platform\Enum; use Utopia\Validator\Nullable; use Utopia\Validator\WhiteList; @@ -69,7 +70,7 @@ class Update extends Action Database::RELATION_MUTATE_CASCADE, Database::RELATION_MUTATE_RESTRICT, Database::RELATION_MUTATE_SET_NULL - ], true), 'Constraints option', true) + ], true), 'Constraints option', true, enum: new Enum(name: 'RelationMutate')) ->param('newKey', null, fn (Database $dbForProject) => new Nullable(new Key(false, $dbForProject->getAdapter()->getMaxUIDLength())), 'New Attribute Key.', true, ['dbForProject']) ->inject('response') ->inject('dbForProject') diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Indexes/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Indexes/Create.php index 6c13a5c33c..4e989621f1 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Indexes/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Indexes/Create.php @@ -22,6 +22,7 @@ use Utopia\Database\Validator\Index as IndexValidator; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; +use Utopia\Platform\Enum; use Utopia\Validator\ArrayList; use Utopia\Validator\Integer; use Utopia\Validator\Nullable; @@ -72,9 +73,9 @@ class Create extends Action ->param('databaseId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Database ID.', false, ['dbForProject']) ->param('collectionId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Collection ID. You can create a new collection using the Database service [server integration](https://appwrite.io/docs/server/databases#databasesCreateCollection).', false, ['dbForProject']) ->param('key', null, fn (Database $dbForProject) => new Key(false, $dbForProject->getAdapter()->getMaxUIDLength()), 'Index Key.', false, ['dbForProject']) - ->param('type', null, new WhiteList([Database::INDEX_KEY, Database::INDEX_FULLTEXT, Database::INDEX_UNIQUE, Database::INDEX_SPATIAL]), 'Index type.') + ->param('type', null, new WhiteList([Database::INDEX_KEY, Database::INDEX_FULLTEXT, Database::INDEX_UNIQUE, Database::INDEX_SPATIAL]), 'Index type.', enum: new Enum(name: 'DatabasesIndexType')) ->param('attributes', null, fn (Database $dbForProject) => new ArrayList(new Key(true, $dbForProject->getAdapter()->getMaxUIDLength()), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Array of attributes to index. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' attributes are allowed, each 32 characters long.', false, ['dbForProject']) - ->param('orders', [], new ArrayList(new WhiteList(['ASC', 'DESC'], false, Database::VAR_STRING), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Array of index orders. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' orders are allowed.', true) + ->param('orders', [], new ArrayList(new WhiteList(['ASC', 'DESC'], false, Database::VAR_STRING), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Array of index orders. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' orders are allowed.', true, enum: new Enum(name: 'OrderBy')) ->param('lengths', [], new ArrayList(new Nullable(new Integer()), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Length of index. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE, optional: true) ->inject('response') ->inject('dbForProject') diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Usage/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Usage/Get.php index bea367af36..2fce1a3906 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Usage/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Usage/Get.php @@ -17,6 +17,7 @@ use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; +use Utopia\Platform\Enum; use Utopia\Validator\WhiteList; class Get extends Action @@ -64,7 +65,14 @@ class Get extends Action ), )) ->param('databaseId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Database ID.', false, ['dbForProject']) - ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true) + ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true, enum: new Enum( + name: 'UsageRange', + map: [ + '24h' => 'Twenty Four Hours', + '30d' => 'Thirty Days', + '90d' => 'Ninety Days', + ] + )) ->param('collectionId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Collection ID.', false, ['dbForProject']) ->inject('response') ->inject('dbForProject') diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Usage/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Usage/Get.php index 240e7d400c..3060fe9978 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Usage/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Usage/Get.php @@ -3,6 +3,7 @@ namespace Appwrite\Platform\Modules\Databases\Http\Databases\Usage; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\SDK\AuthType; use Appwrite\SDK\ContentType; use Appwrite\SDK\Deprecated; @@ -16,7 +17,7 @@ use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Validator\WhiteList; class Get extends Action @@ -93,7 +94,14 @@ class Get extends Action ) ]) ->param('databaseId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Database ID.', false, ['dbForProject']) - ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true) + ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true, enum: new Enum( + name: 'UsageRange', + map: [ + '24h' => 'Twenty Four Hours', + '30d' => 'Thirty Days', + '90d' => 'Ninety Days', + ] + )) ->inject('response') ->inject('dbForProject') ->inject('authorization') diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Usage/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Usage/XList.php index db73954e7f..17b3ff94db 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Usage/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Usage/XList.php @@ -2,6 +2,7 @@ namespace Appwrite\Platform\Modules\Databases\Http\Databases\Usage; +use Appwrite\Platform\Action; use Appwrite\SDK\AuthType; use Appwrite\SDK\ContentType; use Appwrite\SDK\Deprecated; @@ -14,7 +15,7 @@ use Utopia\Database\Document; use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Validator\WhiteList; class XList extends Action @@ -90,7 +91,14 @@ class XList extends Action ) ), ]) - ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true) + ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true, enum: new Enum( + name: 'UsageRange', + map: [ + '24h' => 'Twenty Four Hours', + '30d' => 'Thirty Days', + '90d' => 'Ninety Days', + ] + )) ->inject('response') ->inject('dbForProject') ->inject('authorization') diff --git a/src/Appwrite/Platform/Modules/Databases/Http/DocumentsDB/Collections/Indexes/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/DocumentsDB/Collections/Indexes/Create.php index 637255f16a..65002e2f30 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/DocumentsDB/Collections/Indexes/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/DocumentsDB/Collections/Indexes/Create.php @@ -12,6 +12,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; +use Utopia\Platform\Enum; use Utopia\Validator\ArrayList; use Utopia\Validator\Integer; use Utopia\Validator\Nullable; @@ -58,9 +59,9 @@ class Create extends IndexCreate ->param('databaseId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Database ID.', false, ['dbForProject']) ->param('collectionId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Collection ID. You can create a new collection using the Database service [server integration](https://appwrite.io/docs/server/databases#databasesCreateCollection).', false, ['dbForProject']) ->param('key', null, fn (Database $dbForProject) => new Key(false, $dbForProject->getAdapter()->getMaxUIDLength()), 'Index Key.', false, ['dbForProject']) - ->param('type', null, new WhiteList([Database::INDEX_KEY, Database::INDEX_FULLTEXT, Database::INDEX_UNIQUE]), 'Index type.') + ->param('type', null, new WhiteList([Database::INDEX_KEY, Database::INDEX_FULLTEXT, Database::INDEX_UNIQUE]), 'Index type.', enum: new Enum(name: 'DocumentsDBIndexType')) ->param('attributes', null, fn (Database $dbForProject) => new ArrayList(new Key(true, $dbForProject->getAdapter()->getMaxUIDLength()), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Array of attributes to index. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' attributes are allowed, each 32 characters long.', false, ['dbForProject']) - ->param('orders', [], new ArrayList(new WhiteList(['ASC', 'DESC'], false, Database::VAR_STRING), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Array of index orders. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' orders are allowed.', true) + ->param('orders', [], new ArrayList(new WhiteList(['ASC', 'DESC'], false, Database::VAR_STRING), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Array of index orders. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' orders are allowed.', true, enum: new Enum(name: 'OrderBy')) ->param('lengths', [], new ArrayList(new Nullable(new Integer()), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Length of index. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE, optional: true) ->inject('response') ->inject('dbForProject') diff --git a/src/Appwrite/Platform/Modules/Databases/Http/DocumentsDB/Collections/Usage/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/DocumentsDB/Collections/Usage/Get.php index 51dd3c381d..907ba22ae4 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/DocumentsDB/Collections/Usage/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/DocumentsDB/Collections/Usage/Get.php @@ -11,6 +11,7 @@ use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Database; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; +use Utopia\Platform\Enum; use Utopia\Validator\WhiteList; class Get extends CollectionUsageGet @@ -54,7 +55,14 @@ class Get extends CollectionUsageGet contentType: ContentType::JSON, )) ->param('databaseId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Database ID.', false, ['dbForProject']) - ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true) + ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true, enum: new Enum( + name: 'UsageRange', + map: [ + '24h' => 'Twenty Four Hours', + '30d' => 'Thirty Days', + '90d' => 'Ninety Days', + ] + )) ->param('collectionId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Collection ID.', false, ['dbForProject']) ->inject('response') ->inject('dbForProject') diff --git a/src/Appwrite/Platform/Modules/Databases/Http/DocumentsDB/Usage/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/DocumentsDB/Usage/Get.php index 8373b6bc20..e94106e31e 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/DocumentsDB/Usage/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/DocumentsDB/Usage/Get.php @@ -11,6 +11,7 @@ use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Database; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; +use Utopia\Platform\Enum; use Utopia\Validator\WhiteList; class Get extends DatabaseUsageGet @@ -51,7 +52,14 @@ class Get extends DatabaseUsageGet ), ]) ->param('databaseId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Database ID.', false, ['dbForProject']) - ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true) + ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true, enum: new Enum( + name: 'UsageRange', + map: [ + '24h' => 'Twenty Four Hours', + '30d' => 'Thirty Days', + '90d' => 'Ninety Days', + ] + )) ->inject('response') ->inject('dbForProject') ->inject('authorization') diff --git a/src/Appwrite/Platform/Modules/Databases/Http/DocumentsDB/Usage/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/DocumentsDB/Usage/XList.php index 16535765ca..4ea8c0e6c3 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/DocumentsDB/Usage/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/DocumentsDB/Usage/XList.php @@ -9,6 +9,7 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; +use Utopia\Platform\Enum; use Utopia\Validator\WhiteList; class XList extends DatabaseUsageXList @@ -48,7 +49,14 @@ class XList extends DatabaseUsageXList contentType: ContentType::JSON ), ]) - ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true) + ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true, enum: new Enum( + name: 'UsageRange', + map: [ + '24h' => 'Twenty Four Hours', + '30d' => 'Thirty Days', + '90d' => 'Ninety Days', + ] + )) ->inject('response') ->inject('dbForProject') ->callback($this->action(...)); diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Relationship/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Relationship/Create.php index 414cf03b3d..db8b17473c 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Relationship/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Relationship/Create.php @@ -11,6 +11,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; +use Utopia\Platform\Enum; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; use Utopia\Validator\WhiteList; @@ -60,7 +61,7 @@ class Create extends RelationshipCreate Database::RELATION_MANY_TO_ONE, Database::RELATION_MANY_TO_MANY, Database::RELATION_ONE_TO_MANY - ], true), 'Relation type') + ], true), 'Relation type', enum: new Enum(name: 'RelationshipType')) ->param('twoWay', false, new Boolean(), 'Is Two Way?', true) ->param('key', null, fn (Database $dbForProject) => new Nullable(new Key(false, $dbForProject->getAdapter()->getMaxUIDLength())), 'Column Key.', true, ['dbForProject']) ->param('twoWayKey', null, fn (Database $dbForProject) => new Nullable(new Key(false, $dbForProject->getAdapter()->getMaxUIDLength())), 'Two Way Column Key.', true, ['dbForProject']) @@ -68,7 +69,7 @@ class Create extends RelationshipCreate Database::RELATION_MUTATE_CASCADE, Database::RELATION_MUTATE_RESTRICT, Database::RELATION_MUTATE_SET_NULL - ], true), 'Constraints option', true) + ], true), 'Constraints option', true, enum: new Enum(name: 'RelationMutate')) ->inject('response') ->inject('dbForProject') ->inject('publisherForDatabase') diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Relationship/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Relationship/Update.php index 47884eda80..0ec8f4ba07 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Relationship/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Relationship/Update.php @@ -12,6 +12,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; +use Utopia\Platform\Enum; use Utopia\Validator\Nullable; use Utopia\Validator\WhiteList; @@ -60,7 +61,7 @@ class Update extends RelationshipUpdate Database::RELATION_MUTATE_CASCADE, Database::RELATION_MUTATE_RESTRICT, Database::RELATION_MUTATE_SET_NULL - ], true)), 'Constraints option', true) + ], true)), 'Constraints option', true, enum: new Enum(name: 'RelationMutate')) ->param('newKey', null, fn (Database $dbForProject) => new Nullable(new Key(false, $dbForProject->getAdapter()->getMaxUIDLength())), 'New Column Key.', true, ['dbForProject']) ->inject('response') ->inject('dbForProject') diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Indexes/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Indexes/Create.php index 77496fea59..d6c2bf29f3 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Indexes/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Indexes/Create.php @@ -12,6 +12,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; +use Utopia\Platform\Enum; use Utopia\Validator\ArrayList; use Utopia\Validator\Integer; use Utopia\Validator\Nullable; @@ -58,9 +59,9 @@ class Create extends IndexCreate ->param('databaseId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Database ID.', false, ['dbForProject']) ->param('tableId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Table ID. You can create a new table using the Database service [server integration](https://appwrite.io/docs/references/cloud/server-dart/tablesDB#createTable).', false, ['dbForProject']) ->param('key', null, fn (Database $dbForProject) => new Key(false, $dbForProject->getAdapter()->getMaxUIDLength()), 'Index Key.', false, ['dbForProject']) - ->param('type', null, new WhiteList([Database::INDEX_KEY, Database::INDEX_FULLTEXT, Database::INDEX_UNIQUE, Database::INDEX_SPATIAL]), 'Index type.') + ->param('type', null, new WhiteList([Database::INDEX_KEY, Database::INDEX_FULLTEXT, Database::INDEX_UNIQUE, Database::INDEX_SPATIAL]), 'Index type.', enum: new Enum(name: 'TablesDBIndexType')) ->param('columns', null, fn (Database $dbForProject) => new ArrayList(new Key(true, $dbForProject->getAdapter()->getMaxUIDLength()), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Array of columns to index. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' columns are allowed, each 32 characters long.', false, ['dbForProject']) - ->param('orders', [], new ArrayList(new WhiteList(['ASC', 'DESC'], false, Database::VAR_STRING), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Array of index orders. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' orders are allowed.', true) + ->param('orders', [], new ArrayList(new WhiteList(['ASC', 'DESC'], false, Database::VAR_STRING), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Array of index orders. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' orders are allowed.', true, enum: new Enum(name: 'OrderBy')) ->param('lengths', [], new ArrayList(new Nullable(new Integer()), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Length of index. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE, optional: true) ->inject('response') ->inject('dbForProject') diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Usage/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Usage/Get.php index 6976be014c..293db004ee 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Usage/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Usage/Get.php @@ -11,6 +11,7 @@ use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Database; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; +use Utopia\Platform\Enum; use Utopia\Validator\WhiteList; class Get extends CollectionUsageGet @@ -49,7 +50,14 @@ class Get extends CollectionUsageGet contentType: ContentType::JSON, )) ->param('databaseId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Database ID.', false, ['dbForProject']) - ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true) + ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true, enum: new Enum( + name: 'UsageRange', + map: [ + '24h' => 'Twenty Four Hours', + '30d' => 'Thirty Days', + '90d' => 'Ninety Days', + ] + )) ->param('tableId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Table ID.', false, ['dbForProject']) ->inject('response') ->inject('dbForProject') diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Usage/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Usage/Get.php index 6f0611e87a..3f3e58dc89 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Usage/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Usage/Get.php @@ -11,6 +11,7 @@ use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Database; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; +use Utopia\Platform\Enum; use Utopia\Validator\WhiteList; class Get extends DatabaseUsageGet @@ -46,7 +47,14 @@ class Get extends DatabaseUsageGet ), ]) ->param('databaseId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Database ID.', false, ['dbForProject']) - ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true) + ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true, enum: new Enum( + name: 'UsageRange', + map: [ + '24h' => 'Twenty Four Hours', + '30d' => 'Thirty Days', + '90d' => 'Ninety Days', + ] + )) ->inject('response') ->inject('dbForProject') ->inject('authorization') diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Usage/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Usage/XList.php index a479693206..33fcaf8130 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Usage/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Usage/XList.php @@ -9,6 +9,7 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; +use Utopia\Platform\Enum; use Utopia\Validator\WhiteList; class XList extends DatabaseUsageXList @@ -43,7 +44,14 @@ class XList extends DatabaseUsageXList contentType: ContentType::JSON ), ]) - ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true) + ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true, enum: new Enum( + name: 'UsageRange', + map: [ + '24h' => 'Twenty Four Hours', + '30d' => 'Thirty Days', + '90d' => 'Ninety Days', + ] + )) ->inject('response') ->inject('dbForProject') ->inject('authorization') diff --git a/src/Appwrite/Platform/Modules/Databases/Http/VectorsDB/Collections/Indexes/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/VectorsDB/Collections/Indexes/Create.php index bba7ee0579..e7e8c8cb1f 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/VectorsDB/Collections/Indexes/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/VectorsDB/Collections/Indexes/Create.php @@ -12,6 +12,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; +use Utopia\Platform\Enum; use Utopia\Validator\ArrayList; use Utopia\Validator\Integer; use Utopia\Validator\Nullable; @@ -58,9 +59,9 @@ class Create extends IndexCreate ->param('databaseId', '', new UID(), 'Database ID.') ->param('collectionId', '', new UID(), 'Collection ID. You can create a new collection using the Database service [server integration](https://appwrite.io/docs/server/databases#databasesCreateCollection).') ->param('key', null, new Key(), 'Index Key.') - ->param('type', null, new WhiteList([Database::INDEX_HNSW_EUCLIDEAN,Database::INDEX_HNSW_DOT, Database::INDEX_HNSW_COSINE, Database::INDEX_OBJECT, Database::INDEX_KEY, Database::INDEX_UNIQUE]), 'Index type.') + ->param('type', null, new WhiteList([Database::INDEX_HNSW_EUCLIDEAN,Database::INDEX_HNSW_DOT, Database::INDEX_HNSW_COSINE, Database::INDEX_OBJECT, Database::INDEX_KEY, Database::INDEX_UNIQUE]), 'Index type.', enum: new Enum(name: 'VectorsDBIndexType')) ->param('attributes', null, new ArrayList(new Key(true), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Array of attributes to index. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' attributes are allowed, each 32 characters long.') - ->param('orders', [], new ArrayList(new WhiteList(['ASC', 'DESC'], false, Database::VAR_STRING), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Array of index orders. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' orders are allowed.', true) + ->param('orders', [], new ArrayList(new WhiteList(['ASC', 'DESC'], false, Database::VAR_STRING), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Array of index orders. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' orders are allowed.', true, enum: new Enum(name: 'OrderBy')) ->param('lengths', [], new ArrayList(new Nullable(new Integer()), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Length of index. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE, optional: true) ->inject('response') ->inject('dbForProject') diff --git a/src/Appwrite/Platform/Modules/Databases/Http/VectorsDB/Collections/Usage/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/VectorsDB/Collections/Usage/Get.php index 7e0f79a9f1..fa28028cc1 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/VectorsDB/Collections/Usage/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/VectorsDB/Collections/Usage/Get.php @@ -10,6 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; +use Utopia\Platform\Enum; use Utopia\Validator\WhiteList; class Get extends CollectionUsageGet @@ -53,7 +54,14 @@ class Get extends CollectionUsageGet contentType: ContentType::JSON, )) ->param('databaseId', '', new UID(), 'Database ID.') - ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true) + ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true, enum: new Enum( + name: 'UsageRange', + map: [ + '24h' => 'Twenty Four Hours', + '30d' => 'Thirty Days', + '90d' => 'Ninety Days', + ] + )) ->param('collectionId', '', new UID(), 'Collection ID.') ->inject('response') ->inject('dbForProject') diff --git a/src/Appwrite/Platform/Modules/Databases/Http/VectorsDB/Usage/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/VectorsDB/Usage/Get.php index 051e2e39fa..725e11e48b 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/VectorsDB/Usage/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/VectorsDB/Usage/Get.php @@ -10,6 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; +use Utopia\Platform\Enum; use Utopia\Validator\WhiteList; class Get extends DatabaseUsageGet @@ -50,7 +51,14 @@ class Get extends DatabaseUsageGet ), ]) ->param('databaseId', '', new UID(), 'Database ID.') - ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true) + ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true, enum: new Enum( + name: 'UsageRange', + map: [ + '24h' => 'Twenty Four Hours', + '30d' => 'Thirty Days', + '90d' => 'Ninety Days', + ] + )) ->inject('response') ->inject('dbForProject') ->inject('authorization') diff --git a/src/Appwrite/Platform/Modules/Databases/Http/VectorsDB/Usage/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/VectorsDB/Usage/XList.php index d91a5963c4..b2aae774d8 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/VectorsDB/Usage/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/VectorsDB/Usage/XList.php @@ -9,6 +9,7 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; +use Utopia\Platform\Enum; use Utopia\Validator\WhiteList; class XList extends DatabaseUsageXList @@ -48,7 +49,14 @@ class XList extends DatabaseUsageXList contentType: ContentType::JSON ), ]) - ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true) + ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true, enum: new Enum( + name: 'UsageRange', + map: [ + '24h' => 'Twenty Four Hours', + '30d' => 'Thirty Days', + '90d' => 'Ninety Days', + ] + )) ->inject('response') ->inject('dbForProject') ->callback($this->action(...)); diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Download/Get.php b/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Download/Get.php index d3e7155dc6..c92e3c1406 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Download/Get.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Download/Get.php @@ -3,6 +3,7 @@ namespace Appwrite\Platform\Modules\Functions\Http\Deployments\Download; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\SDK\AuthType; use Appwrite\SDK\ContentType; use Appwrite\SDK\Method; @@ -12,7 +13,7 @@ use Appwrite\Utopia\Response; use Utopia\Database\Database; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Request; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Storage\Device; use Utopia\Validator\WhiteList; @@ -55,7 +56,7 @@ class Get extends Action )) ->param('functionId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Function ID.', false, ['dbForProject']) ->param('deploymentId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Deployment ID.', false, ['dbForProject']) - ->param('type', 'source', new WhiteList(['source', 'output']), 'Deployment file to download. Can be: "source", "output".', true) + ->param('type', 'source', new WhiteList(['source', 'output']), 'Deployment file to download. Can be: "source", "output".', true, enum: new Enum(name: 'DeploymentDownloadType')) ->inject('response') ->inject('request') ->inject('dbForProject') diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Template/Create.php b/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Template/Create.php index f18543c60e..87d1282d8b 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Template/Create.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Template/Create.php @@ -6,6 +6,7 @@ use Appwrite\Event\Event; use Appwrite\Event\Message\Build as BuildMessage; use Appwrite\Event\Publisher\Build as BuildPublisher; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\Platform\Modules\Compute\Base; use Appwrite\SDK\AuthType; use Appwrite\SDK\Method; @@ -19,7 +20,7 @@ use Utopia\Database\Helpers\Role; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Request; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\Boolean; use Utopia\Validator\Text; @@ -68,7 +69,7 @@ class Create extends Base ->param('repository', '', new Text(128, 0), 'Repository name of the template.') ->param('owner', '', new Text(128, 0), 'The name of the owner of the template.') ->param('rootDirectory', '', new Text(128, 0), 'Path to function code in the template repo.') - ->param('type', '', new WhiteList(['commit', 'branch', 'tag']), 'Type for the reference provided. Can be commit, branch, or tag') + ->param('type', '', new WhiteList(['commit', 'branch', 'tag']), 'Type for the reference provided. Can be commit, branch, or tag', enum: new Enum(name: 'TemplateReferenceType')) ->param('reference', '', new Text(128, 0), 'Reference value, can be a commit hash, branch name, or release tag') ->param('activate', false, new Boolean(), 'Automatically activate the deployment when it is finished building.', true) ->inject('request') diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Vcs/Create.php b/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Vcs/Create.php index a74fc12593..4a9ae4051f 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Vcs/Create.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Vcs/Create.php @@ -5,6 +5,7 @@ namespace Appwrite\Platform\Modules\Functions\Http\Deployments\Vcs; use Appwrite\Event\Event; use Appwrite\Event\Publisher\Build as BuildPublisher; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\Platform\Modules\Compute\Base; use Appwrite\SDK\AuthType; use Appwrite\SDK\Method; @@ -14,7 +15,7 @@ use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Request; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\Boolean; use Utopia\Validator\Text; @@ -61,7 +62,7 @@ class Create extends Base )) ->param('functionId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Function ID.', false, ['dbForProject']) // TODO: Support tag in future - ->param('type', '', new WhiteList(['branch', 'commit']), 'Type of reference passed. Allowed values are: branch, commit') + ->param('type', '', new WhiteList(['branch', 'commit']), 'Type of reference passed. Allowed values are: branch, commit', enum: new Enum(name: 'VCSReferenceType')) ->param('reference', '', new Text(255), 'VCS reference to create deployment from. Depending on type this can be: branch name, commit hash') ->param('activate', false, new Boolean(), 'Automatically activate the deployment when it is finished building.', true) ->inject('request') diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Create.php b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Create.php index 148f0945ac..dcb598a2a4 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Create.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Create.php @@ -33,6 +33,7 @@ use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Roles; use Utopia\Http\Request; use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\System\System; use Utopia\Validator\ArrayList; @@ -89,7 +90,7 @@ class Create extends Base ->param('logging', true, new Boolean(), 'When disabled, executions will exclude logs and errors, and will be slightly faster.', true) ->param('entrypoint', '', new Text(1028, 0), 'Entrypoint File. This path is relative to the "providerRootDirectory".', true) ->param('commands', '', new Text(8192, 0), 'Build Commands.', true) - ->param('scopes', [], new ArrayList(new WhiteList(array_keys(Config::getParam('projectScopes')), true), APP_LIMIT_ARRAY_PARAMS_SIZE), 'List of scopes allowed for API key auto-generated for every execution. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' scopes are allowed.', true) + ->param('scopes', [], new ArrayList(new WhiteList(array_keys(Config::getParam('projectScopes')), true), APP_LIMIT_ARRAY_PARAMS_SIZE), 'List of scopes allowed for API key auto-generated for every execution. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' scopes are allowed.', true, enum: new Enum(name: 'ProjectKeyScopes')) ->param('installationId', '', new Text(128, 0), 'Appwrite Installation ID for VCS (Version Control System) deployment.', true) ->param('providerRepositoryId', '', new Text(128, 0), 'Repository ID of the repo linked to the function.', true) ->param('providerBranch', '', new Text(128, 0), 'Production branch for the repo linked to the function.', true) diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Update.php b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Update.php index e8713a179d..2c26adea71 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Update.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Update.php @@ -25,6 +25,7 @@ use Utopia\Database\Validator\Roles; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Request; use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\System\System; use Utopia\Validator\ArrayList; @@ -81,7 +82,7 @@ class Update extends Base ->param('logging', true, new Boolean(), 'When disabled, executions will exclude logs and errors, and will be slightly faster.', true) ->param('entrypoint', '', new Text(1028, 0), 'Entrypoint File. This path is relative to the "providerRootDirectory".', true) ->param('commands', '', new Text(8192, 0), 'Build Commands.', true) - ->param('scopes', [], new ArrayList(new WhiteList(array_keys(Config::getParam('projectScopes')), true), APP_LIMIT_ARRAY_PARAMS_SIZE), 'List of scopes allowed for API Key auto-generated for every execution. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' scopes are allowed.', true) + ->param('scopes', [], new ArrayList(new WhiteList(array_keys(Config::getParam('projectScopes')), true), APP_LIMIT_ARRAY_PARAMS_SIZE), 'List of scopes allowed for API Key auto-generated for every execution. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' scopes are allowed.', true, enum: new Enum(name: 'ProjectKeyScopes')) ->param('installationId', '', new Text(128, 0), 'Appwrite Installation ID for VCS (Version Controle System) deployment.', true) ->param('providerRepositoryId', null, new Nullable(new Text(128, 0)), 'Repository ID of the repo linked to the function', true) ->param('providerBranch', '', new Text(128, 0), 'Production branch for the repo linked to the function', true) diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Usage/Get.php b/src/Appwrite/Platform/Modules/Functions/Http/Usage/Get.php index 7016d600cb..def354aa2d 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Usage/Get.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Usage/Get.php @@ -3,6 +3,7 @@ namespace Appwrite\Platform\Modules\Functions\Http\Usage; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\Platform\Modules\Compute\Base; use Appwrite\SDK\AuthType; use Appwrite\SDK\Method; @@ -14,7 +15,7 @@ use Utopia\Database\Document; use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\WhiteList; @@ -52,7 +53,14 @@ class Get extends Base ] )) ->param('functionId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Function ID.', false, ['dbForProject']) - ->param('range', '30d', new WhiteList(['24h', '30d', '90d']), 'Date range.', true) + ->param('range', '30d', new WhiteList(['24h', '30d', '90d']), 'Date range.', true, enum: new Enum( + name: 'UsageRange', + map: [ + '24h' => 'Twenty Four Hours', + '30d' => 'Thirty Days', + '90d' => 'Ninety Days', + ] + )) ->inject('response') ->inject('dbForProject') ->inject('authorization') diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Usage/XList.php b/src/Appwrite/Platform/Modules/Functions/Http/Usage/XList.php index 70b7b8e058..1ac77da6f8 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Usage/XList.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Usage/XList.php @@ -3,6 +3,7 @@ namespace Appwrite\Platform\Modules\Functions\Http\Usage; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\Platform\Modules\Compute\Base; use Appwrite\SDK\AuthType; use Appwrite\SDK\Method; @@ -13,7 +14,7 @@ use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\WhiteList; @@ -50,7 +51,14 @@ class XList extends Base ) ] )) - ->param('range', '30d', new WhiteList(['24h', '30d', '90d']), 'Date range.', true) + ->param('range', '30d', new WhiteList(['24h', '30d', '90d']), 'Date range.', true, enum: new Enum( + name: 'UsageRange', + map: [ + '24h' => 'Twenty Four Hours', + '30d' => 'Thirty Days', + '90d' => 'Ninety Days', + ] + )) ->inject('response') ->inject('dbForProject') ->inject('authorization') diff --git a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Appwrite/Create.php b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Appwrite/Create.php index fa700877a1..34bc7ac4f2 100644 --- a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Appwrite/Create.php +++ b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Appwrite/Create.php @@ -5,6 +5,7 @@ namespace Appwrite\Platform\Modules\Migrations\Http\Migrations\Appwrite; use Appwrite\Event\Event; use Appwrite\Event\Message\Migration as MigrationMessage; use Appwrite\Event\Publisher\Migration as MigrationPublisher; +use Appwrite\Platform\Action; use Appwrite\SDK\AuthType; use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; @@ -15,7 +16,7 @@ use Utopia\Database\Helpers\ID; use Utopia\Database\Validator\UID; use Utopia\Migration\Destinations\OnDuplicate; use Utopia\Migration\Sources\Appwrite as AppwriteSource; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\ArrayList; use Utopia\Validator\Text; @@ -54,7 +55,7 @@ class Create extends Action ) ] )) - ->param('resources', [], new ArrayList(new WhiteList(AppwriteSource::getSupportedResources())), 'List of resources to migrate') + ->param('resources', [], new ArrayList(new WhiteList(AppwriteSource::getSupportedResources())), 'List of resources to migrate', enum: new Enum(name: 'AppwriteMigrationResource')) ->param('endpoint', '', new URL(), 'Source Appwrite endpoint') ->param('projectId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Source Project ID', false, ['dbForProject']) ->param('apiKey', '', new Text(512), 'Source API Key') diff --git a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Appwrite/Report/Get.php b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Appwrite/Report/Get.php index 32d8a62ec3..539a4ec57f 100644 --- a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Appwrite/Report/Get.php +++ b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Appwrite/Report/Get.php @@ -3,13 +3,14 @@ namespace Appwrite\Platform\Modules\Migrations\Http\Migrations\Appwrite\Report; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\SDK\AuthType; use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response; use Utopia\Database\Document; use Utopia\Migration\Sources\Appwrite as AppwriteSource; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\ArrayList; use Utopia\Validator\Text; @@ -46,7 +47,7 @@ class Get extends Action ) ] )) - ->param('resources', [], new ArrayList(new WhiteList(AppwriteSource::getSupportedResources())), 'List of resources to migrate') + ->param('resources', [], new ArrayList(new WhiteList(AppwriteSource::getSupportedResources())), 'List of resources to migrate', enum: new Enum(name: 'AppwriteMigrationResource')) ->param('endpoint', '', new URL(), "Source's Appwrite Endpoint") ->param('projectID', '', new Text(512), "Source's Project ID") ->param('key', '', new Text(512), "Source's API Key") diff --git a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Firebase/Create.php b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Firebase/Create.php index a8347858b4..c6a552985f 100644 --- a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Firebase/Create.php +++ b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Firebase/Create.php @@ -6,6 +6,7 @@ use Appwrite\Event\Event; use Appwrite\Event\Message\Migration as MigrationMessage; use Appwrite\Event\Publisher\Migration as MigrationPublisher; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\SDK\AuthType; use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; @@ -15,7 +16,7 @@ use Utopia\Database\Document; use Utopia\Database\Helpers\ID; use Utopia\Migration\Sources\Appwrite as AppwriteSource; use Utopia\Migration\Sources\Firebase; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\ArrayList; use Utopia\Validator\Text; @@ -53,7 +54,7 @@ class Create extends Action ) ] )) - ->param('resources', [], new ArrayList(new WhiteList(Firebase::getSupportedResources())), 'List of resources to migrate') + ->param('resources', [], new ArrayList(new WhiteList(Firebase::getSupportedResources())), 'List of resources to migrate', enum: new Enum(name: 'FirebaseMigrationResource')) ->param('serviceAccount', '', new Text(65536), 'JSON of the Firebase service account credentials') ->inject('response') ->inject('dbForProject') diff --git a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Firebase/Report/Get.php b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Firebase/Report/Get.php index ef8084795e..8919e2e6d1 100644 --- a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Firebase/Report/Get.php +++ b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Firebase/Report/Get.php @@ -3,13 +3,14 @@ namespace Appwrite\Platform\Modules\Migrations\Http\Migrations\Firebase\Report; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\SDK\AuthType; use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response; use Utopia\Database\Document; use Utopia\Migration\Sources\Firebase; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\ArrayList; use Utopia\Validator\Text; @@ -45,7 +46,7 @@ class Get extends Action ) ] )) - ->param('resources', [], new ArrayList(new WhiteList(Firebase::getSupportedResources())), 'List of resources to migrate') + ->param('resources', [], new ArrayList(new WhiteList(Firebase::getSupportedResources())), 'List of resources to migrate', enum: new Enum(name: 'FirebaseMigrationResource')) ->param('serviceAccount', '', new Text(65536), 'JSON of the Firebase service account credentials') ->inject('response') ->callback($this->action(...)); diff --git a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/NHost/Create.php b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/NHost/Create.php index fb97b1c16c..c3a299ccd5 100644 --- a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/NHost/Create.php +++ b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/NHost/Create.php @@ -5,6 +5,7 @@ namespace Appwrite\Platform\Modules\Migrations\Http\Migrations\NHost; use Appwrite\Event\Event; use Appwrite\Event\Message\Migration as MigrationMessage; use Appwrite\Event\Publisher\Migration as MigrationPublisher; +use Appwrite\Platform\Action; use Appwrite\SDK\AuthType; use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; @@ -14,7 +15,7 @@ use Utopia\Database\Document; use Utopia\Database\Helpers\ID; use Utopia\Migration\Sources\Appwrite as AppwriteSource; use Utopia\Migration\Sources\NHost; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\ArrayList; use Utopia\Validator\Integer; @@ -53,7 +54,7 @@ class Create extends Action ) ] )) - ->param('resources', [], new ArrayList(new WhiteList(NHost::getSupportedResources())), 'List of resources to migrate') + ->param('resources', [], new ArrayList(new WhiteList(NHost::getSupportedResources())), 'List of resources to migrate', enum: new Enum(name: 'NHostMigrationResource')) ->param('subdomain', '', new Text(512), 'Source\'s Subdomain') ->param('region', '', new Text(512), 'Source\'s Region') ->param('adminSecret', '', new Text(512), 'Source\'s Admin Secret') diff --git a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/NHost/Report/Get.php b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/NHost/Report/Get.php index 964f2dc347..a16d47f53d 100644 --- a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/NHost/Report/Get.php +++ b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/NHost/Report/Get.php @@ -3,13 +3,14 @@ namespace Appwrite\Platform\Modules\Migrations\Http\Migrations\NHost\Report; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\SDK\AuthType; use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response; use Utopia\Database\Document; use Utopia\Migration\Sources\NHost; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\ArrayList; use Utopia\Validator\Integer; @@ -46,7 +47,7 @@ class Get extends Action ) ] )) - ->param('resources', [], new ArrayList(new WhiteList(NHost::getSupportedResources())), 'List of resources to migrate.') + ->param('resources', [], new ArrayList(new WhiteList(NHost::getSupportedResources())), 'List of resources to migrate.', enum: new Enum(name: 'NHostMigrationResource')) ->param('subdomain', '', new Text(512), 'Source\'s Subdomain.') ->param('region', '', new Text(512), 'Source\'s Region.') ->param('adminSecret', '', new Text(512), 'Source\'s Admin Secret.') diff --git a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Supabase/Create.php b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Supabase/Create.php index 98b33e379d..dc835158ab 100644 --- a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Supabase/Create.php +++ b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Supabase/Create.php @@ -5,6 +5,7 @@ namespace Appwrite\Platform\Modules\Migrations\Http\Migrations\Supabase; use Appwrite\Event\Event; use Appwrite\Event\Message\Migration as MigrationMessage; use Appwrite\Event\Publisher\Migration as MigrationPublisher; +use Appwrite\Platform\Action; use Appwrite\SDK\AuthType; use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; @@ -14,7 +15,7 @@ use Utopia\Database\Document; use Utopia\Database\Helpers\ID; use Utopia\Migration\Sources\Appwrite as AppwriteSource; use Utopia\Migration\Sources\Supabase; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\ArrayList; use Utopia\Validator\Integer; @@ -54,7 +55,7 @@ class Create extends Action ) ] )) - ->param('resources', [], new ArrayList(new WhiteList(Supabase::getSupportedResources(), true)), 'List of resources to migrate') + ->param('resources', [], new ArrayList(new WhiteList(Supabase::getSupportedResources(), true)), 'List of resources to migrate', enum: new Enum(name: 'SupabaseMigrationResource')) ->param('endpoint', '', new URL(), 'Source\'s Supabase Endpoint') ->param('apiKey', '', new Text(512), 'Source\'s API Key') ->param('databaseHost', '', new Text(512), 'Source\'s Database Host') diff --git a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Supabase/Report/Get.php b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Supabase/Report/Get.php index 423e611430..d88fa0e2fb 100644 --- a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Supabase/Report/Get.php +++ b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Supabase/Report/Get.php @@ -3,13 +3,14 @@ namespace Appwrite\Platform\Modules\Migrations\Http\Migrations\Supabase\Report; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\SDK\AuthType; use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response; use Utopia\Database\Document; use Utopia\Migration\Sources\Supabase; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\ArrayList; use Utopia\Validator\Integer; @@ -47,7 +48,7 @@ class Get extends Action ) ] )) - ->param('resources', [], new ArrayList(new WhiteList(Supabase::getSupportedResources(), true)), 'List of resources to migrate') + ->param('resources', [], new ArrayList(new WhiteList(Supabase::getSupportedResources(), true)), 'List of resources to migrate', enum: new Enum(name: 'SupabaseMigrationResource')) ->param('endpoint', '', new URL(), 'Source\'s Supabase Endpoint.') ->param('apiKey', '', new Text(512), 'Source\'s API Key.') ->param('databaseHost', '', new Text(512), 'Source\'s Database Host.') diff --git a/src/Appwrite/Platform/Modules/Presences/HTTP/Usage/Get.php b/src/Appwrite/Platform/Modules/Presences/HTTP/Usage/Get.php index 636010e765..36b488cfe7 100644 --- a/src/Appwrite/Platform/Modules/Presences/HTTP/Usage/Get.php +++ b/src/Appwrite/Platform/Modules/Presences/HTTP/Usage/Get.php @@ -3,6 +3,7 @@ namespace Appwrite\Platform\Modules\Presences\HTTP\Usage; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\Platform\Action as PlatformAction; use Appwrite\SDK\AuthType; use Appwrite\SDK\Method; @@ -13,7 +14,7 @@ use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Validator\WhiteList; class Get extends PlatformAction @@ -45,7 +46,14 @@ class Get extends PlatformAction ), ], )) - ->param('range', '30d', new WhiteList(['24h', '30d', '90d']), 'Date range.', true) + ->param('range', '30d', new WhiteList(['24h', '30d', '90d']), 'Date range.', true, enum: new Enum( + name: 'UsageRange', + map: [ + '24h' => 'Twenty Four Hours', + '30d' => 'Thirty Days', + '90d' => 'Ninety Days', + ] + )) ->inject('response') ->inject('dbForProject') ->inject('authorization') diff --git a/src/Appwrite/Platform/Modules/Project/Http/Project/Keys/Create.php b/src/Appwrite/Platform/Modules/Project/Http/Project/Keys/Create.php index eebc0a7067..992b3532c4 100644 --- a/src/Appwrite/Platform/Modules/Project/Http/Project/Keys/Create.php +++ b/src/Appwrite/Platform/Modules/Project/Http/Project/Keys/Create.php @@ -4,6 +4,7 @@ namespace Appwrite\Platform\Modules\Project\Http\Project\Keys; use Appwrite\Event\Event as QueueEvent; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\Platform\Modules\Compute\Base; use Appwrite\SDK\AuthType; use Appwrite\SDK\Method; @@ -17,7 +18,7 @@ use Utopia\Database\Exception\Duplicate as DuplicateException; use Utopia\Database\Helpers\ID; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Datetime; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\ArrayList; use Utopia\Validator\Nullable; @@ -64,7 +65,7 @@ class Create extends Base )) ->param('keyId', '', fn (Database $dbForPlatform) => new CustomId(false, $dbForPlatform->getAdapter()->getMaxUIDLength()), 'Key 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.', false, ['dbForPlatform']) ->param('name', null, new Text(128), 'Key name. Max length: 128 chars.') - ->param('scopes', [], new ArrayList(new WhiteList(array_keys(Config::getParam('projectScopes')), true), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Key scopes list. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' scopes are allowed.', optional: false) + ->param('scopes', [], new ArrayList(new WhiteList(array_keys(Config::getParam('projectScopes')), true), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Key scopes list. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' scopes are allowed.', optional: false, enum: new Enum(name: 'ProjectKeyScopes')) ->param('expire', null, new Nullable(new Datetime()), 'Expiration time in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format. Use null for unlimited expiration.', true) ->inject('response') ->inject('queueForEvents') diff --git a/src/Appwrite/Platform/Modules/Project/Http/Project/Keys/Ephemeral/Create.php b/src/Appwrite/Platform/Modules/Project/Http/Project/Keys/Ephemeral/Create.php index 4130effe69..aadf76d74f 100644 --- a/src/Appwrite/Platform/Modules/Project/Http/Project/Keys/Ephemeral/Create.php +++ b/src/Appwrite/Platform/Modules/Project/Http/Project/Keys/Ephemeral/Create.php @@ -4,6 +4,7 @@ namespace Appwrite\Platform\Modules\Project\Http\Project\Keys\Ephemeral; use Ahc\Jwt\JWT; use Appwrite\Event\Event as QueueEvent; +use Appwrite\Platform\Action; use Appwrite\Platform\Modules\Compute\Base; use Appwrite\SDK\AuthType; use Appwrite\SDK\Method; @@ -13,7 +14,7 @@ use Utopia\Config\Config; use Utopia\Database\DateTime as DatabaseDateTime; use Utopia\Database\Document; use Utopia\Database\Helpers\ID; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\System\System; use Utopia\Validator\ArrayList; @@ -58,7 +59,7 @@ class Create extends Base ) ], )) - ->param('scopes', [], new ArrayList(new WhiteList(array_keys(Config::getParam('projectScopes')), true), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Key scopes list. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' scopes are allowed.', optional: false) + ->param('scopes', [], new ArrayList(new WhiteList(array_keys(Config::getParam('projectScopes')), true), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Key scopes list. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' scopes are allowed.', optional: false, enum: new Enum(name: 'ProjectKeyScopes')) ->param('duration', null, new Range(1, 3600), 'Time in seconds before ephemeral key expires. Maximum duration is 3600 seconds.', optional: false, example: 600) ->inject('response') ->inject('queueForEvents') diff --git a/src/Appwrite/Platform/Modules/Project/Http/Project/Keys/Update.php b/src/Appwrite/Platform/Modules/Project/Http/Project/Keys/Update.php index 9193bdbfdf..0d96bcf315 100644 --- a/src/Appwrite/Platform/Modules/Project/Http/Project/Keys/Update.php +++ b/src/Appwrite/Platform/Modules/Project/Http/Project/Keys/Update.php @@ -4,6 +4,7 @@ namespace Appwrite\Platform\Modules\Project\Http\Project\Keys; use Appwrite\Event\Event as QueueEvent; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\Platform\Modules\Compute\Base; use Appwrite\SDK\AuthType; use Appwrite\SDK\Method; @@ -16,7 +17,7 @@ use Utopia\Database\Exception\Duplicate; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Datetime; use Utopia\Database\Validator\UID; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\ArrayList; use Utopia\Validator\Nullable; @@ -60,7 +61,7 @@ class Update extends Base )) ->param('keyId', '', fn (Database $dbForPlatform) => new UID($dbForPlatform->getAdapter()->getMaxUIDLength()), 'Key ID.', false, ['dbForPlatform']) ->param('name', null, new Text(128), 'Key name. Max length: 128 chars.') - ->param('scopes', [], new ArrayList(new WhiteList(array_keys(Config::getParam('projectScopes')), true), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Key scopes list. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' scopes are allowed.', optional: false) + ->param('scopes', [], new ArrayList(new WhiteList(array_keys(Config::getParam('projectScopes')), true), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Key scopes list. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' scopes are allowed.', optional: false, enum: new Enum(name: 'ProjectKeyScopes')) ->param('expire', null, new Nullable(new Datetime()), 'Expiration time in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format. Use null for unlimited expiration.', true) ->inject('response') ->inject('queueForEvents') diff --git a/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Redirect/Create.php b/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Redirect/Create.php index e8167b44a0..b6f5185422 100644 --- a/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Redirect/Create.php +++ b/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Redirect/Create.php @@ -16,6 +16,7 @@ use Utopia\Database\Helpers\ID; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; use Utopia\Logger\Log; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\System\System; use Utopia\Validator\Domain as ValidatorDomain; @@ -68,7 +69,13 @@ class Create extends Action ->param('url', null, new URL(), 'Target URL of redirection') ->param('statusCode', null, new WhiteList([301, 302, 307, 308]), 'Status code of redirection') ->param('resourceId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'ID of parent resource.', false, ['dbForProject']) - ->param('resourceType', '', new WhiteList(['site', 'function']), 'Type of parent resource.') + ->param('resourceType', '', new WhiteList(['site', 'function']), 'Type of parent resource.', enum: new Enum( + name: 'ProxyResourceType', + map: [ + 'site' => 'Site', + 'function' => 'Function', + ] + )) ->inject('response') ->inject('project') ->inject('publisherForCertificates') diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Download/Get.php b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Download/Get.php index 339d059365..0ab998292d 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Download/Get.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Download/Get.php @@ -3,6 +3,7 @@ namespace Appwrite\Platform\Modules\Sites\Http\Deployments\Download; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\SDK\AuthType; use Appwrite\SDK\ContentType; use Appwrite\SDK\Method; @@ -12,7 +13,7 @@ use Appwrite\Utopia\Response; use Utopia\Database\Database; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Request; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Storage\Device; use Utopia\Validator\WhiteList; @@ -54,7 +55,7 @@ class Get extends Action )) ->param('siteId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Site ID.', false, ['dbForProject']) ->param('deploymentId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Deployment ID.', false, ['dbForProject']) - ->param('type', 'source', new WhiteList(['source', 'output']), 'Deployment file to download. Can be: "source", "output".', true) + ->param('type', 'source', new WhiteList(['source', 'output']), 'Deployment file to download. Can be: "source", "output".', true, enum: new Enum(name: 'DeploymentDownloadType')) ->inject('response') ->inject('request') ->inject('dbForProject') diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Template/Create.php b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Template/Create.php index 29854d473b..b0d39ad6f9 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Template/Create.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Template/Create.php @@ -6,6 +6,7 @@ use Appwrite\Event\Event; use Appwrite\Event\Message\Build as BuildMessage; use Appwrite\Event\Publisher\Build as BuildPublisher; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\Platform\Modules\Compute\Base; use Appwrite\SDK\AuthType; use Appwrite\SDK\Method; @@ -19,7 +20,7 @@ use Utopia\Database\Helpers\Role; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Request; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\System\System; use Utopia\Validator\Boolean; @@ -69,7 +70,7 @@ class Create extends Base ->param('repository', '', new Text(128, 0), 'Repository name of the template.') ->param('owner', '', new Text(128, 0), 'The name of the owner of the template.') ->param('rootDirectory', '', new Text(128, 0), 'Path to site code in the template repo.') - ->param('type', '', new WhiteList(['branch', 'commit', 'tag']), 'Type for the reference provided. Can be commit, branch, or tag') + ->param('type', '', new WhiteList(['branch', 'commit', 'tag']), 'Type for the reference provided. Can be commit, branch, or tag', enum: new Enum(name: 'TemplateReferenceType')) ->param('reference', '', new Text(128, 0), 'Reference value, can be a commit hash, branch name, or release tag') ->param('activate', false, new Boolean(), 'Automatically activate the deployment when it is finished building.', true) ->inject('request') diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Vcs/Create.php b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Vcs/Create.php index d34b8c4055..d4bf42cffe 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Vcs/Create.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Vcs/Create.php @@ -5,6 +5,7 @@ namespace Appwrite\Platform\Modules\Sites\Http\Deployments\Vcs; use Appwrite\Event\Event; use Appwrite\Event\Publisher\Build as BuildPublisher; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\Platform\Modules\Compute\Base; use Appwrite\SDK\AuthType; use Appwrite\SDK\Method; @@ -15,7 +16,7 @@ use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Request; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\Boolean; use Utopia\Validator\Text; @@ -62,7 +63,7 @@ class Create extends Base )) ->param('siteId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Site ID.', false, ['dbForProject']) // TODO: Support tag in future - ->param('type', '', new WhiteList(['branch', 'commit', 'tag']), 'Type of reference passed. Allowed values are: branch, commit') + ->param('type', '', new WhiteList(['branch', 'commit', 'tag']), 'Type of reference passed. Allowed values are: branch, commit', enum: new Enum(name: 'VCSReferenceType')) ->param('reference', '', new Text(255), 'VCS reference to create deployment from. Depending on type this can be: branch name, commit hash') ->param('activate', false, new Boolean(), 'Automatically activate the deployment when it is finished building.', true) ->inject('request') diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Usage/Get.php b/src/Appwrite/Platform/Modules/Sites/Http/Usage/Get.php index 85968c7550..73400977d1 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Usage/Get.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Usage/Get.php @@ -3,6 +3,7 @@ namespace Appwrite\Platform\Modules\Sites\Http\Usage; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\Platform\Modules\Compute\Base; use Appwrite\SDK\AuthType; use Appwrite\SDK\Method; @@ -14,7 +15,7 @@ use Utopia\Database\Document; use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\WhiteList; @@ -52,7 +53,14 @@ class Get extends Base ] )) ->param('siteId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Site ID.', false, ['dbForProject']) - ->param('range', '30d', new WhiteList(['24h', '30d', '90d']), 'Date range.', true) + ->param('range', '30d', new WhiteList(['24h', '30d', '90d']), 'Date range.', true, enum: new Enum( + name: 'UsageRange', + map: [ + '24h' => 'Twenty Four Hours', + '30d' => 'Thirty Days', + '90d' => 'Ninety Days', + ] + )) ->inject('response') ->inject('dbForProject') ->inject('authorization') diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Usage/XList.php b/src/Appwrite/Platform/Modules/Sites/Http/Usage/XList.php index 636889f6c0..0066bb644c 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Usage/XList.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Usage/XList.php @@ -3,6 +3,7 @@ namespace Appwrite\Platform\Modules\Sites\Http\Usage; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\Platform\Modules\Compute\Base; use Appwrite\SDK\AuthType; use Appwrite\SDK\Method; @@ -13,7 +14,7 @@ use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\WhiteList; @@ -50,7 +51,14 @@ class XList extends Base ) ] )) - ->param('range', '30d', new WhiteList(['24h', '30d', '90d']), 'Date range.', true) + ->param('range', '30d', new WhiteList(['24h', '30d', '90d']), 'Date range.', true, enum: new Enum( + name: 'UsageRange', + map: [ + '24h' => 'Twenty Four Hours', + '30d' => 'Thirty Days', + '90d' => 'Ninety Days', + ] + )) ->inject('response') ->inject('dbForProject') ->inject('authorization') diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Preview/Get.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Preview/Get.php index 68bc2cabae..d160bf0ee3 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Preview/Get.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Preview/Get.php @@ -4,6 +4,7 @@ namespace Appwrite\Platform\Modules\Storage\Http\Buckets\Files\Preview; use Appwrite\Extend\Exception; use Appwrite\OpenSSL\OpenSSL; +use Appwrite\Platform\Action; use Appwrite\Platform\Modules\Storage\Config\CacheControl; use Appwrite\Platform\Modules\Storage\Config\StorageCacheControl; use Appwrite\SDK\AuthType; @@ -25,7 +26,7 @@ use Utopia\Database\Validator\Authorization\Input; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Request; use Utopia\Image\Image; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Span\Span; use Utopia\Storage\Device; @@ -76,7 +77,7 @@ class Get extends Action ->param('fileId', '', new UID(), 'File ID') ->param('width', 0, new Range(0, 4000), 'Resize preview image width, Pass an integer between 0 to 4000.', true) ->param('height', 0, new Range(0, 4000), 'Resize preview image height, Pass an integer between 0 to 4000.', true) - ->param('gravity', Image::GRAVITY_CENTER, new WhiteList(Image::getGravityTypes()), 'Image crop gravity. Can be one of ' . implode(",", Image::getGravityTypes()), true) + ->param('gravity', Image::GRAVITY_CENTER, new WhiteList(Image::getGravityTypes()), 'Image crop gravity. Can be one of ' . implode(",", Image::getGravityTypes()), true, enum: new Enum(name: 'ImageGravity')) ->param('quality', -1, new Range(-1, 100), 'Preview image quality. Pass an integer between 0 to 100. Defaults to keep existing image quality.', true) ->param('borderWidth', 0, new Range(0, 100), 'Preview image border in pixels. Pass an integer between 0 to 100. Defaults to 0.', true) ->param('borderColor', '', new HexColor(), 'Preview image border color. Use a valid HEX color, no # is needed for prefix.', true) @@ -84,7 +85,7 @@ class Get extends Action ->param('opacity', 1, new Range(0, 1, Range::TYPE_FLOAT), 'Preview image opacity. Only works with images having an alpha channel (like png). Pass a number between 0 to 1.', true) ->param('rotation', 0, new Range(-360, 360), 'Preview image rotation in degrees. Pass an integer between -360 and 360.', true) ->param('background', '', new HexColor(), 'Preview image background color. Only works with transparent images (png). Use a valid HEX color, no # is needed for prefix.', true) - ->param('output', '', new WhiteList(\array_keys(Config::getParam('storage-outputs')), true), 'Output format type (jpeg, jpg, png, gif and webp).', true) + ->param('output', '', new WhiteList(\array_keys(Config::getParam('storage-outputs')), true), 'Output format type (jpeg, jpg, png, gif and webp).', true, enum: new Enum(name: 'ImageFormat')) // NOTE: this is only for the sdk generator and is not used in the action below and is utilised in `resources.php` for `resourceToken`. ->param('token', '', new Text(512), 'File token for accessing this file.', true) ->inject('request') diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Usage/Get.php b/src/Appwrite/Platform/Modules/Storage/Http/Usage/Get.php index 10a603f5df..41ae0dd9ab 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Usage/Get.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Usage/Get.php @@ -3,6 +3,7 @@ namespace Appwrite\Platform\Modules\Storage\Http\Usage; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\SDK\AuthType; use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; @@ -13,7 +14,7 @@ use Utopia\Database\Document; use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\WhiteList; @@ -49,7 +50,14 @@ class Get extends Action ] )) ->param('bucketId', '', new UID(), 'Bucket ID.') - ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true) + ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true, enum: new Enum( + name: 'UsageRange', + map: [ + '24h' => 'Twenty Four Hours', + '30d' => 'Thirty Days', + '90d' => 'Ninety Days', + ] + )) ->inject('response') ->inject('project') ->inject('dbForProject') diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Usage/XList.php b/src/Appwrite/Platform/Modules/Storage/Http/Usage/XList.php index 04eac21754..b4376208c0 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Usage/XList.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Usage/XList.php @@ -3,6 +3,7 @@ namespace Appwrite\Platform\Modules\Storage\Http\Usage; use Appwrite\Extend\Exception; +use Appwrite\Platform\Action; use Appwrite\SDK\AuthType; use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; @@ -12,7 +13,7 @@ use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; -use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\WhiteList; @@ -47,7 +48,14 @@ class XList extends Action ) ] )) - ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true) + ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true, enum: new Enum( + name: 'UsageRange', + map: [ + '24h' => 'Twenty Four Hours', + '30d' => 'Thirty Days', + '90d' => 'Ninety Days', + ] + )) ->inject('response') ->inject('dbForProject') ->inject('authorization') diff --git a/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/Detections/Create.php b/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/Detections/Create.php index aa7d7ae95c..4da5699a4e 100644 --- a/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/Detections/Create.php +++ b/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/Detections/Create.php @@ -46,6 +46,7 @@ use Utopia\Detector\Detector\Framework; use Utopia\Detector\Detector\Packager; use Utopia\Detector\Detector\Runtime; use Utopia\Detector\Detector\Strategy; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\System\System; use Utopia\Validator\Text; @@ -91,7 +92,7 @@ class Create extends Action )) ->param('installationId', '', new Text(256), 'Installation Id') ->param('providerRepositoryId', '', new Text(256), 'Repository Id') - ->param('type', '', new WhiteList(['runtime', 'framework']), 'Detector type. Must be one of the following: runtime, framework') + ->param('type', '', new WhiteList(['runtime', 'framework']), 'Detector type. Must be one of the following: runtime, framework', enum: new Enum(name: 'VCSDetectionType')) ->param('providerRootDirectory', '', new Text(256, 0), 'Path to Root Directory', true) ->inject('gitHub') ->inject('response') diff --git a/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/XList.php b/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/XList.php index b4172fabdf..0163492233 100644 --- a/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/XList.php +++ b/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/XList.php @@ -50,6 +50,7 @@ use Utopia\Detector\Detector\Framework; use Utopia\Detector\Detector\Packager; use Utopia\Detector\Detector\Runtime; use Utopia\Detector\Detector\Strategy; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\System\System; use Utopia\Validator\Text; @@ -94,7 +95,7 @@ class XList extends Action ] )) ->param('installationId', '', new Text(256), 'Installation Id') - ->param('type', '', new WhiteList(['runtime', 'framework']), 'Detector type. Must be one of the following: runtime, framework') + ->param('type', '', new WhiteList(['runtime', 'framework']), 'Detector type. Must be one of the following: runtime, framework', enum: new Enum(name: 'VCSDetectionType')) ->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true) ->param('queries', [], new Queries([new Limit(), new Offset()]), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Only supported methods are limit and offset', true) ->inject('gitHub') diff --git a/src/Appwrite/SDK/Specification/Format.php b/src/Appwrite/SDK/Specification/Format.php index 0cbd83cf3f..29ad2d84b8 100644 --- a/src/Appwrite/SDK/Specification/Format.php +++ b/src/Appwrite/SDK/Specification/Format.php @@ -3,7 +3,6 @@ namespace Appwrite\SDK\Specification; use Appwrite\Utopia\Response\Model; -use Utopia\Config\Config; use Utopia\DI\Container; use Utopia\Http\Route; @@ -41,78 +40,6 @@ abstract class Format 'license.url' => '', ]; - /** - * @var list, parameter: string, excludeKeys?: list, exclude?: bool}> - */ - private const array OAUTH_PROVIDER_BLACKLIST = [ - [ - 'namespace' => 'account', - 'methods' => [ - 'createOAuth2Session', - 'createOAuth2Token', - 'updateMagicURLSession' - ], - 'parameter' => 'provider', - 'excludeKeys' => [ - 'mock', - 'mock-unverified' - ], - ], - [ - 'namespace' => 'projects', - 'methods' => [ - 'updateOAuth2' - ], - 'parameter' => 'provider', - 'excludeKeys' => [ - 'mock', - 'mock-unverified' - ], - ], - [ - 'namespace' => 'project', - 'methods' => [ - 'getOAuth2Provider' - ], - 'parameter' => 'providerId', - 'excludeKeys' => [ - 'mock', - 'mock-unverified' - ], - ], - ]; - - /** - * @var list, parameter: string, excludeKeys?: list, exclude?: bool}> - */ - private const array PROVIDER_USAGE_BLACKLIST = [ - [ - 'namespace' => 'users', - 'methods' => [ - 'getUsage' - ], - 'parameter' => 'provider', - 'exclude' => true, /* fully excluded */ - ], - ]; - - /** - * @var list, parameter: string, required?: bool, nullable?: bool}> - */ - private const array REQUEST_PARAMETER_OVERRIDES = [ - [ - 'namespace' => 'project', - 'methods' => [ - 'createWebPlatform', - 'updateWebPlatform', - ], - 'parameter' => 'hostname', - 'required' => true, - ], - ]; - - protected array $enumBlacklist = []; - public function __construct(Container $container, array $services, array $routes, array $models, array $keys, int $authCount, string $platform) { $this->container = $container; @@ -122,32 +49,6 @@ abstract class Format $this->keys = $keys; $this->authCount = $authCount; $this->platform = $platform; - - $this->enumBlacklist = $this->buildEnumBlacklist(); - } - - protected function buildEnumBlacklist(): array - { - $blacklist = []; - - foreach ([...self::OAUTH_PROVIDER_BLACKLIST, ...self::PROVIDER_USAGE_BLACKLIST] as $config) { - foreach ($config['methods'] as $method) { - $entry = [ - 'namespace' => $config['namespace'], - 'method' => $method, - 'parameter' => $config['parameter'], - ]; - if (isset($config['excludeKeys'])) { - $entry['excludeKeys'] = $config['excludeKeys']; - } - if (isset($config['exclude'])) { - $entry['exclude'] = $config['exclude']; - } - $blacklist[] = $entry; - } - } - - return $blacklist; } /** @@ -443,596 +344,6 @@ abstract class Format ]); } - protected function getRequestEnumName(string $service, string $method, string $param): ?string - { - /* `$service` is `$namespace` */ - switch ($service) { - case 'proxy': - switch ($method) { - case 'createRedirectRule': - switch ($param) { - case 'resourceType': - return 'ProxyResourceType'; - } - break; - } - break; - case 'console': - switch ($method) { - case 'getResource': - switch ($param) { - case 'type': - return 'ConsoleResourceType'; - case 'value': - return 'ConsoleResourceValue'; - } - break; - case 'getEmailTemplate': - switch ($param) { - case 'templateId': - return 'ProjectEmailTemplateId'; - case 'locale': - return 'ProjectEmailTemplateLocale'; - } - break; - } - break; - case 'account': - switch ($method) { - case 'createOAuth2Session': - case 'createOAuth2Token': - switch ($param) { - case 'provider': - return 'OAuthProvider'; - } - break; - case 'createMfaAuthenticator': - case 'updateMfaAuthenticator': - case 'deleteMfaAuthenticator': - switch ($param) { - case 'type': - return 'AuthenticatorType'; - } - break; - case 'createMfaChallenge': - switch ($param) { - case 'factor': - return 'AuthenticationFactor'; - } - break; - } - break; - case 'avatars': - switch ($method) { - case 'getBrowser': - return 'Browser'; - case 'getCreditCard': - return 'CreditCard'; - case 'getFlag': - return 'Flag'; - case 'getScreenshot': - switch ($param) { - case 'permissions': - return 'BrowserPermission'; - case 'output': - return 'ImageFormat'; - } - break; - } - break; - case 'databases': - switch ($method) { - case 'getUsage': - case 'listUsage': - case 'getCollectionUsage': - switch ($param) { - case 'range': - return 'UsageRange'; - } - break; - case 'createRelationshipAttribute': - switch ($param) { - case 'type': - return 'RelationshipType'; - case 'onDelete': - return 'RelationMutate'; - } - break; - case 'updateRelationshipAttribute': - switch ($param) { - case 'onDelete': - return 'RelationMutate'; - } - break; - case 'createIndex': - switch ($param) { - case 'type': - return 'DatabasesIndexType'; - case 'orders': - return 'OrderBy'; - } - } - break; - case 'tablesDB': - switch ($method) { - case 'getUsage': - case 'listUsage': - case 'getTableUsage': - switch ($param) { - case 'range': - return 'UsageRange'; - } - break; - case 'createRelationshipColumn': - switch ($param) { - case 'type': - return 'RelationshipType'; - case 'onDelete': - return 'RelationMutate'; - } - break; - case 'updateRelationshipColumn': - switch ($param) { - case 'onDelete': - return 'RelationMutate'; - } - break; - case 'createIndex': - switch ($param) { - case 'type': - return 'TablesDBIndexType'; - case 'orders': - return 'OrderBy'; - } - } - break; - case 'documentsDB': - switch ($method) { - case 'getUsage': - case 'listUsage': - case 'getCollectionUsage': - switch ($param) { - case 'range': - return 'UsageRange'; - } - break; - case 'createIndex': - switch ($param) { - case 'type': - return 'DocumentsDBIndexType'; - case 'orders': - return 'OrderBy'; - } - } - break; - case 'vectorsDB': - switch ($method) { - case 'getUsage': - case 'listUsage': - case 'getCollectionUsage': - switch ($param) { - case 'range': - return 'UsageRange'; - } - break; - case 'createIndex': - switch ($param) { - case 'type': - return 'VectorsDBIndexType'; - case 'orders': - return 'OrderBy'; - } - } - break; - case 'functions': - switch ($method) { - case 'getUsage': - case 'listUsage': - switch ($param) { - case 'range': - return 'UsageRange'; - } - break; - case 'createExecution': - switch ($param) { - case 'method': - return 'ExecutionMethod'; - } - break; - case 'getDeploymentDownload': - switch ($param) { - case 'type': - return 'DeploymentDownloadType'; - } - break; - case 'createVcsDeployment': - switch ($param) { - case 'type': - return 'VCSReferenceType'; - } - break; - case 'createTemplateDeployment': - switch ($param) { - case 'type': - return 'TemplateReferenceType'; - } - break; - } - break; - case 'sites': - switch ($method) { - case 'getDeploymentDownload': - switch ($param) { - case 'type': - return 'DeploymentDownloadType'; - } - break; - case 'getUsage': - case 'listUsage': - switch ($param) { - case 'range': - return 'UsageRange'; - } - break; - case 'createVcsDeployment': - switch ($param) { - case 'type': - return 'VCSReferenceType'; - } - break; - case 'createTemplateDeployment': - switch ($param) { - case 'type': - return 'TemplateReferenceType'; - } - break; - } - break; - case 'vcs': - switch ($method) { - case 'createRepositoryDetection': - case 'listRepositories': - switch ($param) { - case 'type': - return 'VCSDetectionType'; - } - break; - } - break; - case 'messaging': - switch ($method) { - case 'getUsage': - switch ($param) { - case 'period': - return 'MessagingUsageRange'; - } - break; - case 'createSms': - case 'createPush': - case 'createEmail': - case 'updateSms': - case 'updatePush': - case 'updateEmail': - switch ($param) { - case 'status': - return 'MessageStatus'; - case 'priority': - return 'MessagePriority'; - } - break; - case 'createSmtpProvider': - case 'updateSmtpProvider': - switch ($param) { - case 'encryption': - return 'SmtpEncryption'; - } - break; - } - break; - case 'migrations': - switch ($method) { - case 'createAppwriteMigration': - case 'getAppwriteReport': - switch ($param) { - case 'resources': - return 'AppwriteMigrationResource'; - } - break; - case 'createFirebaseMigration': - case 'getFirebaseReport': - switch ($param) { - case 'resources': - return 'FirebaseMigrationResource'; - } - break; - case 'createSupabaseMigration': - case 'getSupabaseReport': - switch ($param) { - case 'resources': - return 'SupabaseMigrationResource'; - } - break; - case 'createNHostMigration': - case 'getNHostReport': - switch ($param) { - case 'resources': - return 'NHostMigrationResource'; - } - break; - } - break; - case 'project': - switch ($method) { - case 'updateAuthMethod': - switch ($param) { - case 'methodId': - return 'ProjectAuthMethodId'; - } - break; - case 'getPolicy': - switch ($param) { - case 'policyId': - return 'ProjectPolicyId'; - } - break; - case 'getOAuth2Provider': - switch ($param) { - case 'providerId': - return 'ProjectOAuthProviderId'; - } - break; - case 'getEmailTemplate': - case 'updateEmailTemplate': - switch ($param) { - case 'templateId': - return 'ProjectEmailTemplateId'; - case 'locale': - return 'ProjectEmailTemplateLocale'; - } - break; - case 'getUsage': - switch ($param) { - case 'period': - return 'ProjectUsageRange'; - } - break; - case 'updateProtocol': - switch ($param) { - case 'protocolId': - return 'ProjectProtocolId'; - } - break; - case 'updateService': - switch ($param) { - case 'serviceId': - return 'ProjectServiceId'; - } - break; - case 'updateSMTP': - case 'createSMTPTest': - switch ($param) { - case 'secure': - return 'ProjectSMTPSecure'; - } - break; - case 'updateOAuth2Google': - switch ($param) { - case 'prompt': - return 'ProjectOAuth2GooglePrompt'; - } - break; - case 'createKey': - case 'createEphemeralKey': - case 'updateKey': - switch ($param) { - case 'scopes': - return 'ProjectKeyScopes'; - } - break; - } - break; - case 'projects': - switch ($method) { - case 'getEmailTemplate': - case 'updateEmailTemplate': - switch ($param) { - case 'type': - return 'EmailTemplateType'; - case 'locale': - return 'EmailTemplateLocale'; - } - break; - case 'createPlatform': - switch ($param) { - case 'type': - return 'PlatformType'; - } - break; - case 'createSmtpTest': - case 'updateSmtp': - switch ($param) { - case 'secure': - return 'SMTPSecure'; - } - break; - case 'updateOAuth2': - switch ($param) { - case 'provider': - return 'OAuthProvider'; - } - break; - case 'updateAuthStatus': - switch ($param) { - case 'method': - return 'AuthMethod'; - } - break; - case 'updateServiceStatus': - switch ($param) { - case 'service': - return 'ApiService'; - } - break; - } - break; - case 'storage': - switch ($method) { - case 'getUsage': - case 'getBucketUsage': - switch ($param) { - case 'range': - return 'UsageRange'; - } - break; - case 'getFilePreview': - switch ($param) { - case 'gravity': - return 'ImageGravity'; - case 'output': - return 'ImageFormat'; - } - break; - } - break; - case 'users': - switch ($method) { - case 'getUsage': - switch ($param) { - case 'range': - return 'UsageRange'; - } - break; - case 'createMfaAuthenticator': - case 'updateMfaAuthenticator': - case 'deleteMfaAuthenticator': - switch ($param) { - case 'type': - return 'AuthenticatorType'; - } - break; - case 'createTarget': - switch ($param) { - case 'providerType': - return 'MessagingProviderType'; - } - break; - case 'createSHAUser': - switch ($param) { - case 'passwordVersion': - return 'PasswordHash'; - } - break; - } - break; - case 'presences': - switch ($method) { - case 'getUsage': - switch ($param) { - case 'range': - return 'UsageRange'; - } - break; - } - break; - } - return null; - } - - public function getRequestEnumKeys(string $service, string $method, string $param): array - { - $values = []; - switch ($service) { - case 'avatars': - switch ($method) { - case 'getBrowser': - $codes = Config::getParam('avatar-browsers'); - foreach ($codes as $code => $value) { - $values[] = $value['name']; - } - return $values; - case 'getCreditCard': - $codes = Config::getParam('avatar-credit-cards'); - foreach ($codes as $code => $value) { - $values[] = $value['name']; - } - return $values; - case 'getFlag': - $codes = Config::getParam('avatar-flags'); - foreach ($codes as $code => $value) { - $values[] = $value['name']; - } - return $values; - } - break; - case 'databases': - case 'documentsDB': - case 'vectorsDB': - switch ($method) { - case 'getUsage': - case 'listUsage': - case 'getCollectionUsage': - // Range Enum Keys - return ['Twenty Four Hours', 'Thirty Days', 'Ninety Days']; - } - break; - case 'tablesDB': - switch ($method) { - case 'getUsage': - case 'listUsage': - case 'getTableUsage': - // Range Enum Keys - return ['Twenty Four Hours', 'Thirty Days', 'Ninety Days']; - } - break; - case 'proxy': - switch ($method) { - case 'createRedirectRule': - switch ($param) { - case 'statusCode': - return ['Moved Permanently 301', 'Found 302', 'Temporary Redirect 307', 'Permanent Redirect 308']; - case 'resourceType': - return ['Site', 'Function']; - } - break; - } - break; - case 'sites': - case 'functions': - switch ($method) { - case 'getUsage': - case 'listUsage': - // Range Enum Keys - return ['Twenty Four Hours', 'Thirty Days', 'Ninety Days']; - } - break; - case 'users': - switch ($method) { - case 'getUsage': - // Range Enum Keys - if ($param == 'range') { - return ['Twenty Four Hours', 'Thirty Days', 'Ninety Days']; - } - } - break; - case 'storage': - switch ($method) { - case 'getUsage': - case 'getBucketUsage': - // Range Enum Keys - return ['Twenty Four Hours', 'Thirty Days', 'Ninety Days']; - } - break; - case 'project': - switch ($method) { - case 'getUsage': - // Range Enum Keys - return ['One Hour', 'One Day']; - } - break; - } - return $values; - } - protected function shouldEmitDefaultForSchema(mixed $default, array $schema): bool { if (isset($schema['enum'])) { @@ -1046,66 +357,27 @@ abstract class Format return true; } - protected function getRequestParameterConfig(string $service, string $method, string $param, bool $optional, bool $nullable, mixed $default): array + protected function getRequestParameterConfig(bool $optional, bool $nullable, mixed $default, string $methodName = '', string $paramName = '') { + $required = !$optional; + + if ( + $paramName === 'hostname' + && \in_array($methodName, ['project.createWebPlatform', 'project.updateWebPlatform'], true) + ) { + $required = true; + } + $config = [ - 'required' => !$optional, + 'required' => $required, 'nullable' => $nullable, ]; - foreach ($this->getRequestParameterOverrides() as $override) { - if ( - $override['namespace'] !== $service - || !\in_array($method, $override['methods'], true) - || $override['parameter'] !== $param - ) { - continue; - } - - if (isset($override['required'])) { - $config['required'] = $override['required']; - } - if (isset($override['nullable'])) { - $config['nullable'] = $override['nullable']; - } - break; - } - $config['emitDefault'] = !$config['required'] && !\is_null($default); return $config; } - /** - * @return list, parameter: string, required?: bool, nullable?: bool}> - */ - private function getRequestParameterOverrides(): array - { - return self::REQUEST_PARAMETER_OVERRIDES; - } - - public function getResponseEnumName(string $model, string $param, ?string $enumSDKName = null): ?string - { - if ($enumSDKName) { - return $enumSDKName; - } - - if ($param === 'type' && \str_starts_with($model, 'platform') && $model !== 'platformList') { - return 'PlatformType'; - } - - if ($param !== 'status') { - return null; - } - - return match (true) { - $model === 'healthStatus' => 'HealthCheckStatus', - str_starts_with($model, 'attribute') => 'AttributeStatus', - str_starts_with($model, 'column') => 'ColumnStatus', - default => null, - }; - } - protected function getNestedModels(Model $model, array &$usedModels): void { foreach ($model->getRules() as $rule) { diff --git a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php index 117fb5e321..20accca8ac 100644 --- a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php +++ b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php @@ -17,6 +17,7 @@ use Utopia\Database\Database; use Utopia\Database\Helpers\Permission; use Utopia\Database\Helpers\Role; use Utopia\Database\Validator\Spatial; +use Utopia\Platform\Enum; use Utopia\Validator; use Utopia\Validator\ArrayList; use Utopia\Validator\Nullable; @@ -412,12 +413,11 @@ class OpenAPI3 extends Format $isNullable = $validator instanceof Nullable; $parameter = $this->getRequestParameterConfig( - $sdk->getNamespace(), - $methodName, - $name, $param['optional'], $isNullable, $param['default'], + $sdk->getNamespace() . '.' . $sdk->getMethodName(), + $name, ); $node = [ @@ -629,51 +629,36 @@ class OpenAPI3 extends Format $node['schema']['x-example'] = $param['example']; } - // Iterate from the blackList. If it matches with the current one, then it is a blackList - // Do not add the enum - $allowed = true; - $excludeKeys = null; - foreach ($this->enumBlacklist as $blacklist) { - if ( - $blacklist['namespace'] == $sdk->getNamespace() - && $blacklist['method'] == $methodName - && $blacklist['parameter'] == $name - ) { - // 'exclude' => true means full exclude - if (isset($blacklist['exclude']) && $blacklist['exclude'] === true) { - $allowed = false; - break; + if ($validator->getType() === 'string') { + $enum = $param['enum'] ?? null; + + if ($enum instanceof Enum) { + $enumValues = \array_values($validator->getList()); + + if (!empty($enum->exclude)) { + $keepIndices = []; + foreach ($enumValues as $index => $value) { + if (!\in_array($value, $enum->exclude, true)) { + $keepIndices[] = $index; + } + } + + $enumValues = \array_values(\array_intersect_key($enumValues, \array_flip($keepIndices))); + $node['description'] = $this->parseDescription($node['description'], $enum->exclude); } - if (isset($blacklist['excludeKeys'])) { - $excludeKeys = $blacklist['excludeKeys']; - } - break; - } - } - if ($allowed && $validator->getType() === 'string') { - $allValues = \array_values($validator->getList()); - $allKeys = $this->getRequestEnumKeys($sdk->getNamespace(), $methodName, $name); - - if ($excludeKeys !== null) { - $keepIndices = []; - foreach ($allValues as $index => $value) { - if (!\in_array($value, $excludeKeys, true)) { - $keepIndices[] = $index; + $enumKeys = []; + if (!empty($enum->map)) { + foreach ($enumValues as $enumValue) { + $enumKeys[] = $enum->map[$enumValue] ?? $enumValue; } } - $enumKeys = \array_values(\array_intersect_key($allKeys, \array_flip($keepIndices))); - $enumValues = \array_values(\array_intersect_key($allValues, \array_flip($keepIndices))); - } else { - $enumKeys = $allKeys; - $enumValues = $allValues; - } - $node['schema']['items']['enum'] = $enumValues; - $node['schema']['items']['x-enum-name'] = $this->getRequestEnumName($sdk->getNamespace(), $methodName, $name); - $node['schema']['items']['x-enum-keys'] = $enumKeys; - if (!empty($excludeKeys)) { - $node['description'] = $this->parseDescription($node['description'], $excludeKeys); + $node['schema']['items']['enum'] = $enumValues; + $node['schema']['items']['x-enum-name'] = $enum->name; + if (!empty($enumKeys)) { + $node['schema']['items']['x-enum-keys'] = $enumKeys; + } } } if ($validator->getType() === 'integer') { @@ -683,51 +668,36 @@ class OpenAPI3 extends Format $node['schema']['type'] = $validator->getType(); $node['schema']['x-example'] = ($param['example'] ?? '') ?: $validator->getList()[0]; - // Iterate from the blackList. If it matches with the current one, then it is a blackList - // Do not add the enum - $allowed = true; - $excludeKeys = null; - foreach ($this->enumBlacklist as $blacklist) { - if ( - $blacklist['namespace'] == $sdk->getNamespace() - && $blacklist['method'] == $methodName - && $blacklist['parameter'] == $name - ) { - // 'exclude' => true means full exclude - if (isset($blacklist['exclude']) && $blacklist['exclude'] === true) { - $allowed = false; - break; + if ($validator->getType() === 'string') { + $enum = $param['enum'] ?? null; + + if ($enum instanceof Enum) { + $enumValues = \array_values($validator->getList()); + + if (!empty($enum->exclude)) { + $keepIndices = []; + foreach ($enumValues as $index => $value) { + if (!\in_array($value, $enum->exclude, true)) { + $keepIndices[] = $index; + } + } + + $enumValues = \array_values(\array_intersect_key($enumValues, \array_flip($keepIndices))); + $node['description'] = $this->parseDescription($node['description'], $enum->exclude); } - if (isset($blacklist['excludeKeys'])) { - $excludeKeys = $blacklist['excludeKeys']; - } - break; - } - } - if ($allowed && $validator->getType() === 'string') { - $allValues = \array_values($validator->getList()); - $allKeys = $this->getRequestEnumKeys($sdk->getNamespace(), $methodName, $name); - - if ($excludeKeys !== null) { - $keepIndices = []; - foreach ($allValues as $index => $value) { - if (!\in_array($value, $excludeKeys, true)) { - $keepIndices[] = $index; + $enumKeys = []; + if (!empty($enum->map)) { + foreach ($enumValues as $enumValue) { + $enumKeys[] = $enum->map[$enumValue] ?? $enumValue; } } - $enumKeys = \array_values(\array_intersect_key($allKeys, \array_flip($keepIndices))); - $enumValues = \array_values(\array_intersect_key($allValues, \array_flip($keepIndices))); - } else { - $enumKeys = $allKeys; - $enumValues = $allValues; - } - $node['schema']['enum'] = $enumValues; - $node['schema']['x-enum-name'] = $this->getRequestEnumName($sdk->getNamespace(), $methodName, $name); - $node['schema']['x-enum-keys'] = $enumKeys; - if (!empty($excludeKeys)) { - $node['description'] = $this->parseDescription($node['description'], $excludeKeys); + $node['schema']['enum'] = $enumValues; + $node['schema']['x-enum-name'] = $enum->name; + if (!empty($enumKeys)) { + $node['schema']['x-enum-keys'] = $enumKeys; + } } } if ($validator->getType() === 'integer') { @@ -819,7 +789,9 @@ class OpenAPI3 extends Format /// If the enum flag is Set, add the enum values to the body $body['content'][$consumes[0]]['schema']['properties'][$name]['enum'] = $node['schema']['enum']; $body['content'][$consumes[0]]['schema']['properties'][$name]['x-enum-name'] = $node['schema']['x-enum-name'] ?? null; - $body['content'][$consumes[0]]['schema']['properties'][$name]['x-enum-keys'] = $node['schema']['x-enum-keys']; + if (isset($node['schema']['x-enum-keys'])) { + $body['content'][$consumes[0]]['schema']['properties'][$name]['x-enum-keys'] = $node['schema']['x-enum-keys']; + } } if ($node['schema']['x-upload-id'] ?? false) { @@ -1022,15 +994,13 @@ class OpenAPI3 extends Format if ($rule['type'] === 'enum' && !empty($rule['enum'])) { if ($rule['array']) { $output['components']['schemas'][$model->getType()]['properties'][$name]['items']['enum'] = \array_values($rule['enum']); - $enumName = $this->getResponseEnumName($model->getType(), $name, $rule['enumSDKName'] ?? null); - if ($enumName) { - $output['components']['schemas'][$model->getType()]['properties'][$name]['items']['x-enum-name'] = $enumName; + if (!empty($rule['enumSDKName'])) { + $output['components']['schemas'][$model->getType()]['properties'][$name]['items']['x-enum-name'] = $rule['enumSDKName']; } } else { $output['components']['schemas'][$model->getType()]['properties'][$name]['enum'] = \array_values($rule['enum']); - $enumName = $this->getResponseEnumName($model->getType(), $name, $rule['enumSDKName'] ?? null); - if ($enumName) { - $output['components']['schemas'][$model->getType()]['properties'][$name]['x-enum-name'] = $enumName; + if (!empty($rule['enumSDKName'])) { + $output['components']['schemas'][$model->getType()]['properties'][$name]['x-enum-name'] = $rule['enumSDKName']; } } } diff --git a/src/Appwrite/SDK/Specification/Format/Swagger2.php b/src/Appwrite/SDK/Specification/Format/Swagger2.php index f0cd52bf99..66244464a7 100644 --- a/src/Appwrite/SDK/Specification/Format/Swagger2.php +++ b/src/Appwrite/SDK/Specification/Format/Swagger2.php @@ -18,6 +18,7 @@ use Utopia\Database\Helpers\Permission; use Utopia\Database\Helpers\Role; use Utopia\Database\Validator\Spatial; use Utopia\Http\Route; +use Utopia\Platform\Enum; use Utopia\Validator; use Utopia\Validator\ArrayList; use Utopia\Validator\Nullable; @@ -109,8 +110,9 @@ class Swagger2 extends Format $additionalMethods = null; if (\is_array($sdk)) { $additionalMethods = $sdk; + $sdkValues = \array_values($sdk); /** @var Method $sdk */ - $sdk = $sdk[0]; + $sdk = $sdkValues[0]; } $consumes = []; @@ -402,12 +404,11 @@ class Swagger2 extends Format $isNullable = $validator instanceof Nullable; $parameter = $this->getRequestParameterConfig( - $sdk->getNamespace(), - $methodName, - $name, $param['optional'], $isNullable, $param['default'], + $sdk->getNamespace() . '.' . $sdk->getMethodName(), + $name, ); $node = [ @@ -595,45 +596,36 @@ class Swagger2 extends Format $node['x-example'] = $param['example']; } - $allowed = true; - $excludeKeys = null; - foreach ($this->enumBlacklist as $blacklist) { - if ($blacklist['namespace'] == $namespace && $blacklist['method'] == $methodName && $blacklist['parameter'] == $name) { - // 'exclude' => true means full exclude - if (isset($blacklist['exclude']) && $blacklist['exclude'] === true) { - $allowed = false; - break; + if ($validator->getType() === 'string') { + $enum = $param['enum'] ?? null; + + if ($enum instanceof Enum) { + $enumValues = \array_values($validator->getList()); + + if (!empty($enum->exclude)) { + $keepIndices = []; + foreach ($enumValues as $index => $value) { + if (!\in_array($value, $enum->exclude, true)) { + $keepIndices[] = $index; + } + } + + $enumValues = \array_values(\array_intersect_key($enumValues, \array_flip($keepIndices))); + $node['description'] = $this->parseDescription($node['description'], $enum->exclude); } - if (isset($blacklist['excludeKeys'])) { - $excludeKeys = $blacklist['excludeKeys']; - } - break; - } - } - if ($allowed && $validator->getType() === 'string') { - $allValues = \array_values($validator->getList()); - $allKeys = $this->getRequestEnumKeys($namespace, $methodName, $name); - - if ($excludeKeys !== null) { - $keepIndices = []; - foreach ($allValues as $index => $value) { - if (!\in_array($value, $excludeKeys, true)) { - $keepIndices[] = $index; + $enumKeys = []; + if (!empty($enum->map)) { + foreach ($enumValues as $enumValue) { + $enumKeys[] = $enum->map[$enumValue] ?? $enumValue; } } - $enumKeys = \array_values(\array_intersect_key($allKeys, \array_flip($keepIndices))); - $enumValues = \array_values(\array_intersect_key($allValues, \array_flip($keepIndices))); - } else { - $enumKeys = $allKeys; - $enumValues = $allValues; - } - $node['items']['enum'] = $enumValues; - $node['items']['x-enum-name'] = $this->getRequestEnumName($namespace, $methodName, $name); - $node['items']['x-enum-keys'] = $enumKeys; - if (!empty($excludeKeys)) { - $node['description'] = $this->parseDescription($node['description'], $excludeKeys); + $node['items']['enum'] = $enumValues; + $node['items']['x-enum-name'] = $enum->name; + if (!empty($enumKeys)) { + $node['items']['x-enum-keys'] = $enumKeys; + } } } if ($validator->getType() === 'integer') { @@ -643,45 +635,36 @@ class Swagger2 extends Format $node['type'] = $validator->getType(); $node['x-example'] = ($param['example'] ?? '') ?: $validator->getList()[0]; - $allowed = true; - $excludeKeys = null; - foreach ($this->enumBlacklist as $blacklist) { - if ($blacklist['namespace'] == $namespace && $blacklist['method'] == $methodName && $blacklist['parameter'] == $name) { - // 'exclude' => true means full exclude - if (isset($blacklist['exclude']) && $blacklist['exclude'] === true) { - $allowed = false; - break; + if ($validator->getType() === 'string') { + $enum = $param['enum'] ?? null; + + if ($enum instanceof Enum) { + $enumValues = \array_values($validator->getList()); + + if (!empty($enum->exclude)) { + $keepIndices = []; + foreach ($enumValues as $index => $value) { + if (!\in_array($value, $enum->exclude, true)) { + $keepIndices[] = $index; + } + } + + $enumValues = \array_values(\array_intersect_key($enumValues, \array_flip($keepIndices))); + $node['description'] = $this->parseDescription($node['description'], $enum->exclude); } - if (isset($blacklist['excludeKeys'])) { - $excludeKeys = $blacklist['excludeKeys']; - } - break; - } - } - if ($allowed && $validator->getType() === 'string') { - $allValues = \array_values($validator->getList()); - $allKeys = $this->getRequestEnumKeys($namespace, $methodName, $name); - - if ($excludeKeys !== null) { - $keepIndices = []; - foreach ($allValues as $index => $value) { - if (!\in_array($value, $excludeKeys, true)) { - $keepIndices[] = $index; + $enumKeys = []; + if (!empty($enum->map)) { + foreach ($enumValues as $enumValue) { + $enumKeys[] = $enum->map[$enumValue] ?? $enumValue; } } - $enumKeys = \array_values(\array_intersect_key($allKeys, \array_flip($keepIndices))); - $enumValues = \array_values(\array_intersect_key($allValues, \array_flip($keepIndices))); - } else { - $enumKeys = $allKeys; - $enumValues = $allValues; - } - $node['enum'] = $enumValues; - $node['x-enum-name'] = $this->getRequestEnumName($namespace, $methodName, $name); - $node['x-enum-keys'] = $enumKeys; - if (!empty($excludeKeys)) { - $node['description'] = $this->parseDescription($node['description'], $excludeKeys); + $node['enum'] = $enumValues; + $node['x-enum-name'] = $enum->name; + if (!empty($enumKeys)) { + $node['x-enum-keys'] = $enumKeys; + } } } if ($validator->getType() === 'integer') { @@ -785,7 +768,9 @@ class Swagger2 extends Format /// If the enum flag is Set, add the enum values to the body $body['schema']['properties'][$name]['enum'] = $node['enum']; $body['schema']['properties'][$name]['x-enum-name'] = $node['x-enum-name'] ?? null; - $body['schema']['properties'][$name]['x-enum-keys'] = $node['x-enum-keys']; + if (isset($node['x-enum-keys'])) { + $body['schema']['properties'][$name]['x-enum-keys'] = $node['x-enum-keys']; + } } if ($parameter['nullable']) { @@ -1000,15 +985,13 @@ class Swagger2 extends Format if ($rule['type'] === 'enum' && !empty($rule['enum'])) { if ($rule['array']) { $output['definitions'][$model->getType()]['properties'][$name]['items']['enum'] = \array_values($rule['enum']); - $enumName = $this->getResponseEnumName($model->getType(), $name, $rule['enumSDKName'] ?? null); - if ($enumName) { - $output['definitions'][$model->getType()]['properties'][$name]['items']['x-enum-name'] = $enumName; + if (!empty($rule['enumSDKName'])) { + $output['definitions'][$model->getType()]['properties'][$name]['items']['x-enum-name'] = $rule['enumSDKName']; } } else { $output['definitions'][$model->getType()]['properties'][$name]['enum'] = \array_values($rule['enum']); - $enumName = $this->getResponseEnumName($model->getType(), $name, $rule['enumSDKName'] ?? null); - if ($enumName) { - $output['definitions'][$model->getType()]['properties'][$name]['x-enum-name'] = $enumName; + if (!empty($rule['enumSDKName'])) { + $output['definitions'][$model->getType()]['properties'][$name]['x-enum-name'] = $rule['enumSDKName']; } } } diff --git a/src/Appwrite/Utopia/Response/Model/Attribute.php b/src/Appwrite/Utopia/Response/Model/Attribute.php index 35de6bacc5..4e2f3c24fd 100644 --- a/src/Appwrite/Utopia/Response/Model/Attribute.php +++ b/src/Appwrite/Utopia/Response/Model/Attribute.php @@ -28,6 +28,7 @@ class Attribute extends Model 'default' => '', 'example' => 'available', 'enum' => ['available', 'processing', 'deleting', 'stuck', 'failed'], + 'enumSDKName' => 'AttributeStatus', ]) ->addRule('error', [ 'type' => self::TYPE_STRING, diff --git a/src/Appwrite/Utopia/Response/Model/Column.php b/src/Appwrite/Utopia/Response/Model/Column.php index cae8d1fadb..ae7e33fa54 100644 --- a/src/Appwrite/Utopia/Response/Model/Column.php +++ b/src/Appwrite/Utopia/Response/Model/Column.php @@ -28,6 +28,7 @@ class Column extends Model 'default' => '', 'example' => 'available', 'enum' => ['available', 'processing', 'deleting', 'stuck', 'failed'], + 'enumSDKName' => 'ColumnStatus', ]) ->addRule('error', [ 'type' => self::TYPE_STRING, diff --git a/src/Appwrite/Utopia/Response/Model/HealthStatus.php b/src/Appwrite/Utopia/Response/Model/HealthStatus.php index 24fb8766ce..13206968cc 100644 --- a/src/Appwrite/Utopia/Response/Model/HealthStatus.php +++ b/src/Appwrite/Utopia/Response/Model/HealthStatus.php @@ -28,6 +28,7 @@ class HealthStatus extends Model 'default' => '', 'example' => 'pass', 'enum' => ['pass', 'fail'], + 'enumSDKName' => 'HealthCheckStatus', ]) ; } diff --git a/src/Appwrite/Utopia/Response/Model/PlatformBase.php b/src/Appwrite/Utopia/Response/Model/PlatformBase.php index 1b7ec75e6d..8ca0aef803 100644 --- a/src/Appwrite/Utopia/Response/Model/PlatformBase.php +++ b/src/Appwrite/Utopia/Response/Model/PlatformBase.php @@ -51,6 +51,7 @@ abstract class PlatformBase extends Model 'default' => '', 'example' => Platform::TYPE_WEB, 'enum' => self::getSupportedTypes(), + 'enumSDKName' => 'PlatformType', ]) ; } From 91227249b8091ae9aba123fd51ebd5d8fe4e81e7 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Wed, 20 May 2026 17:47:45 +0530 Subject: [PATCH 02/17] chore: use enum metadata server branch --- composer.json | 2 +- composer.lock | 36 ++++++++++++++++++++++-------------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/composer.json b/composer.json index 961eb60e48..65c5066ad1 100644 --- a/composer.json +++ b/composer.json @@ -81,7 +81,7 @@ "utopia-php/span": "1.1.*", "utopia-php/preloader": "0.2.*", "utopia-php/queue": "0.18.*", - "utopia-php/servers": "0.4.*", + "utopia-php/servers": "dev-feat-param-enum-metadata as 0.4.0", "utopia-php/registry": "0.5.*", "utopia-php/storage": "2.*", "utopia-php/system": "0.10.*", diff --git a/composer.lock b/composer.lock index 379a6e05bf..cee8d63fa2 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "87677413cb65fd4688a9a56a896dad08", + "content-hash": "5e4279c99bb870892a68ecc99600e8bb", "packages": [ { "name": "adhocore/jwt", @@ -4777,12 +4777,12 @@ "source": { "type": "git", "url": "https://github.com/utopia-php/platform.git", - "reference": "2e3d957f4f9f672edede820c1815c81976f6606b" + "reference": "c490c9aa38d8f0e04061b197fa99489450c2641a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/platform/zipball/2e3d957f4f9f672edede820c1815c81976f6606b", - "reference": "2e3d957f4f9f672edede820c1815c81976f6606b", + "url": "https://api.github.com/repos/utopia-php/platform/zipball/c490c9aa38d8f0e04061b197fa99489450c2641a", + "reference": "c490c9aa38d8f0e04061b197fa99489450c2641a", "shasum": "" }, "require": { @@ -4792,7 +4792,7 @@ "utopia-php/cli": "0.23.*", "utopia-php/http": "^2.0@RC", "utopia-php/queue": "0.18.*", - "utopia-php/servers": "0.4.*" + "utopia-php/servers": "dev-feat-param-enum-metadata as 0.4.0" }, "require-dev": { "laravel/pint": "1.2.*", @@ -4820,7 +4820,7 @@ "issues": "https://github.com/utopia-php/platform/issues", "source": "https://github.com/utopia-php/platform/tree/feat/action-param-meta" }, - "time": "2026-05-20T11:39:39+00:00" + "time": "2026-05-20T12:10:54+00:00" }, { "name": "utopia-php/pools", @@ -5094,16 +5094,16 @@ }, { "name": "utopia-php/servers", - "version": "0.4.0", + "version": "dev-feat-param-enum-metadata", "source": { "type": "git", "url": "https://github.com/utopia-php/servers.git", - "reference": "7db346ef377503efe0acafe0791085270cd9ed70" + "reference": "333e93c5e5c629a1ae059003f570a48bc5a0eeb6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/servers/zipball/7db346ef377503efe0acafe0791085270cd9ed70", - "reference": "7db346ef377503efe0acafe0791085270cd9ed70", + "url": "https://api.github.com/repos/utopia-php/servers/zipball/333e93c5e5c629a1ae059003f570a48bc5a0eeb6", + "reference": "333e93c5e5c629a1ae059003f570a48bc5a0eeb6", "shasum": "" }, "require": { @@ -5142,9 +5142,9 @@ ], "support": { "issues": "https://github.com/utopia-php/servers/issues", - "source": "https://github.com/utopia-php/servers/tree/0.4.0" + "source": "https://github.com/utopia-php/servers/tree/feat-param-enum-metadata" }, - "time": "2026-05-05T04:08:30+00:00" + "time": "2026-05-20T11:51:30+00:00" }, { "name": "utopia-php/span", @@ -8615,11 +8615,19 @@ "time": "2024-11-07T12:36:22+00:00" } ], - "aliases": [], + "aliases": [ + { + "package": "utopia-php/servers", + "version": "dev-feat-param-enum-metadata", + "alias": "0.4.0", + "alias_normalized": "0.4.0.0" + } + ], "minimum-stability": "dev", "stability-flags": { "utopia-php/http": 5, - "utopia-php/platform": 20 + "utopia-php/platform": 20, + "utopia-php/servers": 20 }, "prefer-stable": true, "prefer-lowest": false, From a659b0b1874554824043c34445ae532fe5966c27 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Mon, 25 May 2026 19:21:35 +0530 Subject: [PATCH 03/17] Use stable Utopia dependency releases --- composer.json | 4 +-- composer.lock | 95 +++++++++++++++++++++++---------------------------- 2 files changed, 45 insertions(+), 54 deletions(-) diff --git a/composer.json b/composer.json index 65c5066ad1..73ea513792 100644 --- a/composer.json +++ b/composer.json @@ -76,12 +76,12 @@ "utopia-php/logger": "0.8.*", "utopia-php/messaging": "0.22.*", "utopia-php/migration": "1.*", - "utopia-php/platform": "dev-feat/action-param-meta", + "utopia-php/platform": "1.0.0-rc3", "utopia-php/pools": "1.*", "utopia-php/span": "1.1.*", "utopia-php/preloader": "0.2.*", "utopia-php/queue": "0.18.*", - "utopia-php/servers": "dev-feat-param-enum-metadata as 0.4.0", + "utopia-php/servers": "0.4.*", "utopia-php/registry": "0.5.*", "utopia-php/storage": "2.*", "utopia-php/system": "0.10.*", diff --git a/composer.lock b/composer.lock index cee8d63fa2..fb34853980 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "5e4279c99bb870892a68ecc99600e8bb", + "content-hash": "343aa35bfe6cd80cbe5d3150d00f8b85", "packages": [ { "name": "adhocore/jwt", @@ -3731,21 +3731,21 @@ }, { "name": "utopia-php/cli", - "version": "0.23.3", + "version": "0.23.4", "source": { "type": "git", "url": "https://github.com/utopia-php/cli.git", - "reference": "3c45ae5bcdcd3c7916e1909d74c60b8e771610db" + "reference": "59f66e72ec1f8350968d8b95c0039faaac7a6d6d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/cli/zipball/3c45ae5bcdcd3c7916e1909d74c60b8e771610db", - "reference": "3c45ae5bcdcd3c7916e1909d74c60b8e771610db", + "url": "https://api.github.com/repos/utopia-php/cli/zipball/59f66e72ec1f8350968d8b95c0039faaac7a6d6d", + "reference": "59f66e72ec1f8350968d8b95c0039faaac7a6d6d", "shasum": "" }, "require": { "php": ">=7.4", - "utopia-php/servers": "0.4.0" + "utopia-php/servers": "0.4.*" }, "require-dev": { "laravel/pint": "1.2.*", @@ -3776,9 +3776,9 @@ ], "support": { "issues": "https://github.com/utopia-php/cli/issues", - "source": "https://github.com/utopia-php/cli/tree/0.23.3" + "source": "https://github.com/utopia-php/cli/tree/0.23.4" }, - "time": "2026-05-05T04:38:59+00:00" + "time": "2026-05-21T14:42:15+00:00" }, { "name": "utopia-php/compression", @@ -4346,23 +4346,23 @@ }, { "name": "utopia-php/http", - "version": "2.0.0-rc1", + "version": "2.0.0-rc3", "source": { "type": "git", "url": "https://github.com/utopia-php/http.git", - "reference": "3e3b431d443844c6bf810120dee735f45880856f" + "reference": "e1a51a2eb906a3d461378fb551a647ef01714f1c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/http/zipball/3e3b431d443844c6bf810120dee735f45880856f", - "reference": "3e3b431d443844c6bf810120dee735f45880856f", + "url": "https://api.github.com/repos/utopia-php/http/zipball/e1a51a2eb906a3d461378fb551a647ef01714f1c", + "reference": "e1a51a2eb906a3d461378fb551a647ef01714f1c", "shasum": "" }, "require": { "php": ">=8.3", "utopia-php/compression": "0.1.*", "utopia-php/di": "0.3.*", - "utopia-php/servers": "0.4.0", + "utopia-php/servers": "0.4.*", "utopia-php/telemetry": "0.2.*", "utopia-php/validators": "0.2.*" }, @@ -4396,9 +4396,9 @@ ], "support": { "issues": "https://github.com/utopia-php/http/issues", - "source": "https://github.com/utopia-php/http/tree/2.0.0-rc1" + "source": "https://github.com/utopia-php/http/tree/2.0.0-rc3" }, - "time": "2026-05-05T15:00:03+00:00" + "time": "2026-05-21T14:42:41+00:00" }, { "name": "utopia-php/image", @@ -4773,16 +4773,16 @@ }, { "name": "utopia-php/platform", - "version": "dev-feat/action-param-meta", + "version": "1.0.0-rc3", "source": { "type": "git", "url": "https://github.com/utopia-php/platform.git", - "reference": "c490c9aa38d8f0e04061b197fa99489450c2641a" + "reference": "674fd3cea6d1f8db660b01c5be89e8333dfb6de9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/platform/zipball/c490c9aa38d8f0e04061b197fa99489450c2641a", - "reference": "c490c9aa38d8f0e04061b197fa99489450c2641a", + "url": "https://api.github.com/repos/utopia-php/platform/zipball/674fd3cea6d1f8db660b01c5be89e8333dfb6de9", + "reference": "674fd3cea6d1f8db660b01c5be89e8333dfb6de9", "shasum": "" }, "require": { @@ -4792,7 +4792,7 @@ "utopia-php/cli": "0.23.*", "utopia-php/http": "^2.0@RC", "utopia-php/queue": "0.18.*", - "utopia-php/servers": "dev-feat-param-enum-metadata as 0.4.0" + "utopia-php/servers": "0.4.*" }, "require-dev": { "laravel/pint": "1.2.*", @@ -4818,9 +4818,9 @@ ], "support": { "issues": "https://github.com/utopia-php/platform/issues", - "source": "https://github.com/utopia-php/platform/tree/feat/action-param-meta" + "source": "https://github.com/utopia-php/platform/tree/1.0.0-rc3" }, - "time": "2026-05-20T12:10:54+00:00" + "time": "2026-05-25T11:48:18+00:00" }, { "name": "utopia-php/pools", @@ -4976,16 +4976,16 @@ }, { "name": "utopia-php/queue", - "version": "0.18.3", + "version": "0.18.4", "source": { "type": "git", "url": "https://github.com/utopia-php/queue.git", - "reference": "141aad162b90728353f3aa834684b1f2affed045" + "reference": "1323b52f39b899c580dbb7af8562fc53d4e13e62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/queue/zipball/141aad162b90728353f3aa834684b1f2affed045", - "reference": "141aad162b90728353f3aa834684b1f2affed045", + "url": "https://api.github.com/repos/utopia-php/queue/zipball/1323b52f39b899c580dbb7af8562fc53d4e13e62", + "reference": "1323b52f39b899c580dbb7af8562fc53d4e13e62", "shasum": "" }, "require": { @@ -4993,7 +4993,7 @@ "php-amqplib/php-amqplib": "^3.7", "utopia-php/di": "0.3.*", "utopia-php/pools": "1.*", - "utopia-php/servers": "0.4.0", + "utopia-php/servers": "0.4.*", "utopia-php/telemetry": "0.2.*", "utopia-php/validators": "0.2.*" }, @@ -5036,9 +5036,9 @@ ], "support": { "issues": "https://github.com/utopia-php/queue/issues", - "source": "https://github.com/utopia-php/queue/tree/0.18.3" + "source": "https://github.com/utopia-php/queue/tree/0.18.4" }, - "time": "2026-05-14T08:53:35+00:00" + "time": "2026-05-21T14:43:24+00:00" }, { "name": "utopia-php/registry", @@ -5094,16 +5094,16 @@ }, { "name": "utopia-php/servers", - "version": "dev-feat-param-enum-metadata", + "version": "0.4.1", "source": { "type": "git", "url": "https://github.com/utopia-php/servers.git", - "reference": "333e93c5e5c629a1ae059003f570a48bc5a0eeb6" + "reference": "6e9241f587a19c0e9e7a3587fe3b15ffb2d4c2a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/servers/zipball/333e93c5e5c629a1ae059003f570a48bc5a0eeb6", - "reference": "333e93c5e5c629a1ae059003f570a48bc5a0eeb6", + "url": "https://api.github.com/repos/utopia-php/servers/zipball/6e9241f587a19c0e9e7a3587fe3b15ffb2d4c2a4", + "reference": "6e9241f587a19c0e9e7a3587fe3b15ffb2d4c2a4", "shasum": "" }, "require": { @@ -5142,9 +5142,9 @@ ], "support": { "issues": "https://github.com/utopia-php/servers/issues", - "source": "https://github.com/utopia-php/servers/tree/feat-param-enum-metadata" + "source": "https://github.com/utopia-php/servers/tree/0.4.1" }, - "time": "2026-05-20T11:51:30+00:00" + "time": "2026-05-21T13:08:45+00:00" }, { "name": "utopia-php/span", @@ -5355,16 +5355,16 @@ }, { "name": "utopia-php/validators", - "version": "0.2.3", + "version": "0.2.4", "source": { "type": "git", "url": "https://github.com/utopia-php/validators.git", - "reference": "9770269c8ed8e6909934965fa8722103c7434c23" + "reference": "b4ee60db4dbae5ffbe53968d01f69b6941251576" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/validators/zipball/9770269c8ed8e6909934965fa8722103c7434c23", - "reference": "9770269c8ed8e6909934965fa8722103c7434c23", + "url": "https://api.github.com/repos/utopia-php/validators/zipball/b4ee60db4dbae5ffbe53968d01f69b6941251576", + "reference": "b4ee60db4dbae5ffbe53968d01f69b6941251576", "shasum": "" }, "require": { @@ -5394,9 +5394,9 @@ ], "support": { "issues": "https://github.com/utopia-php/validators/issues", - "source": "https://github.com/utopia-php/validators/tree/0.2.3" + "source": "https://github.com/utopia-php/validators/tree/0.2.4" }, - "time": "2026-05-14T08:05:44+00:00" + "time": "2026-05-21T12:47:43+00:00" }, { "name": "utopia-php/vcs", @@ -8615,19 +8615,10 @@ "time": "2024-11-07T12:36:22+00:00" } ], - "aliases": [ - { - "package": "utopia-php/servers", - "version": "dev-feat-param-enum-metadata", - "alias": "0.4.0", - "alias_normalized": "0.4.0.0" - } - ], + "aliases": [], "minimum-stability": "dev", "stability-flags": { - "utopia-php/http": 5, - "utopia-php/platform": 20, - "utopia-php/servers": 20 + "utopia-php/http": 5 }, "prefer-stable": true, "prefer-lowest": false, From ee97d4ef4da318a86eea5101d9545fe89458bda5 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Mon, 25 May 2026 19:27:04 +0530 Subject: [PATCH 04/17] Use compatible HTTP release for platform --- composer.json | 2 +- composer.lock | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/composer.json b/composer.json index c9980581c8..5318db9f47 100644 --- a/composer.json +++ b/composer.json @@ -67,7 +67,7 @@ "utopia-php/emails": "0.7.*", "utopia-php/dns": "1.7.*", "utopia-php/dsn": "0.2.1", - "utopia-php/http": "2.0.0-rc2", + "utopia-php/http": "2.0.0-rc3", "utopia-php/fetch": "^1.1", "utopia-php/validators": "0.2.*", "utopia-php/image": "0.8.*", diff --git a/composer.lock b/composer.lock index 988b26b252..8f3ab9fd93 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "af7afb20c293318eab8d80dff5fb2b01", + "content-hash": "0f60e85b461aa1a57d624e97be0614bd", "packages": [ { "name": "adhocore/jwt", @@ -4346,23 +4346,23 @@ }, { "name": "utopia-php/http", - "version": "2.0.0-rc2", + "version": "2.0.0-rc3", "source": { "type": "git", "url": "https://github.com/utopia-php/http.git", - "reference": "17f3d5e966ada8a5c041717436f069f269aef2b3" + "reference": "e1a51a2eb906a3d461378fb551a647ef01714f1c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/http/zipball/17f3d5e966ada8a5c041717436f069f269aef2b3", - "reference": "17f3d5e966ada8a5c041717436f069f269aef2b3", + "url": "https://api.github.com/repos/utopia-php/http/zipball/e1a51a2eb906a3d461378fb551a647ef01714f1c", + "reference": "e1a51a2eb906a3d461378fb551a647ef01714f1c", "shasum": "" }, "require": { "php": ">=8.3", "utopia-php/compression": "0.1.*", "utopia-php/di": "0.3.*", - "utopia-php/servers": "0.4.0", + "utopia-php/servers": "0.4.*", "utopia-php/telemetry": "0.2.*", "utopia-php/validators": "0.2.*" }, @@ -4396,9 +4396,9 @@ ], "support": { "issues": "https://github.com/utopia-php/http/issues", - "source": "https://github.com/utopia-php/http/tree/2.0.0-rc2" + "source": "https://github.com/utopia-php/http/tree/2.0.0-rc3" }, - "time": "2026-05-20T11:13:49+00:00" + "time": "2026-05-21T14:42:41+00:00" }, { "name": "utopia-php/image", @@ -5094,16 +5094,16 @@ }, { "name": "utopia-php/servers", - "version": "0.4.0", + "version": "0.4.1", "source": { "type": "git", "url": "https://github.com/utopia-php/servers.git", - "reference": "7db346ef377503efe0acafe0791085270cd9ed70" + "reference": "6e9241f587a19c0e9e7a3587fe3b15ffb2d4c2a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/servers/zipball/7db346ef377503efe0acafe0791085270cd9ed70", - "reference": "7db346ef377503efe0acafe0791085270cd9ed70", + "url": "https://api.github.com/repos/utopia-php/servers/zipball/6e9241f587a19c0e9e7a3587fe3b15ffb2d4c2a4", + "reference": "6e9241f587a19c0e9e7a3587fe3b15ffb2d4c2a4", "shasum": "" }, "require": { @@ -5142,9 +5142,9 @@ ], "support": { "issues": "https://github.com/utopia-php/servers/issues", - "source": "https://github.com/utopia-php/servers/tree/0.4.0" + "source": "https://github.com/utopia-php/servers/tree/0.4.1" }, - "time": "2026-05-05T04:08:30+00:00" + "time": "2026-05-21T13:08:45+00:00" }, { "name": "utopia-php/span", From e19ca24d5dce74be187fbc3a0cfeccd77ba36128 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Mon, 25 May 2026 20:36:14 +0530 Subject: [PATCH 05/17] Update enum metadata tests --- .../Databases/Http/Databases/Usage/Get.php | 4 +- .../Databases/Http/Databases/Usage/XList.php | 4 +- tests/unit/SDK/Specification/FormatTest.php | 43 ++++++++++++------- 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Usage/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Usage/Get.php index 3060fe9978..39e57a0aee 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Usage/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Usage/Get.php @@ -37,7 +37,9 @@ class Get extends Action default => DATABASE_TYPE_LEGACY, }; - return parent::setHttpPath($path); + parent::setHttpPath($path); + + return $this; } protected function getMetrics(): array diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Usage/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Usage/XList.php index 17b3ff94db..7dea8b9380 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Usage/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Usage/XList.php @@ -35,7 +35,9 @@ class XList extends Action default => DATABASE_TYPE_LEGACY, }; - return parent::setHttpPath($path); + parent::setHttpPath($path); + + return $this; } protected function getMetrics(): array diff --git a/tests/unit/SDK/Specification/FormatTest.php b/tests/unit/SDK/Specification/FormatTest.php index f99b29bfe2..ea9ed3bd43 100644 --- a/tests/unit/SDK/Specification/FormatTest.php +++ b/tests/unit/SDK/Specification/FormatTest.php @@ -3,6 +3,13 @@ namespace Tests\Unit\SDK\Specification; use Appwrite\SDK\Specification\Format; +use Appwrite\Utopia\Response\Model\HealthStatus; +use Appwrite\Utopia\Response\Model\PlatformAndroid; +use Appwrite\Utopia\Response\Model\PlatformApple; +use Appwrite\Utopia\Response\Model\PlatformLinux; +use Appwrite\Utopia\Response\Model\PlatformList; +use Appwrite\Utopia\Response\Model\PlatformWeb; +use Appwrite\Utopia\Response\Model\PlatformWindows; use PHPUnit\Framework\TestCase; use Utopia\DI\Container; @@ -18,9 +25,9 @@ class TestFormat extends Format return []; } - public function requestParameterConfig(string $service, string $method, string $param, bool $optional, bool $nullable, mixed $default): array + public function requestParameterConfig(bool $optional, bool $nullable, mixed $default, string $methodName = '', string $paramName = ''): array { - return $this->getRequestParameterConfig($service, $method, $param, $optional, $nullable, $default); + return $this->getRequestParameterConfig($optional, $nullable, $default, $methodName, $paramName); } } @@ -37,9 +44,9 @@ class FormatTest extends TestCase public function testProjectRequestParameterOverrides(): void { - $createWebPlatform = $this->format->requestParameterConfig('project', 'createWebPlatform', 'hostname', true, false, ''); - $updateWebPlatform = $this->format->requestParameterConfig('project', 'updateWebPlatform', 'hostname', true, false, ''); - $listPlatforms = $this->format->requestParameterConfig('project', 'listPlatforms', 'queries', true, false, []); + $createWebPlatform = $this->format->requestParameterConfig(true, false, '', 'project.createWebPlatform', 'hostname'); + $updateWebPlatform = $this->format->requestParameterConfig(true, false, '', 'project.updateWebPlatform', 'hostname'); + $listPlatforms = $this->format->requestParameterConfig(true, false, [], 'project.listPlatforms', 'queries'); $this->assertTrue($createWebPlatform['required']); $this->assertFalse($createWebPlatform['emitDefault']); @@ -48,19 +55,25 @@ class FormatTest extends TestCase $this->assertTrue($listPlatforms['emitDefault']); } - public function testProjectPlatformResponseTypeUsesSharedEnumName(): void + public function testProjectPlatformResponseTypeUsesSharedEnumMetadata(): void { - $this->assertSame('PlatformType', $this->format->getResponseEnumName('platformAndroid', 'type')); - $this->assertSame('PlatformType', $this->format->getResponseEnumName('platformWeb', 'type')); - $this->assertSame('PlatformType', $this->format->getResponseEnumName('platformApple', 'type')); - $this->assertSame('PlatformType', $this->format->getResponseEnumName('platformWindows', 'type')); - $this->assertSame('PlatformType', $this->format->getResponseEnumName('platformLinux', 'type')); - $this->assertNull($this->format->getResponseEnumName('platformList', 'type')); + $models = [ + new PlatformAndroid(), + new PlatformWeb(), + new PlatformApple(), + new PlatformWindows(), + new PlatformLinux(), + ]; + + foreach ($models as $model) { + $this->assertSame('PlatformType', $model->getRules()['type']['enumSDKName']); + } + + $this->assertArrayNotHasKey('enumSDKName', (new PlatformList())->getRules()['platforms']); } - public function testExistingResponseEnumMappingsRemainUnchanged(): void + public function testExistingResponseEnumMetadataRemainsUnchanged(): void { - $this->assertSame('HealthCheckStatus', $this->format->getResponseEnumName('healthStatus', 'status')); - $this->assertNull($this->format->getResponseEnumName('key', 'name')); + $this->assertSame('HealthCheckStatus', (new HealthStatus())->getRules()['status']['enumSDKName']); } } From 88648b78f03d0514648ef256acf6b35d17779991 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Tue, 26 May 2026 10:30:50 +0530 Subject: [PATCH 06/17] fix: preserve SDK enum metadata --- app/controllers/api/account.php | 5 +++-- app/controllers/api/messaging.php | 9 +++++---- app/controllers/api/project.php | 3 ++- app/controllers/api/users.php | 9 +++++---- .../Modules/Functions/Http/Executions/Create.php | 3 ++- .../Modules/Project/Http/Project/AuthMethods/Update.php | 3 ++- .../Platform/Modules/Project/Http/Project/OAuth2/Get.php | 3 ++- .../Project/Http/Project/OAuth2/Google/Update.php | 3 ++- .../Modules/Project/Http/Project/Policies/Get.php | 3 ++- .../Modules/Project/Http/Project/Protocols/Update.php | 3 ++- .../Modules/Project/Http/Project/SMTP/Update.php | 3 ++- .../Modules/Project/Http/Project/Services/Update.php | 3 ++- .../Modules/Project/Http/Project/Templates/Email/Get.php | 5 +++-- .../Project/Http/Project/Templates/Email/Update.php | 5 +++-- 14 files changed, 37 insertions(+), 23 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index c7da65f818..5c95738a69 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -67,6 +67,7 @@ use Utopia\Emails\Email; use Utopia\Emails\Validator\Email as EmailValidator; use Utopia\Http\Http; use Utopia\Locale\Locale; +use Utopia\Platform\Enum; use Utopia\Storage\Validator\FileName; use Utopia\System\System; use Utopia\Validator; @@ -1242,7 +1243,7 @@ Http::get('/v1/account/sessions/oauth2/:provider') )) ->label('abuse-limit', 50) ->label('abuse-key', 'ip:{ip}') - ->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('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'])))) . '.', enum: new Enum(name: 'OAuthProvider')) ->param('success', '', fn ($redirectValidator) => $redirectValidator, '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, ['redirectValidator']) ->param('failure', '', fn ($redirectValidator) => $redirectValidator, '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, ['redirectValidator']) ->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) @@ -2008,7 +2009,7 @@ Http::get('/v1/account/tokens/oauth2/:provider') )) ->label('abuse-limit', 50) ->label('abuse-key', 'ip:{ip}') - ->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('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'])))) . '.', enum: new Enum(name: 'OAuthProvider')) ->param('success', '', fn ($redirectValidator) => $redirectValidator, '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, ['redirectValidator']) ->param('failure', '', fn ($redirectValidator) => $redirectValidator, '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, ['redirectValidator']) ->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) diff --git a/app/controllers/api/messaging.php b/app/controllers/api/messaging.php index d1ffa2e478..26f6bf21c4 100644 --- a/app/controllers/api/messaging.php +++ b/app/controllers/api/messaging.php @@ -47,6 +47,7 @@ use Utopia\Database\Validator\UID; use Utopia\Emails\Validator\Email; use Utopia\Http\Http; use Utopia\Locale\Locale; +use Utopia\Platform\Enum; use Utopia\System\System; use Utopia\Validator\ArrayList; use Utopia\Validator\Boolean; @@ -364,7 +365,7 @@ Http::post('/v1/messaging/providers/smtp') ->param('port', 587, new Range(1, 65535), 'The default SMTP server port.', true) ->param('username', '', new Text(0), 'Authentication username.', true) ->param('password', '', new Text(0), 'Authentication password.', true) - ->param('encryption', '', new WhiteList(['none', 'ssl', 'tls']), 'Encryption type. Can be omitted, \'ssl\', or \'tls\'', true) + ->param('encryption', '', new WhiteList(['none', 'ssl', 'tls']), 'Encryption type. Can be omitted, \'ssl\', or \'tls\'', true, enum: new Enum(name: 'SmtpEncryption')) ->param('autoTLS', true, new Boolean(), 'Enable SMTP AutoTLS feature.', true) ->param('mailer', '', new Text(0), 'The value to use for the X-Mailer header.', true) ->param('fromName', '', new Text(128, 0), 'Sender Name.', true) @@ -1602,7 +1603,7 @@ Http::patch('/v1/messaging/providers/smtp/:providerId') ->param('port', null, new Nullable(new Range(1, 65535)), 'SMTP port.', true) ->param('username', '', new Text(0), 'Authentication username.', true) ->param('password', '', new Text(0), 'Authentication password.', true) - ->param('encryption', '', new WhiteList(['none', 'ssl', 'tls']), 'Encryption type. Can be \'ssl\' or \'tls\'', true) + ->param('encryption', '', new WhiteList(['none', 'ssl', 'tls']), 'Encryption type. Can be \'ssl\' or \'tls\'', true, enum: new Enum(name: 'SmtpEncryption')) ->param('autoTLS', null, new Nullable(new Boolean()), 'Enable SMTP AutoTLS feature.', true) ->param('mailer', '', new Text(0), 'The value to use for the X-Mailer header.', true) ->param('fromName', '', new Text(128), 'Sender Name.', true) @@ -3501,7 +3502,7 @@ Http::post('/v1/messaging/messages/push') ->param('scheduledAt', null, new Nullable(new DatetimeValidator(requireDateInFuture: true)), 'Scheduled delivery time for message in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format. DateTime value must be in future.', true) ->param('contentAvailable', false, new Boolean(), 'If set to true, the notification will be delivered in the background. Available only for iOS Platform.', true) ->param('critical', false, new Boolean(), 'If set to true, the notification will be marked as critical. This requires the app to have the critical notification entitlement. Available only for iOS Platform.', true) - ->param('priority', 'high', new WhiteList(['normal', 'high']), 'Set the notification priority. "normal" will consider device state and may not deliver notifications immediately. "high" will always attempt to immediately deliver the notification.', true) + ->param('priority', 'high', new WhiteList(['normal', 'high']), 'Set the notification priority. "normal" will consider device state and may not deliver notifications immediately. "high" will always attempt to immediately deliver the notification.', true, enum: new Enum(name: 'MessagePriority')) ->inject('queueForEvents') ->inject('dbForProject') ->inject('dbForPlatform') @@ -4388,7 +4389,7 @@ Http::patch('/v1/messaging/messages/push/:messageId') ->param('scheduledAt', null, new Nullable(new DatetimeValidator(requireDateInFuture: true)), 'Scheduled delivery time for message in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format. DateTime value must be in future.', true) ->param('contentAvailable', null, new Nullable(new Boolean()), 'If set to true, the notification will be delivered in the background. Available only for iOS Platform.', true) ->param('critical', null, new Nullable(new Boolean()), 'If set to true, the notification will be marked as critical. This requires the app to have the critical notification entitlement. Available only for iOS Platform.', true) - ->param('priority', null, new Nullable(new WhiteList(['normal', 'high'])), 'Set the notification priority. "normal" will consider device battery state and may send notifications later. "high" will always attempt to immediately deliver the notification.', true) + ->param('priority', null, new Nullable(new WhiteList(['normal', 'high'])), 'Set the notification priority. "normal" will consider device battery state and may send notifications later. "high" will always attempt to immediately deliver the notification.', true, enum: new Enum(name: 'MessagePriority')) ->inject('queueForEvents') ->inject('dbForProject') ->inject('dbForPlatform') diff --git a/app/controllers/api/project.php b/app/controllers/api/project.php index 544beade77..043227fad4 100644 --- a/app/controllers/api/project.php +++ b/app/controllers/api/project.php @@ -10,6 +10,7 @@ use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Datetime as DateTimeValidator; use Utopia\Http\Http; +use Utopia\Platform\Enum; use Utopia\Validator\WhiteList; Http::get('/v1/project/usage') @@ -31,7 +32,7 @@ Http::get('/v1/project/usage') )) ->param('startDate', '', new DateTimeValidator(), 'Starting date for the usage') ->param('endDate', '', new DateTimeValidator(), 'End date for the usage') - ->param('period', '1d', new WhiteList(['1h', '1d']), 'Period used', true) + ->param('period', '1d', new WhiteList(['1h', '1d']), 'Period used', true, enum: new Enum(name: 'ProjectUsageRange')) ->inject('response') ->inject('project') ->inject('dbForProject') diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index abe06a2bb8..c8ea66ea51 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -63,6 +63,7 @@ use Utopia\Emails\Email; use Utopia\Emails\Validator\Email as EmailValidator; use Utopia\Http\Http; use Utopia\Locale\Locale; +use Utopia\Platform\Enum; use Utopia\System\System; use Utopia\Validator\ArrayList; use Utopia\Validator\Assoc; @@ -432,7 +433,7 @@ Http::post('/v1/users/sha') ->param('userId', '', fn (Database $dbForProject) => new CustomId(false, $dbForProject->getAdapter()->getMaxUIDLength()), 'User 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.', false, ['dbForProject']) ->param('email', '', new EmailValidator(), 'User email.') ->param('password', '', new Password(), 'User password hashed using SHA.') - ->param('passwordVersion', '', new WhiteList(['sha1', 'sha224', 'sha256', 'sha384', 'sha512/224', 'sha512/256', 'sha512', 'sha3-224', 'sha3-256', 'sha3-384', 'sha3-512']), "Optional SHA version used to hash password. Allowed values are: 'sha1', 'sha224', 'sha256', 'sha384', 'sha512/224', 'sha512/256', 'sha512', 'sha3-224', 'sha3-256', 'sha3-384', 'sha3-512'", true) + ->param('passwordVersion', '', new WhiteList(['sha1', 'sha224', 'sha256', 'sha384', 'sha512/224', 'sha512/256', 'sha512', 'sha3-224', 'sha3-256', 'sha3-384', 'sha3-512']), "Optional SHA version used to hash password. Allowed values are: 'sha1', 'sha224', 'sha256', 'sha384', 'sha512/224', 'sha512/256', 'sha512', 'sha3-224', 'sha3-256', 'sha3-384', 'sha3-512'", true, enum: new Enum(name: 'PasswordHash')) ->param('name', '', new Text(128), 'User name. Max length: 128 chars.', true) ->inject('response') ->inject('project') @@ -606,7 +607,7 @@ Http::post('/v1/users/:userId/targets') )) ->param('targetId', '', fn (Database $dbForProject) => new CustomId(false, $dbForProject->getAdapter()->getMaxUIDLength()), 'Target 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.', false, ['dbForProject']) ->param('userId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'User ID.', false, ['dbForProject']) - ->param('providerType', '', new WhiteList([MESSAGE_TYPE_EMAIL, MESSAGE_TYPE_SMS, MESSAGE_TYPE_PUSH]), 'The target provider type. Can be one of the following: `email`, `sms` or `push`.') + ->param('providerType', '', new WhiteList([MESSAGE_TYPE_EMAIL, MESSAGE_TYPE_SMS, MESSAGE_TYPE_PUSH]), 'The target provider type. Can be one of the following: `email`, `sms` or `push`.', enum: new Enum(name: 'MessagingProviderType')) ->param('identifier', '', new Text(Database::LENGTH_KEY), 'The target identifier (token, email, phone etc.)') ->param('providerId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Provider ID. Message will be sent to this target from the specified provider ID. If no provider ID is set the first setup provider will be used.', true, ['dbForProject']) ->param('name', '', new Text(128), 'Target name. Max length: 128 chars. For example: My Awesome App Galaxy S23.', true) @@ -2318,7 +2319,7 @@ Http::delete('/v1/users/:userId/mfa/authenticators/:type') ) ]) ->param('userId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'User ID.', false, ['dbForProject']) - ->param('type', null, new WhiteList([Type::TOTP]), 'Type of authenticator.') + ->param('type', null, new WhiteList([Type::TOTP]), 'Type of authenticator.', enum: new Enum(name: 'AuthenticatorType')) ->inject('response') ->inject('dbForProject') ->inject('queueForEvents') @@ -2831,7 +2832,7 @@ Http::get('/v1/users/usage') ) ] )) - ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true) + ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true, enum: new Enum(name: 'UsageRange')) ->inject('response') ->inject('dbForProject') ->inject('authorization') diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Executions/Create.php b/src/Appwrite/Platform/Modules/Functions/Http/Executions/Create.php index 1089d815b5..ba36b47884 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Executions/Create.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Executions/Create.php @@ -38,6 +38,7 @@ use Utopia\Database\Validator\Datetime as DatetimeValidator; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Request; use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\System\System; use Utopia\Validator\AnyOf; @@ -86,7 +87,7 @@ class Create extends Base ->param('body', '', new Text(10485760, 0), 'HTTP body of execution. Default value is empty string.', true) ->param('async', false, new Boolean(true), 'Execute code in the background. Default value is false.', true) ->param('path', '/', new Text(2048), 'HTTP path of execution. Path can include query params. Default value is /', true) - ->param('method', 'POST', new Whitelist(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS', 'HEAD'], true), 'HTTP method of execution. Default value is POST.', true) + ->param('method', 'POST', new Whitelist(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS', 'HEAD'], true), 'HTTP method of execution. Default value is POST.', true, enum: new Enum(name: 'ExecutionMethod')) ->param('headers', [], new AnyOf([new Assoc(), new Text(65535)], AnyOf::TYPE_MIXED), 'HTTP headers of execution. Defaults to empty.', true) ->param('scheduledAt', null, new Nullable(new Text(100)), 'Scheduled execution time in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format. DateTime value must be in future with precision in minutes.', true) ->inject('response') diff --git a/src/Appwrite/Platform/Modules/Project/Http/Project/AuthMethods/Update.php b/src/Appwrite/Platform/Modules/Project/Http/Project/AuthMethods/Update.php index 5335036cde..e98d3141f6 100644 --- a/src/Appwrite/Platform/Modules/Project/Http/Project/AuthMethods/Update.php +++ b/src/Appwrite/Platform/Modules/Project/Http/Project/AuthMethods/Update.php @@ -12,6 +12,7 @@ use Utopia\Config\Config; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\Boolean; use Utopia\Validator\WhiteList; @@ -53,7 +54,7 @@ class Update extends Action ], )) - ->param('methodId', '', new WhiteList(\array_keys(Config::getParam('auth')), true), 'Auth Method ID. Possible values: ' . implode(',', \array_keys(Config::getParam('auth'))), false) + ->param('methodId', '', new WhiteList(\array_keys(Config::getParam('auth')), true), 'Auth Method ID. Possible values: ' . implode(',', \array_keys(Config::getParam('auth'))), false, enum: new Enum(name: 'ProjectAuthMethodId')) ->param('enabled', null, new Boolean(), 'Auth method status.') ->inject('response') ->inject('dbForPlatform') diff --git a/src/Appwrite/Platform/Modules/Project/Http/Project/OAuth2/Get.php b/src/Appwrite/Platform/Modules/Project/Http/Project/OAuth2/Get.php index 250a3e5df1..57953e4e68 100644 --- a/src/Appwrite/Platform/Modules/Project/Http/Project/OAuth2/Get.php +++ b/src/Appwrite/Platform/Modules/Project/Http/Project/OAuth2/Get.php @@ -10,6 +10,7 @@ use Appwrite\Utopia\Response; use Utopia\Config\Config; use Utopia\Database\Document; use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\WhiteList; @@ -86,7 +87,7 @@ class Get extends Action ) ] )) - ->param('providerId', '', new WhiteList(\array_keys(Config::getParam('oAuthProviders', [])), true), 'OAuth2 provider key. For example: github, google, apple.', aliases: ['provider']) + ->param('providerId', '', new WhiteList(\array_keys(Config::getParam('oAuthProviders', [])), true), 'OAuth2 provider key. For example: github, google, apple.', aliases: ['provider'], enum: new Enum(name: 'ProjectOAuthProviderId')) ->inject('response') ->inject('project') ->callback($this->action(...)); diff --git a/src/Appwrite/Platform/Modules/Project/Http/Project/OAuth2/Google/Update.php b/src/Appwrite/Platform/Modules/Project/Http/Project/OAuth2/Google/Update.php index 2a061d09ce..5623f2bdf9 100644 --- a/src/Appwrite/Platform/Modules/Project/Http/Project/OAuth2/Google/Update.php +++ b/src/Appwrite/Platform/Modules/Project/Http/Project/OAuth2/Google/Update.php @@ -14,6 +14,7 @@ use Appwrite\Utopia\Response; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; +use Utopia\Platform\Enum; use Utopia\Validator\ArrayList; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; @@ -108,7 +109,7 @@ class Update extends Base )) ->param(static::getClientIdParamName(), null, new Nullable(new Text(256, 0)), static::getClientIdDescription(), optional: true) ->param(static::getClientSecretParamName(), null, new Nullable(new Text(512, 0)), static::getClientSecretDescription(), optional: true) - ->param('prompt', null, new Nullable(new ArrayList(new WhiteList(['none', 'consent', 'select_account'], true), 3)), 'Array of Google OAuth2 prompt values. If "none" is included, it must be the only element. "none" means: don\'t display any authentication or consent screens. Must not be specified with other values. "consent" means: prompt the user for consent. "select_account" means: prompt the user to select an account.', optional: true) + ->param('prompt', null, new Nullable(new ArrayList(new WhiteList(['none', 'consent', 'select_account'], true), 3)), 'Array of Google OAuth2 prompt values. If "none" is included, it must be the only element. "none" means: don\'t display any authentication or consent screens. Must not be specified with other values. "consent" means: prompt the user for consent. "select_account" means: prompt the user to select an account.', optional: true, enum: new Enum(name: 'ProjectOAuth2GooglePrompt')) ->param('enabled', null, new Nullable(new Boolean()), 'OAuth2 sign-in method status. Set to true to enable new session creation. Setting to true will trigger end-to-end credentials validation, and will throw if the credentials are invalid.', true) ->inject('response') ->inject('dbForPlatform') diff --git a/src/Appwrite/Platform/Modules/Project/Http/Project/Policies/Get.php b/src/Appwrite/Platform/Modules/Project/Http/Project/Policies/Get.php index 21342332d9..7505cf62c4 100644 --- a/src/Appwrite/Platform/Modules/Project/Http/Project/Policies/Get.php +++ b/src/Appwrite/Platform/Modules/Project/Http/Project/Policies/Get.php @@ -8,6 +8,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response; use Utopia\Database\Document; use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\WhiteList; @@ -63,7 +64,7 @@ class Get extends Action 'session-limit', 'user-limit', 'membership-privacy', - ], true), 'Policy ID. Can be one of: password-dictionary, password-history, password-personal-data, session-alert, session-duration, session-invalidation, session-limit, user-limit, membership-privacy.') + ], true), 'Policy ID. Can be one of: password-dictionary, password-history, password-personal-data, session-alert, session-duration, session-invalidation, session-limit, user-limit, membership-privacy.', enum: new Enum(name: 'ProjectPolicyId')) ->inject('response') ->inject('project') ->callback($this->action(...)); diff --git a/src/Appwrite/Platform/Modules/Project/Http/Project/Protocols/Update.php b/src/Appwrite/Platform/Modules/Project/Http/Project/Protocols/Update.php index ad5691c1e0..bfc73802c8 100644 --- a/src/Appwrite/Platform/Modules/Project/Http/Project/Protocols/Update.php +++ b/src/Appwrite/Platform/Modules/Project/Http/Project/Protocols/Update.php @@ -12,6 +12,7 @@ use Utopia\Config\Config; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\Boolean; use Utopia\Validator\WhiteList; @@ -53,7 +54,7 @@ class Update extends Action ) ], )) - ->param('protocolId', '', new WhiteList(array_keys(Config::getParam('protocols')), true), 'Protocol name. Can be one of: ' . \implode(', ', array_keys(Config::getParam('protocols')))) + ->param('protocolId', '', new WhiteList(array_keys(Config::getParam('protocols')), true), 'Protocol name. Can be one of: ' . \implode(', ', array_keys(Config::getParam('protocols'))), enum: new Enum(name: 'ProjectProtocolId')) ->param('enabled', null, new Boolean(), 'Protocol status.') ->inject('response') ->inject('dbForPlatform') diff --git a/src/Appwrite/Platform/Modules/Project/Http/Project/SMTP/Update.php b/src/Appwrite/Platform/Modules/Project/Http/Project/SMTP/Update.php index b99a9db3c2..c3fe222298 100644 --- a/src/Appwrite/Platform/Modules/Project/Http/Project/SMTP/Update.php +++ b/src/Appwrite/Platform/Modules/Project/Http/Project/SMTP/Update.php @@ -14,6 +14,7 @@ use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; use Utopia\Emails\Validator\Email; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\Boolean; use Utopia\Validator\Hostname; @@ -66,7 +67,7 @@ class Update extends Action ->param('senderName', null, new Nullable(new Text(256, 0)), 'Name shown in inbox as the sender of the email. Pass an empty string to clear a previously set value.', optional: true) ->param('replyToEmail', null, new Nullable(new Email(allowEmpty: true)), 'Email used when user replies to the email. Pass an empty string to clear a previously set value.', optional: true) ->param('replyToName', null, new Nullable(new Text(256, 0)), 'Name used when user replies to the email. Pass an empty string to clear a previously set value.', optional: true) - ->param('secure', null, new Nullable(new WhiteList(['tls', 'ssl'], true)), 'Configures if communication with SMTP server is encrypted. Allowed values are: tls, ssl. Leave empty for no encryption.', optional: true) + ->param('secure', null, new Nullable(new WhiteList(['tls', 'ssl'], true)), 'Configures if communication with SMTP server is encrypted. Allowed values are: tls, ssl. Leave empty for no encryption.', optional: true, enum: new Enum(name: 'ProjectSMTPSecure')) ->param('enabled', null, new Nullable(new Boolean()), 'Enable or disable custom SMTP. Custom SMTP is useful for branding purposes, but also allows use of custom email templates.', optional: true) ->inject('response') ->inject('dbForPlatform') diff --git a/src/Appwrite/Platform/Modules/Project/Http/Project/Services/Update.php b/src/Appwrite/Platform/Modules/Project/Http/Project/Services/Update.php index 7aab6f5ad0..518eeb4c36 100644 --- a/src/Appwrite/Platform/Modules/Project/Http/Project/Services/Update.php +++ b/src/Appwrite/Platform/Modules/Project/Http/Project/Services/Update.php @@ -12,6 +12,7 @@ use Utopia\Config\Config; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\Boolean; use Utopia\Validator\WhiteList; @@ -53,7 +54,7 @@ class Update extends Action ) ], )) - ->param('serviceId', '', new WhiteList(array_keys(array_filter(Config::getParam('services'), fn ($element) => $element['optional'])), true), 'Service name. Can be one of: '.\implode(', ', array_keys(array_filter(Config::getParam('services'), fn ($element) => $element['optional'])))) + ->param('serviceId', '', new WhiteList(array_keys(array_filter(Config::getParam('services'), fn ($element) => $element['optional'])), true), 'Service name. Can be one of: '.\implode(', ', array_keys(array_filter(Config::getParam('services'), fn ($element) => $element['optional']))), enum: new Enum(name: 'ProjectServiceId')) ->param('enabled', null, new Boolean(), 'Service status.') ->inject('response') ->inject('dbForPlatform') diff --git a/src/Appwrite/Platform/Modules/Project/Http/Project/Templates/Email/Get.php b/src/Appwrite/Platform/Modules/Project/Http/Project/Templates/Email/Get.php index 02ba431775..f5adfe9a6c 100644 --- a/src/Appwrite/Platform/Modules/Project/Http/Project/Templates/Email/Get.php +++ b/src/Appwrite/Platform/Modules/Project/Http/Project/Templates/Email/Get.php @@ -11,6 +11,7 @@ use Utopia\Config\Config; use Utopia\Database\Document; use Utopia\Locale\Locale; use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\System\System; use Utopia\Validator\WhiteList; @@ -47,8 +48,8 @@ class Get extends Action ) ] )) - ->param('templateId', '', new WhiteList(Config::getParam('locale-templates')['email'] ?? [], true), 'Custom email template type. Can be one of: '.\implode(', ', Config::getParam('locale-templates')['email'] ?? [])) - ->param('locale', '', fn ($localeCodes) => new WhiteList($localeCodes), 'Custom email template locale. If left empty, the fallback locale (en) will be used.', optional: true, injections: ['localeCodes']) + ->param('templateId', '', new WhiteList(Config::getParam('locale-templates')['email'] ?? [], true), 'Custom email template type. Can be one of: '.\implode(', ', Config::getParam('locale-templates')['email'] ?? []), enum: new Enum(name: 'ProjectEmailTemplateId')) + ->param('locale', '', fn ($localeCodes) => new WhiteList($localeCodes), 'Custom email template locale. If left empty, the fallback locale (en) will be used.', optional: true, injections: ['localeCodes'], enum: new Enum(name: 'ProjectEmailTemplateLocale')) ->inject('response') ->inject('project') ->callback($this->action(...)); diff --git a/src/Appwrite/Platform/Modules/Project/Http/Project/Templates/Email/Update.php b/src/Appwrite/Platform/Modules/Project/Http/Project/Templates/Email/Update.php index c9c64ebdfa..c8ec04bc76 100644 --- a/src/Appwrite/Platform/Modules/Project/Http/Project/Templates/Email/Update.php +++ b/src/Appwrite/Platform/Modules/Project/Http/Project/Templates/Email/Update.php @@ -14,6 +14,7 @@ use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; use Utopia\Emails\Validator\Email; use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\System\System; use Utopia\Validator\Nullable; @@ -56,8 +57,8 @@ class Update extends Action ) ] )) - ->param('templateId', '', new WhiteList(Config::getParam('locale-templates')['email'] ?? [], true), 'Custom email template type. Can be one of: '.\implode(', ', Config::getParam('locale-templates')['email'] ?? [])) - ->param('locale', '', fn ($localeCodes) => new WhiteList($localeCodes), 'Custom email template locale. If left empty, the fallback locale (en) will be used.', optional: true, injections: ['localeCodes']) + ->param('templateId', '', new WhiteList(Config::getParam('locale-templates')['email'] ?? [], true), 'Custom email template type. Can be one of: '.\implode(', ', Config::getParam('locale-templates')['email'] ?? []), enum: new Enum(name: 'ProjectEmailTemplateId')) + ->param('locale', '', fn ($localeCodes) => new WhiteList($localeCodes), 'Custom email template locale. If left empty, the fallback locale (en) will be used.', optional: true, injections: ['localeCodes'], enum: new Enum(name: 'ProjectEmailTemplateLocale')) ->param('subject', null, new Nullable(new Text(255)), 'Subject of the email template. Can be up to 255 characters.', optional: true) ->param('message', null, new Nullable(new Text(10485760)), 'Plain or HTML body of the email template message. Can be up to 10MB of content.', optional: true) ->param('senderName', null, new Nullable(new Text(255, 0)), 'Name of the email sender.', optional: true) From 6266dfb7abbeae3a101f473a4fe343099fa72617 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Tue, 26 May 2026 10:45:48 +0530 Subject: [PATCH 07/17] fix: preserve remaining SDK enum metadata --- app/controllers/api/account.php | 4 ++-- .../Platform/Modules/Avatars/Http/Screenshots/Get.php | 2 +- .../Platform/Modules/Console/Http/Templates/Email/Get.php | 5 +++-- .../Platform/Modules/Project/Http/Project/OAuth2/Get.php | 2 +- src/Appwrite/SDK/Specification/Format/OpenAPI3.php | 8 ++++++-- src/Appwrite/SDK/Specification/Format/Swagger2.php | 8 ++++++-- 6 files changed, 19 insertions(+), 10 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 5c95738a69..c8b1dfc98f 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -1243,7 +1243,7 @@ Http::get('/v1/account/sessions/oauth2/:provider') )) ->label('abuse-limit', 50) ->label('abuse-key', 'ip:{ip}') - ->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'])))) . '.', enum: new Enum(name: 'OAuthProvider')) + ->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'])))) . '.', enum: new Enum(name: 'OAuthProvider', exclude: ['mock', 'mock-unverified'])) ->param('success', '', fn ($redirectValidator) => $redirectValidator, '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, ['redirectValidator']) ->param('failure', '', fn ($redirectValidator) => $redirectValidator, '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, ['redirectValidator']) ->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) @@ -2009,7 +2009,7 @@ Http::get('/v1/account/tokens/oauth2/:provider') )) ->label('abuse-limit', 50) ->label('abuse-key', 'ip:{ip}') - ->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'])))) . '.', enum: new Enum(name: 'OAuthProvider')) + ->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'])))) . '.', enum: new Enum(name: 'OAuthProvider', exclude: ['mock', 'mock-unverified'])) ->param('success', '', fn ($redirectValidator) => $redirectValidator, '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, ['redirectValidator']) ->param('failure', '', fn ($redirectValidator) => $redirectValidator, '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, ['redirectValidator']) ->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) diff --git a/src/Appwrite/Platform/Modules/Avatars/Http/Screenshots/Get.php b/src/Appwrite/Platform/Modules/Avatars/Http/Screenshots/Get.php index 69a4101711..26be113202 100644 --- a/src/Appwrite/Platform/Modules/Avatars/Http/Screenshots/Get.php +++ b/src/Appwrite/Platform/Modules/Avatars/Http/Screenshots/Get.php @@ -73,7 +73,7 @@ class Get extends Action ->param('userAgent', '', new Text(512), 'Custom user agent string. Defaults to browser default.', true, example: 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15') ->param('fullpage', false, new Boolean(true), 'Capture full page scroll. Pass 0 for viewport only, or 1 for full page. Defaults to 0.', true, example: 'true') ->param('locale', '', new Text(10), 'Browser locale (e.g., "en-US", "fr-FR"). Defaults to browser default.', true, example: 'en-US') - ->param('timezone', '', new WhiteList(timezone_identifiers_list()), 'IANA timezone identifier (e.g., "America/New_York", "Europe/London"). Defaults to browser default.', true, example: 'America/New_York') + ->param('timezone', '', new WhiteList(timezone_identifiers_list()), 'IANA timezone identifier (e.g., "America/New_York", "Europe/London"). Defaults to browser default.', true, example: 'America/New_York', enum: new Enum()) ->param('latitude', 0, new Range(-90, 90, Range::TYPE_FLOAT), 'Geolocation latitude. Pass a number between -90 to 90. Defaults to 0.', true, example: '37.7749') ->param('longitude', 0, new Range(-180, 180, Range::TYPE_FLOAT), 'Geolocation longitude. Pass a number between -180 to 180. Defaults to 0.', true, example: '-122.4194') ->param('accuracy', 0, new Range(0, 100000, Range::TYPE_FLOAT), 'Geolocation accuracy in meters. Pass a number between 0 to 100000. Defaults to 0.', true, example: '100') diff --git a/src/Appwrite/Platform/Modules/Console/Http/Templates/Email/Get.php b/src/Appwrite/Platform/Modules/Console/Http/Templates/Email/Get.php index 6906c1fd79..003158ab9f 100644 --- a/src/Appwrite/Platform/Modules/Console/Http/Templates/Email/Get.php +++ b/src/Appwrite/Platform/Modules/Console/Http/Templates/Email/Get.php @@ -11,6 +11,7 @@ use Utopia\Config\Config; use Utopia\Database\Document; use Utopia\Locale\Locale; use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\System\System; use Utopia\Validator\WhiteList; @@ -46,8 +47,8 @@ class Get extends Action ) ] )) - ->param('templateId', '', new WhiteList(Config::getParam('locale-templates')['email'] ?? [], true), 'Email template type. Can be one of: ' . \implode(', ', Config::getParam('locale-templates')['email'] ?? [])) - ->param('locale', '', fn ($localeCodes) => new WhiteList($localeCodes), 'Template locale. If left empty, the fallback locale (en) will be used.', optional: true, injections: ['localeCodes']) + ->param('templateId', '', new WhiteList(Config::getParam('locale-templates')['email'] ?? [], true), 'Email template type. Can be one of: ' . \implode(', ', Config::getParam('locale-templates')['email'] ?? []), enum: new Enum(name: 'ProjectEmailTemplateId')) + ->param('locale', '', fn ($localeCodes) => new WhiteList($localeCodes), 'Template locale. If left empty, the fallback locale (en) will be used.', optional: true, injections: ['localeCodes'], enum: new Enum(name: 'ProjectEmailTemplateLocale')) ->inject('response') ->callback($this->action(...)); } diff --git a/src/Appwrite/Platform/Modules/Project/Http/Project/OAuth2/Get.php b/src/Appwrite/Platform/Modules/Project/Http/Project/OAuth2/Get.php index 57953e4e68..58e8259fc5 100644 --- a/src/Appwrite/Platform/Modules/Project/Http/Project/OAuth2/Get.php +++ b/src/Appwrite/Platform/Modules/Project/Http/Project/OAuth2/Get.php @@ -87,7 +87,7 @@ class Get extends Action ) ] )) - ->param('providerId', '', new WhiteList(\array_keys(Config::getParam('oAuthProviders', [])), true), 'OAuth2 provider key. For example: github, google, apple.', aliases: ['provider'], enum: new Enum(name: 'ProjectOAuthProviderId')) + ->param('providerId', '', new WhiteList(\array_keys(Config::getParam('oAuthProviders', [])), true), 'OAuth2 provider key. For example: github, google, apple.', aliases: ['provider'], enum: new Enum(name: 'ProjectOAuthProviderId', exclude: ['mock', 'mock-unverified'])) ->inject('response') ->inject('project') ->callback($this->action(...)); diff --git a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php index 20accca8ac..95e47cf2b7 100644 --- a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php +++ b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php @@ -655,7 +655,9 @@ class OpenAPI3 extends Format } $node['schema']['items']['enum'] = $enumValues; - $node['schema']['items']['x-enum-name'] = $enum->name; + if (!empty($enum->name)) { + $node['schema']['items']['x-enum-name'] = $enum->name; + } if (!empty($enumKeys)) { $node['schema']['items']['x-enum-keys'] = $enumKeys; } @@ -694,7 +696,9 @@ class OpenAPI3 extends Format } $node['schema']['enum'] = $enumValues; - $node['schema']['x-enum-name'] = $enum->name; + if (!empty($enum->name)) { + $node['schema']['x-enum-name'] = $enum->name; + } if (!empty($enumKeys)) { $node['schema']['x-enum-keys'] = $enumKeys; } diff --git a/src/Appwrite/SDK/Specification/Format/Swagger2.php b/src/Appwrite/SDK/Specification/Format/Swagger2.php index 66244464a7..af2451e8ce 100644 --- a/src/Appwrite/SDK/Specification/Format/Swagger2.php +++ b/src/Appwrite/SDK/Specification/Format/Swagger2.php @@ -622,7 +622,9 @@ class Swagger2 extends Format } $node['items']['enum'] = $enumValues; - $node['items']['x-enum-name'] = $enum->name; + if (!empty($enum->name)) { + $node['items']['x-enum-name'] = $enum->name; + } if (!empty($enumKeys)) { $node['items']['x-enum-keys'] = $enumKeys; } @@ -661,7 +663,9 @@ class Swagger2 extends Format } $node['enum'] = $enumValues; - $node['x-enum-name'] = $enum->name; + if (!empty($enum->name)) { + $node['x-enum-name'] = $enum->name; + } if (!empty($enumKeys)) { $node['x-enum-keys'] = $enumKeys; } From 7f97d91f66d9dba4b4b876a601d04d147a9086b9 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Tue, 26 May 2026 10:48:13 +0530 Subject: [PATCH 08/17] fix: order spec defaults before examples --- src/Appwrite/SDK/Specification/Format/OpenAPI3.php | 7 ++++++- src/Appwrite/SDK/Specification/Format/Swagger2.php | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php index 95e47cf2b7..30a148e469 100644 --- a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php +++ b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php @@ -782,9 +782,14 @@ class OpenAPI3 extends Format $body['content'][$consumes[0]]['schema']['properties'][$name] = [ 'type' => $node['schema']['type'], 'description' => $node['description'], - 'x-example' => $node['schema']['x-example'] ?? null ]; + if (\array_key_exists('default', $node['schema'])) { + $body['content'][$consumes[0]]['schema']['properties'][$name]['default'] = $node['schema']['default']; + } + + $body['content'][$consumes[0]]['schema']['properties'][$name]['x-example'] = $node['schema']['x-example'] ?? null; + if (isset($node['schema']['format'])) { $body['content'][$consumes[0]]['schema']['properties'][$name]['format'] = $node['schema']['format']; } diff --git a/src/Appwrite/SDK/Specification/Format/Swagger2.php b/src/Appwrite/SDK/Specification/Format/Swagger2.php index af2451e8ce..524589c91e 100644 --- a/src/Appwrite/SDK/Specification/Format/Swagger2.php +++ b/src/Appwrite/SDK/Specification/Format/Swagger2.php @@ -757,13 +757,14 @@ class Swagger2 extends Format $body['schema']['properties'][$name] = [ 'type' => $node['type'], 'description' => $node['description'], - 'x-example' => $node['x-example'] ?? null, ]; if (\array_key_exists('default', $node)) { $body['schema']['properties'][$name]['default'] = $node['default']; } + $body['schema']['properties'][$name]['x-example'] = $node['x-example'] ?? null; + if (isset($node['format'])) { $body['schema']['properties'][$name]['format'] = $node['format']; } From 6bc5d0dd06558dc85b6e22fe221b341bfd58f8d4 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Tue, 26 May 2026 10:51:10 +0530 Subject: [PATCH 09/17] fix: remove endpoint docs appwrite metadata --- src/Appwrite/SDK/Specification/Format/OpenAPI3.php | 3 --- src/Appwrite/SDK/Specification/Format/Swagger2.php | 3 --- 2 files changed, 6 deletions(-) diff --git a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php index 30a148e469..2e7d0ea716 100644 --- a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php +++ b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php @@ -69,9 +69,6 @@ class OpenAPI3 extends Format ], ], ], - 'x-appwrite' => [ - 'endpointDocs' => $this->getParam('endpoint.docs', ''), - ], 'paths' => [], 'tags' => $this->services, 'components' => [ diff --git a/src/Appwrite/SDK/Specification/Format/Swagger2.php b/src/Appwrite/SDK/Specification/Format/Swagger2.php index 524589c91e..c6353e67ba 100644 --- a/src/Appwrite/SDK/Specification/Format/Swagger2.php +++ b/src/Appwrite/SDK/Specification/Format/Swagger2.php @@ -56,9 +56,6 @@ class Swagger2 extends Format ], 'host' => \parse_url($this->getParam('endpoint', ''), PHP_URL_HOST), 'x-host-docs' => \parse_url($this->getParam('endpoint.docs', ''), PHP_URL_HOST), - 'x-appwrite' => [ - 'endpointDocs' => $this->getParam('endpoint.docs', ''), - ], 'basePath' => \parse_url($this->getParam('endpoint', ''), PHP_URL_PATH), 'schemes' => [\parse_url($this->getParam('endpoint', ''), PHP_URL_SCHEME)], 'consumes' => ['application/json', 'multipart/form-data'], From 17bae22b24159e0074fca1d2a1154a82bf3a3526 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Tue, 26 May 2026 10:51:52 +0530 Subject: [PATCH 10/17] Revert "Merge pull request #12356 from appwrite/fix-account-server-specs-auth" This reverts commit ff76f3efa0ccba28f4ab3f13ae712a22014156d0, reversing changes made to ed14acfc75b62e85a4c0680e48a27f35808da7e9. --- app/config/sdks.php | 98 ++++++++++++++++----------------- app/controllers/api/account.php | 7 ++- 2 files changed, 53 insertions(+), 52 deletions(-) diff --git a/app/config/sdks.php b/app/config/sdks.php index 36a973167d..e29b28690f 100644 --- a/app/config/sdks.php +++ b/app/config/sdks.php @@ -8,6 +8,55 @@ return [ 'enabled' => true, 'beta' => false, 'sdks' => [ + [ + 'key' => 'web', + 'name' => 'Web', + 'version' => '22.4.0', + 'url' => 'https://github.com/appwrite/sdk-for-web', + 'package' => 'https://www.npmjs.com/package/appwrite', + 'enabled' => true, + 'beta' => false, + 'dev' => false, + 'hidden' => false, + 'family' => APP_SDK_PLATFORM_CLIENT, + 'prism' => 'javascript', + 'source' => \realpath(__DIR__ . '/../sdks/client-web'), + 'gitUrl' => 'git@github.com:appwrite/sdk-for-web.git', + 'gitRepoName' => 'sdk-for-web', + 'gitUserName' => 'appwrite', + 'gitBranch' => 'dev', + 'changelog' => \realpath(__DIR__ . '/../../docs/sdks/web/CHANGELOG.md'), + 'demos' => [ + [ + 'icon' => 'react.svg', + 'name' => 'Todo App with React JS', + 'description' => 'A simple Todo app that uses both the Appwrite account and database APIs.', + 'source' => 'https://github.com/appwrite/todo-with-react', + 'url' => 'https://appwrite-todo-with-react.vercel.app/', + ], + [ + 'icon' => 'vue.svg', + 'name' => 'Todo App with Vue JS', + 'description' => 'A simple Todo app that uses both the Appwrite account and database APIs.', + 'source' => 'https://github.com/appwrite/todo-with-vue', + 'url' => 'https://appwrite-todo-with-vue.vercel.app/', + ], + [ + 'icon' => 'angular.svg', + 'name' => 'Todo App with Angular', + 'description' => 'A simple Todo app that uses both the Appwrite account and database APIs.', + 'source' => 'https://github.com/appwrite/todo-with-angular', + 'url' => 'https://appwrite-todo-with-angular.vercel.app/', + ], + [ + 'icon' => 'svelte.svg', + 'name' => 'Todo App with Svelte', + 'description' => 'A simple Todo app that uses both the Appwrite account and database APIs.', + 'source' => 'https://github.com/appwrite/todo-with-svelte', + 'url' => 'https://appwrite-todo-with-svelte.vercel.app/', + ], + ] + ], [ 'key' => 'flutter', 'name' => 'Flutter', @@ -301,55 +350,6 @@ return [ 'enabled' => true, 'beta' => false, 'sdks' => [ - [ - 'key' => 'web', - 'name' => 'Web', - 'version' => '22.4.0', - 'url' => 'https://github.com/appwrite/sdk-for-web', - 'package' => 'https://www.npmjs.com/package/appwrite', - 'enabled' => true, - 'beta' => false, - 'dev' => false, - 'hidden' => false, - 'family' => APP_SDK_PLATFORM_SERVER, - 'prism' => 'javascript', - 'source' => \realpath(__DIR__ . '/../sdks/client-web'), - 'gitUrl' => 'git@github.com:appwrite/sdk-for-web.git', - 'gitRepoName' => 'sdk-for-web', - 'gitUserName' => 'appwrite', - 'gitBranch' => 'dev', - 'changelog' => \realpath(__DIR__ . '/../../docs/sdks/web/CHANGELOG.md'), - 'demos' => [ - [ - 'icon' => 'react.svg', - 'name' => 'Todo App with React JS', - 'description' => 'A simple Todo app that uses both the Appwrite account and database APIs.', - 'source' => 'https://github.com/appwrite/todo-with-react', - 'url' => 'https://appwrite-todo-with-react.vercel.app/', - ], - [ - 'icon' => 'vue.svg', - 'name' => 'Todo App with Vue JS', - 'description' => 'A simple Todo app that uses both the Appwrite account and database APIs.', - 'source' => 'https://github.com/appwrite/todo-with-vue', - 'url' => 'https://appwrite-todo-with-vue.vercel.app/', - ], - [ - 'icon' => 'angular.svg', - 'name' => 'Todo App with Angular', - 'description' => 'A simple Todo app that uses both the Appwrite account and database APIs.', - 'source' => 'https://github.com/appwrite/todo-with-angular', - 'url' => 'https://appwrite-todo-with-angular.vercel.app/', - ], - [ - 'icon' => 'svelte.svg', - 'name' => 'Todo App with Svelte', - 'description' => 'A simple Todo app that uses both the Appwrite account and database APIs.', - 'source' => 'https://github.com/appwrite/todo-with-svelte', - 'url' => 'https://appwrite-todo-with-svelte.vercel.app/', - ], - ] - ], [ 'key' => 'nodejs', 'name' => 'Node.js', diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index c8b1dfc98f..67affddd20 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -1240,6 +1240,7 @@ Http::get('/v1/account/sessions/oauth2/:provider') ) ], contentType: ContentType::HTML, + hide: [APP_SDK_PLATFORM_SERVER], )) ->label('abuse-limit', 50) ->label('abuse-key', 'ip:{ip}') @@ -4515,7 +4516,7 @@ Http::post('/v1/account/targets/push') group: 'pushTargets', name: 'createPushTarget', description: '/docs/references/account/create-push-target.md', - auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::JWT], + auth: [AuthType::ADMIN, AuthType::SESSION], responses: [ new SDKResponse( code: Response::STATUS_CODE_CREATED, @@ -4599,7 +4600,7 @@ Http::put('/v1/account/targets/:targetId/push') group: 'pushTargets', name: 'updatePushTarget', description: '/docs/references/account/update-push-target.md', - auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::JWT], + auth: [AuthType::ADMIN, AuthType::SESSION], responses: [ new SDKResponse( code: Response::STATUS_CODE_OK, @@ -4669,7 +4670,7 @@ Http::delete('/v1/account/targets/:targetId/push') group: 'pushTargets', name: 'deletePushTarget', description: '/docs/references/account/delete-push-target.md', - auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::JWT], + auth: [AuthType::ADMIN, AuthType::SESSION], responses: [ new SDKResponse( code: Response::STATUS_CODE_NOCONTENT, From 29d2a99e92562d5b29f148db5a80a51b3230963d Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Tue, 26 May 2026 10:53:50 +0530 Subject: [PATCH 11/17] fix: remove weight from spec metadata --- src/Appwrite/SDK/Specification/Format/OpenAPI3.php | 1 - src/Appwrite/SDK/Specification/Format/Swagger2.php | 1 - 2 files changed, 2 deletions(-) diff --git a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php index 2e7d0ea716..b62397b2d0 100644 --- a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php +++ b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php @@ -147,7 +147,6 @@ class OpenAPI3 extends Format 'x-appwrite' => [ // Appwrite related metadata 'method' => $methodName, 'group' => $sdk->getGroup(), - 'weight' => $route->getOrder(), 'cookies' => $route->getLabel('sdk.cookies', false), 'type' => $sdk->getType()->value ?? '', 'demo' => \strtolower($namespace) . '/' . Template::fromCamelCaseToDash($methodName) . '.md', diff --git a/src/Appwrite/SDK/Specification/Format/Swagger2.php b/src/Appwrite/SDK/Specification/Format/Swagger2.php index c6353e67ba..1232ea5408 100644 --- a/src/Appwrite/SDK/Specification/Format/Swagger2.php +++ b/src/Appwrite/SDK/Specification/Format/Swagger2.php @@ -143,7 +143,6 @@ class Swagger2 extends Format 'x-appwrite' => [ // Appwrite related metadata 'method' => $methodName, 'group' => $sdk->getGroup(), - 'weight' => $route->getOrder(), 'cookies' => $route->getLabel('sdk.cookies', false), 'type' => $sdk->getType()->value ?? '', 'demo' => \strtolower($namespace) . '/' . Template::fromCamelCaseToDash($methodName) . '.md', From 6f1841681fbb942f527e295e658d5049a73783ed Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Tue, 26 May 2026 11:02:52 +0530 Subject: [PATCH 12/17] fix: preserve runtime and migration enum metadata --- .../Platform/Modules/Functions/Http/Functions/Create.php | 2 +- .../Platform/Modules/Functions/Http/Functions/Update.php | 2 +- .../Modules/Migrations/Http/Migrations/Appwrite/Create.php | 2 +- .../Modules/Migrations/Http/Migrations/CSV/Imports/Create.php | 3 ++- .../Modules/Migrations/Http/Migrations/JSON/Imports/Create.php | 3 ++- src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php | 3 ++- src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php | 3 ++- 7 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Create.php b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Create.php index 3d5221a16d..f80866d79a 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Create.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Create.php @@ -81,7 +81,7 @@ class Create extends Base )) ->param('functionId', '', fn (Database $dbForProject) => new CustomId(false, $dbForProject->getAdapter()->getMaxUIDLength()), 'Function 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.', false, ['dbForProject']) ->param('name', '', new Text(128), 'Function name. Max length: 128 chars.') - ->param('runtime', '', new WhiteList(array_keys(Config::getParam('runtimes')), true), 'Execution runtime.') + ->param('runtime', '', new WhiteList(array_keys(Config::getParam('runtimes')), true), 'Execution runtime.', enum: new Enum()) ->param('execute', [], new Roles(APP_LIMIT_ARRAY_PARAMS_SIZE), 'An array of role strings with execution permissions. By default no user is granted with any execute permissions. [learn more about roles](https://appwrite.io/docs/permissions#permission-roles). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' roles are allowed, each 64 characters long.', true) ->param('events', [], new ArrayList(new FunctionEvent(), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Events list. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' events are allowed.', true) ->param('schedule', '', new Cron(), 'Schedule CRON syntax.', true) diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Update.php b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Update.php index ba72bafe6e..c1655a45bb 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Update.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Update.php @@ -73,7 +73,7 @@ class Update extends Base )) ->param('functionId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Function ID.', false, ['dbForProject']) ->param('name', '', new Text(128), 'Function name. Max length: 128 chars.') - ->param('runtime', '', new WhiteList(array_keys(Config::getParam('runtimes')), true), 'Execution runtime.', true) + ->param('runtime', '', new WhiteList(array_keys(Config::getParam('runtimes')), true), 'Execution runtime.', true, enum: new Enum()) ->param('execute', [], new Roles(APP_LIMIT_ARRAY_PARAMS_SIZE), 'An array of role strings with execution permissions. By default no user is granted with any execute permissions. [learn more about roles](https://appwrite.io/docs/permissions#permission-roles). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' roles are allowed, each 64 characters long.', true) ->param('events', [], new ArrayList(new FunctionEvent(), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Events list. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' events are allowed.', true) ->param('schedule', '', new Cron(), 'Schedule CRON syntax.', true) diff --git a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Appwrite/Create.php b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Appwrite/Create.php index 34bc7ac4f2..329e5efeeb 100644 --- a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Appwrite/Create.php +++ b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Appwrite/Create.php @@ -59,7 +59,7 @@ class Create extends Action ->param('endpoint', '', new URL(), 'Source Appwrite endpoint') ->param('projectId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Source Project ID', false, ['dbForProject']) ->param('apiKey', '', new Text(512), 'Source API Key') - ->param('onDuplicate', OnDuplicate::Fail->value, new WhiteList(OnDuplicate::values()), 'Behavior when a row with an existing $id is encountered. "fail" (default): abort on first conflict. "skip": silently ignore. "overwrite": replace existing row.', true) + ->param('onDuplicate', OnDuplicate::Fail->value, new WhiteList(OnDuplicate::values()), 'Behavior when a row with an existing $id is encountered. "fail" (default): abort on first conflict. "skip": silently ignore. "overwrite": replace existing row.', true, enum: new Enum()) ->inject('response') ->inject('dbForProject') ->inject('project') diff --git a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/CSV/Imports/Create.php b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/CSV/Imports/Create.php index 4b47ed7d58..4131948551 100644 --- a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/CSV/Imports/Create.php +++ b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/CSV/Imports/Create.php @@ -26,6 +26,7 @@ use Utopia\Migration\Sources\Appwrite as AppwriteSource; use Utopia\Migration\Sources\CSV; use Utopia\Migration\Transfer; use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Storage\Device; use Utopia\System\System; @@ -69,7 +70,7 @@ class Create extends Action ->param('fileId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'File ID.', false, ['dbForProject']) ->param('resourceId', null, new CompoundUID(), 'Composite ID in the format {databaseId:collectionId}, identifying a collection within a database.') ->param('internalFile', false, new Boolean(), 'Is the file stored in an internal bucket?', true) - ->param('onDuplicate', OnDuplicate::Fail->value, new WhiteList(OnDuplicate::values()), 'Behavior when a row with an existing $id is encountered. "fail" (default): abort on first conflict. "skip": silently ignore. "overwrite": replace existing row.', true) + ->param('onDuplicate', OnDuplicate::Fail->value, new WhiteList(OnDuplicate::values()), 'Behavior when a row with an existing $id is encountered. "fail" (default): abort on first conflict. "skip": silently ignore. "overwrite": replace existing row.', true, enum: new Enum()) ->inject('response') ->inject('dbForProject') ->inject('dbForPlatform') diff --git a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/JSON/Imports/Create.php b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/JSON/Imports/Create.php index c5d936711e..70900450a6 100644 --- a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/JSON/Imports/Create.php +++ b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/JSON/Imports/Create.php @@ -26,6 +26,7 @@ use Utopia\Migration\Sources\Appwrite as AppwriteSource; use Utopia\Migration\Sources\JSON as JSONSource; use Utopia\Migration\Transfer; use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Storage\Device; use Utopia\System\System; @@ -68,7 +69,7 @@ class Create extends Action ->param('fileId', '', new UID(), 'File ID.') ->param('resourceId', null, new CompoundUID(), 'Composite ID in the format {databaseId:collectionId}, identifying a collection within a database.') ->param('internalFile', false, new Boolean(), 'Is the file stored in an internal bucket?', true) - ->param('onDuplicate', OnDuplicate::Fail->value, new WhiteList(OnDuplicate::values()), 'Behavior when a row with an existing $id is encountered. "fail" (default): abort on first conflict. "skip": silently ignore. "overwrite": replace existing row.', true) + ->param('onDuplicate', OnDuplicate::Fail->value, new WhiteList(OnDuplicate::values()), 'Behavior when a row with an existing $id is encountered. "fail" (default): abort on first conflict. "skip": silently ignore. "overwrite": replace existing row.', true, enum: new Enum()) ->inject('response') ->inject('dbForProject') ->inject('dbForPlatform') diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php index 9f3d46ffd0..717285266c 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php @@ -17,6 +17,7 @@ use Utopia\Database\Document; use Utopia\Database\Exception\Duplicate as DuplicateException; use Utopia\Database\Helpers\ID; use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\System\System; use Utopia\Validator\ArrayList; @@ -71,7 +72,7 @@ class Create extends Base ->param('buildCommand', '', new Text(8192, 0), 'Build Command.', true) ->param('startCommand', '', new Text(8192, 0), 'Custom start command. Leave empty to use default.', true) ->param('outputDirectory', '', new Text(8192, 0), 'Output Directory for site.', true) - ->param('buildRuntime', '', new WhiteList(array_keys(Config::getParam('runtimes')), true), 'Runtime to use during build step.') + ->param('buildRuntime', '', new WhiteList(array_keys(Config::getParam('runtimes')), true), 'Runtime to use during build step.', enum: new Enum()) ->param('adapter', '', new WhiteList(['static', 'ssr']), 'Framework adapter defining rendering strategy. Allowed values are: static, ssr', true) ->param('installationId', '', new Text(128, 0), 'Appwrite Installation ID for VCS (Version Control System) deployment.', true) ->param('fallbackFile', '', new Text(255, 0), 'Fallback file for single page application sites.', true) diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php index bfd8c9f198..6951fafb48 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php @@ -20,6 +20,7 @@ use Utopia\Database\Query; use Utopia\Database\Validator\UID; use Utopia\Http\Adapter\Swoole\Request; use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\System\System; use Utopia\Validator\ArrayList; @@ -75,7 +76,7 @@ class Update extends Base ->param('buildCommand', '', new Text(8192, 0), 'Build Command.', true) ->param('startCommand', '', new Text(8192, 0), 'Custom start command. Leave empty to use default.', true) ->param('outputDirectory', '', new Text(8192, 0), 'Output Directory for site.', true) - ->param('buildRuntime', '', new WhiteList(array_keys(Config::getParam('runtimes')), true), 'Runtime to use during build step.', true) + ->param('buildRuntime', '', new WhiteList(array_keys(Config::getParam('runtimes')), true), 'Runtime to use during build step.', true, enum: new Enum()) ->param('adapter', '', new WhiteList(['static', 'ssr']), 'Framework adapter defining rendering strategy. Allowed values are: static, ssr', true) ->param('fallbackFile', '', new Text(255, 0), 'Fallback file for single page application sites.', true) ->param('installationId', '', new Text(128, 0), 'Appwrite Installation ID for VCS (Version Control System) deployment.', true) From 08b18f07749b76b01181ff0dc201b38c5cd539b3 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Tue, 26 May 2026 11:06:34 +0530 Subject: [PATCH 13/17] fix: name preserved enum metadata --- src/Appwrite/Platform/Modules/Avatars/Http/Screenshots/Get.php | 2 +- .../Platform/Modules/Functions/Http/Functions/Create.php | 2 +- .../Platform/Modules/Functions/Http/Functions/Update.php | 2 +- .../Modules/Migrations/Http/Migrations/Appwrite/Create.php | 2 +- .../Modules/Migrations/Http/Migrations/CSV/Imports/Create.php | 2 +- .../Modules/Migrations/Http/Migrations/JSON/Imports/Create.php | 2 +- src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php | 2 +- src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Appwrite/Platform/Modules/Avatars/Http/Screenshots/Get.php b/src/Appwrite/Platform/Modules/Avatars/Http/Screenshots/Get.php index 26be113202..7ff61f5b69 100644 --- a/src/Appwrite/Platform/Modules/Avatars/Http/Screenshots/Get.php +++ b/src/Appwrite/Platform/Modules/Avatars/Http/Screenshots/Get.php @@ -73,7 +73,7 @@ class Get extends Action ->param('userAgent', '', new Text(512), 'Custom user agent string. Defaults to browser default.', true, example: 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15') ->param('fullpage', false, new Boolean(true), 'Capture full page scroll. Pass 0 for viewport only, or 1 for full page. Defaults to 0.', true, example: 'true') ->param('locale', '', new Text(10), 'Browser locale (e.g., "en-US", "fr-FR"). Defaults to browser default.', true, example: 'en-US') - ->param('timezone', '', new WhiteList(timezone_identifiers_list()), 'IANA timezone identifier (e.g., "America/New_York", "Europe/London"). Defaults to browser default.', true, example: 'America/New_York', enum: new Enum()) + ->param('timezone', '', new WhiteList(timezone_identifiers_list()), 'IANA timezone identifier (e.g., "America/New_York", "Europe/London"). Defaults to browser default.', true, example: 'America/New_York', enum: new Enum(name: 'Timezone')) ->param('latitude', 0, new Range(-90, 90, Range::TYPE_FLOAT), 'Geolocation latitude. Pass a number between -90 to 90. Defaults to 0.', true, example: '37.7749') ->param('longitude', 0, new Range(-180, 180, Range::TYPE_FLOAT), 'Geolocation longitude. Pass a number between -180 to 180. Defaults to 0.', true, example: '-122.4194') ->param('accuracy', 0, new Range(0, 100000, Range::TYPE_FLOAT), 'Geolocation accuracy in meters. Pass a number between 0 to 100000. Defaults to 0.', true, example: '100') diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Create.php b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Create.php index f80866d79a..e37f4120e1 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Create.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Create.php @@ -81,7 +81,7 @@ class Create extends Base )) ->param('functionId', '', fn (Database $dbForProject) => new CustomId(false, $dbForProject->getAdapter()->getMaxUIDLength()), 'Function 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.', false, ['dbForProject']) ->param('name', '', new Text(128), 'Function name. Max length: 128 chars.') - ->param('runtime', '', new WhiteList(array_keys(Config::getParam('runtimes')), true), 'Execution runtime.', enum: new Enum()) + ->param('runtime', '', new WhiteList(array_keys(Config::getParam('runtimes')), true), 'Execution runtime.', enum: new Enum(name: 'FunctionRuntime')) ->param('execute', [], new Roles(APP_LIMIT_ARRAY_PARAMS_SIZE), 'An array of role strings with execution permissions. By default no user is granted with any execute permissions. [learn more about roles](https://appwrite.io/docs/permissions#permission-roles). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' roles are allowed, each 64 characters long.', true) ->param('events', [], new ArrayList(new FunctionEvent(), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Events list. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' events are allowed.', true) ->param('schedule', '', new Cron(), 'Schedule CRON syntax.', true) diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Update.php b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Update.php index c1655a45bb..9272c2863c 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Update.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Update.php @@ -73,7 +73,7 @@ class Update extends Base )) ->param('functionId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Function ID.', false, ['dbForProject']) ->param('name', '', new Text(128), 'Function name. Max length: 128 chars.') - ->param('runtime', '', new WhiteList(array_keys(Config::getParam('runtimes')), true), 'Execution runtime.', true, enum: new Enum()) + ->param('runtime', '', new WhiteList(array_keys(Config::getParam('runtimes')), true), 'Execution runtime.', true, enum: new Enum(name: 'FunctionRuntime')) ->param('execute', [], new Roles(APP_LIMIT_ARRAY_PARAMS_SIZE), 'An array of role strings with execution permissions. By default no user is granted with any execute permissions. [learn more about roles](https://appwrite.io/docs/permissions#permission-roles). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' roles are allowed, each 64 characters long.', true) ->param('events', [], new ArrayList(new FunctionEvent(), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Events list. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' events are allowed.', true) ->param('schedule', '', new Cron(), 'Schedule CRON syntax.', true) diff --git a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Appwrite/Create.php b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Appwrite/Create.php index 329e5efeeb..2633f5f6fb 100644 --- a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Appwrite/Create.php +++ b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/Appwrite/Create.php @@ -59,7 +59,7 @@ class Create extends Action ->param('endpoint', '', new URL(), 'Source Appwrite endpoint') ->param('projectId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Source Project ID', false, ['dbForProject']) ->param('apiKey', '', new Text(512), 'Source API Key') - ->param('onDuplicate', OnDuplicate::Fail->value, new WhiteList(OnDuplicate::values()), 'Behavior when a row with an existing $id is encountered. "fail" (default): abort on first conflict. "skip": silently ignore. "overwrite": replace existing row.', true, enum: new Enum()) + ->param('onDuplicate', OnDuplicate::Fail->value, new WhiteList(OnDuplicate::values()), 'Behavior when a row with an existing $id is encountered. "fail" (default): abort on first conflict. "skip": silently ignore. "overwrite": replace existing row.', true, enum: new Enum(name: 'MigrationOnDuplicate')) ->inject('response') ->inject('dbForProject') ->inject('project') diff --git a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/CSV/Imports/Create.php b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/CSV/Imports/Create.php index 4131948551..7222a05703 100644 --- a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/CSV/Imports/Create.php +++ b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/CSV/Imports/Create.php @@ -70,7 +70,7 @@ class Create extends Action ->param('fileId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'File ID.', false, ['dbForProject']) ->param('resourceId', null, new CompoundUID(), 'Composite ID in the format {databaseId:collectionId}, identifying a collection within a database.') ->param('internalFile', false, new Boolean(), 'Is the file stored in an internal bucket?', true) - ->param('onDuplicate', OnDuplicate::Fail->value, new WhiteList(OnDuplicate::values()), 'Behavior when a row with an existing $id is encountered. "fail" (default): abort on first conflict. "skip": silently ignore. "overwrite": replace existing row.', true, enum: new Enum()) + ->param('onDuplicate', OnDuplicate::Fail->value, new WhiteList(OnDuplicate::values()), 'Behavior when a row with an existing $id is encountered. "fail" (default): abort on first conflict. "skip": silently ignore. "overwrite": replace existing row.', true, enum: new Enum(name: 'MigrationOnDuplicate')) ->inject('response') ->inject('dbForProject') ->inject('dbForPlatform') diff --git a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/JSON/Imports/Create.php b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/JSON/Imports/Create.php index 70900450a6..cec20fe61e 100644 --- a/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/JSON/Imports/Create.php +++ b/src/Appwrite/Platform/Modules/Migrations/Http/Migrations/JSON/Imports/Create.php @@ -69,7 +69,7 @@ class Create extends Action ->param('fileId', '', new UID(), 'File ID.') ->param('resourceId', null, new CompoundUID(), 'Composite ID in the format {databaseId:collectionId}, identifying a collection within a database.') ->param('internalFile', false, new Boolean(), 'Is the file stored in an internal bucket?', true) - ->param('onDuplicate', OnDuplicate::Fail->value, new WhiteList(OnDuplicate::values()), 'Behavior when a row with an existing $id is encountered. "fail" (default): abort on first conflict. "skip": silently ignore. "overwrite": replace existing row.', true, enum: new Enum()) + ->param('onDuplicate', OnDuplicate::Fail->value, new WhiteList(OnDuplicate::values()), 'Behavior when a row with an existing $id is encountered. "fail" (default): abort on first conflict. "skip": silently ignore. "overwrite": replace existing row.', true, enum: new Enum(name: 'MigrationOnDuplicate')) ->inject('response') ->inject('dbForProject') ->inject('dbForPlatform') diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php index 717285266c..e27854be92 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php @@ -72,7 +72,7 @@ class Create extends Base ->param('buildCommand', '', new Text(8192, 0), 'Build Command.', true) ->param('startCommand', '', new Text(8192, 0), 'Custom start command. Leave empty to use default.', true) ->param('outputDirectory', '', new Text(8192, 0), 'Output Directory for site.', true) - ->param('buildRuntime', '', new WhiteList(array_keys(Config::getParam('runtimes')), true), 'Runtime to use during build step.', enum: new Enum()) + ->param('buildRuntime', '', new WhiteList(array_keys(Config::getParam('runtimes')), true), 'Runtime to use during build step.', enum: new Enum(name: 'SiteBuildRuntime')) ->param('adapter', '', new WhiteList(['static', 'ssr']), 'Framework adapter defining rendering strategy. Allowed values are: static, ssr', true) ->param('installationId', '', new Text(128, 0), 'Appwrite Installation ID for VCS (Version Control System) deployment.', true) ->param('fallbackFile', '', new Text(255, 0), 'Fallback file for single page application sites.', true) diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php index 6951fafb48..674a8280f6 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php @@ -76,7 +76,7 @@ class Update extends Base ->param('buildCommand', '', new Text(8192, 0), 'Build Command.', true) ->param('startCommand', '', new Text(8192, 0), 'Custom start command. Leave empty to use default.', true) ->param('outputDirectory', '', new Text(8192, 0), 'Output Directory for site.', true) - ->param('buildRuntime', '', new WhiteList(array_keys(Config::getParam('runtimes')), true), 'Runtime to use during build step.', true, enum: new Enum()) + ->param('buildRuntime', '', new WhiteList(array_keys(Config::getParam('runtimes')), true), 'Runtime to use during build step.', true, enum: new Enum(name: 'SiteBuildRuntime')) ->param('adapter', '', new WhiteList(['static', 'ssr']), 'Framework adapter defining rendering strategy. Allowed values are: static, ssr', true) ->param('fallbackFile', '', new Text(255, 0), 'Fallback file for single page application sites.', true) ->param('installationId', '', new Text(128, 0), 'Appwrite Installation ID for VCS (Version Control System) deployment.', true) From 3f0d1d2a2700cc3cfbf151e7289408bca503a18c Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Tue, 26 May 2026 11:14:52 +0530 Subject: [PATCH 14/17] fix: preserve remaining spec enum metadata --- .../Platform/Modules/Avatars/Http/Screenshots/Get.php | 2 +- .../Databases/Http/VectorsDB/Embeddings/Text/Create.php | 3 ++- .../Platform/Modules/Functions/Http/Templates/XList.php | 5 +++-- .../Platform/Modules/Health/Http/Health/Queue/Failed/Get.php | 3 ++- .../Platform/Modules/Projects/Http/Projects/Create.php | 3 ++- .../Platform/Modules/Projects/Http/Schedules/Create.php | 3 ++- .../Platform/Modules/Proxy/Http/Rules/Redirect/Create.php | 2 +- src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php | 4 ++-- src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php | 4 ++-- src/Appwrite/Platform/Modules/Sites/Http/Templates/XList.php | 5 +++-- .../Platform/Modules/Storage/Http/Buckets/Create.php | 3 ++- .../Platform/Modules/Storage/Http/Buckets/Update.php | 3 ++- 12 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/Appwrite/Platform/Modules/Avatars/Http/Screenshots/Get.php b/src/Appwrite/Platform/Modules/Avatars/Http/Screenshots/Get.php index 7ff61f5b69..9b2e92efe5 100644 --- a/src/Appwrite/Platform/Modules/Avatars/Http/Screenshots/Get.php +++ b/src/Appwrite/Platform/Modules/Avatars/Http/Screenshots/Get.php @@ -69,7 +69,7 @@ class Get extends Action ->param('viewportWidth', 1280, new Range(1, 1920), 'Browser viewport width. Pass an integer between 1 to 1920. Defaults to 1280.', true, example: '1920') ->param('viewportHeight', 720, new Range(1, 1080), 'Browser viewport height. Pass an integer between 1 to 1080. Defaults to 720.', true, example: '1080') ->param('scale', 1, new Range(0.1, 3, Range::TYPE_FLOAT), 'Browser scale factor. Pass a number between 0.1 to 3. Defaults to 1.', true, example: '2') - ->param('theme', 'light', new WhiteList(['light', 'dark']), 'Browser theme. Pass "light" or "dark". Defaults to "light".', true, example: 'dark') + ->param('theme', 'light', new WhiteList(['light', 'dark']), 'Browser theme. Pass "light" or "dark". Defaults to "light".', true, example: 'dark', enum: new Enum(name: 'BrowserTheme')) ->param('userAgent', '', new Text(512), 'Custom user agent string. Defaults to browser default.', true, example: 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15') ->param('fullpage', false, new Boolean(true), 'Capture full page scroll. Pass 0 for viewport only, or 1 for full page. Defaults to 0.', true, example: 'true') ->param('locale', '', new Text(10), 'Browser locale (e.g., "en-US", "fr-FR"). Defaults to browser default.', true, example: 'en-US') diff --git a/src/Appwrite/Platform/Modules/Databases/Http/VectorsDB/Embeddings/Text/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/VectorsDB/Embeddings/Text/Create.php index 8a7137e38b..b5480f39e3 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/VectorsDB/Embeddings/Text/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/VectorsDB/Embeddings/Text/Create.php @@ -16,6 +16,7 @@ use Utopia\Database\Document; use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Logger\Log; use Utopia\Logger\Logger; +use Utopia\Platform\Enum; use Utopia\System\System; use Utopia\Validator\ArrayList; use Utopia\Validator\Text; @@ -74,7 +75,7 @@ class Create extends CreateDocumentAction ) ]) ->param('texts', [], fn (array $plan) => new ArrayList(new Text(0), $plan['databasesMaxEmbeddingTexts'] ?? APP_LIMIT_DATABASE_BATCH), 'Array of text to generate embeddings.', false, ['plan']) - ->param('model', Ollama::MODEL_EMBEDDING_GEMMA, new WhiteList(Ollama::MODELS), 'The embedding model to use for generating vector embeddings.', true) + ->param('model', Ollama::MODEL_EMBEDDING_GEMMA, new WhiteList(Ollama::MODELS), 'The embedding model to use for generating vector embeddings.', true, enum: new Enum(name: 'EmbeddingModel')) ->inject('response') ->inject('project') ->inject('embeddingAgent') diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Templates/XList.php b/src/Appwrite/Platform/Modules/Functions/Http/Templates/XList.php index 91cb787b70..d77063e95a 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Templates/XList.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Templates/XList.php @@ -11,6 +11,7 @@ use FunctionUseCases; use Utopia\Config\Config; use Utopia\Database\Document; use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\ArrayList; use Utopia\Validator\Boolean; @@ -50,8 +51,8 @@ class XList extends Base ) ] )) - ->param('runtimes', [], new ArrayList(new WhiteList(array_keys(Config::getParam('runtimes')), true), APP_LIMIT_ARRAY_PARAMS_SIZE), 'List of runtimes allowed for filtering function templates. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' runtimes are allowed.', true) - ->param('useCases', [], new ArrayList(new WhiteList(FunctionUseCases::getAll()), APP_LIMIT_ARRAY_PARAMS_SIZE), 'List of use cases allowed for filtering function templates. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' use cases are allowed.', true) + ->param('runtimes', [], new ArrayList(new WhiteList(array_keys(Config::getParam('runtimes')), true), APP_LIMIT_ARRAY_PARAMS_SIZE), 'List of runtimes allowed for filtering function templates. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' runtimes are allowed.', true, enum: new Enum(name: 'FunctionRuntime')) + ->param('useCases', [], new ArrayList(new WhiteList(FunctionUseCases::getAll()), APP_LIMIT_ARRAY_PARAMS_SIZE), 'List of use cases allowed for filtering function templates. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' use cases are allowed.', true, enum: new Enum(name: 'FunctionTemplateUseCase')) ->param('limit', 25, new Range(1, 5000), 'Limit the number of templates returned in the response. Default limit is 25, and maximum limit is 5000.', true) ->param('offset', 0, new Range(0, 5000), 'Offset the list of returned templates. Maximum offset is 5000.', true) ->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true) diff --git a/src/Appwrite/Platform/Modules/Health/Http/Health/Queue/Failed/Get.php b/src/Appwrite/Platform/Modules/Health/Http/Health/Queue/Failed/Get.php index d3b760d01b..f0dff0a811 100644 --- a/src/Appwrite/Platform/Modules/Health/Http/Health/Queue/Failed/Get.php +++ b/src/Appwrite/Platform/Modules/Health/Http/Health/Queue/Failed/Get.php @@ -24,6 +24,7 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response; use Utopia\Database\Document; +use Utopia\Platform\Enum; use Utopia\System\System; use Utopia\Validator\Integer; use Utopia\Validator\WhiteList; @@ -71,7 +72,7 @@ class Get extends Base System::getEnv('_APP_SCREENSHOTS_QUEUE_NAME', Event::SCREENSHOTS_QUEUE_NAME), System::getEnv('_APP_MESSAGING_QUEUE_NAME', Event::MESSAGING_QUEUE_NAME), System::getEnv('_APP_MIGRATIONS_QUEUE_NAME', Event::MIGRATIONS_QUEUE_NAME), - ]), 'The name of the queue') + ]), 'The name of the queue', enum: new Enum(name: 'HealthQueueName')) ->param('threshold', 5000, new Integer(true), 'Queue size threshold. When hit (equal or higher), endpoint returns server error. Default value is 5000.', true) ->inject('response') ->inject('publisherForDatabase') diff --git a/src/Appwrite/Platform/Modules/Projects/Http/Projects/Create.php b/src/Appwrite/Platform/Modules/Projects/Http/Projects/Create.php index 18250cb140..9204f99d67 100644 --- a/src/Appwrite/Platform/Modules/Projects/Http/Projects/Create.php +++ b/src/Appwrite/Platform/Modules/Projects/Http/Projects/Create.php @@ -20,6 +20,7 @@ use Utopia\Database\Exception\Duplicate; use Utopia\Database\Helpers\ID; use Utopia\Database\Validator\UID; use Utopia\DSN\DSN; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Pools\Group; use Utopia\System\System; @@ -54,7 +55,7 @@ class Create extends Action ->param('projectId', '', new ProjectId(), 'Unique Id. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, and hyphen. Can\'t start with a special char. Max length is 36 chars.') ->param('name', null, new Text(128), 'Project name. Max length: 128 chars.') ->param('teamId', '', new UID(), 'Team unique ID.') - ->param('region', System::getEnv('_APP_REGION', 'default'), new WhiteList(array_keys(array_filter(Config::getParam('regions'), fn ($config) => !$config['disabled']))), 'Project Region.', true) + ->param('region', System::getEnv('_APP_REGION', 'default'), new WhiteList(array_keys(array_filter(Config::getParam('regions'), fn ($config) => !$config['disabled']))), 'Project Region.', true, enum: new Enum(name: 'Region')) ->inject('request') ->inject('response') ->inject('dbForPlatform') diff --git a/src/Appwrite/Platform/Modules/Projects/Http/Schedules/Create.php b/src/Appwrite/Platform/Modules/Projects/Http/Schedules/Create.php index e00809300d..7cf13c5ca2 100644 --- a/src/Appwrite/Platform/Modules/Projects/Http/Schedules/Create.php +++ b/src/Appwrite/Platform/Modules/Projects/Http/Schedules/Create.php @@ -15,6 +15,7 @@ use Utopia\Database\Document; use Utopia\Database\Exception\Duplicate as DuplicateException; use Utopia\Database\Validator\UID; use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\Boolean; use Utopia\Validator\JSON; @@ -85,7 +86,7 @@ class Create extends Action ], )) ->param('projectId', '', new UID(), 'Project unique ID.') - ->param('resourceType', '', new WhiteList($resourceTypes, true), 'The resource type for the schedule. Possible values: '.implode(', ', $resourceTypes).'.') + ->param('resourceType', '', new WhiteList($resourceTypes, true), 'The resource type for the schedule. Possible values: '.implode(', ', $resourceTypes).'.', enum: new Enum(name: 'ScheduleResourceType')) ->param('resourceId', '', new UID(), 'The resource ID to associate with this schedule.') ->param('schedule', '', new Cron(), 'Schedule CRON expression.') ->param('active', false, new Boolean(), 'Whether the schedule is active.', true) diff --git a/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Redirect/Create.php b/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Redirect/Create.php index b6f5185422..784da4e2eb 100644 --- a/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Redirect/Create.php +++ b/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Redirect/Create.php @@ -67,7 +67,7 @@ class Create extends Action ->label('abuse-time', 60) ->param('domain', null, new ValidatorDomain(), 'Domain name.') ->param('url', null, new URL(), 'Target URL of redirection') - ->param('statusCode', null, new WhiteList([301, 302, 307, 308]), 'Status code of redirection') + ->param('statusCode', null, new WhiteList([301, 302, 307, 308]), 'Status code of redirection', enum: new Enum(name: 'RedirectStatusCode')) ->param('resourceId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'ID of parent resource.', false, ['dbForProject']) ->param('resourceType', '', new WhiteList(['site', 'function']), 'Type of parent resource.', enum: new Enum( name: 'ProxyResourceType', diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php index e27854be92..064f2e213e 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php @@ -64,7 +64,7 @@ class Create extends Base )) ->param('siteId', '', fn (Database $dbForProject) => new CustomId(false, $dbForProject->getAdapter()->getMaxUIDLength()), 'Site 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.', false, ['dbForProject']) ->param('name', '', new Text(128), 'Site name. Max length: 128 chars.') - ->param('framework', '', new WhiteList(\array_keys(Config::getParam('frameworks')), true), 'Sites framework.') + ->param('framework', '', new WhiteList(\array_keys(Config::getParam('frameworks')), true), 'Sites framework.', enum: new Enum(name: 'SiteFramework')) ->param('enabled', true, new Boolean(), 'Is site enabled? When set to \'disabled\', users cannot access the site but Server SDKs with and API key can still access the site. No data is lost when this is toggled.', true) ->param('logging', true, new Boolean(), 'When disabled, request logs will exclude logs and errors, and site responses will be slightly faster.', true) ->param('timeout', 30, new Range(1, (int) System::getEnv('_APP_SITES_TIMEOUT', 30)), 'Maximum request time in seconds.', true) @@ -73,7 +73,7 @@ class Create extends Base ->param('startCommand', '', new Text(8192, 0), 'Custom start command. Leave empty to use default.', true) ->param('outputDirectory', '', new Text(8192, 0), 'Output Directory for site.', true) ->param('buildRuntime', '', new WhiteList(array_keys(Config::getParam('runtimes')), true), 'Runtime to use during build step.', enum: new Enum(name: 'SiteBuildRuntime')) - ->param('adapter', '', new WhiteList(['static', 'ssr']), 'Framework adapter defining rendering strategy. Allowed values are: static, ssr', true) + ->param('adapter', '', new WhiteList(['static', 'ssr']), 'Framework adapter defining rendering strategy. Allowed values are: static, ssr', true, enum: new Enum(name: 'SiteAdapter')) ->param('installationId', '', new Text(128, 0), 'Appwrite Installation ID for VCS (Version Control System) deployment.', true) ->param('fallbackFile', '', new Text(255, 0), 'Fallback file for single page application sites.', true) ->param('providerRepositoryId', '', new Text(128, 0), 'Repository ID of the repo linked to the site.', true) diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php index 674a8280f6..66537edb04 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php @@ -68,7 +68,7 @@ class Update extends Base )) ->param('siteId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'Site ID.', false, ['dbForProject']) ->param('name', '', new Text(128), 'Site name. Max length: 128 chars.') - ->param('framework', '', new WhiteList(\array_keys(Config::getParam('frameworks')), true), 'Sites framework.') + ->param('framework', '', new WhiteList(\array_keys(Config::getParam('frameworks')), true), 'Sites framework.', enum: new Enum(name: 'SiteFramework')) ->param('enabled', true, new Boolean(), 'Is site enabled? When set to \'disabled\', users cannot access the site but Server SDKs with and API key can still access the site. No data is lost when this is toggled.', true) ->param('logging', true, new Boolean(), 'When disabled, request logs will exclude logs and errors, and site responses will be slightly faster.', true) ->param('timeout', 30, new Range(1, (int) System::getEnv('_APP_SITES_TIMEOUT', 30)), 'Maximum request time in seconds.', true) @@ -77,7 +77,7 @@ class Update extends Base ->param('startCommand', '', new Text(8192, 0), 'Custom start command. Leave empty to use default.', true) ->param('outputDirectory', '', new Text(8192, 0), 'Output Directory for site.', true) ->param('buildRuntime', '', new WhiteList(array_keys(Config::getParam('runtimes')), true), 'Runtime to use during build step.', true, enum: new Enum(name: 'SiteBuildRuntime')) - ->param('adapter', '', new WhiteList(['static', 'ssr']), 'Framework adapter defining rendering strategy. Allowed values are: static, ssr', true) + ->param('adapter', '', new WhiteList(['static', 'ssr']), 'Framework adapter defining rendering strategy. Allowed values are: static, ssr', true, enum: new Enum(name: 'SiteAdapter')) ->param('fallbackFile', '', new Text(255, 0), 'Fallback file for single page application sites.', true) ->param('installationId', '', new Text(128, 0), 'Appwrite Installation ID for VCS (Version Control System) deployment.', true) ->param('providerRepositoryId', '', new Text(128, 0), 'Repository ID of the repo linked to the site.', true) diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Templates/XList.php b/src/Appwrite/Platform/Modules/Sites/Http/Templates/XList.php index 4dea0908cf..a5c6ece560 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Templates/XList.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Templates/XList.php @@ -11,6 +11,7 @@ use SiteUseCases; use Utopia\Config\Config; use Utopia\Database\Document; use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\ArrayList; use Utopia\Validator\Range; @@ -49,8 +50,8 @@ class XList extends Base ) ] )) - ->param('frameworks', [], new ArrayList(new WhiteList(\array_keys(Config::getParam('frameworks')), true), APP_LIMIT_ARRAY_PARAMS_SIZE), 'List of frameworks allowed for filtering site templates. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' frameworks are allowed.', true) - ->param('useCases', [], new ArrayList(new WhiteList(SiteUseCases::getAll()), APP_LIMIT_ARRAY_PARAMS_SIZE), 'List of use cases allowed for filtering site templates. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' use cases are allowed.', true) + ->param('frameworks', [], new ArrayList(new WhiteList(\array_keys(Config::getParam('frameworks')), true), APP_LIMIT_ARRAY_PARAMS_SIZE), 'List of frameworks allowed for filtering site templates. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' frameworks are allowed.', true, enum: new Enum(name: 'SiteFramework')) + ->param('useCases', [], new ArrayList(new WhiteList(SiteUseCases::getAll()), APP_LIMIT_ARRAY_PARAMS_SIZE), 'List of use cases allowed for filtering site templates. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' use cases are allowed.', true, enum: new Enum(name: 'SiteTemplateUseCase')) ->param('limit', 25, new Range(1, 5000), 'Limit the number of templates returned in the response. Default limit is 25, and maximum limit is 5000.', true) ->param('offset', 0, new Range(0, 5000), 'Offset the list of returned templates. Maximum offset is 5000.', true) ->inject('response') diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Create.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Create.php index f31d30188a..ebe06d0ccf 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Create.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Create.php @@ -17,6 +17,7 @@ use Utopia\Database\Exception\Duplicate as DuplicateException; use Utopia\Database\Helpers\ID; use Utopia\Database\Helpers\Permission; use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Storage\Storage; use Utopia\System\System; @@ -68,7 +69,7 @@ class Create extends Action ->param('enabled', true, new Boolean(true), 'Is bucket enabled? When set to \'disabled\', users cannot access the files in this bucket but Server SDKs with and API key can still access the bucket. No files are lost when this is toggled.', true) ->param('maximumFileSize', fn (array $plan) => empty($plan['fileSize']) ? (int) System::getEnv('_APP_STORAGE_LIMIT', 0) : $plan['fileSize'] * 1000 * 1000, fn (array $plan) => new Range(1, empty($plan['fileSize']) ? (int) System::getEnv('_APP_STORAGE_LIMIT', 0) : $plan['fileSize'] * 1000 * 1000), 'Maximum file size allowed in bytes. Maximum allowed value is ' . Storage::human(System::getEnv('_APP_STORAGE_LIMIT', 0), 0) . '.', true, ['plan']) ->param('allowedFileExtensions', [], new ArrayList(new Text(64), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Allowed file extensions. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' extensions are allowed, each 64 characters long.', true) - ->param('compression', Compression::NONE, new WhiteList([Compression::NONE, Compression::GZIP, Compression::ZSTD], true), 'Compression algorithm chosen for compression. Can be one of ' . Compression::NONE . ', [' . Compression::GZIP . '](https://en.wikipedia.org/wiki/Gzip), or [' . Compression::ZSTD . '](https://en.wikipedia.org/wiki/Zstd), For file size above ' . Storage::human(APP_STORAGE_READ_BUFFER, 0) . ' compression is skipped even if it\'s enabled', true) + ->param('compression', Compression::NONE, new WhiteList([Compression::NONE, Compression::GZIP, Compression::ZSTD], true), 'Compression algorithm chosen for compression. Can be one of ' . Compression::NONE . ', [' . Compression::GZIP . '](https://en.wikipedia.org/wiki/Gzip), or [' . Compression::ZSTD . '](https://en.wikipedia.org/wiki/Zstd), For file size above ' . Storage::human(APP_STORAGE_READ_BUFFER, 0) . ' compression is skipped even if it\'s enabled', true, enum: new Enum(name: 'Compression')) ->param('encryption', true, new Boolean(true), 'Is encryption enabled? For file size above ' . Storage::human(APP_STORAGE_READ_BUFFER, 0) . ' encryption is skipped even if it\'s enabled', true) ->param('antivirus', true, new Boolean(true), 'Is virus scanning enabled? For file size above ' . Storage::human(APP_LIMIT_ANTIVIRUS, 0) . ' AntiVirus scanning is skipped even if it\'s enabled', true) ->param('transformations', true, new Boolean(true), 'Are image transformations enabled?', true) diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Update.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Update.php index 406f8e4f49..3549c035f1 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Update.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Update.php @@ -14,6 +14,7 @@ use Utopia\Database\Helpers\Permission; use Utopia\Database\Validator\Permissions; use Utopia\Database\Validator\UID; use Utopia\Platform\Action; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Storage\Storage; use Utopia\System\System; @@ -65,7 +66,7 @@ class Update extends Action ->param('enabled', true, new Boolean(true), 'Is bucket enabled? When set to \'disabled\', users cannot access the files in this bucket but Server SDKs with and API key can still access the bucket. No files are lost when this is toggled.', true) ->param('maximumFileSize', fn (array $plan) => empty($plan['fileSize']) ? (int) System::getEnv('_APP_STORAGE_LIMIT', 0) : $plan['fileSize'] * 1000 * 1000, fn (array $plan) => new Range(1, empty($plan['fileSize']) ? (int) System::getEnv('_APP_STORAGE_LIMIT', 0) : $plan['fileSize'] * 1000 * 1000), 'Maximum file size allowed in bytes. Maximum allowed value is ' . Storage::human(System::getEnv('_APP_STORAGE_LIMIT', 0), 0) . '.', true, ['plan']) ->param('allowedFileExtensions', [], new ArrayList(new Text(64), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Allowed file extensions. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' extensions are allowed, each 64 characters long.', true) - ->param('compression', Compression::NONE, new WhiteList([Compression::NONE, Compression::GZIP, Compression::ZSTD], true), 'Compression algorithm chosen for compression. Can be one of ' . Compression::NONE . ', [' . Compression::GZIP . '](https://en.wikipedia.org/wiki/Gzip), or [' . Compression::ZSTD . '](https://en.wikipedia.org/wiki/Zstd), For file size above ' . Storage::human(APP_STORAGE_READ_BUFFER, 0) . ' compression is skipped even if it\'s enabled', true) + ->param('compression', Compression::NONE, new WhiteList([Compression::NONE, Compression::GZIP, Compression::ZSTD], true), 'Compression algorithm chosen for compression. Can be one of ' . Compression::NONE . ', [' . Compression::GZIP . '](https://en.wikipedia.org/wiki/Gzip), or [' . Compression::ZSTD . '](https://en.wikipedia.org/wiki/Zstd), For file size above ' . Storage::human(APP_STORAGE_READ_BUFFER, 0) . ' compression is skipped even if it\'s enabled', true, enum: new Enum(name: 'Compression')) ->param('encryption', true, new Boolean(true), 'Is encryption enabled? For file size above ' . Storage::human(APP_STORAGE_READ_BUFFER, 0) . ' encryption is skipped even if it\'s enabled', true) ->param('antivirus', true, new Boolean(true), 'Is virus scanning enabled? For file size above ' . Storage::human(APP_LIMIT_ANTIVIRUS, 0) . ' AntiVirus scanning is skipped even if it\'s enabled', true) ->param('transformations', true, new Boolean(true), 'Are image transformations enabled?', true) From fe1a2f6364b9e739d0477a0f2b295b196baf4f47 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Tue, 26 May 2026 11:19:48 +0530 Subject: [PATCH 15/17] fix: preserve organization project region enum --- .../Platform/Modules/Organization/Http/Projects/Create.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Appwrite/Platform/Modules/Organization/Http/Projects/Create.php b/src/Appwrite/Platform/Modules/Organization/Http/Projects/Create.php index 227c64ce8c..785fddf233 100644 --- a/src/Appwrite/Platform/Modules/Organization/Http/Projects/Create.php +++ b/src/Appwrite/Platform/Modules/Organization/Http/Projects/Create.php @@ -21,6 +21,7 @@ use Utopia\Database\Document; use Utopia\Database\Exception\Duplicate; use Utopia\Database\Helpers\ID; use Utopia\DSN\DSN; +use Utopia\Platform\Enum; use Utopia\Platform\Scope\HTTP; use Utopia\Pools\Group; use Utopia\System\System; @@ -64,7 +65,7 @@ class Create extends Action )) ->param('projectId', '', new ProjectId(), 'Unique Id. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, and hyphen. Can\'t start with a special char. Max length is 36 chars.') ->param('name', null, new Text(128), 'Project name. Max length: 128 chars.') - ->param('region', System::getEnv('_APP_REGION', 'default'), new WhiteList(array_keys(array_filter(Config::getParam('regions'), fn ($config) => !$config['disabled']))), 'Project Region.', true) + ->param('region', System::getEnv('_APP_REGION', 'default'), new WhiteList(array_keys(array_filter(Config::getParam('regions'), fn ($config) => !$config['disabled']))), 'Project Region.', true, enum: new Enum(name: 'Region')) ->inject('response') ->inject('dbForPlatform') ->inject('cache') From a4d889145b959588b2c655c8c0a5d30e1d00ea01 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Tue, 26 May 2026 11:28:30 +0530 Subject: [PATCH 16/17] test: expect client web version --- tests/e2e/General/HTTPTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/e2e/General/HTTPTest.php b/tests/e2e/General/HTTPTest.php index 0358281eb7..450e4f2378 100644 --- a/tests/e2e/General/HTTPTest.php +++ b/tests/e2e/General/HTTPTest.php @@ -101,7 +101,7 @@ class HTTPTest extends Scope $body = $response['body']; $this->assertEquals(200, $response['headers']['status-code']); $this->assertIsString($body['server']); - $this->assertIsString($body['server-web']); + $this->assertIsString($body['client-web']); $this->assertIsString($body['client-flutter']); $this->assertIsString($body['console-web']); $this->assertIsString($body['server-nodejs']); From c7caf8d23d52cda9ccf16848773bf2bae1f51dc5 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Tue, 26 May 2026 11:33:25 +0530 Subject: [PATCH 17/17] fix: map numeric spec enum keys --- app/controllers/api/project.php | 8 +++++++- .../Modules/Proxy/Http/Rules/Redirect/Create.php | 10 +++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/project.php b/app/controllers/api/project.php index 043227fad4..b83c0a38ed 100644 --- a/app/controllers/api/project.php +++ b/app/controllers/api/project.php @@ -32,7 +32,13 @@ Http::get('/v1/project/usage') )) ->param('startDate', '', new DateTimeValidator(), 'Starting date for the usage') ->param('endDate', '', new DateTimeValidator(), 'End date for the usage') - ->param('period', '1d', new WhiteList(['1h', '1d']), 'Period used', true, enum: new Enum(name: 'ProjectUsageRange')) + ->param('period', '1d', new WhiteList(['1h', '1d']), 'Period used', true, enum: new Enum( + name: 'ProjectUsageRange', + map: [ + '1h' => 'OneHour', + '1d' => 'OneDay', + ] + )) ->inject('response') ->inject('project') ->inject('dbForProject') diff --git a/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Redirect/Create.php b/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Redirect/Create.php index 784da4e2eb..8dd15d3f03 100644 --- a/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Redirect/Create.php +++ b/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Redirect/Create.php @@ -67,7 +67,15 @@ class Create extends Action ->label('abuse-time', 60) ->param('domain', null, new ValidatorDomain(), 'Domain name.') ->param('url', null, new URL(), 'Target URL of redirection') - ->param('statusCode', null, new WhiteList([301, 302, 307, 308]), 'Status code of redirection', enum: new Enum(name: 'RedirectStatusCode')) + ->param('statusCode', null, new WhiteList([301, 302, 307, 308]), 'Status code of redirection', enum: new Enum( + name: 'RedirectStatusCode', + map: [ + '301' => 'MovedPermanently', + '302' => 'Found', + '307' => 'TemporaryRedirect', + '308' => 'PermanentRedirect', + ] + )) ->param('resourceId', '', fn (Database $dbForProject) => new UID($dbForProject->getAdapter()->getMaxUIDLength()), 'ID of parent resource.', false, ['dbForProject']) ->param('resourceType', '', new WhiteList(['site', 'function']), 'Type of parent resource.', enum: new Enum( name: 'ProxyResourceType',