From 17e9c313f0e45cc6348241c0d2eb7d5c9fec2ab1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 12 May 2026 14:17:31 +0200 Subject: [PATCH 1/4] Fix response format enum sdk names --- src/Appwrite/SDK/Specification/Format.php | 6 +++- .../SDK/Specification/Format/OpenAPI3.php | 4 +-- .../SDK/Specification/Format/Swagger2.php | 4 +-- .../Response/Model/ProjectAuthMethod.php | 1 + .../Utopia/Response/Model/ProjectProtocol.php | 1 + .../Utopia/Response/Model/ProjectService.php | 1 + tests/unit/SDK/Specification/FormatTest.php | 29 +++++++++++++++++++ 7 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/Appwrite/SDK/Specification/Format.php b/src/Appwrite/SDK/Specification/Format.php index 4c7fa6f377..7e72a96017 100644 --- a/src/Appwrite/SDK/Specification/Format.php +++ b/src/Appwrite/SDK/Specification/Format.php @@ -1019,8 +1019,12 @@ abstract class Format return self::REQUEST_PARAMETER_OVERRIDES; } - public function getResponseEnumName(string $model, string $param): ?string + 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'; } diff --git a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php index f69ec3972a..ab1e9be97c 100644 --- a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php +++ b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php @@ -988,13 +988,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); + $enumName = $this->getResponseEnumName($model->getType(), $name, $rule['enumSDKName']); if ($enumName) { $output['components']['schemas'][$model->getType()]['properties'][$name]['items']['x-enum-name'] = $enumName; } } else { $output['components']['schemas'][$model->getType()]['properties'][$name]['enum'] = \array_values($rule['enum']); - $enumName = $this->getResponseEnumName($model->getType(), $name); + $enumName = $this->getResponseEnumName($model->getType(), $name, $rule['enumSDKName']); if ($enumName) { $output['components']['schemas'][$model->getType()]['properties'][$name]['x-enum-name'] = $enumName; } diff --git a/src/Appwrite/SDK/Specification/Format/Swagger2.php b/src/Appwrite/SDK/Specification/Format/Swagger2.php index 52e33bcc27..4ccc4cf132 100644 --- a/src/Appwrite/SDK/Specification/Format/Swagger2.php +++ b/src/Appwrite/SDK/Specification/Format/Swagger2.php @@ -975,13 +975,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); + $enumName = $this->getResponseEnumName($model->getType(), $name, $rule['enumSDKName']); if ($enumName) { $output['definitions'][$model->getType()]['properties'][$name]['items']['x-enum-name'] = $enumName; } } else { $output['definitions'][$model->getType()]['properties'][$name]['enum'] = \array_values($rule['enum']); - $enumName = $this->getResponseEnumName($model->getType(), $name); + $enumName = $this->getResponseEnumName($model->getType(), $name, $rule['enumSDKName']); if ($enumName) { $output['definitions'][$model->getType()]['properties'][$name]['x-enum-name'] = $enumName; } diff --git a/src/Appwrite/Utopia/Response/Model/ProjectAuthMethod.php b/src/Appwrite/Utopia/Response/Model/ProjectAuthMethod.php index e500d7caa6..cb4a7dc93f 100644 --- a/src/Appwrite/Utopia/Response/Model/ProjectAuthMethod.php +++ b/src/Appwrite/Utopia/Response/Model/ProjectAuthMethod.php @@ -17,6 +17,7 @@ class ProjectAuthMethod extends Model 'default' => '', 'example' => 'email-password', 'enum' => \array_keys(Config::getParam('auth', [])), + 'enumSDKName' => 'ProjectAuthMethodId', ]) ->addRule('enabled', [ 'type' => self::TYPE_BOOLEAN, diff --git a/src/Appwrite/Utopia/Response/Model/ProjectProtocol.php b/src/Appwrite/Utopia/Response/Model/ProjectProtocol.php index fc166be9aa..918b1bc630 100644 --- a/src/Appwrite/Utopia/Response/Model/ProjectProtocol.php +++ b/src/Appwrite/Utopia/Response/Model/ProjectProtocol.php @@ -17,6 +17,7 @@ class ProjectProtocol extends Model 'default' => '', 'example' => 'graphql', 'enum' => \array_keys(Config::getParam('protocols', [])), + 'enumSDKName' => 'ProjectProtocolId', ]) ->addRule('enabled', [ 'type' => self::TYPE_BOOLEAN, diff --git a/src/Appwrite/Utopia/Response/Model/ProjectService.php b/src/Appwrite/Utopia/Response/Model/ProjectService.php index ca481c2946..2e76dcfbe7 100644 --- a/src/Appwrite/Utopia/Response/Model/ProjectService.php +++ b/src/Appwrite/Utopia/Response/Model/ProjectService.php @@ -17,6 +17,7 @@ class ProjectService extends Model 'default' => '', 'example' => 'sites', 'enum' => \array_keys(\array_filter(Config::getParam('services', []), fn ($element) => $element['optional'])), + 'enumSDKName' => 'ProjectServiceId', ]) ->addRule('enabled', [ 'type' => self::TYPE_BOOLEAN, diff --git a/tests/unit/SDK/Specification/FormatTest.php b/tests/unit/SDK/Specification/FormatTest.php index f99b29bfe2..ae778a86f6 100644 --- a/tests/unit/SDK/Specification/FormatTest.php +++ b/tests/unit/SDK/Specification/FormatTest.php @@ -63,4 +63,33 @@ class FormatTest extends TestCase $this->assertSame('HealthCheckStatus', $this->format->getResponseEnumName('healthStatus', 'status')); $this->assertNull($this->format->getResponseEnumName('key', 'name')); } + + public function testPlatformListIdUsesSharedPlatformTypeEnum(): void + { + $this->assertSame('PlatformType', $this->format->getResponseEnumName('platformList', '$id')); + $this->assertNull($this->format->getResponseEnumName('platformList', 'name')); + $this->assertNull($this->format->getResponseEnumName('other', '$id')); + } + + public function testEnumSDKNameOverrideTakesPrecedence(): void + { + $this->assertSame('AuthMethodId', $this->format->getResponseEnumName('projectAuthMethod', 'method', 'AuthMethodId')); + + // Override wins even on models that have their own mapping. + $this->assertSame('CustomName', $this->format->getResponseEnumName('platformAndroid', 'type', 'CustomName')); + $this->assertSame('CustomName', $this->format->getResponseEnumName('healthStatus', 'status', 'CustomName')); + + // Override produces an enum name for params that otherwise wouldn't get one. + $this->assertSame('AuthMethodId', $this->format->getResponseEnumName('key', 'name', 'AuthMethodId')); + } + + public function testEnumSDKNameEmptyOrNullFallsThroughToDefaults(): void + { + $this->assertNull($this->format->getResponseEnumName('key', 'name', null)); + $this->assertNull($this->format->getResponseEnumName('key', 'name', '')); + + // Falsy override should not block the existing platform mapping. + $this->assertSame('PlatformType', $this->format->getResponseEnumName('platformWeb', 'type', null)); + $this->assertSame('PlatformType', $this->format->getResponseEnumName('platformWeb', 'type', '')); + } } From 0ca52a1bdbee0aca36dddb22469968eaeaaa54be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 12 May 2026 14:39:13 +0200 Subject: [PATCH 2/4] Request enum params sdk method name --- src/Appwrite/SDK/Specification/Format.php | 45 ++++++++++++++++++++--- 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/src/Appwrite/SDK/Specification/Format.php b/src/Appwrite/SDK/Specification/Format.php index 7e72a96017..6265aeeb9f 100644 --- a/src/Appwrite/SDK/Specification/Format.php +++ b/src/Appwrite/SDK/Specification/Format.php @@ -757,28 +757,28 @@ abstract class Format case 'updateAuthMethod': switch ($param) { case 'methodId': - return 'AuthMethod'; + return 'ProjetAuthMethodId'; } break; case 'getPolicy': switch ($param) { case 'policyId': - return 'ProjectPolicy'; + return 'ProjectPolicyId'; } break; case 'getOAuth2Provider': switch ($param) { case 'providerId': - return 'OAuthProvider'; + return 'ProjectOAuthProviderId'; } break; case 'getEmailTemplate': case 'updateEmailTemplate': switch ($param) { case 'templateId': - return 'EmailTemplateType'; + return 'ProjectEmailTemplateId'; case 'locale': - return 'EmailTemplateLocale'; + return 'ProjectEmailTemplateLocale'; } break; case 'getUsage': @@ -787,6 +787,39 @@ abstract class Format 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': @@ -1024,7 +1057,7 @@ abstract class Format if ($enumSDKName) { return $enumSDKName; } - + if ($param === 'type' && \str_starts_with($model, 'platform') && $model !== 'platformList') { return 'PlatformType'; } From 5a748c27835cf22a7912db7bf9aa8ac103f602b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 12 May 2026 14:46:33 +0200 Subject: [PATCH 3/4] PR review fixes --- src/Appwrite/SDK/Specification/Format.php | 2 +- tests/unit/SDK/Specification/FormatTest.php | 29 --------------------- 2 files changed, 1 insertion(+), 30 deletions(-) diff --git a/src/Appwrite/SDK/Specification/Format.php b/src/Appwrite/SDK/Specification/Format.php index 6265aeeb9f..fc67dedb13 100644 --- a/src/Appwrite/SDK/Specification/Format.php +++ b/src/Appwrite/SDK/Specification/Format.php @@ -757,7 +757,7 @@ abstract class Format case 'updateAuthMethod': switch ($param) { case 'methodId': - return 'ProjetAuthMethodId'; + return 'ProjectAuthMethodId'; } break; case 'getPolicy': diff --git a/tests/unit/SDK/Specification/FormatTest.php b/tests/unit/SDK/Specification/FormatTest.php index ae778a86f6..f99b29bfe2 100644 --- a/tests/unit/SDK/Specification/FormatTest.php +++ b/tests/unit/SDK/Specification/FormatTest.php @@ -63,33 +63,4 @@ class FormatTest extends TestCase $this->assertSame('HealthCheckStatus', $this->format->getResponseEnumName('healthStatus', 'status')); $this->assertNull($this->format->getResponseEnumName('key', 'name')); } - - public function testPlatformListIdUsesSharedPlatformTypeEnum(): void - { - $this->assertSame('PlatformType', $this->format->getResponseEnumName('platformList', '$id')); - $this->assertNull($this->format->getResponseEnumName('platformList', 'name')); - $this->assertNull($this->format->getResponseEnumName('other', '$id')); - } - - public function testEnumSDKNameOverrideTakesPrecedence(): void - { - $this->assertSame('AuthMethodId', $this->format->getResponseEnumName('projectAuthMethod', 'method', 'AuthMethodId')); - - // Override wins even on models that have their own mapping. - $this->assertSame('CustomName', $this->format->getResponseEnumName('platformAndroid', 'type', 'CustomName')); - $this->assertSame('CustomName', $this->format->getResponseEnumName('healthStatus', 'status', 'CustomName')); - - // Override produces an enum name for params that otherwise wouldn't get one. - $this->assertSame('AuthMethodId', $this->format->getResponseEnumName('key', 'name', 'AuthMethodId')); - } - - public function testEnumSDKNameEmptyOrNullFallsThroughToDefaults(): void - { - $this->assertNull($this->format->getResponseEnumName('key', 'name', null)); - $this->assertNull($this->format->getResponseEnumName('key', 'name', '')); - - // Falsy override should not block the existing platform mapping. - $this->assertSame('PlatformType', $this->format->getResponseEnumName('platformWeb', 'type', null)); - $this->assertSame('PlatformType', $this->format->getResponseEnumName('platformWeb', 'type', '')); - } } From b655f241728480ef6a35de2c9d561e77a30b49a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 12 May 2026 14:49:59 +0200 Subject: [PATCH 4/4] Fix warning --- src/Appwrite/SDK/Specification/Format/OpenAPI3.php | 4 ++-- src/Appwrite/SDK/Specification/Format/Swagger2.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php index ab1e9be97c..3be3fe7115 100644 --- a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php +++ b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php @@ -988,13 +988,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']); + $enumName = $this->getResponseEnumName($model->getType(), $name, $rule['enumSDKName'] ?? null); if ($enumName) { $output['components']['schemas'][$model->getType()]['properties'][$name]['items']['x-enum-name'] = $enumName; } } else { $output['components']['schemas'][$model->getType()]['properties'][$name]['enum'] = \array_values($rule['enum']); - $enumName = $this->getResponseEnumName($model->getType(), $name, $rule['enumSDKName']); + $enumName = $this->getResponseEnumName($model->getType(), $name, $rule['enumSDKName'] ?? null); if ($enumName) { $output['components']['schemas'][$model->getType()]['properties'][$name]['x-enum-name'] = $enumName; } diff --git a/src/Appwrite/SDK/Specification/Format/Swagger2.php b/src/Appwrite/SDK/Specification/Format/Swagger2.php index 4ccc4cf132..9a16bc8bbe 100644 --- a/src/Appwrite/SDK/Specification/Format/Swagger2.php +++ b/src/Appwrite/SDK/Specification/Format/Swagger2.php @@ -975,13 +975,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']); + $enumName = $this->getResponseEnumName($model->getType(), $name, $rule['enumSDKName'] ?? null); if ($enumName) { $output['definitions'][$model->getType()]['properties'][$name]['items']['x-enum-name'] = $enumName; } } else { $output['definitions'][$model->getType()]['properties'][$name]['enum'] = \array_values($rule['enum']); - $enumName = $this->getResponseEnumName($model->getType(), $name, $rule['enumSDKName']); + $enumName = $this->getResponseEnumName($model->getType(), $name, $rule['enumSDKName'] ?? null); if ($enumName) { $output['definitions'][$model->getType()]['properties'][$name]['x-enum-name'] = $enumName; }