Skip to content

Commit e4ce2f6

Browse files
authored
[Documentation] Document API endpoints using OpenAPI standard (alexjustesen#1985)
Co-authored-by: alexjustesen <[email protected]>
1 parent f586165 commit e4ce2f6

File tree

7 files changed

+244
-87
lines changed

7 files changed

+244
-87
lines changed

app/Http/Controllers/Api/V1/ApiController.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44

55
use Illuminate\Http\Exceptions\HttpResponseException;
66
use Illuminate\Support\Facades\Log;
7+
use OpenApi\Attributes as OA;
78

9+
#[OA\Info(title: 'Speedtest Tracker API', version: '1.0.0')]
810
abstract class ApiController
911
{
1012
/**

app/Http/Controllers/Api/V1/LatestResult.php

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,25 @@
66
use App\Models\Result;
77
use Http\Discovery\Exception\NotFoundException;
88
use Illuminate\Http\Request;
9+
use Illuminate\Http\Response;
10+
use OpenApi\Attributes as OA;
911

1012
class LatestResult extends ApiController
1113
{
12-
/**
13-
* Handle the incoming request.
14-
*/
14+
#[OA\Get(
15+
path: '/api/v1/results/latest',
16+
description: 'Get the latest result.',
17+
responses: [
18+
new OA\Response(response: 200, description: 'OK'),
19+
new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'No result found'),
20+
])]
1521
public function __invoke(Request $request)
1622
{
1723
$result = Result::query()
1824
->latest()
1925
->firstOr(function () {
2026
self::throw(
21-
e: new NotFoundException('No results found.'),
27+
e: new NotFoundException('No result found.'),
2228
code: 404,
2329
);
2430
});

app/Http/Controllers/Api/V1/ListResults.php

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,25 @@
22

33
namespace App\Http\Controllers\Api\V1;
44

5-
use App\Http\Controllers\Controller;
65
use App\Http\Resources\V1\ResultResource;
76
use App\Models\Result;
87
use Illuminate\Http\Request;
8+
use Illuminate\Http\Response;
99
use Illuminate\Support\Facades\Validator;
10+
use OpenApi\Attributes as OA;
1011
use Spatie\QueryBuilder\AllowedFilter;
1112
use Spatie\QueryBuilder\Enums\FilterOperator;
1213
use Spatie\QueryBuilder\QueryBuilder;
1314

14-
class ListResults extends Controller
15+
class ListResults extends ApiController
1516
{
16-
/**
17-
* Handle the incoming request.
18-
*/
17+
#[OA\Get(
18+
path: '/api/v1/results',
19+
description: 'List results.',
20+
responses: [
21+
new OA\Response(response: Response::HTTP_OK, description: 'OK'),
22+
new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Unprocessable Entity'),
23+
])]
1924
public function __invoke(Request $request)
2025
{
2126
$validator = Validator::make($request->all(), [

app/Http/Controllers/Api/V1/ShowResult.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,18 @@
66
use App\Models\Result;
77
use Http\Discovery\Exception\NotFoundException;
88
use Illuminate\Http\Request;
9+
use Illuminate\Http\Response;
10+
use OpenApi\Attributes as OA;
911

1012
class ShowResult extends ApiController
1113
{
12-
/**
13-
* Handle the incoming request.
14-
*/
14+
#[OA\Get(
15+
path: '/api/v1/results/{id}',
16+
description: 'Get result.',
17+
responses: [
18+
new OA\Response(response: 200, description: 'OK'),
19+
new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Result not found'),
20+
])]
1521
public function __invoke(Request $request, int $id)
1622
{
1723
$result = Result::findOr($id, function () {

composer.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,12 @@
3232
"lorisleiva/laravel-actions": "^2.8.5",
3333
"maennchen/zipstream-php": "^2.4",
3434
"ryangjchandler/blade-tabler-icons": "^2.3",
35-
"spatie/laravel-json-api-paginate": "^1.16",
35+
"spatie/laravel-json-api-paginate": "^1.16.1",
3636
"spatie/laravel-query-builder": "^6.3",
3737
"spatie/laravel-settings": "^3.4",
3838
"spatie/laravel-webhook-server": "^3.8.2",
39-
"timokoerber/laravel-one-time-operations": "^1.4.4"
39+
"timokoerber/laravel-one-time-operations": "^1.4.4",
40+
"zircote/swagger-php": "^5.0"
4041
},
4142
"require-dev": {
4243
"fakerphp/faker": "^1.24.1",

composer.lock

Lines changed: 159 additions & 73 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)