refine layering around updating user accounts
authorDenis Ovsienko <denis@ovsienko.info>
Mon, 17 Sep 2018 16:38:36 +0000 (17:38 +0100)
committerDenis Ovsienko <denis@ovsienko.info>
Mon, 17 Sep 2018 16:38:36 +0000 (17:38 +0100)
Move the logic from updateUser() to commitUpdateUserAccount() as that's
where it belongs.

wwwroot/inc/database.php
wwwroot/inc/ophandlers.php

index 5c7cb44..1d0683b 100644 (file)
@@ -3367,19 +3367,23 @@ function commitCreateUserAccount ($username, $realname, $password)
        return $user_id;
 }
 
-function commitUpdateUserAccount ($id, $new_username, $new_realname, $new_password)
+// Update the password only if it is provided.
+function commitUpdateUserAccount ($id, $new_username, $new_realname, $new_password = '')
 {
-       usePreparedUpdateBlade
+       $set_columns = array
        (
-               'UserAccount',
-               array
-               (
-                       'user_name' => $new_username,
-                       'user_realname' => $new_realname == '' ? NULL : $new_realname,
-                       'user_password_hash' => $new_password,
-               ),
-               array ('user_id' => $id)
+               'user_name' => $new_username,
+               'user_realname' => nullIfEmptyStr ($new_realname),
        );
+       if ($new_password != '')
+               $set_columns['user_password_hash'] = sha1 ($new_password);
+       $userinfo = spotEntity ('user', $id);
+       usePreparedUpdateBlade ('UserAccount', $set_columns, array ('user_id' => $id));
+       // There is no FK to do this update as user-specific configuration is always local,
+       // but authentication may be not (the rows in UserConfig may have no matching
+       // rows in UserAccount).
+       if ($userinfo['user_name'] != $new_username)
+               usePreparedUpdateBlade ('UserConfig', array ('user' => $new_username), array('user' => $userinfo['user_name']));
 }
 
 function commitDeleteUserAccount ($id)
index 60c89d5..0ae09d0 100644 (file)
@@ -1074,17 +1074,14 @@ function createUser ()
 function updateUser ()
 {
        setFuncMessages (__FUNCTION__, array ('OK' => 6));
-       $user_id = genericAssertion ('user_id', 'natural');
-       $username = assertStringArg ('username');
-       assertStringArg ('realname', TRUE);
-       $new_password = assertStringArg ('password', TRUE);
-       $userinfo = spotEntity ('user', $user_id);
-       // Set new password only if provided.
-       $new_password = $new_password != '' ? sha1 ($new_password) : $userinfo['user_password_hash'];
-       commitUpdateUserAccount ($user_id, $username, $_REQUEST['realname'], $new_password);
-       // if user account renaming is being performed, change key value in UserConfig table
-       if ($userinfo['user_name'] !== $username)
-               usePreparedUpdateBlade ('UserConfig', array ('user' => $username), array('user' => $userinfo['user_name']));
+       $username = genericAssertion ('username', 'string');
+       commitUpdateUserAccount
+       (
+               genericAssertion ('user_id', 'natural'),
+               $username,
+               genericAssertion ('realname', 'string0'),
+               genericAssertion ('password', 'string0')
+       );
        showFuncMessage (__FUNCTION__, 'OK', array ($username));
 }