82 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			82 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | ||
|  | 
 | ||
|  | namespace SchemaQueryParameterProcessor; | ||
|  | 
 | ||
|  | use OpenApi\Analysis; | ||
|  | use OpenApi\Annotations\Components; | ||
|  | use OpenApi\Annotations\Operation; | ||
|  | use OpenApi\Annotations\Parameter; | ||
|  | use OpenApi\Annotations\Schema; | ||
|  | use const OpenApi\UNDEFINED; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Custom processor to translate the vendor tag `query-args-$ref` into query parameter annotations. | ||
|  |  * | ||
|  |  * Details for the parameters are taken from the referenced schema. | ||
|  |  */ | ||
|  | class SchemaQueryParameter | ||
|  | { | ||
|  |     const X_QUERY_AGS_REF = 'query-args-$ref'; | ||
|  | 
 | ||
|  |     public function __invoke(Analysis $analysis) | ||
|  |     { | ||
|  |         $schemas = $analysis->getAnnotationsOfType(Schema::class, true); | ||
|  |         $operations = $analysis->getAnnotationsOfType(Operation::class); | ||
|  | 
 | ||
|  |         foreach ($operations as $operation) { | ||
|  |             if ($operation->x !== UNDEFINED && array_key_exists(self::X_QUERY_AGS_REF, $operation->x)) { | ||
|  |                 if ($schema = $this->schemaForRef($schemas, $operation->x[self::X_QUERY_AGS_REF])) { | ||
|  |                     $this->expandQueryArgs($operation, $schema); | ||
|  |                     $this->cleanUp($operation); | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Find schema for the given ref. | ||
|  |      */ | ||
|  |     protected function schemaForRef(array $schemas, string $ref) | ||
|  |     { | ||
|  |         foreach ($schemas as $schema) { | ||
|  |             if (Components::SCHEMA_REF . $schema->schema === $ref) { | ||
|  |                 return $schema; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         return null; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Expand the given operation by injecting parameters for all properties of the given schema. | ||
|  |      */ | ||
|  |     protected function expandQueryArgs(Operation $operation, Schema $schema) | ||
|  |     { | ||
|  |         if ($schema->properties === UNDEFINED || !$schema->properties) { | ||
|  |             return; | ||
|  |         } | ||
|  | 
 | ||
|  |         $operation->parameters = $operation->parameters === UNDEFINED ? [] : $operation->parameters; | ||
|  |         foreach ($schema->properties as $property) { | ||
|  |             $parameter = new Parameter([ | ||
|  |                 'name' => $property->property, | ||
|  |                 'in' => 'query', | ||
|  |                 'required' => false, | ||
|  |             ]); | ||
|  |             $operation->parameters[] = $parameter; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Clean up. | ||
|  |      */ | ||
|  |     protected function cleanUp($operation) | ||
|  |     { | ||
|  |         unset($operation->x[self::X_QUERY_AGS_REF]); | ||
|  |         if (!$operation->x) { | ||
|  |             $operation->x = UNDEFINED; | ||
|  |         } | ||
|  |     } | ||
|  | } | ||
|  | 
 |