Skip to content

Commit aca909c

Browse files
committed
Fix untyped filter OpenAPI schemas
1 parent 671f7cc commit aca909c

2 files changed

Lines changed: 38 additions & 1 deletion

File tree

src/Endpoint/Concerns/ResolvesList.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ protected function listParameters(
3030
$filterProperties = [];
3131

3232
foreach ($filters as $filter) {
33-
$filterProperties[$filter->name] = $filter->getSchema();
33+
$schema = $filter->getSchema();
34+
$filterProperties[$filter->name] = $schema === [] ? (object) [] : $schema;
3435
}
3536

3637
$params[] = Parameter::make('filter')

tests/feature/OpenApiTest.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1265,4 +1265,40 @@ public function test_filter_types_are_included_in_openapi_parameters()
12651265
$this->assertInstanceOf(\stdClass::class, $rawOperatorSchema['properties']['gt']);
12661266
$this->assertSame('{}', json_encode($rawOperatorSchema['properties']['eq']));
12671267
}
1268+
1269+
public function test_untyped_filter_schema_serializes_as_object()
1270+
{
1271+
$api = new JsonApi();
1272+
1273+
$api->resource(
1274+
new MockResource(
1275+
'users',
1276+
endpoints: [Index::make()],
1277+
filters: [
1278+
CustomFilter::make('products', fn() => null),
1279+
CustomFilter::make('mine', fn() => null),
1280+
],
1281+
),
1282+
);
1283+
1284+
$definition = (new OpenApiGenerator())->generate($api);
1285+
$parameters = $definition['paths']['/users']['get']['parameters'];
1286+
1287+
$filterParameter = null;
1288+
foreach ($parameters as $parameter) {
1289+
if ($parameter['name'] === 'filter') {
1290+
$filterParameter = $parameter;
1291+
break;
1292+
}
1293+
}
1294+
1295+
$filterProperties = $filterParameter['schema']['properties'];
1296+
1297+
$this->assertInstanceOf(\stdClass::class, $filterProperties['products']);
1298+
$this->assertInstanceOf(\stdClass::class, $filterProperties['mine']);
1299+
$this->assertSame(
1300+
'{"products":{},"mine":{}}',
1301+
json_encode($filterProperties),
1302+
);
1303+
}
12681304
}

0 commit comments

Comments
 (0)