. namespace core\router\schema; use core\exception\coding_exception; use core\param; use core\router\route; use core\router\schema\objects\type_base; use stdClass; /** * OpenAPI parameter. * * https://spec.openapis.org/oas/v3.1.0#parameter-object * * @package core * @copyright 2023 Andrew Lyons * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class parameter extends openapi_base { /** @var string A query parameter */ public const IN_QUERY = 'query'; /** @var string A header parameter */ public const IN_HEADER = 'header'; /** @var string A URI path parameter */ public const IN_PATH = 'path'; /** @var string A cookie parameter */ public const IN_COOKIE = 'cookie'; /** * Constructor for a Parameter Object. * * @param string $name The name of the parameter. Parameter names are case sensitive. * - If in is "path", the name field MUST correspond to a template expression occurring within the * path field in the Paths Object. * See Path Templating for further information. * - If in is "header" and the name field is "Accept", "Content-Type" or "Authorization", * the parameter definition SHALL be ignored. * - For all other cases, the name corresponds to the parameter name used by the in property. * @param string $in The location of the parameter. Possible values are "query", "header", "path" or "cookie". * @param null|string $description * @param null|bool $required * @param null|bool $deprecated Specifies that a parameter is deprecated and SHOULD be transitioned out of usage. * @param null|param $type A Moodle parameter type, which can be used instead of a schema. * @param mixed $default The default value * @param null|type_base $schema * @param null|example $example * @param example[] $examples * @param mixed[] ...$extra * @throws coding_exception */ public function __construct( /** @var string The name of the parameter. Parameter names are case sensitive */ protected string $name, /** @var string The location of the parameter */ protected string $in, /** @var string|null A description of the parameter */ protected ?string $description = null, /** @var bool|null Whether the parameter is required */ protected ?bool $required = null, /** @var bool|null Whether the parameter is deprecated */ protected ?bool $deprecated = false, /** @var param|null A Moodle parameter type */ protected ?param $type = null, /** @var mixed|null The default value of the parameter */ protected mixed $default = null, /** @var type_base|null The schema */ protected ?type_base $schema = null, /** @var example|null An example */ protected ?example $example = null, /** @var example[] An array of examples */ protected array $examples = [], ...$extra, ) { if ($example) { if (count($examples)) { throw new coding_exception('Only one of example or examples can be specified.'); } $this->examples[$example->get_name()] = $example; } if ($required === true && $default !== null) { throw new coding_exception('A parameter cannot be required and have a default value.'); } parent::__construct(...$extra); } #[\Override] public function get_openapi_description( specification $api, ?string $path = null, ): ?stdClass { $data = (object) [ // The `name`, and `in` values are required. 'name' => $this->name, 'in' => $this->in, ]; if ($this->description !== null) { $data->description = $this->description; } // Allow another schema to be passed. if ($this->schema !== null) { $data->schema = $this->schema->get_openapi_schema($api, $path); } else { $data->schema = $this->get_schema_from_type($this->type); } if (count($this->examples) > 0) { $data->examples = []; foreach ($this->examples as $example) { $data->examples[$example->get_name()] = $example->get_openapi_schema( api: $api, ); } } return $data; } /** * Get the OpenAPI 'in' property. * * @return string */ public function get_in(): string { return $this->in; } /** * Fetch the underlying param. * * @return param */ public function get_type(): param { return $this->type; } /** * Whether this property is required. * * @param route $route * @return bool */ public function is_required(route $route): bool { return $this->required ?? false; } /** * Get the name of the parameter. * * @return string */ public function get_name(): string { return $this->name; } }