Merge pull request #11132 from appwrite/fix-sdk-handling

This commit is contained in:
Darshan 2026-01-14 17:18:59 +05:30 committed by GitHub
commit 3bbfbdb063
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
16 changed files with 229 additions and 107 deletions

View file

@ -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": []

View file

@ -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": []
@ -61445,7 +61439,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 +61485,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": {

View file

@ -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": {

View file

@ -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": []

View file

@ -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": []

View file

@ -3217,9 +3217,7 @@
"yammer",
"yandex",
"zoho",
"zoom",
"mock",
"mock-unverified"
"zoom"
],
"x-enum-name": "OAuthProvider",
"x-enum-keys": []

View file

@ -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": [],

View file

@ -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": [],
@ -28355,9 +28351,7 @@
"yammer",
"yandex",
"zoho",
"zoom",
"mock",
"mock-unverified"
"zoom"
],
"x-enum-name": "OAuthProvider",
"x-enum-keys": []
@ -61384,7 +61378,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 +61424,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": {

View file

@ -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": {

View file

@ -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": [],

View file

@ -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": [],
@ -28355,9 +28351,7 @@
"yammer",
"yandex",
"zoho",
"zoom",
"mock",
"mock-unverified"
"zoom"
],
"x-enum-name": "OAuthProvider",
"x-enum-keys": []

View file

@ -3357,9 +3357,7 @@
"yammer",
"yandex",
"zoho",
"zoom",
"mock",
"mock-unverified"
"zoom"
],
"x-enum-name": "OAuthProvider",
"x-enum-keys": [],

12
composer.lock generated
View file

@ -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",

View file

@ -40,17 +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'
]
'methods' => [
'getUsage'
],
'parameter' => 'provider',
'exclude' => true, /* fully excluded */
],
];
protected array $enumBlacklist = [];
public function __construct(App $app, array $services, array $routes, array $models, array $keys, int $authCount, string $platform)
{
$this->app = $app;
@ -60,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;
}
/**

View file

@ -584,20 +584,45 @@ 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());
$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 = \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'] = $this->getRequestEnumKeys($sdk->getNamespace() ?? '', $methodName, $name);
$node['schema']['items']['x-enum-keys'] = $enumKeys;
}
if ($validator->getType() === 'integer') {
$node['schema']['items']['format'] = $validator->getFormat() ?? 'int32';
@ -609,20 +634,45 @@ 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());
$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 = \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'] = $this->getRequestEnumKeys($sdk->getNamespace() ?? '', $methodName, $name);
$node['schema']['x-enum-keys'] = $enumKeys;
}
if ($validator->getType() === 'integer') {
$node['schema']['format'] = $validator->getFormat() ?? 'int32';

View file

@ -571,18 +571,42 @@ 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());
$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 = \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'] = $this->getRequestEnumKeys($namespace, $methodName, $name);
$node['items']['x-enum-keys'] = $enumKeys;
}
if ($validator->getType() === 'integer') {
$node['items']['format'] = $validator->getFormat() ?? 'int32';
@ -591,18 +615,42 @@ 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());
$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 = \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'] = $this->getRequestEnumKeys($namespace, $methodName, $name);
$node['x-enum-keys'] = $enumKeys;
}
if ($validator->getType() === 'integer') {
$node['format'] = $validator->getFormat() ?? 'int32';