15
15
16
16
use ApiPlatform \Doctrine \Common \Filter \ExistsFilterInterface ;
17
17
use ApiPlatform \Doctrine \Common \Filter \ExistsFilterTrait ;
18
+ use ApiPlatform \Metadata \JsonSchemaFilterInterface ;
19
+ use ApiPlatform \Metadata \OpenApiParameterFilterInterface ;
18
20
use ApiPlatform \Metadata \Operation ;
21
+ use ApiPlatform \Metadata \Parameter ;
22
+ use ApiPlatform \OpenApi \Model \Parameter as OpenApiParameter ;
19
23
use Doctrine \ODM \MongoDB \Aggregation \Builder ;
20
24
use Doctrine \ODM \MongoDB \Mapping \ClassMetadata ;
21
25
use Doctrine \Persistence \ManagerRegistry ;
107
111
* @author Teoh Han Hui <[email protected] >
108
112
* @author Alan Poulain <[email protected] >
109
113
*/
110
- final class ExistsFilter extends AbstractFilter implements ExistsFilterInterface
114
+ final class ExistsFilter extends AbstractFilter implements ExistsFilterInterface, JsonSchemaFilterInterface, OpenApiParameterFilterInterface
111
115
{
112
116
use ExistsFilterTrait;
113
117
114
- public function __construct (ManagerRegistry $ managerRegistry , ?LoggerInterface $ logger = null , ?array $ properties = null , string $ existsParameterName = self ::QUERY_PARAMETER_KEY , ?NameConverterInterface $ nameConverter = null )
118
+ public function __construct (? ManagerRegistry $ managerRegistry = null , ?LoggerInterface $ logger = null , ?array $ properties = null , string $ existsParameterName = self ::QUERY_PARAMETER_KEY , ?NameConverterInterface $ nameConverter = null )
115
119
{
120
+ if (\is_array ($ properties ) && \is_int (key ($ properties ))) {
121
+ $ properties = array_flip ($ properties );
122
+ }
123
+
116
124
parent ::__construct ($ managerRegistry , $ logger , $ properties , $ nameConverter );
117
125
118
126
$ this ->existsParameterName = $ existsParameterName ;
@@ -123,6 +131,12 @@ public function __construct(ManagerRegistry $managerRegistry, ?LoggerInterface $
123
131
*/
124
132
public function apply (Builder $ aggregationBuilder , string $ resourceClass , ?Operation $ operation = null , array &$ context = []): void
125
133
{
134
+ $ parameter = $ context ['parameter ' ] ?? null ;
135
+
136
+ if (null !== ($ value = $ context ['filters ' ][$ parameter ?->getProperty()] ?? null )) {
137
+ $ this ->filterProperty ($ this ->denormalizePropertyName ($ parameter ->getProperty ()), $ value , $ aggregationBuilder , $ resourceClass , $ operation , $ context );
138
+ }
139
+
126
140
foreach ($ context ['filters ' ][$ this ->existsParameterName ] ?? [] as $ property => $ value ) {
127
141
$ this ->filterProperty ($ this ->denormalizePropertyName ($ property ), $ value , $ aggregationBuilder , $ resourceClass , $ operation , $ context );
128
142
}
@@ -167,4 +181,24 @@ protected function isNullableField(string $property, string $resourceClass): boo
167
181
168
182
return $ metadata instanceof ClassMetadata && $ metadata ->hasField ($ field ) ? $ metadata ->isNullable ($ field ) : false ;
169
183
}
184
+
185
+ public function getSchema (Parameter $ parameter ): array
186
+ {
187
+ return ['type ' => 'boolean ' ];
188
+ }
189
+ public function getOpenApiParameters (Parameter $ parameter ): OpenApiParameter |array |null
190
+ {
191
+ if (str_contains ($ parameter ->getKey (), ':property ' )) {
192
+ $ parameters = [];
193
+ $ key = str_replace ('[:property] ' , '' , $ parameter ->getKey ());
194
+ foreach (array_keys ($ parameter ->getExtraProperties ()['_properties ' ] ?? []) as $ property ) {
195
+ $ parameters [] = new OpenApiParameter (name: \sprintf ('%s[%s] ' , $ key , $ property ), in: 'query ' );
196
+ }
197
+
198
+ return $ parameters ;
199
+ }
200
+
201
+ return null ;
202
+ }
203
+
170
204
}
0 commit comments