Rename mw.util.wikiGetlink to getUrl
[lhc/web/wiklou.git] / includes / actions / WatchAction.php
index ae5f76c..929c1b5 100644 (file)
@@ -87,24 +87,72 @@ class WatchAction extends FormAction {
                return parent::checkCanExecute( $user );
        }
 
-       public static function doWatch( Title $title, User $user  ) {
+       /**
+        * Watch or unwatch a page
+        * @since 1.22
+        * @param bool $watch Whether to watch or unwatch the page
+        * @param Title $title Page to watch/unwatch
+        * @param User $user User who is watching/unwatching
+        * @return Status
+        */
+       public static function doWatchOrUnwatch( $watch, Title $title, User $user ) {
+               if ( $user->isLoggedIn() && $user->isWatched( $title, WatchedItem::IGNORE_USER_RIGHTS ) != $watch ) {
+                       // If the user doesn't have 'editmywatchlist', we still want to
+                       // allow them to add but not remove items via edits and such.
+                       if ( $watch ) {
+                               return self::doWatch( $title, $user, WatchedItem::IGNORE_USER_RIGHTS );
+                       } else {
+                               return self::doUnwatch( $title, $user );
+                       }
+               }
+               return Status::newGood();
+       }
+
+       /**
+        * Watch a page
+        * @since 1.22 Returns Status, $checkRights parameter added
+        * @param Title $title Page to watch/unwatch
+        * @param User $user User who is watching/unwatching
+        * @param int $checkRights Passed through to $user->addWatch()
+        * @return Status
+        */
+       public static function doWatch( Title $title, User $user, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
+               if ( $checkRights !== WatchedItem::IGNORE_USER_RIGHTS && !$user->isAllowed( 'editmywatchlist' ) ) {
+                       return User::newFatalPermissionDeniedStatus( 'editmywatchlist' );
+               }
+
                $page = WikiPage::factory( $title );
 
-               if ( wfRunHooks( 'WatchArticle', array( &$user, &$page ) ) ) {
-                       $user->addWatch( $title );
+               $status = Status::newFatal( 'hookaborted' );
+               if ( wfRunHooks( 'WatchArticle', array( &$user, &$page, &$status ) ) ) {
+                       $status = Status::newGood();
+                       $user->addWatch( $title, $checkRights );
                        wfRunHooks( 'WatchArticleComplete', array( &$user, &$page ) );
                }
-               return true;
+               return $status;
        }
 
-       public static function doUnwatch( Title $title, User $user  ) {
+       /**
+        * Unwatch a page
+        * @since 1.22 Returns Status
+        * @param Title $title Page to watch/unwatch
+        * @param User $user User who is watching/unwatching
+        * @return Status
+        */
+       public static function doUnwatch( Title $title, User $user ) {
+               if ( !$user->isAllowed( 'editmywatchlist' ) ) {
+                       return User::newFatalPermissionDeniedStatus( 'editmywatchlist' );
+               }
+
                $page = WikiPage::factory( $title );
 
-               if ( wfRunHooks( 'UnwatchArticle', array( &$user, &$page ) ) ) {
+               $status = Status::newFatal( 'hookaborted' );
+               if ( wfRunHooks( 'UnwatchArticle', array( &$user, &$page, &$status ) ) ) {
+                       $status = Status::newGood();
                        $user->removeWatch( $title );
                        wfRunHooks( 'UnwatchArticleComplete', array( &$user, &$page ) );
                }
-               return true;
+               return $status;
        }
 
        /**