API: Added uiprop=editcount to meta=userinfo
[lhc/web/wiklou.git] / includes / api / ApiRollback.php
index c2ba38f..0f37ef9 100644 (file)
@@ -38,68 +38,63 @@ class ApiRollback extends ApiBase {
 
        public function execute() {
                global $wgUser;
+               $this->getMain()->requestWriteMode();
                $params = $this->extractRequestParams();
                
                $titleObj = NULL;
                if(!isset($params['title']))
-                       $this->dieUsage('The title parameter must be set', 'notarget');
+                       $this->dieUsageMsg(array('missingparam', 'title'));
                if(!isset($params['user']))
-                       $this->dieUsage('The user parameter must be set', 'nouser');
+                       $this->dieUsageMsg(array('missingparam', 'user'));
                if(!isset($params['token']))
-                       $this->dieUsage('The token parameter must be set', 'notoken');
-
-               // doRollback() also checks for these, but we wanna save some work
-               if(!$wgUser->isAllowed('rollback'))
-                       $this->dieUsage('You don\'t have permission to rollback', 'permissiondenied');
-               if($wgUser->isBlocked())
-                       $this->dieUsage('You have been blocked from editing', 'blocked');
-               if(wfReadOnly())
-                       $this->dieUsage('The wiki is in read-only mode', 'readonly');
+                       $this->dieUsageMsg(array('missingparam', 'token'));
 
                $titleObj = Title::newFromText($params['title']);
                if(!$titleObj)
-                       $this->dieUsage("bad title {$params['title']}", 'invalidtitle');
+                       $this->dieUsageMsg(array('invalidtitle', $params['title']));
+               if(!$titleObj->exists())
+                       $this->dieUsageMsg(array('notanarticle'));
+
+               $username = User::getCanonicalName($params['user']);
+               if(!$username)
+                       $this->dieUsageMsg(array('invaliduser', $params['user']));
 
                $articleObj = new Article($titleObj);
                $summary = (isset($params['summary']) ? $params['summary'] : "");
-               $info = array();
-               $retval = $articleObj->doRollback($params['user'], $params['token'], isset($params['markbot']), $summary, &$info);
-
-               switch($retval)
-               {
-                       case ROLLBACK_SUCCESS:
-                               break; // We'll deal with that later
-                       case ROLLBACK_PERM:
-                               $this->dieUsage('You don\'t have permission to rollback', 'permissiondenied');
-                       case ROLLBACK_BLOCKED: // If we get BLOCKED or PERM that's very weird, but it's possible
-                               $this->dieUsage('You have been blocked from editing', 'blocked');
-                       case ROLLBACK_READONLY:
-                               $this->dieUsage('The wiki is in read-only mode', 'readonly');
-                       case ROLLBACK_BADTOKEN:
-                               $this->dieUsage('Invalid token', 'badtoken');
-                       case ROLLBACK_BADARTICLE:
-                               $this->dieUsage("The article ``{$params['title']}'' doesn't exist", 'missingtitle');
-                       case ROLLBACK_ALREADYROLLED:
-                               $this->dieUsage('The edit(s) you tried to rollback is/are already rolled back', 'alreadyrolled');
-                       case ROLLBACK_ONLYAUTHOR:
-                               $this->dieUsage("{$params['user']} is the only author of the page", 'onlyauthor');
-                       case ROLLBACK_EDITFAILED:
-                               $this->dieDebug(__METHOD__, 'Article::doEdit() failed');
-                       default:
-                               // rollback() has apparently invented a new error, which is extremely weird
-                               $this->dieDebug(__METHOD__, "rollback() returned an unknown error ($retval)");
-               }
-               // $retval has to be ROLLBACK_SUCCESS if we get here
-               $this->getResult()->addValue(null, 'rollback', $info);
-       }
+               $details = null;
+               $dbw = wfGetDb(DB_MASTER);
+               $dbw->begin();
+               $retval = $articleObj->doRollback($username, $summary, $params['token'], $params['markbot'], $details);
+
+               if(!empty($retval))
+                       // We don't care about multiple errors, just report one of them
+                       $this->dieUsageMsg(current($retval));
 
+               $dbw->commit();
+               $current = $target = $summary = NULL;
+               extract($details);
+
+               $info = array(
+                       'title' => $titleObj->getPrefixedText(),
+                       'pageid' => $current->getPage(),
+                       'summary' => $summary,
+                       'revid' => $titleObj->getLatestRevID(),
+                       'old_revid' => $current->getID(),
+                       'last_revid' => $target->getID()
+               );
+
+               $this->getResult()->addValue(null, $this->getModuleName(), $info);
+       }
+       
+       public function mustBePosted() { return true; }
+       
        protected function getAllowedParams() {
                return array (
                        'title' => null,
                        'user' => null,
                        'token' => null,
                        'summary' => null,
-                       'markbot' => null
+                       'markbot' => false
                );
        }
 
@@ -128,7 +123,6 @@ class ApiRollback extends ApiBase {
        }
 
        public function getVersion() {
-               return __CLASS__ . ': $Id: ApiRollback.php 22289 2007-05-20 23:31:44Z yurik $';
+               return __CLASS__ . ': $Id$';
        }
 }
-?>