Bene has uploaded a new change for review.
https://gerrit.wikimedia.org/r/234963
Change subject: Add wbquerybadges api module to query badges
......................................................................
Add wbquerybadges api module to query badges
It is weird that the site links returned by BadgeTable
don't have badges assigned themselves at the moment.
We should fix that by doing a self-join on the table.
Bug: T110866
Change-Id: Ib4385b9320c7701c6608f5d301aa8bcb865f40d6
---
M repo/Wikibase.php
A repo/includes/api/QueryBadges.php
2 files changed, 171 insertions(+), 0 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase
refs/changes/63/234963/1
diff --git a/repo/Wikibase.php b/repo/Wikibase.php
index 2dca3a8..9035b3b 100644
--- a/repo/Wikibase.php
+++ b/repo/Wikibase.php
@@ -189,6 +189,7 @@
$wgAPIModules['wbparsevalue'] = 'Wikibase\Repo\Api\ParseValue';
$wgAPIModules['wbavailablebadges'] =
'Wikibase\Repo\Api\AvailableBadges';
$wgAPIModules['wbcreateredirect'] = 'Wikibase\Repo\Api\CreateRedirect';
+ $wgAPIModules['wbquerybadges'] = 'Wikibase\Repo\Api\QueryBadges';
// Special page registration
$wgSpecialPages['NewItem'] = 'Wikibase\Repo\Specials\SpecialNewItem';
diff --git a/repo/includes/api/QueryBadges.php
b/repo/includes/api/QueryBadges.php
new file mode 100644
index 0000000..198da33
--- /dev/null
+++ b/repo/includes/api/QueryBadges.php
@@ -0,0 +1,170 @@
+<?php
+
+
+namespace Wikibase\Repo\Api;
+
+use ApiBase;
+use ApiMain;
+use DataValues\Serializers\DataValueSerializer;
+use InvalidArgumentException;
+use Wikibase\DataModel\Entity\ItemId;
+use Wikibase\DataModel\SerializerFactory;
+use Wikibase\Lib\Store\BadgeLookup;
+use Wikibase\Repo\SiteLinkTargetProvider;
+use Wikibase\Repo\WikibaseRepo;
+
+/**
+ * A module to query badges by site and page.
+ *
+ * @since 0.5
+ * @licence GNU GPL v2+
+ * @author Bene* < [email protected] >
+ */
+class QueryBadges extends ApiBase {
+
+ /**
+ * @var ApiErrorReporter
+ */
+ private $errorReporter;
+
+ /**
+ * @var BadgeLookup
+ */
+ private $badgeLookup;
+
+ /**
+ * @var SiteLinkTargetProvider
+ */
+ private $siteLinkTargetProvider;
+
+ /**
+ * @var SerializerFactory
+ */
+ private $serializerFactory;
+
+ /**
+ * @var string[]
+ */
+ private $siteLinkGroups;
+
+ /**
+ * @var string[]
+ */
+ private $badgeItems;
+
+ /**
+ * @param ApiMain $mainModule
+ * @param string $moduleName
+ * @param string $modulePrefix
+ *
+ * @see ApiBase::__construct
+ */
+ public function __construct( ApiMain $mainModule, $moduleName,
$modulePrefix = '' ) {
+ parent::__construct( $mainModule, $moduleName, $modulePrefix );
+
+ $wikibaseRepo = WikibaseRepo::getDefaultInstance();
+ $this->setServices(
+ $wikibaseRepo->getApiHelperFactory( $this->getContext()
)->getErrorReporter( $this ),
+ $wikibaseRepo->getStore()->newBadgeStore(),
+ new SiteLinkTargetProvider(
+ $wikibaseRepo->getSiteStore(),
+ $wikibaseRepo->getSettings()->getSetting(
'specialSiteLinkGroups' )
+ ),
+ new SerializerFactory( new DataValueSerializer() ),
+ $wikibaseRepo->getSettings()->getSetting(
'siteLinkGroups' ),
+ $wikibaseRepo->getSettings()->getSetting( 'badgeItems' )
+ );
+ }
+
+ public function setServices(
+ ApiErrorReporter $errorReporter,
+ BadgeLookup $badgeLookup,
+ SiteLinkTargetProvider $siteLinkTargetProvider,
+ SerializerFactory $serializerFactory,
+ array $siteLinkGroups,
+ array $badgeItems
+ ) {
+ $this->errorReporter = $errorReporter;
+ $this->badgeLookup = $badgeLookup;
+ $this->siteLinkTargetProvider = $siteLinkTargetProvider;
+ $this->serializerFactory = $serializerFactory;
+ $this->siteLinkGroups = $siteLinkGroups;
+ $this->badgeItems = $badgeItems;
+ }
+
+ /**
+ * @see ApiBase::execute
+ *
+ * @since 0.5
+ */
+ public function execute() {
+ $params = $this->extractRequestParams();
+
+ $badgeId = $this->getBadgeId( $params );
+ $site = isset( $params['site'] ) ? $params['site'] : null;
+
+ $siteLinks = $this->badgeLookup->getSiteLinksForBadge(
$badgeId, $site );
+ $this->showResult( $siteLinks );
+ }
+
+ /**
+ * @param array $params
+ * @return ItemId
+ */
+ private function getBadgeId( array $params ) {
+ if ( !isset( $params['badge'] ) ) {
+ $this->errorReporter->dieError( 'Missing parameter:
badge', 'param-missing' );
+ }
+
+ try {
+ return new ItemId( $params['badge'] );
+ } catch ( InvalidArgumentException $e ) {
+ $this->errorReporter->dieError( "Invalid id:
{$params['badge']}", 'no-such-entity' );
+ }
+ }
+
+ /**
+ * @param SiteLink[] $siteLinks
+ */
+ private function showResult( array $siteLinks ) {
+ $result = $this->getResult();
+ $serializer = $this->serializerFactory->newSiteLinkSerializer();
+
+ foreach ( $siteLinks as $siteLink ) {
+ $result->addValue( 'pages', null,
$serializer->serialize( $siteLink ) );
+ }
+
+ $result->addIndexedTagName( 'pages', 'page' );
+ $result->addValue( null, 'success', 1 );
+ }
+
+ /**
+ * @see ApiBase::getAllowedParams
+ */
+ protected function getAllowedParams() {
+ $sites = $this->siteLinkTargetProvider->getSiteList(
$this->siteLinkGroups );
+
+ return array_merge( parent::getAllowedParams(), array(
+ 'badge' => array(
+ self::PARAM_TYPE => array_keys(
$this->badgeItems ),
+ self::PARAM_REQUIRED
+ ),
+ 'site' => array(
+ self::PARAM_TYPE =>
$sites->getGlobalIdentifiers(),
+ ),
+ ) );
+ }
+
+ /**
+ * @see ApiBase::getExamplesMessages
+ */
+ protected function getExamplesMessages() {
+ return array(
+ "action=wbquerybadges&badge=Q17437798"
+ => "apihelp-wbgetentities-example-1",
+ "action=wbquerybadges&badge=Q17437798&site=enwiki"
+ => "apihelp-wbgetentities-example-2",
+ );
+ }
+
+}
--
To view, visit https://gerrit.wikimedia.org/r/234963
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib4385b9320c7701c6608f5d301aa8bcb865f40d6
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Bene <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits