Move ApiDiscussionTools to ApiDiscussionToolsPageInfo

Also remove 'paction' param, and instead make 'transcludedFrom' a
property of the result object.

Change-Id: I0a289f6d71e4708afff0b52066b1ed6faf76b9ae
This commit is contained in:
Ed Sanders 2022-02-04 23:21:29 +00:00
parent ee2749d34a
commit 7cad692afa
6 changed files with 119 additions and 133 deletions

View file

@ -404,9 +404,6 @@
"MediaWiki\\Extension\\DiscussionTools\\Tests\\": "tests/phpunit/" "MediaWiki\\Extension\\DiscussionTools\\Tests\\": "tests/phpunit/"
}, },
"APIModules": { "APIModules": {
"discussiontools": {
"class": "MediaWiki\\Extension\\DiscussionTools\\ApiDiscussionTools"
},
"discussiontoolsedit": { "discussiontoolsedit": {
"class": "MediaWiki\\Extension\\DiscussionTools\\ApiDiscussionToolsEdit" "class": "MediaWiki\\Extension\\DiscussionTools\\ApiDiscussionToolsEdit"
}, },
@ -417,6 +414,9 @@
"ConfigFactory" "ConfigFactory"
] ]
}, },
"discussiontoolspageinfo": {
"class": "MediaWiki\\Extension\\DiscussionTools\\ApiDiscussionToolsPageInfo"
},
"discussiontoolssubscribe": { "discussiontoolssubscribe": {
"class": "MediaWiki\\Extension\\DiscussionTools\\ApiDiscussionToolsSubscribe", "class": "MediaWiki\\Extension\\DiscussionTools\\ApiDiscussionToolsSubscribe",
"services": [ "services": [

View file

@ -8,9 +8,6 @@
"apierror-discussiontools-formtoken-used": "Comment already posted. Reload the page to see it.", "apierror-discussiontools-formtoken-used": "Comment already posted. Reload the page to see it.",
"apierror-discussiontools-subscription-failed-add": "Could not subscribe to this topic.", "apierror-discussiontools-subscription-failed-add": "Could not subscribe to this topic.",
"apierror-discussiontools-subscription-failed-remove": "Could not unsubscribe from this topic.", "apierror-discussiontools-subscription-failed-remove": "Could not unsubscribe from this topic.",
"apihelp-discussiontools-param-oldid": "The revision number to use (defaults to latest revision).",
"apihelp-discussiontools-paramvalue-paction-transcludedfrom": "Return titles of pages from which each comment on the given page is transcluded.",
"apihelp-discussiontools-summary": "Returns metadata required to initialize the discussion tools.",
"apihelp-discussiontoolsedit-param-commentid": "ID of the comment to reply to. Only used when <var>paction</var> is <var>addcomment</var>. Overrides <var>commentname</var>.", "apihelp-discussiontoolsedit-param-commentid": "ID of the comment to reply to. Only used when <var>paction</var> is <var>addcomment</var>. Overrides <var>commentname</var>.",
"apihelp-discussiontoolsedit-param-commentname": "Name of the comment to reply to. Only used when <var>paction</var> is <var>addcomment</var>.", "apihelp-discussiontoolsedit-param-commentname": "Name of the comment to reply to. Only used when <var>paction</var> is <var>addcomment</var>.",
"apihelp-discussiontoolsedit-param-formtoken": "An optional unique ID generated in the client to prevent double-posting.", "apihelp-discussiontoolsedit-param-formtoken": "An optional unique ID generated in the client to prevent double-posting.",
@ -22,6 +19,8 @@
"apihelp-discussiontoolsedit-summary": "Post a message on a discussion page.", "apihelp-discussiontoolsedit-summary": "Post a message on a discussion page.",
"apihelp-discussiontoolsgetsubscriptions-param-commentname": "Names of the topics to check", "apihelp-discussiontoolsgetsubscriptions-param-commentname": "Names of the topics to check",
"apihelp-discussiontoolsgetsubscriptions-summary": "Get the subscription statuses of given topics.", "apihelp-discussiontoolsgetsubscriptions-summary": "Get the subscription statuses of given topics.",
"apihelp-discussiontoolspageinfo-param-oldid": "The revision number to use (defaults to latest revision).",
"apihelp-discussiontoolspageinfo-summary": "Returns metadata required to initialize the discussion tools.",
"apihelp-discussiontoolssubscribe-param-commentname": "Name of the topic to subscribe to (or unsubscribe from)", "apihelp-discussiontoolssubscribe-param-commentname": "Name of the topic to subscribe to (or unsubscribe from)",
"apihelp-discussiontoolssubscribe-param-page": "A page on which the topic appears", "apihelp-discussiontoolssubscribe-param-page": "A page on which the topic appears",
"apihelp-discussiontoolssubscribe-param-subscribe": "True to subscribe, false to unsubscribe", "apihelp-discussiontoolssubscribe-param-subscribe": "True to subscribe, false to unsubscribe",

View file

@ -10,9 +10,6 @@
"apierror-discussiontools-formtoken-used": "{{doc-apierror}}", "apierror-discussiontools-formtoken-used": "{{doc-apierror}}",
"apierror-discussiontools-subscription-failed-add": "{{doc-apierror}}", "apierror-discussiontools-subscription-failed-add": "{{doc-apierror}}",
"apierror-discussiontools-subscription-failed-remove": "{{doc-apierror}}", "apierror-discussiontools-subscription-failed-remove": "{{doc-apierror}}",
"apihelp-discussiontools-param-oldid": "{{doc-apihelp-param|discussiontools|oldid}}",
"apihelp-discussiontools-paramvalue-paction-transcludedfrom": "{{doc-apihelp-paramvalue|discussiontools|paction|transcludedfrom}}",
"apihelp-discussiontools-summary": "{{doc-apihelp-summary|discussiontools}}",
"apihelp-discussiontoolsedit-param-commentid": "{{doc-apihelp-param|discussiontoolsedit|commentid}}", "apihelp-discussiontoolsedit-param-commentid": "{{doc-apihelp-param|discussiontoolsedit|commentid}}",
"apihelp-discussiontoolsedit-param-commentname": "{{doc-apihelp-param|discussiontoolsedit|commentname}}", "apihelp-discussiontoolsedit-param-commentname": "{{doc-apihelp-param|discussiontoolsedit|commentname}}",
"apihelp-discussiontoolsedit-param-formtoken": "{{doc-apihelp-param|discussiontoolsedit|formtoken}}", "apihelp-discussiontoolsedit-param-formtoken": "{{doc-apihelp-param|discussiontoolsedit|formtoken}}",
@ -24,6 +21,8 @@
"apihelp-discussiontoolsedit-summary": "{{doc-apihelp-summary|discussiontoolsedit}}", "apihelp-discussiontoolsedit-summary": "{{doc-apihelp-summary|discussiontoolsedit}}",
"apihelp-discussiontoolsgetsubscriptions-param-commentname": "{{doc-apihelp-param|discussiontoolsgetsubscriptions|commentname}}", "apihelp-discussiontoolsgetsubscriptions-param-commentname": "{{doc-apihelp-param|discussiontoolsgetsubscriptions|commentname}}",
"apihelp-discussiontoolsgetsubscriptions-summary": "{{doc-apihelp-summary|discussiontoolsgetsubscriptions}}", "apihelp-discussiontoolsgetsubscriptions-summary": "{{doc-apihelp-summary|discussiontoolsgetsubscriptions}}",
"apihelp-discussiontoolspageinfo-param-oldid": "{{doc-apihelp-param|discussiontoolspageinfo|oldid}}",
"apihelp-discussiontoolspageinfo-summary": "{{doc-apihelp-summary|discussiontoolspageinfo}}",
"apihelp-discussiontoolssubscribe-param-commentname": "{{doc-apihelp-param|discussiontoolssubscribe|commentname}}", "apihelp-discussiontoolssubscribe-param-commentname": "{{doc-apihelp-param|discussiontoolssubscribe|commentname}}",
"apihelp-discussiontoolssubscribe-param-page": "{{doc-apihelp-param|discussiontoolssubscribe|page}}", "apihelp-discussiontoolssubscribe-param-page": "{{doc-apihelp-param|discussiontoolssubscribe|page}}",
"apihelp-discussiontoolssubscribe-param-subscribe": "{{doc-apihelp-param|discussiontoolssubscribe|subscribe}}", "apihelp-discussiontoolssubscribe-param-subscribe": "{{doc-apihelp-param|discussiontoolssubscribe|subscribe}}",

View file

@ -1,121 +0,0 @@
<?php
namespace MediaWiki\Extension\DiscussionTools;
use ApiBase;
use ApiMain;
use ApiParsoidTrait;
use Title;
use Wikimedia\ParamValidator\ParamValidator;
use Wikimedia\Parsoid\Utils\DOMCompat;
use Wikimedia\Parsoid\Utils\DOMUtils;
class ApiDiscussionTools extends ApiBase {
use ApiParsoidTrait;
/**
* @inheritDoc
*/
public function __construct( ApiMain $main, string $name ) {
parent::__construct( $main, $name );
}
/**
* @inheritDoc
*/
public function execute() {
$params = $this->extractRequestParams();
$title = Title::newFromText( $params['page'] );
$result = null;
if ( !$title ) {
$this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['page'] ) ] );
}
switch ( $params['paction'] ) {
case 'transcludedfrom':
$response = $this->requestRestbasePageHtml(
$this->getValidRevision( $title, $params['oldid'] ?? null )
);
$doc = DOMUtils::parseHTML( $response['body'] );
$container = DOMCompat::getBody( $doc );
CommentUtils::unwrapParsoidSections( $container );
$parser = CommentParser::newFromGlobalState( $container, $title );
$threadItems = $parser->getThreadItems();
$transcludedFrom = [];
foreach ( $threadItems as $threadItem ) {
$from = $threadItem->getTranscludedFrom();
// Key by IDs, legacy IDs, and names. This assumes that they can never conflict.
$transcludedFrom[ $threadItem->getId() ] = $from;
$legacyId = $threadItem->getLegacyId();
if ( $legacyId ) {
$transcludedFrom[ $legacyId ] = $from;
}
$name = $threadItem->getName();
if ( isset( $transcludedFrom[ $name ] ) && $transcludedFrom[ $name ] !== $from ) {
// Two or more items with the same name, transcluded from different pages.
// Consider them both to be transcluded from unknown source.
$transcludedFrom[ $name ] = true;
} else {
$transcludedFrom[ $name ] = $from;
}
}
$result = $transcludedFrom;
break;
}
$this->getResult()->addValue( null, $this->getModuleName(), $result );
}
/**
* @inheritDoc
*/
public function getAllowedParams() {
return [
'paction' => [
ParamValidator::PARAM_REQUIRED => true,
ParamValidator::PARAM_TYPE => [
'transcludedfrom',
],
ApiBase::PARAM_HELP_MSG => 'apihelp-visualeditoredit-param-paction',
ApiBase::PARAM_HELP_MSG_PER_VALUE => [],
],
'page' => [
ParamValidator::PARAM_REQUIRED => true,
ApiBase::PARAM_HELP_MSG => 'apihelp-visualeditoredit-param-page',
],
'oldid' => null,
];
}
/**
* @inheritDoc
*/
public function needsToken() {
return false;
}
/**
* @inheritDoc
*/
public function isInternal() {
return true;
}
/**
* @inheritDoc
*/
public function isWriteMode() {
return false;
}
}

View file

@ -0,0 +1,110 @@
<?php
namespace MediaWiki\Extension\DiscussionTools;
use ApiBase;
use ApiMain;
use ApiParsoidTrait;
use Title;
use Wikimedia\ParamValidator\ParamValidator;
use Wikimedia\Parsoid\Utils\DOMCompat;
use Wikimedia\Parsoid\Utils\DOMUtils;
class ApiDiscussionToolsPageInfo extends ApiBase {
use ApiParsoidTrait;
/**
* @inheritDoc
*/
public function __construct( ApiMain $main, string $name ) {
parent::__construct( $main, $name );
}
/**
* @inheritDoc
*/
public function execute() {
$params = $this->extractRequestParams();
$title = Title::newFromText( $params['page'] );
if ( !$title ) {
$this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['page'] ) ] );
}
$response = $this->requestRestbasePageHtml(
$this->getValidRevision( $title, $params['oldid'] ?? null )
);
$doc = DOMUtils::parseHTML( $response['body'] );
$container = DOMCompat::getBody( $doc );
CommentUtils::unwrapParsoidSections( $container );
$parser = CommentParser::newFromGlobalState( $container, $title );
$threadItems = $parser->getThreadItems();
$transcludedFrom = [];
foreach ( $threadItems as $threadItem ) {
$from = $threadItem->getTranscludedFrom();
// Key by IDs, legacy IDs, and names. This assumes that they can never conflict.
$transcludedFrom[ $threadItem->getId() ] = $from;
$legacyId = $threadItem->getLegacyId();
if ( $legacyId ) {
$transcludedFrom[ $legacyId ] = $from;
}
$name = $threadItem->getName();
if ( isset( $transcludedFrom[ $name ] ) && $transcludedFrom[ $name ] !== $from ) {
// Two or more items with the same name, transcluded from different pages.
// Consider them both to be transcluded from unknown source.
$transcludedFrom[ $name ] = true;
} else {
$transcludedFrom[ $name ] = $from;
}
}
$result = [
'transcludedfrom' => $transcludedFrom
];
$this->getResult()->addValue( null, $this->getModuleName(), $result );
}
/**
* @inheritDoc
*/
public function getAllowedParams() {
return [
'page' => [
ParamValidator::PARAM_REQUIRED => true,
ApiBase::PARAM_HELP_MSG => 'apihelp-visualeditoredit-param-page',
],
'oldid' => null,
];
}
/**
* @inheritDoc
*/
public function needsToken() {
return false;
}
/**
* @inheritDoc
*/
public function isInternal() {
return true;
}
/**
* @inheritDoc
*/
public function isWriteMode() {
return false;
}
}

View file

@ -101,12 +101,11 @@ function getPageData( pageName, oldId, isNewTopic ) {
} ); } );
transcludedFromPromise = api.get( { transcludedFromPromise = api.get( {
action: 'discussiontools', action: 'discussiontoolspageinfo',
paction: 'transcludedfrom',
page: pageName, page: pageName,
oldid: oldId oldid: oldId
} ).then( function ( response ) { } ).then( function ( response ) {
return OO.getProp( response, 'discussiontools' ) || {}; return OO.getProp( response, 'discussiontoolspageinfo', 'transcludedfrom' ) || {};
} ); } );
} else { } else {
lintPromise = $.Deferred().resolve( [] ).promise(); lintPromise = $.Deferred().resolve( [] ).promise();