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;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 |