From f482e6de68b151fd90d33f5846d105db94815888 Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 14 Jan 2026 14:58:22 +0530 Subject: [PATCH 01/10] update: specs generation to exclude mock auth providers. --- .../SDK/Specification/Format/OpenAPI3.php | 63 ++++++++++++++++++- .../SDK/Specification/Format/Swagger2.php | 53 +++++++++++++++- 2 files changed, 114 insertions(+), 2 deletions(-) diff --git a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php index 0be3240ed7..0fd82fdd7d 100644 --- a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php +++ b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php @@ -12,6 +12,7 @@ use Appwrite\Template\Template; use Appwrite\Utopia\Database\Validator\Operation; use Appwrite\Utopia\Response\Model; use Appwrite\Utopia\Response\Model\Any; +use Utopia\Config\Config; use Utopia\Database\Database; use Utopia\Database\Helpers\Permission; use Utopia\Database\Helpers\Role; @@ -906,6 +907,66 @@ class OpenAPI3 extends Format \ksort($output['paths']); - return $output; + return $this->filterOAuthProviders($output); + } + + /** + * Filter OAuth providers from spec. + * + * @param array $spec + * @return array + */ + protected function filterOAuthProviders(array $spec): array + { + if (!isset($spec['paths'])) { + return $spec; + } + + $oAuthProviders = Config::getParam('oAuthProviders', []); + + foreach ($spec['paths'] as &$path) { + foreach ($path as &$method) { + if (isset($method['parameters'])) { + foreach ($method['parameters'] as &$param) { + if (isset($param['name']) && $param['name'] === 'provider') { + if (isset($param['schema']['enum'])) { + $param['schema']['enum'] = $this->filterProviderList($param['schema']['enum'], $oAuthProviders, 'mock'); + } + if (isset($param['schema']['items']['enum'])) { + $param['schema']['items']['enum'] = $this->filterProviderList($param['schema']['items']['enum'], $oAuthProviders, 'mock'); + } + } + } + } + + // Also check requestBody for provider parameter + if (isset($method['requestBody']['content']['application/json']['schema']['properties']['provider']['enum'])) { + $method['requestBody']['content']['application/json']['schema']['properties']['provider']['enum'] = + $this->filterProviderList( + $method['requestBody']['content']['application/json']['schema']['properties']['provider']['enum'], + $oAuthProviders, + 'mock' + ); + } + } + } + + return $spec; + } + + /** + * Filter provider list to remove providers based on a given key + * + * @param array $providers + * @param array $oAuthProviders + * @param string $key + * @return array + */ + protected function filterProviderList( + array $providers, + array $oAuthProviders, + string $key, + ): array { + return array_values(array_filter($providers, fn ($provider) => empty($oAuthProviders[$provider][$key]))); } } diff --git a/src/Appwrite/SDK/Specification/Format/Swagger2.php b/src/Appwrite/SDK/Specification/Format/Swagger2.php index fe663c6f55..5e5a7a98ea 100644 --- a/src/Appwrite/SDK/Specification/Format/Swagger2.php +++ b/src/Appwrite/SDK/Specification/Format/Swagger2.php @@ -12,6 +12,7 @@ use Appwrite\Template\Template; use Appwrite\Utopia\Database\Validator\Operation; use Appwrite\Utopia\Response\Model; use Appwrite\Utopia\Response\Model\Any; +use Utopia\Config\Config; use Utopia\Database\Database; use Utopia\Database\Helpers\Permission; use Utopia\Database\Helpers\Role; @@ -902,6 +903,56 @@ class Swagger2 extends Format \ksort($output['paths']); - return $output; + return $this->filterOAuthProviders($output); + } + + /** + * Filter OAuth providers from spec. + * + * @param array $spec + * @return array + */ + protected function filterOAuthProviders(array $spec): array + { + if (!isset($spec['paths'])) { + return $spec; + } + + $oAuthProviders = Config::getParam('oAuthProviders', []); + + foreach ($spec['paths'] as &$path) { + foreach ($path as &$method) { + if (isset($method['parameters'])) { + foreach ($method['parameters'] as &$param) { + if (isset($param['name']) && $param['name'] === 'provider') { + if (isset($param['enum'])) { + $param['enum'] = $this->filterProviderList($param['enum'], $oAuthProviders, 'mock'); + } + if (isset($param['items']['enum'])) { + $param['items']['enum'] = $this->filterProviderList($param['items']['enum'], $oAuthProviders, 'mock'); + } + } + } + } + } + } + + return $spec; + } + + /** + * Filter provider list to remove providers based on a given key. + * + * @param array $providers + * @param array $oAuthProviders + * @param string $key + * @return array + */ + protected function filterProviderList( + array $providers, + array $oAuthProviders, + string $key, + ): array { + return array_values(array_filter($providers, fn ($provider) => empty($oAuthProviders[$provider][$key]))); } } From e3ae7daab45b1a2017f64db6498714a03d0158c7 Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 14 Jan 2026 14:58:42 +0530 Subject: [PATCH 02/10] regen: specs. --- app/config/specs/open-api3-latest-client.json | 8 ++------ app/config/specs/open-api3-latest-console.json | 12 +++--------- app/config/specs/open-api3-latest-server.json | 4 +--- app/config/specs/swagger2-latest-client.json | 8 ++------ app/config/specs/swagger2-latest-console.json | 8 ++------ app/config/specs/swagger2-latest-server.json | 4 +--- 6 files changed, 11 insertions(+), 33 deletions(-) diff --git a/app/config/specs/open-api3-latest-client.json b/app/config/specs/open-api3-latest-client.json index 4bb90a535f..942e83c234 100644 --- a/app/config/specs/open-api3-latest-client.json +++ b/app/config/specs/open-api3-latest-client.json @@ -2584,9 +2584,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] @@ -3518,9 +3516,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] diff --git a/app/config/specs/open-api3-latest-console.json b/app/config/specs/open-api3-latest-console.json index a92b8d86e4..f7cbca76a5 100644 --- a/app/config/specs/open-api3-latest-console.json +++ b/app/config/specs/open-api3-latest-console.json @@ -2594,9 +2594,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] @@ -3516,9 +3514,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] @@ -28254,9 +28250,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] diff --git a/app/config/specs/open-api3-latest-server.json b/app/config/specs/open-api3-latest-server.json index ff308095d6..76e3a2a45c 100644 --- a/app/config/specs/open-api3-latest-server.json +++ b/app/config/specs/open-api3-latest-server.json @@ -3217,9 +3217,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] diff --git a/app/config/specs/swagger2-latest-client.json b/app/config/specs/swagger2-latest-client.json index ae64cba59b..1d02df124a 100644 --- a/app/config/specs/swagger2-latest-client.json +++ b/app/config/specs/swagger2-latest-client.json @@ -2694,9 +2694,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [], @@ -3652,9 +3650,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [], diff --git a/app/config/specs/swagger2-latest-console.json b/app/config/specs/swagger2-latest-console.json index ea0333f744..f0e1c5608c 100644 --- a/app/config/specs/swagger2-latest-console.json +++ b/app/config/specs/swagger2-latest-console.json @@ -2720,9 +2720,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [], @@ -3666,9 +3664,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [], diff --git a/app/config/specs/swagger2-latest-server.json b/app/config/specs/swagger2-latest-server.json index 95188083f6..6ad3eb4bce 100644 --- a/app/config/specs/swagger2-latest-server.json +++ b/app/config/specs/swagger2-latest-server.json @@ -3357,9 +3357,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [], From 91240e0ca7027ae8df057de67d314e37339be2d8 Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 14 Jan 2026 15:10:42 +0530 Subject: [PATCH 03/10] update: address comments. regen: specs. --- app/config/specs/swagger2-latest-console.json | 4 +--- .../SDK/Specification/Format/OpenAPI3.php | 16 +++++++++------- .../SDK/Specification/Format/Swagger2.php | 12 ++++++++++++ 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/app/config/specs/swagger2-latest-console.json b/app/config/specs/swagger2-latest-console.json index f0e1c5608c..17064287be 100644 --- a/app/config/specs/swagger2-latest-console.json +++ b/app/config/specs/swagger2-latest-console.json @@ -28351,9 +28351,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] diff --git a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php index 0fd82fdd7d..0370e90c9e 100644 --- a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php +++ b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php @@ -940,13 +940,15 @@ class OpenAPI3 extends Format } // Also check requestBody for provider parameter - if (isset($method['requestBody']['content']['application/json']['schema']['properties']['provider']['enum'])) { - $method['requestBody']['content']['application/json']['schema']['properties']['provider']['enum'] = - $this->filterProviderList( - $method['requestBody']['content']['application/json']['schema']['properties']['provider']['enum'], - $oAuthProviders, - 'mock' - ); + if (isset($method['requestBody']['content']['application/json']['schema']['properties']['provider'])) { + $providerProp = &$method['requestBody']['content']['application/json']['schema']['properties']['provider']; + if (isset($providerProp['enum'])) { + $providerProp['enum'] = $this->filterProviderList($providerProp['enum'], $oAuthProviders, 'mock'); + } + + if (isset($providerProp['items']['enum'])) { + $providerProp['items']['enum'] = $this->filterProviderList($providerProp['items']['enum'], $oAuthProviders, 'mock'); + } } } } diff --git a/src/Appwrite/SDK/Specification/Format/Swagger2.php b/src/Appwrite/SDK/Specification/Format/Swagger2.php index 5e5a7a98ea..1d5d4b754e 100644 --- a/src/Appwrite/SDK/Specification/Format/Swagger2.php +++ b/src/Appwrite/SDK/Specification/Format/Swagger2.php @@ -932,6 +932,18 @@ class Swagger2 extends Format $param['items']['enum'] = $this->filterProviderList($param['items']['enum'], $oAuthProviders, 'mock'); } } + + if (isset($param['schema']['properties']['provider'])) { + if (isset($param['schema']['properties']['provider']['enum'])) { + $param['schema']['properties']['provider']['enum'] = + $this->filterProviderList($param['schema']['properties']['provider']['enum'], $oAuthProviders, 'mock'); + } + + if (isset($param['schema']['properties']['provider']['items']['enum'])) { + $param['schema']['properties']['provider']['items']['enum'] = + $this->filterProviderList($param['schema']['properties']['provider']['items']['enum'], $oAuthProviders, 'mock'); + } + } } } } From 0ec515779ebaa46389e2294686cba5bd9dfc09ab Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 14 Jan 2026 15:29:30 +0530 Subject: [PATCH 04/10] update: address comments. regen: specs. --- app/config/specs/open-api3-latest-client.json | 8 +- .../specs/open-api3-latest-console.json | 12 ++- app/config/specs/open-api3-latest-server.json | 4 +- app/config/specs/swagger2-latest-client.json | 8 +- app/config/specs/swagger2-latest-console.json | 12 ++- app/config/specs/swagger2-latest-server.json | 4 +- .../SDK/Specification/Format/OpenAPI3.php | 99 ++++++----------- .../SDK/Specification/Format/Swagger2.php | 101 ++++++------------ 8 files changed, 98 insertions(+), 150 deletions(-) diff --git a/app/config/specs/open-api3-latest-client.json b/app/config/specs/open-api3-latest-client.json index 942e83c234..4bb90a535f 100644 --- a/app/config/specs/open-api3-latest-client.json +++ b/app/config/specs/open-api3-latest-client.json @@ -2584,7 +2584,9 @@ "yammer", "yandex", "zoho", - "zoom" + "zoom", + "mock", + "mock-unverified" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] @@ -3516,7 +3518,9 @@ "yammer", "yandex", "zoho", - "zoom" + "zoom", + "mock", + "mock-unverified" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] diff --git a/app/config/specs/open-api3-latest-console.json b/app/config/specs/open-api3-latest-console.json index f7cbca76a5..a92b8d86e4 100644 --- a/app/config/specs/open-api3-latest-console.json +++ b/app/config/specs/open-api3-latest-console.json @@ -2594,7 +2594,9 @@ "yammer", "yandex", "zoho", - "zoom" + "zoom", + "mock", + "mock-unverified" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] @@ -3514,7 +3516,9 @@ "yammer", "yandex", "zoho", - "zoom" + "zoom", + "mock", + "mock-unverified" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] @@ -28250,7 +28254,9 @@ "yammer", "yandex", "zoho", - "zoom" + "zoom", + "mock", + "mock-unverified" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] diff --git a/app/config/specs/open-api3-latest-server.json b/app/config/specs/open-api3-latest-server.json index 76e3a2a45c..ff308095d6 100644 --- a/app/config/specs/open-api3-latest-server.json +++ b/app/config/specs/open-api3-latest-server.json @@ -3217,7 +3217,9 @@ "yammer", "yandex", "zoho", - "zoom" + "zoom", + "mock", + "mock-unverified" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] diff --git a/app/config/specs/swagger2-latest-client.json b/app/config/specs/swagger2-latest-client.json index 1d02df124a..ae64cba59b 100644 --- a/app/config/specs/swagger2-latest-client.json +++ b/app/config/specs/swagger2-latest-client.json @@ -2694,7 +2694,9 @@ "yammer", "yandex", "zoho", - "zoom" + "zoom", + "mock", + "mock-unverified" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [], @@ -3650,7 +3652,9 @@ "yammer", "yandex", "zoho", - "zoom" + "zoom", + "mock", + "mock-unverified" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [], diff --git a/app/config/specs/swagger2-latest-console.json b/app/config/specs/swagger2-latest-console.json index 17064287be..ea0333f744 100644 --- a/app/config/specs/swagger2-latest-console.json +++ b/app/config/specs/swagger2-latest-console.json @@ -2720,7 +2720,9 @@ "yammer", "yandex", "zoho", - "zoom" + "zoom", + "mock", + "mock-unverified" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [], @@ -3664,7 +3666,9 @@ "yammer", "yandex", "zoho", - "zoom" + "zoom", + "mock", + "mock-unverified" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [], @@ -28351,7 +28355,9 @@ "yammer", "yandex", "zoho", - "zoom" + "zoom", + "mock", + "mock-unverified" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] diff --git a/app/config/specs/swagger2-latest-server.json b/app/config/specs/swagger2-latest-server.json index 6ad3eb4bce..95188083f6 100644 --- a/app/config/specs/swagger2-latest-server.json +++ b/app/config/specs/swagger2-latest-server.json @@ -3357,7 +3357,9 @@ "yammer", "yandex", "zoho", - "zoom" + "zoom", + "mock", + "mock-unverified" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [], diff --git a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php index 0370e90c9e..782ed217e5 100644 --- a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php +++ b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php @@ -12,7 +12,6 @@ use Appwrite\Template\Template; use Appwrite\Utopia\Database\Validator\Operation; use Appwrite\Utopia\Response\Model; use Appwrite\Utopia\Response\Model\Any; -use Utopia\Config\Config; use Utopia\Database\Database; use Utopia\Database\Helpers\Permission; use Utopia\Database\Helpers\Role; @@ -585,18 +584,31 @@ class OpenAPI3 extends Format // 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 ) { - $allowed = false; + // 'exclude' => true means full exclude + if (isset($blacklist['exclude']) && $blacklist['exclude'] === true) { + $allowed = false; + break; + } + + if (isset($blacklist['excludeKeys'])) { + $excludeKeys = $blacklist['excludeKeys']; + } break; } } if ($allowed && $validator->getType() === 'string') { - $node['schema']['items']['enum'] = \array_values($validator->getList()); + $enumValues = \array_values($validator->getList()); + if ($excludeKeys !== null) { + $enumValues = \array_values(\array_filter($enumValues, fn ($key) => !\in_array($key, $excludeKeys, true))); + } + $node['schema']['items']['enum'] = $enumValues; $node['schema']['items']['x-enum-name'] = $this->getRequestEnumName($sdk->getNamespace() ?? '', $methodName, $name); $node['schema']['items']['x-enum-keys'] = $this->getRequestEnumKeys($sdk->getNamespace() ?? '', $methodName, $name); } @@ -610,18 +622,31 @@ class OpenAPI3 extends Format // 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 ) { - $allowed = false; + // 'exclude' => true means full exclude + if (isset($blacklist['exclude']) && $blacklist['exclude'] === true) { + $allowed = false; + break; + } + + if (isset($blacklist['excludeKeys'])) { + $excludeKeys = $blacklist['excludeKeys']; + } break; } } if ($allowed && $validator->getType() === 'string') { - $node['schema']['enum'] = \array_values($validator->getList()); + $enumValues = \array_values($validator->getList()); + if ($excludeKeys !== null) { + $enumValues = \array_values(\array_filter($enumValues, fn ($key) => !\in_array($key, $excludeKeys, true))); + } + $node['schema']['enum'] = $enumValues; $node['schema']['x-enum-name'] = $this->getRequestEnumName($sdk->getNamespace() ?? '', $methodName, $name); $node['schema']['x-enum-keys'] = $this->getRequestEnumKeys($sdk->getNamespace() ?? '', $methodName, $name); } @@ -907,68 +932,6 @@ class OpenAPI3 extends Format \ksort($output['paths']); - return $this->filterOAuthProviders($output); - } - - /** - * Filter OAuth providers from spec. - * - * @param array $spec - * @return array - */ - protected function filterOAuthProviders(array $spec): array - { - if (!isset($spec['paths'])) { - return $spec; - } - - $oAuthProviders = Config::getParam('oAuthProviders', []); - - foreach ($spec['paths'] as &$path) { - foreach ($path as &$method) { - if (isset($method['parameters'])) { - foreach ($method['parameters'] as &$param) { - if (isset($param['name']) && $param['name'] === 'provider') { - if (isset($param['schema']['enum'])) { - $param['schema']['enum'] = $this->filterProviderList($param['schema']['enum'], $oAuthProviders, 'mock'); - } - if (isset($param['schema']['items']['enum'])) { - $param['schema']['items']['enum'] = $this->filterProviderList($param['schema']['items']['enum'], $oAuthProviders, 'mock'); - } - } - } - } - - // Also check requestBody for provider parameter - if (isset($method['requestBody']['content']['application/json']['schema']['properties']['provider'])) { - $providerProp = &$method['requestBody']['content']['application/json']['schema']['properties']['provider']; - if (isset($providerProp['enum'])) { - $providerProp['enum'] = $this->filterProviderList($providerProp['enum'], $oAuthProviders, 'mock'); - } - - if (isset($providerProp['items']['enum'])) { - $providerProp['items']['enum'] = $this->filterProviderList($providerProp['items']['enum'], $oAuthProviders, 'mock'); - } - } - } - } - - return $spec; - } - - /** - * Filter provider list to remove providers based on a given key - * - * @param array $providers - * @param array $oAuthProviders - * @param string $key - * @return array - */ - protected function filterProviderList( - array $providers, - array $oAuthProviders, - string $key, - ): array { - return array_values(array_filter($providers, fn ($provider) => empty($oAuthProviders[$provider][$key]))); + return $output; } } diff --git a/src/Appwrite/SDK/Specification/Format/Swagger2.php b/src/Appwrite/SDK/Specification/Format/Swagger2.php index 1d5d4b754e..97d12f5192 100644 --- a/src/Appwrite/SDK/Specification/Format/Swagger2.php +++ b/src/Appwrite/SDK/Specification/Format/Swagger2.php @@ -12,7 +12,6 @@ use Appwrite\Template\Template; use Appwrite\Utopia\Database\Validator\Operation; use Appwrite\Utopia\Response\Model; use Appwrite\Utopia\Response\Model\Any; -use Utopia\Config\Config; use Utopia\Database\Database; use Utopia\Database\Helpers\Permission; use Utopia\Database\Helpers\Role; @@ -572,16 +571,28 @@ class Swagger2 extends Format $node['x-example'] = $param['example']; } - // Iterate the blackList. If it matches with the current one, then it is blackListed $allowed = true; + $excludeKeys = null; foreach ($this->enumBlacklist as $blacklist) { if ($blacklist['namespace'] == $namespace && $blacklist['method'] == $methodName && $blacklist['parameter'] == $name) { - $allowed = false; + // 'exclude' => true means full exclude + if (isset($blacklist['exclude']) && $blacklist['exclude'] === true) { + $allowed = false; + break; + } + + if (isset($blacklist['excludeKeys'])) { + $excludeKeys = $blacklist['excludeKeys']; + } break; } } if ($allowed && $validator->getType() === 'string') { - $node['items']['enum'] = \array_values($validator->getList()); + $enumValues = \array_values($validator->getList()); + if ($excludeKeys !== null) { + $enumValues = \array_values(\array_filter($enumValues, fn ($key) => !\in_array($key, $excludeKeys, true))); + } + $node['items']['enum'] = $enumValues; $node['items']['x-enum-name'] = $this->getRequestEnumName($namespace, $methodName, $name); $node['items']['x-enum-keys'] = $this->getRequestEnumKeys($namespace, $methodName, $name); } @@ -592,16 +603,28 @@ class Swagger2 extends Format $node['type'] = $validator->getType(); $node['x-example'] = ($param['example'] ?? '') ?: $validator->getList()[0]; - // Iterate the blackList. If it matches with the current one, then it is blackListed $allowed = true; + $excludeKeys = null; foreach ($this->enumBlacklist as $blacklist) { if ($blacklist['namespace'] == $namespace && $blacklist['method'] == $methodName && $blacklist['parameter'] == $name) { - $allowed = false; + // 'exclude' => true means full exclude + if (isset($blacklist['exclude']) && $blacklist['exclude'] === true) { + $allowed = false; + break; + } + + if (isset($blacklist['excludeKeys'])) { + $excludeKeys = $blacklist['excludeKeys']; + } break; } } if ($allowed && $validator->getType() === 'string') { - $node['enum'] = \array_values($validator->getList()); + $enumValues = \array_values($validator->getList()); + if ($excludeKeys !== null) { + $enumValues = \array_values(\array_filter($enumValues, fn ($key) => !\in_array($key, $excludeKeys, true))); + } + $node['enum'] = $enumValues; $node['x-enum-name'] = $this->getRequestEnumName($namespace, $methodName, $name); $node['x-enum-keys'] = $this->getRequestEnumKeys($namespace, $methodName, $name); } @@ -903,68 +926,6 @@ class Swagger2 extends Format \ksort($output['paths']); - return $this->filterOAuthProviders($output); - } - - /** - * Filter OAuth providers from spec. - * - * @param array $spec - * @return array - */ - protected function filterOAuthProviders(array $spec): array - { - if (!isset($spec['paths'])) { - return $spec; - } - - $oAuthProviders = Config::getParam('oAuthProviders', []); - - foreach ($spec['paths'] as &$path) { - foreach ($path as &$method) { - if (isset($method['parameters'])) { - foreach ($method['parameters'] as &$param) { - if (isset($param['name']) && $param['name'] === 'provider') { - if (isset($param['enum'])) { - $param['enum'] = $this->filterProviderList($param['enum'], $oAuthProviders, 'mock'); - } - if (isset($param['items']['enum'])) { - $param['items']['enum'] = $this->filterProviderList($param['items']['enum'], $oAuthProviders, 'mock'); - } - } - - if (isset($param['schema']['properties']['provider'])) { - if (isset($param['schema']['properties']['provider']['enum'])) { - $param['schema']['properties']['provider']['enum'] = - $this->filterProviderList($param['schema']['properties']['provider']['enum'], $oAuthProviders, 'mock'); - } - - if (isset($param['schema']['properties']['provider']['items']['enum'])) { - $param['schema']['properties']['provider']['items']['enum'] = - $this->filterProviderList($param['schema']['properties']['provider']['items']['enum'], $oAuthProviders, 'mock'); - } - } - } - } - } - } - - return $spec; - } - - /** - * Filter provider list to remove providers based on a given key. - * - * @param array $providers - * @param array $oAuthProviders - * @param string $key - * @return array - */ - protected function filterProviderList( - array $providers, - array $oAuthProviders, - string $key, - ): array { - return array_values(array_filter($providers, fn ($provider) => empty($oAuthProviders[$provider][$key]))); + return $output; } } From d6d8729983e916c728549f0e26103171a1b270cd Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 14 Jan 2026 16:36:44 +0530 Subject: [PATCH 05/10] bump: sdk generator. --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index 20b5c754eb..d52a16365c 100644 --- a/composer.lock +++ b/composer.lock @@ -5481,16 +5481,16 @@ "packages-dev": [ { "name": "appwrite/sdk-generator", - "version": "1.8.11", + "version": "1.8.14", "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator.git", - "reference": "936404bbcbf4cd692bac102f2912b6c97ac87215" + "reference": "a43e8ba5d539e48f0717df284dbd5dc1fb659d6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/936404bbcbf4cd692bac102f2912b6c97ac87215", - "reference": "936404bbcbf4cd692bac102f2912b6c97ac87215", + "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/a43e8ba5d539e48f0717df284dbd5dc1fb659d6b", + "reference": "a43e8ba5d539e48f0717df284dbd5dc1fb659d6b", "shasum": "" }, "require": { @@ -5526,9 +5526,9 @@ "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", "support": { "issues": "https://github.com/appwrite/sdk-generator/issues", - "source": "https://github.com/appwrite/sdk-generator/tree/1.8.11" + "source": "https://github.com/appwrite/sdk-generator/tree/1.8.14" }, - "time": "2026-01-12T08:41:56+00:00" + "time": "2026-01-14T10:42:32+00:00" }, { "name": "doctrine/annotations", From 6cd19bf330c9cbc93a0fa29a2bb9ce90241d1f4a Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 14 Jan 2026 16:42:30 +0530 Subject: [PATCH 06/10] address comment for key values on enums. --- src/Appwrite/SDK/Specification/Format/OpenAPI3.php | 12 ++++++++++-- src/Appwrite/SDK/Specification/Format/Swagger2.php | 12 ++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php index 782ed217e5..ed5beff853 100644 --- a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php +++ b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php @@ -610,7 +610,11 @@ class OpenAPI3 extends Format } $node['schema']['items']['enum'] = $enumValues; $node['schema']['items']['x-enum-name'] = $this->getRequestEnumName($sdk->getNamespace() ?? '', $methodName, $name); - $node['schema']['items']['x-enum-keys'] = $this->getRequestEnumKeys($sdk->getNamespace() ?? '', $methodName, $name); + $enumKeys = $this->getRequestEnumKeys($sdk->getNamespace() ?? '', $methodName, $name); + if ($excludeKeys !== null) { + $enumKeys = \array_values(\array_filter($enumKeys, fn ($key) => \in_array($key, $enumValues, true))); + } + $node['schema']['items']['x-enum-keys'] = $enumKeys; } if ($validator->getType() === 'integer') { $node['schema']['items']['format'] = $validator->getFormat() ?? 'int32'; @@ -648,7 +652,11 @@ class OpenAPI3 extends Format } $node['schema']['enum'] = $enumValues; $node['schema']['x-enum-name'] = $this->getRequestEnumName($sdk->getNamespace() ?? '', $methodName, $name); - $node['schema']['x-enum-keys'] = $this->getRequestEnumKeys($sdk->getNamespace() ?? '', $methodName, $name); + $enumKeys = $this->getRequestEnumKeys($sdk->getNamespace() ?? '', $methodName, $name); + if ($excludeKeys !== null) { + $enumKeys = \array_values(\array_filter($enumKeys, fn ($key) => \in_array($key, $enumValues, true))); + } + $node['schema']['x-enum-keys'] = $enumKeys; } if ($validator->getType() === 'integer') { $node['schema']['format'] = $validator->getFormat() ?? 'int32'; diff --git a/src/Appwrite/SDK/Specification/Format/Swagger2.php b/src/Appwrite/SDK/Specification/Format/Swagger2.php index 97d12f5192..dc135f15d4 100644 --- a/src/Appwrite/SDK/Specification/Format/Swagger2.php +++ b/src/Appwrite/SDK/Specification/Format/Swagger2.php @@ -594,7 +594,11 @@ class Swagger2 extends Format } $node['items']['enum'] = $enumValues; $node['items']['x-enum-name'] = $this->getRequestEnumName($namespace, $methodName, $name); - $node['items']['x-enum-keys'] = $this->getRequestEnumKeys($namespace, $methodName, $name); + $enumKeys = $this->getRequestEnumKeys($namespace, $methodName, $name); + if ($excludeKeys !== null) { + $enumKeys = \array_values(\array_filter($enumKeys, fn ($key) => \in_array($key, $enumValues, true))); + } + $node['items']['x-enum-keys'] = $enumKeys; } if ($validator->getType() === 'integer') { $node['items']['format'] = $validator->getFormat() ?? 'int32'; @@ -626,7 +630,11 @@ class Swagger2 extends Format } $node['enum'] = $enumValues; $node['x-enum-name'] = $this->getRequestEnumName($namespace, $methodName, $name); - $node['x-enum-keys'] = $this->getRequestEnumKeys($namespace, $methodName, $name); + $enumKeys = $this->getRequestEnumKeys($namespace, $methodName, $name); + if ($excludeKeys !== null) { + $enumKeys = \array_values(\array_filter($enumKeys, fn ($key) => \in_array($key, $enumValues, true))); + } + $node['x-enum-keys'] = $enumKeys; } if ($validator->getType() === 'integer') { $node['format'] = $validator->getFormat() ?? 'int32'; From 08cd610823b7a4f049ff309badea6555fff3752f Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 14 Jan 2026 16:47:21 +0530 Subject: [PATCH 07/10] exclude the mocks. --- app/config/specs/open-api3-latest-client.json | 8 ++------ app/config/specs/open-api3-latest-console.json | 8 ++------ app/config/specs/open-api3-latest-server.json | 4 +--- app/config/specs/swagger2-latest-client.json | 8 ++------ app/config/specs/swagger2-latest-console.json | 8 ++------ app/config/specs/swagger2-latest-server.json | 4 +--- src/Appwrite/SDK/Specification/Format.php | 18 ++++++++++++++++++ 7 files changed, 28 insertions(+), 30 deletions(-) diff --git a/app/config/specs/open-api3-latest-client.json b/app/config/specs/open-api3-latest-client.json index 4bb90a535f..942e83c234 100644 --- a/app/config/specs/open-api3-latest-client.json +++ b/app/config/specs/open-api3-latest-client.json @@ -2584,9 +2584,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] @@ -3518,9 +3516,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] diff --git a/app/config/specs/open-api3-latest-console.json b/app/config/specs/open-api3-latest-console.json index a92b8d86e4..97c032720a 100644 --- a/app/config/specs/open-api3-latest-console.json +++ b/app/config/specs/open-api3-latest-console.json @@ -2594,9 +2594,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] @@ -3516,9 +3514,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] diff --git a/app/config/specs/open-api3-latest-server.json b/app/config/specs/open-api3-latest-server.json index ff308095d6..76e3a2a45c 100644 --- a/app/config/specs/open-api3-latest-server.json +++ b/app/config/specs/open-api3-latest-server.json @@ -3217,9 +3217,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] diff --git a/app/config/specs/swagger2-latest-client.json b/app/config/specs/swagger2-latest-client.json index ae64cba59b..1d02df124a 100644 --- a/app/config/specs/swagger2-latest-client.json +++ b/app/config/specs/swagger2-latest-client.json @@ -2694,9 +2694,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [], @@ -3652,9 +3650,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [], diff --git a/app/config/specs/swagger2-latest-console.json b/app/config/specs/swagger2-latest-console.json index ea0333f744..f0e1c5608c 100644 --- a/app/config/specs/swagger2-latest-console.json +++ b/app/config/specs/swagger2-latest-console.json @@ -2720,9 +2720,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [], @@ -3666,9 +3664,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [], diff --git a/app/config/specs/swagger2-latest-server.json b/app/config/specs/swagger2-latest-server.json index 95188083f6..6ad3eb4bce 100644 --- a/app/config/specs/swagger2-latest-server.json +++ b/app/config/specs/swagger2-latest-server.json @@ -3357,9 +3357,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [], diff --git a/src/Appwrite/SDK/Specification/Format.php b/src/Appwrite/SDK/Specification/Format.php index 3d2ebad556..53f96d490e 100644 --- a/src/Appwrite/SDK/Specification/Format.php +++ b/src/Appwrite/SDK/Specification/Format.php @@ -48,6 +48,24 @@ abstract class Format 'namespace' => 'users', 'method' => 'getUsage', 'parameter' => 'provider' + ], + [ + 'namespace' => 'account', + 'method' => 'createOAuth2Session', + 'parameter' => 'provider', + 'excludeKeys' => ['mock', 'mock-unverified'] + ], + [ + 'namespace' => 'account', + 'method' => 'createOAuth2Token', + 'parameter' => 'provider', + 'excludeKeys' => ['mock', 'mock-unverified'] + ], + [ + 'namespace' => 'account', + 'method' => 'updateMagicURLSession', + 'parameter' => 'provider', + 'excludeKeys' => ['mock', 'mock-unverified'] ] ]; From 479a583ff593c99553de7bc5c2686fd5110144a9 Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 14 Jan 2026 16:55:47 +0530 Subject: [PATCH 08/10] exclude the mocks. --- app/config/specs/open-api3-1.8.x-client.json | 8 ++------ app/config/specs/open-api3-1.8.x-console.json | 12 ++++-------- app/config/specs/open-api3-1.8.x-server.json | 8 +++----- app/config/specs/swagger2-1.8.x-client.json | 8 ++------ app/config/specs/swagger2-1.8.x-console.json | 12 ++++-------- app/config/specs/swagger2-1.8.x-server.json | 8 +++----- 6 files changed, 18 insertions(+), 38 deletions(-) diff --git a/app/config/specs/open-api3-1.8.x-client.json b/app/config/specs/open-api3-1.8.x-client.json index 4bb90a535f..942e83c234 100644 --- a/app/config/specs/open-api3-1.8.x-client.json +++ b/app/config/specs/open-api3-1.8.x-client.json @@ -2584,9 +2584,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] @@ -3518,9 +3516,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] diff --git a/app/config/specs/open-api3-1.8.x-console.json b/app/config/specs/open-api3-1.8.x-console.json index 22f247843f..97c032720a 100644 --- a/app/config/specs/open-api3-1.8.x-console.json +++ b/app/config/specs/open-api3-1.8.x-console.json @@ -2594,9 +2594,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] @@ -3516,9 +3514,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] @@ -61445,7 +61441,7 @@ "status": { "type": "string", "description": "Status of delivery.", - "x-example": "Message status can be one of the following: draft, processing, scheduled, sent, or failed.", + "x-example": "processing", "enum": [ "draft", "processing", @@ -61491,7 +61487,7 @@ "subject": "Welcome to Appwrite", "content": "Hi there, welcome to Appwrite family." }, - "status": "Message status can be one of the following: draft, processing, scheduled, sent, or failed." + "status": "processing" } }, "topic": { diff --git a/app/config/specs/open-api3-1.8.x-server.json b/app/config/specs/open-api3-1.8.x-server.json index e82f3e5b78..76e3a2a45c 100644 --- a/app/config/specs/open-api3-1.8.x-server.json +++ b/app/config/specs/open-api3-1.8.x-server.json @@ -3217,9 +3217,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] @@ -45416,7 +45414,7 @@ "status": { "type": "string", "description": "Status of delivery.", - "x-example": "Message status can be one of the following: draft, processing, scheduled, sent, or failed.", + "x-example": "processing", "enum": [ "draft", "processing", @@ -45462,7 +45460,7 @@ "subject": "Welcome to Appwrite", "content": "Hi there, welcome to Appwrite family." }, - "status": "Message status can be one of the following: draft, processing, scheduled, sent, or failed." + "status": "processing" } }, "topic": { diff --git a/app/config/specs/swagger2-1.8.x-client.json b/app/config/specs/swagger2-1.8.x-client.json index ae64cba59b..1d02df124a 100644 --- a/app/config/specs/swagger2-1.8.x-client.json +++ b/app/config/specs/swagger2-1.8.x-client.json @@ -2694,9 +2694,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [], @@ -3652,9 +3650,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [], diff --git a/app/config/specs/swagger2-1.8.x-console.json b/app/config/specs/swagger2-1.8.x-console.json index 7672fc09d4..f0e1c5608c 100644 --- a/app/config/specs/swagger2-1.8.x-console.json +++ b/app/config/specs/swagger2-1.8.x-console.json @@ -2720,9 +2720,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [], @@ -3666,9 +3664,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [], @@ -61384,7 +61380,7 @@ "status": { "type": "string", "description": "Status of delivery.", - "x-example": "Message status can be one of the following: draft, processing, scheduled, sent, or failed.", + "x-example": "processing", "enum": [ "draft", "processing", @@ -61430,7 +61426,7 @@ "subject": "Welcome to Appwrite", "content": "Hi there, welcome to Appwrite family." }, - "status": "Message status can be one of the following: draft, processing, scheduled, sent, or failed." + "status": "processing" } }, "topic": { diff --git a/app/config/specs/swagger2-1.8.x-server.json b/app/config/specs/swagger2-1.8.x-server.json index 284c917919..6ad3eb4bce 100644 --- a/app/config/specs/swagger2-1.8.x-server.json +++ b/app/config/specs/swagger2-1.8.x-server.json @@ -3357,9 +3357,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [], @@ -45349,7 +45347,7 @@ "status": { "type": "string", "description": "Status of delivery.", - "x-example": "Message status can be one of the following: draft, processing, scheduled, sent, or failed.", + "x-example": "processing", "enum": [ "draft", "processing", @@ -45395,7 +45393,7 @@ "subject": "Welcome to Appwrite", "content": "Hi there, welcome to Appwrite family." }, - "status": "Message status can be one of the following: draft, processing, scheduled, sent, or failed." + "status": "processing" } }, "topic": { From 4d2f63139335aa11e750c4e2cc7f8c00550cc007 Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 14 Jan 2026 17:07:33 +0530 Subject: [PATCH 09/10] update: exclude the mocks. update: nice group based blacklisting. --- .../specs/open-api3-latest-console.json | 4 +- app/config/specs/swagger2-latest-console.json | 4 +- src/Appwrite/SDK/Specification/Format.php | 100 ++++++++++++++---- 3 files changed, 79 insertions(+), 29 deletions(-) diff --git a/app/config/specs/open-api3-latest-console.json b/app/config/specs/open-api3-latest-console.json index 97c032720a..f7cbca76a5 100644 --- a/app/config/specs/open-api3-latest-console.json +++ b/app/config/specs/open-api3-latest-console.json @@ -28250,9 +28250,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] diff --git a/app/config/specs/swagger2-latest-console.json b/app/config/specs/swagger2-latest-console.json index f0e1c5608c..17064287be 100644 --- a/app/config/specs/swagger2-latest-console.json +++ b/app/config/specs/swagger2-latest-console.json @@ -28351,9 +28351,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] diff --git a/src/Appwrite/SDK/Specification/Format.php b/src/Appwrite/SDK/Specification/Format.php index 53f96d490e..ed77e568f4 100644 --- a/src/Appwrite/SDK/Specification/Format.php +++ b/src/Appwrite/SDK/Specification/Format.php @@ -40,35 +40,46 @@ abstract class Format 'license.url' => '', ]; - /* - * Blacklist to omit the enum types for the given route's parameter - */ - protected array $enumBlacklist = [ + 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' + ], + ], + ]; + + private const array PROVIDER_USAGE_BLACKLIST = [ [ 'namespace' => 'users', - 'method' => 'getUsage', - 'parameter' => 'provider' - ], - [ - 'namespace' => 'account', - 'method' => 'createOAuth2Session', + 'methods' => [ + 'getUsage' + ], 'parameter' => 'provider', - 'excludeKeys' => ['mock', 'mock-unverified'] + 'exclude' => true, /* fully excluded */ ], - [ - 'namespace' => 'account', - 'method' => 'createOAuth2Token', - 'parameter' => 'provider', - 'excludeKeys' => ['mock', 'mock-unverified'] - ], - [ - 'namespace' => 'account', - 'method' => 'updateMagicURLSession', - 'parameter' => 'provider', - 'excludeKeys' => ['mock', 'mock-unverified'] - ] ]; + protected array $enumBlacklist = []; + public function __construct(App $app, array $services, array $routes, array $models, array $keys, int $authCount, string $platform) { $this->app = $app; @@ -78,6 +89,49 @@ 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 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; + } + } + + foreach (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; } /** From bc6ecbd22cd34b1063332561587890e9bfb0f25d Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 14 Jan 2026 17:15:33 +0530 Subject: [PATCH 10/10] address comments. --- app/config/specs/open-api3-1.8.x-console.json | 4 +- app/config/specs/swagger2-1.8.x-console.json | 4 +- .../SDK/Specification/Format/OpenAPI3.php | 40 +++++++++++++------ .../SDK/Specification/Format/Swagger2.php | 40 +++++++++++++------ 4 files changed, 58 insertions(+), 30 deletions(-) diff --git a/app/config/specs/open-api3-1.8.x-console.json b/app/config/specs/open-api3-1.8.x-console.json index 97c032720a..f7cbca76a5 100644 --- a/app/config/specs/open-api3-1.8.x-console.json +++ b/app/config/specs/open-api3-1.8.x-console.json @@ -28250,9 +28250,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] diff --git a/app/config/specs/swagger2-1.8.x-console.json b/app/config/specs/swagger2-1.8.x-console.json index f0e1c5608c..17064287be 100644 --- a/app/config/specs/swagger2-1.8.x-console.json +++ b/app/config/specs/swagger2-1.8.x-console.json @@ -28351,9 +28351,7 @@ "yammer", "yandex", "zoho", - "zoom", - "mock", - "mock-unverified" + "zoom" ], "x-enum-name": "OAuthProvider", "x-enum-keys": [] diff --git a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php index ed5beff853..27dcf92923 100644 --- a/src/Appwrite/SDK/Specification/Format/OpenAPI3.php +++ b/src/Appwrite/SDK/Specification/Format/OpenAPI3.php @@ -604,16 +604,24 @@ class OpenAPI3 extends Format } } if ($allowed && $validator->getType() === 'string') { - $enumValues = \array_values($validator->getList()); + $allValues = \array_values($validator->getList()); + $allKeys = $this->getRequestEnumKeys($sdk->getNamespace() ?? '', $methodName, $name); + if ($excludeKeys !== null) { - $enumValues = \array_values(\array_filter($enumValues, fn ($key) => !\in_array($key, $excludeKeys, true))); + $keepIndices = []; + foreach ($allValues as $index => $value) { + if (!\in_array($value, $excludeKeys, true)) { + $keepIndices[] = $index; + } + } + $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); - $enumKeys = $this->getRequestEnumKeys($sdk->getNamespace() ?? '', $methodName, $name); - if ($excludeKeys !== null) { - $enumKeys = \array_values(\array_filter($enumKeys, fn ($key) => \in_array($key, $enumValues, true))); - } $node['schema']['items']['x-enum-keys'] = $enumKeys; } if ($validator->getType() === 'integer') { @@ -646,16 +654,24 @@ class OpenAPI3 extends Format } } if ($allowed && $validator->getType() === 'string') { - $enumValues = \array_values($validator->getList()); + $allValues = \array_values($validator->getList()); + $allKeys = $this->getRequestEnumKeys($sdk->getNamespace() ?? '', $methodName, $name); + if ($excludeKeys !== null) { - $enumValues = \array_values(\array_filter($enumValues, fn ($key) => !\in_array($key, $excludeKeys, true))); + $keepIndices = []; + foreach ($allValues as $index => $value) { + if (!\in_array($value, $excludeKeys, true)) { + $keepIndices[] = $index; + } + } + $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); - $enumKeys = $this->getRequestEnumKeys($sdk->getNamespace() ?? '', $methodName, $name); - if ($excludeKeys !== null) { - $enumKeys = \array_values(\array_filter($enumKeys, fn ($key) => \in_array($key, $enumValues, true))); - } $node['schema']['x-enum-keys'] = $enumKeys; } if ($validator->getType() === 'integer') { diff --git a/src/Appwrite/SDK/Specification/Format/Swagger2.php b/src/Appwrite/SDK/Specification/Format/Swagger2.php index dc135f15d4..de25a57ccc 100644 --- a/src/Appwrite/SDK/Specification/Format/Swagger2.php +++ b/src/Appwrite/SDK/Specification/Format/Swagger2.php @@ -588,16 +588,24 @@ class Swagger2 extends Format } } if ($allowed && $validator->getType() === 'string') { - $enumValues = \array_values($validator->getList()); + $allValues = \array_values($validator->getList()); + $allKeys = $this->getRequestEnumKeys($namespace, $methodName, $name); + if ($excludeKeys !== null) { - $enumValues = \array_values(\array_filter($enumValues, fn ($key) => !\in_array($key, $excludeKeys, true))); + $keepIndices = []; + foreach ($allValues as $index => $value) { + if (!\in_array($value, $excludeKeys, true)) { + $keepIndices[] = $index; + } + } + $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); - $enumKeys = $this->getRequestEnumKeys($namespace, $methodName, $name); - if ($excludeKeys !== null) { - $enumKeys = \array_values(\array_filter($enumKeys, fn ($key) => \in_array($key, $enumValues, true))); - } $node['items']['x-enum-keys'] = $enumKeys; } if ($validator->getType() === 'integer') { @@ -624,16 +632,24 @@ class Swagger2 extends Format } } if ($allowed && $validator->getType() === 'string') { - $enumValues = \array_values($validator->getList()); + $allValues = \array_values($validator->getList()); + $allKeys = $this->getRequestEnumKeys($namespace, $methodName, $name); + if ($excludeKeys !== null) { - $enumValues = \array_values(\array_filter($enumValues, fn ($key) => !\in_array($key, $excludeKeys, true))); + $keepIndices = []; + foreach ($allValues as $index => $value) { + if (!\in_array($value, $excludeKeys, true)) { + $keepIndices[] = $index; + } + } + $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); - $enumKeys = $this->getRequestEnumKeys($namespace, $methodName, $name); - if ($excludeKeys !== null) { - $enumKeys = \array_values(\array_filter($enumKeys, fn ($key) => \in_array($key, $enumValues, true))); - } $node['x-enum-keys'] = $enumKeys; } if ($validator->getType() === 'integer') {