Merge "Fix 'Tags' padding to keep it farther from the edge and document the source...
[lhc/web/wiklou.git] / includes / api / ApiOptions.php
index f30b44c..fe7d10d 100644 (file)
@@ -29,11 +29,15 @@ use MediaWiki\MediaWikiServices;
  * @ingroup API
  */
 class ApiOptions extends ApiBase {
+       /** @var User User account to modify */
+       private $userForUpdates;
+
        /**
         * Changes preferences of the current user.
         */
        public function execute() {
-               if ( $this->getUser()->isAnon() ) {
+               $user = $this->getUserForUpdates();
+               if ( !$user || $user->isAnon() ) {
                        $this->dieWithError(
                                [ 'apierror-mustbeloggedin', $this->msg( 'action-editmyoptions' ) ], 'notloggedin'
                        );
@@ -48,16 +52,8 @@ class ApiOptions extends ApiBase {
                        $this->dieWithError( [ 'apierror-missingparam', 'optionname' ] );
                }
 
-               // Load the user from the master to reduce CAS errors on double post (T95839)
-               $user = $this->getUser()->getInstanceForUpdate();
-               if ( !$user ) {
-                       $this->dieWithError(
-                               [ 'apierror-mustbeloggedin', $this->msg( 'action-editmyoptions' ) ], 'notloggedin'
-                       );
-               }
-
                if ( $params['reset'] ) {
-                       $user->resetOptions( $params['resetkinds'], $this->getContext() );
+                       $this->resetPreferences( $params['resetkinds'] );
                        $changed = true;
                }
 
@@ -76,8 +72,7 @@ class ApiOptions extends ApiBase {
                        $this->dieWithError( 'apierror-nochanges' );
                }
 
-               $preferencesFactory = MediaWikiServices::getInstance()->getPreferencesFactory();
-               $prefs = $preferencesFactory->getFormDescriptor( $user, $this->getContext() );
+               $prefs = $this->getPreferences();
                $prefsKinds = $user->getOptionKinds( $this->getContext(), $changes );
 
                $htmlForm = null;
@@ -117,7 +112,7 @@ class ApiOptions extends ApiBase {
                                        break;
                        }
                        if ( $validation === true ) {
-                               $user->setOption( $key, $value );
+                               $this->setPreference( $key, $value );
                                $changed = true;
                        } else {
                                $this->addWarning( [ 'apiwarn-validationfailed', wfEscapeWikiText( $key ), $validation ] );
@@ -125,13 +120,59 @@ class ApiOptions extends ApiBase {
                }
 
                if ( $changed ) {
-                       // Commit changes
-                       $user->saveSettings();
+                       $this->commitChanges();
                }
 
                $this->getResult()->addValue( null, $this->getModuleName(), 'success' );
        }
 
+       /**
+        * Load the user from the master to reduce CAS errors on double post (T95839)
+        *
+        * @return null|User
+        */
+       protected function getUserForUpdates() {
+               if ( !$this->userForUpdates ) {
+                       $this->userForUpdates = $this->getUser()->getInstanceForUpdate();
+               }
+
+               return $this->userForUpdates;
+       }
+
+       /**
+        * Returns preferences form descriptor
+        * @return mixed[][]
+        */
+       protected function getPreferences() {
+               $preferencesFactory = MediaWikiServices::getInstance()->getPreferencesFactory();
+               return $preferencesFactory->getFormDescriptor( $this->getUserForUpdates(),
+                       $this->getContext() );
+       }
+
+       /**
+        * @param string[] $kinds One or more types returned by User::listOptionKinds() or 'all'
+        */
+       protected function resetPreferences( array $kinds ) {
+               $this->getUserForUpdates()->resetOptions( $kinds, $this->getContext() );
+       }
+
+       /**
+        * Sets one user preference to be applied by commitChanges()
+        *
+        * @param string $preference
+        * @param mixed $value
+        */
+       protected function setPreference( $preference, $value ) {
+               $this->getUserForUpdates()->setOption( $preference, $value );
+       }
+
+       /**
+        * Applies changes to user preferences
+        */
+       protected function commitChanges() {
+               $this->getUserForUpdates()->saveSettings();
+       }
+
        public function mustBePosted() {
                return true;
        }