diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 13639c912..8c29e14da 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -1103,14 +1103,23 @@ App::patch('/v1/account/email') // TODO after this user needs to confirm mail again - $user = $projectDB->updateDocument(\array_merge( + if (!$isAnonymousUser) { + // Remove previous unique ID. + $projectDB->deleteUniqueKey(\md5($user->getArrayCopy()['$collection'].':'.'email'.'='.$user->getAttribute('email'))); + } + + $document = (\array_merge( $user->getArrayCopy(), ($isAnonymousUser ? [ 'password' => Auth::passwordHash($password) ] : []), [ 'email' => $email, 'emailVerification' => false, ] - )); + )); + + $user = $projectDB->updateDocument($document, ['email' => $email]); + + $projectDB->addUniqueKey(\md5($document['$collection'].':'.'email'.'='.$email)); if (false === $user) { throw new Exception('Failed saving user to DB', 500); diff --git a/src/Appwrite/Database/Adapter.php b/src/Appwrite/Database/Adapter.php index 6e14365f8..0bfac77e1 100644 --- a/src/Appwrite/Database/Adapter.php +++ b/src/Appwrite/Database/Adapter.php @@ -91,12 +91,21 @@ abstract class Adapter /** * Delete Unique Key. * - * @param int $key + * @param String $key * * @return array */ abstract public function deleteUniqueKey($key); + /** + * Add Unique Key. + * + * @param String $key + * + * @return array + */ + abstract public function addUniqueKey($key); + /** * Create Namespace. * diff --git a/src/Appwrite/Database/Adapter/MySQL.php b/src/Appwrite/Database/Adapter/MySQL.php index 37d07c3a2..d179291ed 100644 --- a/src/Appwrite/Database/Adapter/MySQL.php +++ b/src/Appwrite/Database/Adapter/MySQL.php @@ -360,7 +360,7 @@ class MySQL extends Adapter /** * Delete Unique Key. * - * @param int $key + * @param String $key * * @return array * @@ -377,6 +377,31 @@ class MySQL extends Adapter return []; } + /** + * Add Unique Key. + * + * @param String $key + * + * @return array + * + * @throws Exception + */ + + public function addUniqueKey($key) + { + $st = $this->getPDO()->prepare('INSERT INTO `'.$this->getNamespace().'.database.unique` + SET `key` = :key; + '); + + $st->bindValue(':key', $key, PDO::PARAM_STR); + + if (!$st->execute()) { + throw new Duplicate('Duplicated Property: '.$key); + } + + return []; + } + /** * Create Relation. * diff --git a/src/Appwrite/Database/Adapter/Redis.php b/src/Appwrite/Database/Adapter/Redis.php index a1e440112..0a72f8b4b 100644 --- a/src/Appwrite/Database/Adapter/Redis.php +++ b/src/Appwrite/Database/Adapter/Redis.php @@ -169,6 +169,22 @@ class Redis extends Adapter return $data; } + /** + * Add Unique Key. + * + * @param $key + * + * @return array + * + * @throws Exception + */ + public function addUniqueKey($key) + { + $data = $this->adapter->addUniqueKey($key); + + return $data; + } + /** * Create Namespace. * diff --git a/src/Appwrite/Database/Database.php b/src/Appwrite/Database/Database.php index d0defdec0..bf1033eb8 100644 --- a/src/Appwrite/Database/Database.php +++ b/src/Appwrite/Database/Database.php @@ -370,6 +370,18 @@ class Database return new Document($this->adapter->deleteUniqueKey($key)); } + /** + * @param int $key + * + * @return Document|false + * + * @throws AuthorizationException + */ + public function addUniqueKey($key) + { + return new Document($this->adapter->addUniqueKey($key)); + } + /** * @return array */