Skip to content

Commit a95e8b0

Browse files
committed
Simplify FormRequest, PageParser, Resource and harden OpenAPI command
- Extract duplicate unknown parameter rejection into rejectUnknownKeys() - Extract repeated page array parsing into pageArray() - Reuse single FieldParser instance in applySparseFieldsets() - Add error handling for file_put_contents in OpenAPI command
1 parent 78e2f36 commit a95e8b0

5 files changed

Lines changed: 51 additions & 69 deletions

File tree

config/api-toolkit.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
'description' => '',
5959

6060
'servers' => [
61-
['url' => env('APP_URL', 'http://localhost') . '/api'],
61+
['url' => env('APP_URL', 'http://localhost')],
6262
],
6363

6464
// 'security_schemes' => [

src/Console/GenerateOpenApiCommand.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,11 @@ public function handle(RouteScanner $scanner, Config $config): int
5151
$json = json_encode($document, $flags);
5252
$outputPath = $this->option('output');
5353

54-
file_put_contents(base_path($outputPath), $json);
54+
if (file_put_contents(base_path($outputPath), $json) === false) {
55+
$this->error("Failed to write to {$outputPath}");
56+
57+
return self::FAILURE;
58+
}
5559

5660
$this->info("OpenAPI spec written to {$outputPath}");
5761

src/Http/Requests/FormRequest.php

Lines changed: 27 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -68,28 +68,10 @@ private function validateQueryParams(): void
6868
$queryRules = $this->queryParamRules();
6969

7070
if (count($queryRules) > 0) {
71-
$queryKeys = array_keys($this->query());
72-
73-
$queryRulesKeys = array_keys($queryRules);
74-
75-
$invalidQueryKeys = array_values(array_diff($queryKeys, $queryRulesKeys));
76-
77-
if (count($invalidQueryKeys) > 0) {
78-
$message = count($invalidQueryKeys) > 1
79-
? sprintf(
80-
'Received unknown parameters: %s',
81-
implode(', ', $invalidQueryKeys),
82-
)
83-
: sprintf(
84-
'Received unknown parameter: %s',
85-
$invalidQueryKeys[0],
86-
);
87-
88-
throw new HttpException(
89-
statusCode: Response::HTTP_BAD_REQUEST,
90-
message: $message,
91-
);
92-
}
71+
$this->rejectUnknownKeys(
72+
array_keys($this->query()),
73+
array_keys($queryRules),
74+
);
9375

9476
/** @var ValidationFactory $factory */
9577
$factory = $this->container->make(ValidationFactory::class);
@@ -112,28 +94,29 @@ private function validateFormData(): void
11294
$inputKeys = array_keys(array_diff_key($this->input(), $this->query()));
11395

11496
if (count($inputKeys) > 0) {
115-
$rules = $this->rules();
116-
117-
$rulesKeys = array_keys($rules);
118-
119-
$invalidInputKeys = array_values(array_diff($inputKeys, $rulesKeys));
120-
121-
if (count($invalidInputKeys) > 0) {
122-
$message = count($invalidInputKeys) > 1
123-
? sprintf(
124-
'Received unknown parameters: %s',
125-
implode(', ', $invalidInputKeys),
126-
)
127-
: sprintf(
128-
'Received unknown parameter: %s',
129-
$invalidInputKeys[0],
130-
);
131-
132-
throw new HttpException(
133-
statusCode: Response::HTTP_BAD_REQUEST,
134-
message: $message,
135-
);
136-
}
97+
$this->rejectUnknownKeys($inputKeys, array_keys($this->rules()));
98+
}
99+
}
100+
101+
/**
102+
* @param list<string> $submitted
103+
* @param list<string> $allowed
104+
*/
105+
private function rejectUnknownKeys(array $submitted, array $allowed): void
106+
{
107+
$unknown = array_values(array_diff($submitted, $allowed));
108+
109+
if ($unknown === []) {
110+
return;
137111
}
112+
113+
$message = count($unknown) > 1
114+
? sprintf('Received unknown parameters: %s', implode(', ', $unknown))
115+
: sprintf('Received unknown parameter: %s', $unknown[0]);
116+
117+
throw new HttpException(
118+
statusCode: Response::HTTP_BAD_REQUEST,
119+
message: $message,
120+
);
138121
}
139122
}

src/Parsers/PageParser.php

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,7 @@ public function __construct(
1919
*/
2020
public function isCursor(Request $request): bool
2121
{
22-
$page = $request->query('page', []);
23-
24-
if (! is_array($page)) {
25-
return false;
26-
}
22+
$page = $this->pageArray($request);
2723

2824
return isset($page['cursor']);
2925
}
@@ -33,12 +29,7 @@ public function isCursor(Request $request): bool
3329
*/
3430
public function getSize(Request $request): int
3531
{
36-
$page = $request->query('page', []);
37-
38-
if (! is_array($page)) {
39-
return $this->defaultSize;
40-
}
41-
32+
$page = $this->pageArray($request);
4233
$size = (int) ($page['size'] ?? $this->defaultSize);
4334

4435
return min(max($size, 1), $this->maxSize);
@@ -49,11 +40,7 @@ public function getSize(Request $request): int
4940
*/
5041
public function getNumber(Request $request): int
5142
{
52-
$page = $request->query('page', []);
53-
54-
if (! is_array($page)) {
55-
return 1;
56-
}
43+
$page = $this->pageArray($request);
5744

5845
return max((int) ($page['number'] ?? 1), 1);
5946
}
@@ -63,12 +50,18 @@ public function getNumber(Request $request): int
6350
*/
6451
public function getCursor(Request $request): string | null
6552
{
66-
$page = $request->query('page', []);
67-
68-
if (! is_array($page)) {
69-
return null;
70-
}
53+
$page = $this->pageArray($request);
7154

7255
return $page['cursor'] ?? null;
7356
}
57+
58+
/**
59+
* @return array<string, mixed>
60+
*/
61+
private function pageArray(Request $request): array
62+
{
63+
$page = $request->query('page', []);
64+
65+
return is_array($page) ? $page : [];
66+
}
7467
}

src/Resources/Resource.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -297,11 +297,13 @@ private function resolveMeta($model): array
297297
*/
298298
private function applySparseFieldsets(string $type, array $attributes): array
299299
{
300+
$parser = new FieldParser();
301+
300302
if ($this->parsedFields === null) {
301-
$this->parsedFields = (new FieldParser())->parse($this->request);
303+
$this->parsedFields = $parser->parse($this->request);
302304
}
303305

304-
return (new FieldParser())->filter($attributes, $this->parsedFields[$type] ?? null);
306+
return $parser->filter($attributes, $this->parsedFields[$type] ?? null);
305307
}
306308

307309
/**

0 commit comments

Comments
 (0)