Skip to content

Commit 066d19d

Browse files
committed
fix(php): generate enums used only by request models
1 parent de2ab38 commit 066d19d

File tree

5 files changed

+121
-5
lines changed

5 files changed

+121
-5
lines changed

src/SDK/SDK.php

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -712,9 +712,50 @@ protected function getFilteredResponseEnums(?array $filteredDefinitions = null):
712712
/**
713713
* @return array
714714
*/
715-
protected function getFilteredAllEnums(?array $filteredRequestEnums = null, ?array $filteredResponseEnums = null): array
715+
protected function getFilteredRequestModelEnums(?array $filteredRequestModels = null): array
716716
{
717+
$filteredRequestModels ??= $this->getFilteredRequestModels();
718+
$list = [];
719+
720+
foreach ($filteredRequestModels as $modelName => $model) {
721+
foreach ($model['properties'] ?? [] as $propertyName => $property) {
722+
if (isset($property['enum'])) {
723+
$enumName = $property['enumName'] ?? ucfirst((string)$modelName) . ucfirst((string)$propertyName);
724+
725+
$this->mergeEnumValues(
726+
$list,
727+
$enumName,
728+
$property['enum'],
729+
$property['enumKeys'] ?? []
730+
);
731+
}
732+
733+
if ((($property['type'] ?? null) === 'array') && isset($property['enumValues'])) {
734+
$enumName = $property['enumName'] ?? ucfirst((string)$modelName) . ucfirst((string)$propertyName);
735+
736+
$this->mergeEnumValues(
737+
$list,
738+
$enumName,
739+
$property['enumValues'],
740+
$property['enumKeys'] ?? []
741+
);
742+
}
743+
}
744+
}
745+
746+
return \array_values($list);
747+
}
748+
749+
/**
750+
* @return array
751+
*/
752+
protected function getFilteredAllEnums(
753+
?array $filteredRequestEnums = null,
754+
?array $filteredRequestModelEnums = null,
755+
?array $filteredResponseEnums = null
756+
): array {
717757
$filteredRequestEnums ??= $this->getFilteredRequestEnums();
758+
$filteredRequestModelEnums ??= $this->getFilteredRequestModelEnums();
718759
$filteredResponseEnums ??= $this->getFilteredResponseEnums();
719760
$list = [];
720761

@@ -727,6 +768,15 @@ protected function getFilteredAllEnums(?array $filteredRequestEnums = null, ?arr
727768
);
728769
}
729770

771+
foreach ($filteredRequestModelEnums as $enum) {
772+
$this->mergeEnumValues(
773+
$list,
774+
$enum['name'],
775+
$enum['enum'],
776+
$enum['keys'] ?? []
777+
);
778+
}
779+
730780
foreach ($filteredResponseEnums as $enum) {
731781
$this->mergeEnumValues(
732782
$list,
@@ -901,8 +951,13 @@ public function generate(string $target): void
901951
$filteredDefinitions = $filteredModelData['definitions'];
902952
$filteredRequestModels = $filteredModelData['requestModels'];
903953
$filteredRequestEnums = $this->getFilteredRequestEnums($filteredServices);
954+
$filteredRequestModelEnums = $this->getFilteredRequestModelEnums($filteredRequestModels);
904955
$filteredResponseEnums = $this->getFilteredResponseEnums($filteredDefinitions);
905-
$filteredAllEnums = $this->getFilteredAllEnums($filteredRequestEnums, $filteredResponseEnums);
956+
$filteredAllEnums = $this->getFilteredAllEnums(
957+
$filteredRequestEnums,
958+
$filteredRequestModelEnums,
959+
$filteredResponseEnums
960+
);
906961

907962
$params = [
908963
'spec' => [
@@ -921,6 +976,7 @@ public function generate(string $target): void
921976
'contactEmail' => $this->spec->getContactEmail(),
922977
'services' => $filteredServices,
923978
'requestEnums' => $filteredRequestEnums,
979+
'requestModelEnums' => $filteredRequestModelEnums,
924980
'responseEnums' => $filteredResponseEnums,
925981
'allEnums' => $filteredAllEnums,
926982
'definitions' => $filteredDefinitions,

src/Spec/Swagger2.php

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -686,6 +686,48 @@ public function getResponseEnums(): array
686686
return \array_values($list);
687687
}
688688

689+
/**
690+
* @return array
691+
*/
692+
public function getRequestModelEnums(): array
693+
{
694+
$list = [];
695+
696+
foreach ($this->getRequestModels() as $modelName => $model) {
697+
if (!isset($model['properties']) || !is_array($model['properties'])) {
698+
continue;
699+
}
700+
701+
foreach ($model['properties'] as $propertyName => $property) {
702+
if (isset($property['enum'])) {
703+
$enumName = $property['enumName'] ?? ucfirst($modelName) . ucfirst($propertyName);
704+
705+
if (!isset($list[$enumName])) {
706+
$list[$enumName] = [
707+
'name' => $enumName,
708+
'enum' => $property['enum'],
709+
'keys' => $property['enumKeys'] ?? [],
710+
];
711+
}
712+
}
713+
714+
if ((($property['type'] ?? null) === 'array') && isset($property['enumValues'])) {
715+
$enumName = $property['enumName'] ?? ucfirst($modelName) . ucfirst($propertyName);
716+
717+
if (!isset($list[$enumName])) {
718+
$list[$enumName] = [
719+
'name' => $enumName,
720+
'enum' => $property['enumValues'],
721+
'keys' => $property['enumKeys'] ?? [],
722+
];
723+
}
724+
}
725+
}
726+
}
727+
728+
return \array_values($list);
729+
}
730+
689731
/**
690732
* @return array
691733
*/
@@ -695,6 +737,9 @@ public function getAllEnums(): array
695737
foreach ($this->getRequestEnums() as $enum) {
696738
$list[$enum['name']] = $enum;
697739
}
740+
foreach ($this->getRequestModelEnums() as $enum) {
741+
$list[$enum['name']] = $enum;
742+
}
698743
foreach ($this->getResponseEnums() as $enum) {
699744
$list[$enum['name']] = $enum;
700745
}

tests/Base.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,8 +205,8 @@ abstract class Base extends TestCase
205205
];
206206

207207
protected const MODEL_SERIALIZATION_RESPONSES = [
208-
'{"default":"active","status":"active","captain":{"id":"captain1","name":"Captain One","score":300},"statuses":["active","inactive"],"history":["queued","running"],"players":[{"id":"player1","name":"John Doe","score":100}]}',
209-
'Appwrite\\Enums\\FixtureStatus|Appwrite\\Enums\\FixtureStatus|Appwrite\\Enums\\FixtureHistoryStatus|Appwrite\\Models\\Player|Appwrite\\Models\\Player',
208+
'{"default":"active","status":"active","captain":{"id":"captain1","name":"Captain One","score":300},"statuses":["active","inactive"],"history":["queued","running"],"requestOnlyHistory":["queued","approved"],"players":[{"id":"player1","name":"John Doe","score":100}]}',
209+
'Appwrite\\Enums\\FixtureStatus|Appwrite\\Enums\\FixtureStatus|Appwrite\\Enums\\FixtureHistoryStatus|Appwrite\\Enums\\FixtureRequestHistoryStatus|Appwrite\\Models\\Player|Appwrite\\Models\\Player',
210210
'{"default":"inactive","status":"pending","captain":{"id":"captain2","name":"Captain Two","score":400},"statuses":["pending","active"],"history":["done","queued"],"players":[{"id":"player2","name":"Jane Doe","score":200}],"custom":"inactive","nested":{"enabled":true}}',
211211
'Appwrite\\Enums\\FixtureStatus|Appwrite\\Enums\\FixtureStatus|Appwrite\\Enums\\FixtureHistoryStatus|Appwrite\\Models\\Player|Appwrite\\Models\\Player',
212212
];

tests/languages/php/test.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,12 +386,13 @@ public function toArray(): array
386386
'captain' => ['id' => 'captain1', 'name' => 'Captain One', 'score' => 300],
387387
'statuses' => ['active', 'inactive'],
388388
'history' => ['queued', 'running'],
389+
'requestOnlyHistory' => ['queued', 'approved'],
389390
'players' => [
390391
['id' => 'player1', 'name' => 'John Doe', 'score' => 100],
391392
],
392393
]);
393394
echo json_encode($enumPayload->toArray(), JSON_THROW_ON_ERROR) . "\n";
394-
echo get_class($enumPayload->status) . '|' . get_class($enumPayload->statuses[0]) . '|' . get_class($enumPayload->history[0]) . '|' . get_class($enumPayload->captain) . '|' . get_class($enumPayload->players[0]) . "\n";
395+
echo get_class($enumPayload->status) . '|' . get_class($enumPayload->statuses[0]) . '|' . get_class($enumPayload->history[0]) . '|' . get_class($enumPayload->requestOnlyHistory[0]) . '|' . get_class($enumPayload->captain) . '|' . get_class($enumPayload->players[0]) . "\n";
395396

396397
$enumResult = EnumResult::from([
397398
'default' => 'inactive',

tests/resources/spec.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2566,6 +2566,19 @@
25662566
"x-enum-name": "FixtureHistoryStatus"
25672567
}
25682568
},
2569+
"requestOnlyHistory": {
2570+
"type": "array",
2571+
"description": "Fixture request-only history state changes.",
2572+
"items": {
2573+
"type": "string",
2574+
"enum": [
2575+
"queued",
2576+
"approved",
2577+
"rejected"
2578+
],
2579+
"x-enum-name": "FixtureRequestHistoryStatus"
2580+
}
2581+
},
25692582
"players": {
25702583
"type": "array",
25712584
"description": "Fixture players.",
@@ -2579,6 +2592,7 @@
25792592
"captain",
25802593
"statuses",
25812594
"history",
2595+
"requestOnlyHistory",
25822596
"players"
25832597
]
25842598
},

0 commit comments

Comments
 (0)