Browse Source

Merge pull request #383 from raznerdeveloper/master

PR to close issue 344 for queryParams addition
Shalvah A 6 years ago
parent
commit
96f998aef2

+ 18 - 9
resources/views/partials/route.blade.php

@@ -25,13 +25,13 @@ curl -X {{$route['methods'][0]}} {{$route['methods'][0] == 'GET' ? '-G ' : ''}}"
     @endif
 @endforeach
 @endif
-@if(count($route['parameters'])) \
-@foreach($route['parameters'] as $attribute => $parameter)
-    -d "{{$attribute}}"={{$parameter['value']}} @if(! ($loop->last))\
+
+@if(count($route['bodyParameters'])) \
+@foreach($route['bodyParameters'] as $attribute => $parameter)
+    -d "{{$attribute}}"="{{$parameter['value']}}" @if(! ($loop->last))\
     @endif
 @endforeach
 @endif
-
 ```
 
 ```javascript
@@ -40,8 +40,8 @@ var settings = {
     "crossDomain": true,
     "url": "{{ rtrim(config('app.docs_url') ?: config('app.url'), '/') }}/{{ ltrim($route['uri'], '/') }}",
     "method": "{{$route['methods'][0]}}",
-    @if(count($route['parameters']))
-"data": {!! str_replace("\n}","\n    }", str_replace('    ','        ',json_encode(array_combine(array_keys($route['parameters']), array_map(function($param){ return $param['value']; },$route['parameters'])), JSON_PRETTY_PRINT))) !!},
+    @if(count($route['bodyParameters']))
+"data": {!! str_replace("\n}","\n    }", str_replace('    ','        ',json_encode(array_combine(array_keys($route['bodyParameters']), array_map(function($param){ return $param['value']; },$route['bodyParameters'])), JSON_PRETTY_PRINT))) !!},
     @endif
 "headers": {
         "accept": "application/json",
@@ -73,14 +73,23 @@ $.ajax(settings).done(function (response) {
 `{{$method}} {{$route['uri']}}`
 
 @endforeach
-@if(count($route['parameters']))
-#### Parameters
+@if(count($route['bodyParameters']))
+#### Body Parameters
 
 Parameter | Type | Status | Description
 --------- | ------- | ------- | ------- | -----------
-@foreach($route['parameters'] as $attribute => $parameter)
+@foreach($route['bodyParameters'] as $attribute => $parameter)
     {{$attribute}} | {{$parameter['type']}} | @if($parameter['required']) required @else optional @endif | {!! $parameter['description'] !!}
 @endforeach
 @endif
+@if(count($route['queryParameters']))
+#### Query Parameters
+
+Parameter | Status | Description
+--------- | ------- | ------- | -----------
+@foreach($route['queryParameters'] as $attribute => $parameter)
+    {{$attribute}} | @if($parameter['required']) required @else optional @endif | {!! implode(' ',$parameter['description']) !!}
+@endforeach
+@endif
 
 <!-- END_{{$route['id']}} -->

+ 37 - 2
src/Generators/Generator.php

@@ -56,7 +56,8 @@ class Generator
             'description' => $docBlock['long'],
             'methods' => $this->getMethods($route),
             'uri' => $this->getUri($route),
-            'parameters' => $this->getParametersFromDocBlock($docBlock['tags']),
+            'bodyParameters' => $this->getBodyParametersFromDocBlock($docBlock['tags']),
+            'queryParameters' => $this->getQueryParametersFromDocBlock($docBlock['tags']),
             'authenticated' => $this->getAuthStatusFromDocBlock($docBlock['tags']),
             'response' => $content,
             'showresponse' => ! empty($content),
@@ -71,7 +72,7 @@ class Generator
      *
      * @return array
      */
-    protected function getParametersFromDocBlock(array $tags)
+    protected function getBodyParametersFromDocBlock(array $tags)
     {
         $parameters = collect($tags)
             ->filter(function ($tag) {
@@ -103,6 +104,40 @@ class Generator
         return $parameters;
     }
 
+    /**
+     * @param array $tags
+     *
+     * @return array
+     */
+    protected function getQueryParametersFromDocBlock(array $tags)
+    {
+        $parameters = collect($tags)
+            ->filter(function ($tag) {
+                return $tag instanceof Tag && $tag->getName() === 'queryParam';
+            })
+            ->mapWithKeys(function ($tag) {
+                preg_match('/(.+?)\s+(required\s+)?(.*)/', $tag->getContent(), $content);
+                if (empty($content)) {
+                    // this means only name was supplied
+                    list($name) = preg_split('/\s+/', $tag->getContent());
+                    $required = false;
+                    $description = '';
+                } else {
+                    list($_, $name, $required, $description) = $content;
+                    $description = trim($description);
+                    if ($description == 'required' && empty(trim($required))) {
+                        $required = $description;
+                        $description = '';
+                    }
+                    $required = trim($required) == 'required' ? true : false;
+                }
+
+                return [$name => compact('description', 'required')];
+            })->toArray();
+
+        return $parameters;
+    }
+
     /**
      * @param array $tags
      *

+ 1 - 1
src/Postman/CollectionWriter.php

@@ -44,7 +44,7 @@ class CollectionWriter
                                 'method' => $route['methods'][0],
                                 'body' => [
                                     'mode' => 'formdata',
-                                    'formdata' => collect($route['parameters'])->map(function ($parameter, $key) {
+                                    'formdata' => collect($route['bodyParameters'])->map(function ($parameter, $key) {
                                         return [
                                             'key' => $key,
                                             'value' => isset($parameter['value']) ? $parameter['value'] : '',

+ 9 - 0
tests/Fixtures/TestController.php

@@ -46,6 +46,15 @@ class TestController extends Controller
         return '';
     }
 
+    /**
+     * @queryParam location_id required The id of the location.
+     * @queryParam filters  The filters.
+     */
+    public function withQueryParameters()
+    {
+        return '';
+    }
+
     /**
      * @authenticated
      */

+ 20 - 2
tests/Unit/GeneratorTestCase.php

@@ -44,7 +44,7 @@ abstract class GeneratorTestCase extends TestCase
     public function can_parse_body_parameters()
     {
         $route = $this->createRoute('GET', '/api/test', 'withBodyParameters');
-        $parameters = $this->generator->processRoute($route)['parameters'];
+        $bodyParameters = $this->generator->processRoute($route)['bodyParameters'];
 
         $this->assertArraySubset([
             'user_id' => [
@@ -77,7 +77,25 @@ abstract class GeneratorTestCase extends TestCase
                 'required' => false,
                 'description' => '',
             ],
-        ], $parameters);
+        ], $bodyParameters);
+    }
+
+    /** @test */
+    public function can_parse_query_parameters()
+    {
+        $route = $this->createRoute('GET', '/api/test', 'withQueryParameters');
+        $queryParameters = $this->generator->processRoute($route)['queryParameters'];
+
+        $this->assertArraySubset([
+            'location_id' => [
+                'required' => true,
+                'description' => 'The id of the location.',
+            ],
+            'filters' => [
+                'required' => false,
+                'description' => 'The filters.',
+            ],
+        ], $queryParameters);
     }
 
     /** @test */