mediawiki.user: Reduce repetition of code
authorhelder.wiki <helder.wiki@gmail.com>
Wed, 1 Aug 2012 15:21:36 +0000 (12:21 -0300)
committerTimo Tijhof <ttijhof@wikimedia.org>
Wed, 8 Aug 2012 03:02:40 +0000 (05:02 +0200)
Created a local utility function getUserInfo(), which is called by
both mw.user.getGroups and mw.user.getRights.

This function uses the same API request to get both pieces of
information.

Also reduces the number of jQuery.Callbacks instances by
using it directly instead of jQuery.Deffered with '.always()'.

Change-Id: I590175dba1c9761da19a84efe69a5305220d8eb7

resources/mediawiki/mediawiki.user.js

index 8c6e90c..48f30df 100644 (file)
@@ -2,7 +2,7 @@
  * Implementation for mediaWiki.user
  */
 
-(function( $ ) {
+( function ( $ ) {
 
        /**
         * User object
                /* Private Members */
 
                var that = this;
-               var api = new mw.Api();
-               var groupsDeferred;
-               var rightsDeferred;
+               var callbacks = {};
+
+               /**
+                * Gets the current user's groups or rights.
+                * @param {String} info: One of 'groups' or 'rights'.
+                * @param {Function} callback
+                */
+               function getUserInfo( info, callback ) {
+                       var api;
+                       if ( callbacks[info] ) {
+                               callbacks[info].add( callback );
+                               return;
+                       }
+                       callbacks.rights = $.Callbacks('once memory');
+                       callbacks.groups = $.Callbacks('once memory');
+                       callbacks[info].add( callback );
+                       api = new mw.Api();
+                       api.get( {
+                               action: 'query',
+                               meta: 'userinfo',
+                               uiprop: 'rights|groups'
+                       } ).always( function ( data ) {
+                               var rights, groups;
+                               if ( data.query && data.query.userinfo ) {
+                                       rights = data.query.userinfo.rights;
+                                       groups = data.query.userinfo.groups;
+                               }
+                               callbacks.rights.fire( rights || [] );
+                               callbacks.groups.fire( groups || [] );
+                       } );
+               }
 
                /* Public Members */
 
                 */
                this.sessionId = function () {
                        var sessionId = $.cookie( 'mediaWiki.user.sessionId' );
-                       if ( typeof sessionId == 'undefined' || sessionId === null ) {
+                       if ( typeof sessionId === 'undefined' || sessionId === null ) {
                                sessionId = generateId();
                                $.cookie( 'mediaWiki.user.sessionId', sessionId, { 'expires': null, 'path': '/' } );
                        }
                                return name;
                        }
                        var id = $.cookie( 'mediaWiki.user.id' );
-                       if ( typeof id == 'undefined' || id === null ) {
+                       if ( typeof id === 'undefined' || id === null ) {
                                id = generateId();
                        }
                        // Set cookie if not set, or renew it if already set
                 * Gets the current user's groups.
                 */
                this.getGroups = function ( callback ) {
-                       if ( groupsDeferred ) {
-                               groupsDeferred.always( callback );
-                               return;
-                       }
-
-                       groupsDeferred = $.Deferred();
-                       groupsDeferred.always( callback );
-                       api.get( {
-                               action: 'query',
-                               meta: 'userinfo',
-                               uiprop: 'groups'
-                       } ).done( function ( data ) {
-                               if ( data.query && data.query.userinfo && data.query.userinfo.groups ) {
-                                       groupsDeferred.resolve( data.query.userinfo.groups );
-                               } else {
-                                       groupsDeferred.reject( [] );
-                               }
-                       } ).fail( function ( data ) {
-                                       groupsDeferred.reject( [] );
-                       } );
+                       getUserInfo( 'groups', callback );
                };
 
                /**
                 * Gets the current user's rights.
                 */
                this.getRights = function ( callback ) {
-                       if ( rightsDeferred ) {
-                               rightsDeferred.always( callback );
-                               return;
-                       }
-
-                       rightsDeferred = $.Deferred();
-                       rightsDeferred.always( callback );
-                       api.get( {
-                               action: 'query',
-                               meta: 'userinfo',
-                               uiprop: 'rights'
-                       } ).done( function ( data ) {
-                               if ( data.query && data.query.userinfo && data.query.userinfo.rights ) {
-                                       rightsDeferred.resolve( data.query.userinfo.rights );
-                               } else {
-                                       rightsDeferred.reject( [] );
-                               }
-                       } ).fail( function ( data ) {
-                               rightsDeferred.reject( [] );
-                       } );
+                       getUserInfo( 'rights', callback );
                };
        }
 
        // This is kind of ugly but we're stuck with this for b/c reasons
        mw.user = new User( mw.user.options, mw.user.tokens );
 
-})(jQuery);
+}( jQuery ) );