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; } }