@@ -499,57 +499,94 @@ private function getParameterArgs(Operation $operation, array $args = []): array
499499 {
500500 foreach ($ operation ->getParameters () ?? [] as $ parameter ) {
501501 $ key = $ parameter ->getKey ();
502+ $ property = $ parameter ->getProperty ();
502503
503- if (!str_contains ($ key , ':property ' )) {
504- $ args [$ key ] = ['type ' => GraphQLType::string ()];
504+ $ matchFound = false ;
505505
506- if ($ parameter ->getRequired ()) {
507- $ args [$ key ]['type ' ] = GraphQLType::nonNull ($ args [$ key ]['type ' ]);
508- }
506+ if ($ filter = $ this ->getFilterInstance ($ parameter ->getFilter ())) {
507+ if ($ filter instanceof FilterInterface) {
508+ foreach ($ filter ->getDescription ($ operation ->getClass ()) as $ name => $ value ) {
509+ // Check if this description entry matches the current parameter's property
510+ if ($ property && ($ value ['property ' ] ?? null ) === $ property ) {
511+ $ matchFound = true ;
509512
510- continue ;
511- }
513+ $ suffix = '' ;
514+ if (str_starts_with ($ name , $ property )) {
515+ $ suffix = substr ($ name , \strlen ($ property ));
516+ }
512517
513- if (!($ filterId = $ parameter ->getFilter ()) || !$ this ->filterLocator ->has ($ filterId )) {
514- continue ;
515- }
518+ $ argName = $ key .$ suffix ;
516519
517- $ filter = $ this ->filterLocator ->get ($ filterId );
518- $ parsedKey = explode ('[:property] ' , $ key );
519- $ flattenFields = [];
520+ $ type = \in_array ($ value ['type ' ] ?? 'string ' , TypeIdentifier::values (), true ) ? Type::builtin ($ value ['type ' ] ?? 'string ' ) : Type::object ($ value ['type ' ] ?? 'string ' );
520521
521- if ($ filter instanceof FilterInterface) {
522- foreach ($ filter ->getDescription ($ operation ->getClass ()) as $ name => $ value ) {
523- $ values = [];
524- parse_str ($ name , $ values );
525- if (isset ($ values [$ parsedKey [0 ]])) {
526- $ values = $ values [$ parsedKey [0 ]];
527- }
522+ if (!($ value ['required ' ] ?? false )) {
523+ $ type = Type::nullable ($ type );
524+ }
525+
526+ $ graphQlType = $ this ->getParameterType ($ type );
527+
528+ parse_str ($ argName , $ parsed );
529+ array_walk_recursive ($ parsed , static function (&$ v ) use ($ graphQlType ): void {
530+ $ v = $ graphQlType ;
531+ });
528532
529- $ name = key ($ values );
530- $ flattenFields [] = ['name ' => $ name , 'required ' => $ value ['required ' ] ?? null , 'description ' => $ value ['description ' ] ?? null , 'leafs ' => $ values [$ name ], 'type ' => $ value ['type ' ] ?? 'string ' ];
533+ $ args = $ this ->mergeFilterArgs ($ args , $ parsed , $ operation , $ key );
534+ }
535+ }
531536 }
532537
533- $ args [$ parsedKey [0 ]] = $ this ->parameterToObjectType ($ flattenFields , $ parsedKey [0 ]);
534- }
538+ if ($ filter instanceof OpenApiParameterFilterInterface) {
539+ foreach ($ filter ->getOpenApiParameters ($ parameter ) as $ value ) {
540+ $ matchFound = true ;
541+ $ suffix = '' ;
542+ if ($ property && str_starts_with ($ value ->getName (), $ property )) {
543+ $ suffix = substr ($ value ->getName (), \strlen ($ property ));
544+ }
535545
536- if ($ filter instanceof OpenApiParameterFilterInterface) {
537- foreach ($ filter ->getOpenApiParameters ($ parameter ) as $ value ) {
538- $ values = [];
539- parse_str ($ value ->getName (), $ values );
540- if (isset ($ values [$ parsedKey [0 ]])) {
541- $ values = $ values [$ parsedKey [0 ]];
546+ $ argName = $ key .$ suffix ;
547+ $ type = \in_array ($ value ->getSchema ()['type ' ] ?? 'string ' , TypeIdentifier::values (), true ) ? Type::builtin ($ value ->getSchema ()['type ' ] ?? 'string ' ) : Type::object ($ value ->getSchema ()['type ' ] ?? 'string ' );
548+ if (!$ value ->getRequired ()) {
549+ $ type = Type::nullable ($ type );
550+ }
551+ $ graphQlType = $ this ->getParameterType ($ type );
552+ parse_str ($ argName , $ parsed );
553+ array_walk_recursive ($ parsed , static function (&$ v ) use ($ graphQlType ): void {
554+ $ v = $ graphQlType ;
555+ });
556+ $ args = $ this ->mergeFilterArgs ($ args , $ parsed , $ operation , $ key );
542557 }
558+ }
559+ }
543560
544- $ name = key ($ values );
545- $ flattenFields [] = ['name ' => $ name , 'required ' => $ value ->getRequired (), 'description ' => $ value ->getDescription (), 'leafs ' => $ values [$ name ], 'type ' => $ value ->getSchema ()['type ' ] ?? 'string ' ];
561+ if (!$ matchFound ) {
562+ $ type = GraphQLType::string ();
563+ if ($ parameter ->getNativeType ()) {
564+ $ type = $ this ->getParameterType ($ parameter ->getNativeType ());
546565 }
547566
548- $ args [$ parsedKey [0 ]] = $ this ->parameterToObjectType ($ flattenFields , $ parsedKey [0 ].$ operation ->getShortName ().$ operation ->getName ());
567+ $ arg = ['type ' => $ type ];
568+
569+ if ($ parameter ->getRequired ()) {
570+ $ arg ['type ' ] = GraphQLType::nonNull ($ arg ['type ' ]);
571+ }
572+
573+ if ($ parameter ->getDescription ()) {
574+ $ arg ['description ' ] = $ parameter ->getDescription ();
575+ }
576+
577+ if (str_contains ($ key , '[ ' )) {
578+ parse_str ($ key , $ parsed );
579+ array_walk_recursive ($ parsed , static function (&$ v ) use ($ arg ): void {
580+ $ v = $ arg ['type ' ];
581+ });
582+ $ args = $ this ->mergeFilterArgs ($ args , $ parsed , $ operation , $ key );
583+ } else {
584+ $ args [$ key ] = $ arg ;
585+ }
549586 }
550587 }
551588
552- return $ args ;
589+ return $ this -> convertFilterArgsToTypes ( $ args) ;
553590 }
554591
555592 private function getGraphQlPaginationArgs (Operation $ queryOperation ): array
@@ -742,4 +779,21 @@ private function normalizePropertyName(string $property, string $resourceClass):
742779
743780 return $ this ->nameConverter ->normalize ($ property , $ resourceClass );
744781 }
782+
783+ private function getFilterInstance (object |string |null $ filter ): ?FilterInterface
784+ {
785+ if (!$ filter ) {
786+ return null ;
787+ }
788+
789+ if (\is_object ($ filter )) {
790+ return $ filter ;
791+ }
792+
793+ if (!$ this ->filterLocator ->has ($ filter )) {
794+ return null ;
795+ }
796+
797+ return $ this ->filterLocator ->get ($ filter );
798+ }
745799}
0 commit comments