From e2a86b74204e9d2562b0647a3b3ade391b686785 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Thu, 10 Feb 2022 16:51:30 +0100 Subject: [PATCH] Delete the user status without loading it first Signed-off-by: Joas Schilling --- apps/user_status/lib/Db/UserStatusMapper.php | 19 +++++++++++++++++++ .../user_status/lib/Service/StatusService.php | 15 ++++++--------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/apps/user_status/lib/Db/UserStatusMapper.php b/apps/user_status/lib/Db/UserStatusMapper.php index 4670c28f7f7..02f9a607bd8 100644 --- a/apps/user_status/lib/Db/UserStatusMapper.php +++ b/apps/user_status/lib/Db/UserStatusMapper.php @@ -166,4 +166,23 @@ class UserStatusMapper extends QBMapper { $qb->execute(); } + + + /** + * Deletes a user status so we can restore the backup + * + * @param string $userId + * @param string $messageId + * @param string $status + * @return bool True if an entry was deleted + */ + public function deleteCurrentStatusToRestoreBackup(string $userId, string $messageId, string $status): bool { + $qb = $this->db->getQueryBuilder(); + $qb->delete($this->tableName) + ->where($qb->expr()->eq('user_id', $qb->createNamedParameter($userId))) + ->andWhere($qb->expr()->eq('message_id', $qb->createNamedParameter($messageId))) + ->andWhere($qb->expr()->eq('status', $qb->createNamedParameter($status))) + ->andWhere($qb->expr()->eq('is_backup', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL))); + return $qb->executeStatement() > 0; + } } diff --git a/apps/user_status/lib/Service/StatusService.php b/apps/user_status/lib/Service/StatusService.php index 1f72fd8a21b..e31b1772c4d 100644 --- a/apps/user_status/lib/Service/StatusService.php +++ b/apps/user_status/lib/Service/StatusService.php @@ -468,16 +468,13 @@ class StatusService { // No user status to revert, do nothing return; } - try { - $userStatus = $this->mapper->findByUserId($userId); - if ($userStatus->getMessageId() !== $messageId || $userStatus->getStatus() !== $status) { - // Another status is set automatically, do nothing - return; - } - $this->mapper->delete($userStatus); - } catch (DoesNotExistException $ex) { - // No current status => nothing to delete + + $deleted = $this->mapper->deleteCurrentStatusToRestoreBackup($userId, $messageId ?? '', $status); + if (!$deleted) { + // Another status is set automatically or no status, do nothing + return; } + $backupUserStatus->setIsBackup(false); // Remove the underscore prefix added when creating the backup $backupUserStatus->setUserId(substr($backupUserStatus->getUserId(), 1)); -- 2.39.5