summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/Translate/api/ApiGroupReview.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/Translate/api/ApiGroupReview.php')
-rw-r--r--www/wiki/extensions/Translate/api/ApiGroupReview.php153
1 files changed, 153 insertions, 0 deletions
diff --git a/www/wiki/extensions/Translate/api/ApiGroupReview.php b/www/wiki/extensions/Translate/api/ApiGroupReview.php
new file mode 100644
index 00000000..67583854
--- /dev/null
+++ b/www/wiki/extensions/Translate/api/ApiGroupReview.php
@@ -0,0 +1,153 @@
+<?php
+/**
+ * API module for switching workflow states for message groups
+ * @file
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ */
+
+/**
+ * API module for switching workflow states for message groups
+ *
+ * @ingroup API TranslateAPI
+ */
+class ApiGroupReview extends ApiBase {
+ protected static $right = 'translate-groupreview';
+
+ public function execute() {
+ $user = $this->getUser();
+ $requestParams = $this->extractRequestParams();
+
+ $group = MessageGroups::getGroup( $requestParams['group'] );
+ $code = $requestParams['language'];
+
+ if ( !$group || MessageGroups::isDynamic( $group ) ) {
+ $this->dieWithError( [ 'apierror-missingparam', 'group' ] );
+ }
+ $stateConfig = $group->getMessageGroupStates()->getStates();
+ if ( !$stateConfig ) {
+ $this->dieWithError( 'apierror-translate-groupreviewdisabled', 'disabled' );
+ }
+
+ $this->checkUserRightsAny( self::$right );
+
+ if ( $user->isBlocked() ) {
+ $this->dieBlocked( $user->getBlock() );
+ }
+
+ $requestParams = $this->extractRequestParams();
+
+ $languages = Language::fetchLanguageNames();
+ if ( !isset( $languages[$code] ) ) {
+ $this->dieWithError( [ 'apierror-missingparam', 'language' ] );
+ }
+
+ $targetState = $requestParams['state'];
+ if ( !isset( $stateConfig[$targetState] ) ) {
+ $this->dieWithError( 'apierror-translate-invalidstate', 'invalidstate' );
+ }
+
+ if ( is_array( $stateConfig[$targetState] )
+ && isset( $stateConfig[$targetState]['right'] )
+ ) {
+ $this->checkUserRightsAny( $stateConfig[$targetState]['right'] );
+ }
+
+ self::changeState( $group, $code, $targetState, $user );
+
+ $output = [ 'review' => [
+ 'group' => $group->getId(),
+ 'language' => $code,
+ 'state' => $targetState,
+ ] ];
+
+ $this->getResult()->addValue( null, $this->getModuleName(), $output );
+ }
+
+ public static function getState( MessageGroup $group, $code ) {
+ $dbw = wfGetDB( DB_MASTER );
+ $table = 'translate_groupreviews';
+
+ $field = 'tgr_state';
+ $conds = [
+ 'tgr_group' => $group->getId(),
+ 'tgr_lang' => $code
+ ];
+
+ return $dbw->selectField( $table, $field, $conds, __METHOD__ );
+ }
+
+ public static function changeState( MessageGroup $group, $code, $newState, User $user ) {
+ $currentState = self::getState( $group, $code );
+ if ( $currentState === $newState ) {
+ return false;
+ }
+
+ $table = 'translate_groupreviews';
+ $index = [ 'tgr_group', 'tgr_language' ];
+ $row = [
+ 'tgr_group' => $group->getId(),
+ 'tgr_lang' => $code,
+ 'tgr_state' => $newState,
+ ];
+
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->replace( $table, [ $index ], $row, __METHOD__ );
+
+ $entry = new ManualLogEntry( 'translationreview', 'group' );
+ $entry->setPerformer( $user );
+ $entry->setTarget( SpecialPage::getTitleFor( 'Translate', $group->getId() ) );
+ // @todo
+ // $entry->setComment( $comment );
+ $entry->setParameters( [
+ '4::language' => $code,
+ '5::group-label' => $group->getLabel(),
+ '6::old-state' => $currentState,
+ '7::new-state' => $newState,
+ ] );
+
+ $logid = $entry->insert();
+ $entry->publish( $logid );
+
+ Hooks::run( 'TranslateEventMessageGroupStateChange',
+ [ $group, $code, $currentState, $newState ] );
+
+ return true;
+ }
+
+ public function isWriteMode() {
+ return true;
+ }
+
+ public function needsToken() {
+ return 'csrf';
+ }
+
+ public function getAllowedParams() {
+ return [
+ 'group' => [
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => true,
+ ],
+ 'language' => [
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_DFLT => 'en',
+ ],
+ 'state' => [
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => true,
+ ],
+ 'token' => [
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => true,
+ ],
+ ];
+ }
+
+ protected function getExamplesMessages() {
+ return [
+ 'action=groupreview&group=page-Example&language=de&state=ready&token=foo'
+ => 'apihelp-groupreview-example-1',
+ ];
+ }
+}