diff --git a/app/Api/ApiDocsGenerator.php b/app/Api/ApiDocsGenerator.php index 41decd23d..a0c45608a 100644 --- a/app/Api/ApiDocsGenerator.php +++ b/app/Api/ApiDocsGenerator.php @@ -31,9 +31,12 @@ class ApiDocsGenerator protected function loadDetailsFromFiles(Collection $routes): Collection { return $routes->map(function (array $route) { - $exampleResponseFile = base_path('dev/api/responses/' . $route['name'] . '.json'); - $exampleResponse = file_exists($exampleResponseFile) ? file_get_contents($exampleResponseFile) : null; - $route['example_response'] = $exampleResponse; + $exampleTypes = ['request', 'response']; + foreach ($exampleTypes as $exampleType) { + $exampleFile = base_path("dev/api/{$exampleType}s/{$route['name']}.json"); + $exampleContent = file_exists($exampleFile) ? file_get_contents($exampleFile) : null; + $route["example_{$exampleType}"] = $exampleContent; + } return $route; }); } diff --git a/dev/api/requests/books-create.json b/dev/api/requests/books-create.json new file mode 100644 index 000000000..4a6626619 --- /dev/null +++ b/dev/api/requests/books-create.json @@ -0,0 +1,4 @@ +{ + "name": "My own book", + "description": "This is my own little book" +} \ No newline at end of file diff --git a/dev/api/requests/books-update.json b/dev/api/requests/books-update.json new file mode 100644 index 000000000..fc67d5fcc --- /dev/null +++ b/dev/api/requests/books-update.json @@ -0,0 +1,4 @@ +{ + "name": "My updated book", + "description": "This is my book with updated details" +} \ No newline at end of file diff --git a/resources/views/api-docs/index.blade.php b/resources/views/api-docs/index.blade.php index 181bcd746..a20ba04cc 100644 --- a/resources/views/api-docs/index.blade.php +++ b/resources/views/api-docs/index.blade.php @@ -12,32 +12,64 @@ @foreach($endpoints as $endpoint) <div class="mb-xs"> - <a href="#{{ $endpoint['name'] }}" class="text-mono"> + <a href="#{{ $endpoint['name'] }}" class="text-mono inline block mr-s"> <span class="api-method" data-method="{{ $endpoint['method'] }}">{{ $endpoint['method'] }}</span> - /{{ $endpoint['uri'] }} + </a> + <a href="#{{ $endpoint['name'] }}" class="text-mono"> + {{ $endpoint['controller_method'] }} </a> </div> @endforeach @endforeach </div> - <div> + <div style="overflow: auto;"> @foreach($docs as $model => $endpoints) <section class="card content-wrap auto-height"> <h1 class="list-heading text-capitals">{{ $model }}</h1> @foreach($endpoints as $endpoint) + <h6 class="text-uppercase text-muted float right">{{ $endpoint['controller_method'] }}</h6> <h5 id="{{ $endpoint['name'] }}" class="text-mono mb-m"> <span class="api-method" data-method="{{ $endpoint['method'] }}">{{ $endpoint['method'] }}</span> {{ url($endpoint['uri']) }} </h5> <p class="mb-m">{{ $endpoint['description'] ?? '' }}</p> + @if($endpoint['body_params'] ?? false) + <details class="mb-m"> + <summary class="text-muted">Body Parameters</summary> + <table class="table"> + <tr> + <th>Param Name</th> + <th>Value Rules</th> + </tr> + @foreach($endpoint['body_params'] as $paramName => $rules) + <tr> + <td>{{ $paramName }}</td> + <td> + @foreach($rules as $rule) + <code class="mr-xs">{{ $rule }}</code> + @endforeach + </td> + </tr> + @endforeach + </table> + </details> + @endif + @if($endpoint['example_request'] ?? false) + <details details-highlighter class="mb-m"> + <summary class="text-muted">Example Request</summary> + <pre><code class="language-json">{{ $endpoint['example_request'] }}</code></pre> + </details> + @endif @if($endpoint['example_response'] ?? false) - <details details-highlighter> + <details details-highlighter class="mb-m"> <summary class="text-muted">Example Response</summary> <pre><code class="language-json">{{ $endpoint['example_response'] }}</code></pre> </details> - <hr class="mt-m"> + @endif + @if(!$loop->last) + <hr> @endif @endforeach </section>