Skip to content

Commit 7c312ec

Browse files
authored
Merge pull request #1441 from appwrite/codex/php-enum-templated-array-serialization
Replace reflective PHP model serialization with generated methods
2 parents 7c2193e + 066d19d commit 7c312ec

File tree

10 files changed

+668
-264
lines changed

10 files changed

+668
-264
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: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,10 @@ public function getDefinitions(): array
520520
$model['properties'][$name]['description'] = $def['description'] ?? '';
521521
$model['properties'][$name]['example'] = $def['x-example'] ?? null;
522522
$model['properties'][$name]['required'] = in_array($name, $model['required']);
523+
if (isset($def['$ref'])) {
524+
$model['properties'][$name]['sub_schema'] = str_replace('#/definitions/', '', $def['$ref']);
525+
}
526+
523527
if (isset($def['items']['$ref'])) {
524528
//nested model
525529
$model['properties'][$name]['sub_schema'] = str_replace('#/definitions/', '', $def['items']['$ref']);
@@ -540,6 +544,10 @@ public function getDefinitions(): array
540544
$model['properties'][$name]['enum'] = $def['enum'];
541545
$model['properties'][$name]['enumName'] = $def['x-enum-name'] ?? ucfirst($key) . ucfirst($name);
542546
$model['properties'][$name]['enumKeys'] = $def['x-enum-keys'] ?? [];
547+
} elseif (($model['properties'][$name]['type'] ?? null) === 'array' && isset($def['items']['enum'])) {
548+
$model['properties'][$name]['enumValues'] = $def['items']['enum'];
549+
$model['properties'][$name]['enumName'] = $def['items']['x-enum-name'] ?? ucfirst($key) . ucfirst($name);
550+
$model['properties'][$name]['enumKeys'] = $def['items']['x-enum-keys'] ?? [];
543551
}
544552
}
545553
}
@@ -574,6 +582,10 @@ public function getRequestModels(): array
574582
$model['properties'][$name]['description'] = $def['description'] ?? '';
575583
$model['properties'][$name]['example'] = $def['x-example'] ?? null;
576584
$model['properties'][$name]['required'] = in_array($name, $model['required']);
585+
if (isset($def['$ref'])) {
586+
$model['properties'][$name]['sub_schema'] = str_replace('#/definitions/', '', $def['$ref']);
587+
}
588+
577589
if (isset($def['items']['$ref'])) {
578590
$model['properties'][$name]['sub_schema'] = str_replace('#/definitions/', '', $def['items']['$ref']);
579591
}
@@ -590,6 +602,10 @@ public function getRequestModels(): array
590602
$model['properties'][$name]['enum'] = $def['enum'];
591603
$model['properties'][$name]['enumName'] = $def['x-enum-name'] ?? ucfirst($key) . ucfirst($name);
592604
$model['properties'][$name]['enumKeys'] = $def['x-enum-keys'] ?? [];
605+
} elseif (($model['properties'][$name]['type'] ?? null) === 'array' && isset($def['items']['enum'])) {
606+
$model['properties'][$name]['enumValues'] = $def['items']['enum'];
607+
$model['properties'][$name]['enumName'] = $def['items']['x-enum-name'] ?? ucfirst($key) . ucfirst($name);
608+
$model['properties'][$name]['enumKeys'] = $def['items']['x-enum-keys'] ?? [];
593609
}
594610
}
595611
}
@@ -651,7 +667,9 @@ public function getResponseEnums(): array
651667

652668
// array of enums
653669
if ((($property['type'] ?? null) === 'array') && isset($property['items']['enum'])) {
654-
$enumName = $property['x-enum-name'] ?? ucfirst($modelName) . ucfirst($propertyName);
670+
$enumName = $property['items']['x-enum-name']
671+
?? $property['enumName']
672+
?? ucfirst($modelName) . ucfirst($propertyName);
655673

656674
if (!isset($list[$enumName])) {
657675
$list[$enumName] = [
@@ -668,6 +686,48 @@ public function getResponseEnums(): array
668686
return \array_values($list);
669687
}
670688

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+
671731
/**
672732
* @return array
673733
*/
@@ -677,6 +737,9 @@ public function getAllEnums(): array
677737
foreach ($this->getRequestEnums() as $enum) {
678738
$list[$enum['name']] = $enum;
679739
}
740+
foreach ($this->getRequestModelEnums() as $enum) {
741+
$list[$enum['name']] = $enum;
742+
}
680743
foreach ($this->getResponseEnums() as $enum) {
681744
$list[$enum['name']] = $enum;
682745
}

0 commit comments

Comments
 (0)