The discovery endpoint provides basic information about accessing the wiki's APIs, as well as a directory of available modules. Bug: T365753 Change-Id: I161aa68566da91867b650e13c8aadc87cd0c428c
109 lines
2.9 KiB
PHP
109 lines
2.9 KiB
PHP
<?php
|
|
|
|
namespace MediaWiki\Rest\Handler;
|
|
|
|
use MediaWiki\Config\Config;
|
|
use MediaWiki\Config\ServiceOptions;
|
|
use MediaWiki\MainConfigNames;
|
|
use MediaWiki\Rest\Handler;
|
|
use MediaWiki\Rest\Module\Module;
|
|
|
|
/**
|
|
* Core REST API endpoint that outputs discovery information, including a
|
|
* list of registered modules.
|
|
* Inspired by Google's API directory, see https://developers.google.com/discovery/v1/reference.
|
|
*/
|
|
class DiscoveryHandler extends Handler {
|
|
/**
|
|
* @internal
|
|
*/
|
|
private const CONSTRUCTOR_OPTIONS = [
|
|
MainConfigNames::RightsUrl,
|
|
MainConfigNames::RightsText,
|
|
MainConfigNames::EmergencyContact,
|
|
MainConfigNames::Sitename,
|
|
MainConfigNames::Server,
|
|
];
|
|
|
|
/** @var ServiceOptions */
|
|
private ServiceOptions $options;
|
|
|
|
/**
|
|
* @param Config $config
|
|
*/
|
|
public function __construct( Config $config ) {
|
|
$options = new ServiceOptions( self::CONSTRUCTOR_OPTIONS, $config );
|
|
$options->assertRequiredOptions( self::CONSTRUCTOR_OPTIONS );
|
|
$this->options = $options;
|
|
}
|
|
|
|
public function execute() {
|
|
// NOTE: must match docs/rest/discovery-1.0.json
|
|
return [
|
|
'mw-discovery' => '1.0',
|
|
'$schema' => 'https://www.mediawiki.org/schema/discovery-1.0',
|
|
'info' => $this->getInfoSpec(),
|
|
'servers' => $this->getServerList(),
|
|
'modules' => $this->getModuleMap(),
|
|
// TODO: link to aggregated spec
|
|
// TODO: list of component schemas
|
|
];
|
|
}
|
|
|
|
private function getModuleMap(): array {
|
|
$modules = [];
|
|
|
|
foreach ( $this->getRouter()->getModuleIds() as $moduleName ) {
|
|
$module = $this->getRouter()->getModule( $moduleName );
|
|
|
|
if ( $module ) {
|
|
$modules[$moduleName] = $this->getModuleSpec( $moduleName, $module );
|
|
}
|
|
}
|
|
|
|
return $modules;
|
|
}
|
|
|
|
private function getServerList(): array {
|
|
// See https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#server-object
|
|
return [
|
|
[
|
|
'url' => $this->getRouter()->getRouteUrl( '' ),
|
|
]
|
|
];
|
|
}
|
|
|
|
private function getInfoSpec() {
|
|
return [
|
|
'title' => $this->options->get( MainConfigNames::Sitename ),
|
|
'mediawiki' => MW_VERSION,
|
|
'license' => $this->getLicenseSpec(),
|
|
'contact' => $this->getContactSpec(),
|
|
// TODO: terms of service
|
|
// TODO: owner/operator
|
|
// TODO: link to Special:RestSandbox
|
|
// TODO: link to https://www.mediawiki.org/wiki/API:REST_API
|
|
];
|
|
}
|
|
|
|
private function getLicenseSpec(): array {
|
|
// See https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#license-object
|
|
// TODO: get terms-of-use URL, not content license.
|
|
return [
|
|
'name' => $this->options->get( MainConfigNames::RightsText ),
|
|
'url' => $this->options->get( MainConfigNames::RightsUrl ),
|
|
];
|
|
}
|
|
|
|
private function getContactSpec(): array {
|
|
// https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#contact-object
|
|
return [
|
|
'email' => $this->options->get( MainConfigNames::EmergencyContact ),
|
|
];
|
|
}
|
|
|
|
private function getModuleSpec( string $moduleId, Module $module ): array {
|
|
return $module->getModuleDescription();
|
|
}
|
|
|
|
}
|