ソースを参照

Fixed an issue processing body parameters when the request body itself is an array of objects.

Rick Sharp 3 年 前
コミット
ba7e0427f9
2 ファイル変更56 行追加3 行削除
  1. 15 3
      src/Extracting/Generator.php
  2. 41 0
      tests/Unit/GeneratorTest.php

+ 15 - 3
src/Extracting/Generator.php

@@ -301,7 +301,7 @@ class Generator
     {
         $parts = explode('.', $path);
 
-        array_pop($parts); // Get rid of the field name
+        $paramName = array_pop($parts); // Remove the field name
 
         $baseName = join('.', $parts);
         // For array fields, the type should be indicated in the source object by now;
@@ -313,7 +313,14 @@ class Generator
             $baseNameInOriginalParams = substr($baseNameInOriginalParams, 0, -2);
         }
 
-        if (Arr::has($source, $baseNameInOriginalParams)) {
+        if (empty($baseNameInOriginalParams)) {
+            // This indicates that the body is an array of objects, so each parameter should be a key in the first object in that array
+            $results[0][$paramName] = $value;
+        } elseif (array_key_exists(0, $results)) {
+            // The body is an array of objects, so every parameter must be an element of the array object.
+            $dotPath = '0.'.substr($path, 3);
+            Arr::set($results, $dotPath, $value);
+        } elseif (Arr::has($source, $baseNameInOriginalParams)) {
             $parentData = Arr::get($source, $baseNameInOriginalParams);
             // Path we use for data_set
             $dotPath = str_replace('[]', '.0', $path);
@@ -418,7 +425,7 @@ class Generator
 
                 // If the user didn't add a parent field, we'll conveniently add it for them
                 $parentName = rtrim(join('.', $parts), '[]');
-                if (empty($parameters[$parentName])) {
+                if (!empty($parentName) && empty($parameters[$parentName])) {
                     $normalisedParameters[$parentName] = [
                         "name" => $parentName,
                         "type" => "object",
@@ -427,6 +434,11 @@ class Generator
                         "value" => [$fieldName => $parameter['value']],
                     ];
                 }
+
+                // If the body is an array, the parameter array must use sequential keys
+                if (Str::startsWith($name, '[].')) {
+                  $name = count($normalisedParameters);
+                }
             }
             $normalisedParameters[$name] = $parameter;
         }

+ 41 - 0
tests/Unit/GeneratorTest.php

@@ -129,6 +129,47 @@ class GeneratorTest extends TestCase
         ], $cleanBodyParameters);
     }
 
+    /** @test */
+    public function clean_can_properly_parse_a_body_array()
+    {
+        $parameters = [
+            '[].key1' => [
+                'type' => 'string',
+                'value' => '43',
+            ],
+            '[].key2' => [
+                'type' => 'integer',
+                'value' => 77,
+            ],
+            '[].key3' => [
+                'type' => 'object',
+                'value'=> [],
+            ],
+            '[].key3.key1' => [
+                'type' => 'object',
+                'value' => [],
+            ],
+            '[].key3.key1.objkey1' => [
+                'type' => 'string',
+                'value' => 'hoho',
+            ],
+        ];
+
+        $cleanBodyParameters = Generator::cleanParams($parameters);
+
+        $this->assertEquals([
+            [
+                'key1' => '43',
+                'key2' => 77,
+                'key3' => [
+                    'key1' => [
+                      'objkey1' => 'hoho',
+                    ]
+                ]
+            ],
+        ], $cleanBodyParameters);
+    }
+
     /** @test */
     public function does_not_generate_values_for_excluded_params_and_excludes_them_from_clean_params()
     {