Skip to content

Commit 0b578d1

Browse files
authored
feat: add deprecation support for QueryParam and BodyParam (#1022)
* QueryParams and BodyParams can be marked as deprecated * Add support for marking OpenAPI parameters as deprecated
1 parent 8aa309a commit 0b578d1

18 files changed

Lines changed: 276 additions & 13 deletions

File tree

camel/Extraction/Parameter.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class Parameter extends BaseDTO
1515
public array $enumValues = [];
1616
public bool $exampleWasSpecified = false;
1717
public bool $nullable = false;
18+
public bool $deprecated = false;
1819

1920
public function __construct(array $parameters = [])
2021
{

resources/views/components/field-details.blade.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
<b style="line-height: 2;"><code>{{ $name }}</code></b>&nbsp;&nbsp;
55
@if($type)<small>{{ $type }}</small>@endif&nbsp;
66
@if($isInput && !$required)<i>optional</i>@endif &nbsp;
7+
@if($isInput && $deprecated)<i>deprecated</i>@endif &nbsp;
78
@if($isInput && empty($hasChildren))
89
@php
910
$isList = Str::endsWith($type, '[]');

resources/views/components/nested-fields.blade.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
'fullName' => $subfield['name'],
2424
'type' => $subfield['type'] ?? 'string',
2525
'required' => $subfield['required'] ?? false,
26+
'deprecated' => $subfield['deprecated'] ?? false,
2627
'description' => $subfield['description'] ?? '',
2728
'example' => $subfield['example'] ?? '',
2829
'enumValues' => $subfield['enumValues'] ?? null,
@@ -44,6 +45,7 @@
4445
'fullName' => $field['name'],
4546
'type' => $field['type'] ?? 'string',
4647
'required' => $field['required'] ?? false,
48+
'deprecated' => $field['deprecated'] ?? false,
4749
'description' => $field['description'] ?? '',
4850
'example' => $field['example'] ?? '',
4951
'enumValues' => $field['enumValues'] ?? null,
@@ -66,6 +68,7 @@
6668
'fullName' => $subfield['name'],
6769
'type' => $subfield['type'] ?? 'string',
6870
'required' => $subfield['required'] ?? false,
71+
'deprecated' => $subfield['deprecated'] ?? false,
6972
'description' => $subfield['description'] ?? '',
7073
'example' => $subfield['example'] ?? '',
7174
'enumValues' => $subfield['enumValues'] ?? null,
@@ -87,6 +90,7 @@
8790
'fullName' => $field['name'],
8891
'type' => $field['type'] ?? 'string',
8992
'required' => $field['required'] ?? false,
93+
'deprecated' => $field['deprecated'] ?? false,
9094
'description' => $field['description'] ?? '',
9195
'example' => $field['example'] ?? '',
9296
'enumValues' => $field['enumValues'] ?? null,

resources/views/themes/default/endpoint.blade.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@
113113
'name' => $name,
114114
'type' => null,
115115
'required' => true,
116+
'deprecated' => false,
116117
'description' => null,
117118
'example' => $example,
118119
'endpointId' => $endpoint->endpointId(),
@@ -132,6 +133,7 @@
132133
'name' => $parameter->name,
133134
'type' => $parameter->type ?? 'string',
134135
'required' => $parameter->required,
136+
'deprecated' => $parameter->deprecated,
135137
'description' => $parameter->description,
136138
'example' => $parameter->example ?? '',
137139
'enumValues' => $parameter->enumValues,
@@ -157,6 +159,7 @@
157159
'name' => $parameter->name,
158160
'type' => $parameter->type,
159161
'required' => $parameter->required,
162+
'deprecated' => $parameter->deprecated,
160163
'description' => $parameter->description,
161164
'example' => $parameter->example ?? '',
162165
'enumValues' => $parameter->enumValues,

resources/views/themes/elements/components/field-details.blade.php

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,17 @@ class="svg-inline--fa fa-chevron-right fa-fw fa-sm sl-icon" role="img"
2525
<span class="sl-truncate sl-text-muted">{{ $type }}</span>
2626
@endif
2727
</div>
28-
@if($required)
29-
<div class="sl-flex-1 sl-h-px sl-mx-3"></div>
30-
<span class="sl-ml-2 sl-text-warning">required</span>
31-
@endif
28+
@if($required || $deprecated)
29+
<div class="sl-flex-1 sl-h-px sl-mx-3"></div>
30+
<div class="sl-flex sl-items-center">
31+
@if($required)
32+
<span class="sl-ml-2 sl-text-warning">required</span>
33+
@endif
34+
@if($deprecated)
35+
<span class="sl-ml-2 sl-text-warning">deprecated</span>
36+
@endif
37+
</div>
38+
@endif
3239
@endunless
3340
</div>
3441
@if($description)

resources/views/themes/elements/components/nested-fields.blade.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
'name' => $name,
1414
'type' => $field['type'] ?? 'string',
1515
'required' => $field['required'] ?? false,
16+
'deprecated' => $field['deprecated'] ?? false,
1617
'description' => $field['description'] ?? '',
1718
'example' => $field['example'] ?? '',
1819
'enumValues' => $field['enumValues'] ?? null,

resources/views/themes/elements/endpoint.blade.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ class="sl-overflow-x-hidden sl-truncate sl-text-muted">{!! rtrim($baseUrl, '/')
6969
'name' => $header,
7070
'type' => null,
7171
'required' => false,
72+
'deprecated' => false,
7273
'description' => null,
7374
'example' => $value,
7475
'endpointId' => $endpoint->endpointId(),
@@ -91,6 +92,7 @@ class="sl-overflow-x-hidden sl-truncate sl-text-muted">{!! rtrim($baseUrl, '/')
9192
'name' => $parameter->name,
9293
'type' => $parameter->type ?? 'string',
9394
'required' => $parameter->required,
95+
'deprecated' => $parameter->deprecated,
9496
'description' => $parameter->description,
9597
'example' => $parameter->example ?? '',
9698
'enumValues' => $parameter->enumValues,
@@ -115,6 +117,7 @@ class="sl-overflow-x-hidden sl-truncate sl-text-muted">{!! rtrim($baseUrl, '/')
115117
'name' => $parameter->name,
116118
'type' => $parameter->type,
117119
'required' => $parameter->required,
120+
'deprecated' => $parameter->deprecated,
118121
'description' => $parameter->description,
119122
'example' => $parameter->example ?? '',
120123
'enumValues' => $parameter->enumValues,

src/Attributes/GenericParam.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public function __construct(
1515
public mixed $example = null, /* Pass 'No-example' to omit the example */
1616
public mixed $enum = null, // Can pass a list of values, or a native PHP enum
1717
public ?bool $nullable = false,
18+
public ?bool $deprecated = false,
1819
) {
1920
}
2021

@@ -28,6 +29,7 @@ public function toArray()
2829
"example" => $this->example,
2930
"enumValues" => $this->getEnumValues(),
3031
'nullable' => $this->nullable,
32+
'deprecated' => $this->deprecated,
3133
];
3234
}
3335

src/Attributes/ResponseField.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public function __construct(
1717
public mixed $example = null, /* Pass 'No-example' to omit the example */
1818
public mixed $enum = null, // Can pass a list of values, or a native PHP enum,
1919
public ?bool $nullable = false,
20+
public ?bool $deprecated = false,
2021
) {
2122
}
2223
}

src/Extracting/Strategies/BodyParameters/GetFromBodyParamTag.php

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,31 +11,37 @@ class GetFromBodyParamTag extends GetFieldsFromTagStrategy
1111
public function parseTag(string $tagContent): array
1212
{
1313
// Format:
14-
// @bodyParam <name> <type> <"required" (optional)> <description>
14+
// @bodyParam <name> <type> <"required" (optional)> <"deprecated" (optional)> <description>
1515
// Examples:
1616
// @bodyParam text string required The text.
1717
// @bodyParam user_id integer The ID of the user.
18-
preg_match('/(.+?)\s+(.+?)\s+(required\s+)?([\s\S]*)/', $tagContent, $parsedContent);
18+
// @bodyParam status string required deprecated Use `is_active` instead.
19+
preg_match('/(.+?)\s+(.+?)\s+(required\s+)?(deprecated\s+)?([\s\S]*)/', $tagContent, $parsedContent);
1920

2021
if (empty($parsedContent)) {
2122
// This means only name and type were supplied
2223
[$name, $type] = preg_split('/\s+/', $tagContent);
2324
$required = false;
25+
$deprecated = false;
2426
$description = '';
2527
} else {
26-
[$_, $name, $type, $required, $description] = $parsedContent;
28+
[$_, $name, $type, $required, $deprecated, $description] = $parsedContent;
2729
$description = trim(str_replace(['No-example.', 'No-example'], '', $description));
2830
if ($description == 'required') {
2931
$required = $description;
3032
$description = '';
33+
} elseif ($description == 'deprecated') {
34+
$deprecated = $description;
35+
$description = '';
3136
}
3237
$required = trim($required) === 'required';
38+
$deprecated = trim($deprecated) === 'deprecated';
3339
}
3440

3541
$type = static::normalizeTypeName($type);
3642
[$description, $example, $enumValues, $exampleWasSpecified] =
3743
$this->getDescriptionAndExample($description, $type, $tagContent, $name);
3844

39-
return compact('name', 'type', 'description', 'required', 'example', 'enumValues', 'exampleWasSpecified');
45+
return compact('name', 'type', 'description', 'required', 'deprecated', 'example', 'enumValues', 'exampleWasSpecified');
4046
}
4147
}

0 commit comments

Comments
 (0)