]> source.dussan.org Git - nextcloud-server.git/commitdiff
Do status and predefined message setting in one go 31106/head
authorJoas Schilling <coding@schilljs.com>
Tue, 15 Feb 2022 14:28:55 +0000 (15:28 +0100)
committerJoas Schilling <coding@schilljs.com>
Tue, 15 Feb 2022 15:06:33 +0000 (16:06 +0100)
Signed-off-by: Joas Schilling <coding@schilljs.com>
apps/user_status/lib/Connector/UserStatusProvider.php
apps/user_status/lib/Service/StatusService.php
apps/user_status/tests/Unit/Db/UserStatusMapperTest.php

index cec9406d28bfcddc174c92120ef6e81cfba549e8..46b89739f7c35f955786f5bcfb19c23c1fdd4b60 100644 (file)
@@ -57,14 +57,8 @@ class UserStatusProvider implements IProvider, ISettableProvider {
                return $userStatuses;
        }
 
-       public function setUserStatus(string $userId, string $messageId, string $status, bool $createBackup = false): void {
-               if ($createBackup) {
-                       if ($this->service->backupCurrentStatus($userId) === false) {
-                               return; // Already a status set automatically => abort.
-                       }
-               }
-               $this->service->setStatus($userId, $status, null, true);
-               $this->service->setPredefinedMessage($userId, $messageId, null);
+       public function setUserStatus(string $userId, string $messageId, string $status, bool $createBackup): void {
+               $this->service->setUserStatus($userId, $status, $messageId, $createBackup);
        }
 
        public function revertUserStatus(string $userId, string $messageId, string $status): void {
index 5cd5bb83c3a4e6604bec1981e870f36007086978..c7ad7afe3221417359ac2161bc49aff421e67ce0 100644 (file)
@@ -231,6 +231,7 @@ class StatusService {
                        $userStatus->setStatus(IUserStatus::OFFLINE);
                        $userStatus->setStatusTimestamp(0);
                        $userStatus->setIsUserDefined(false);
+                       $userStatus->setIsBackup(false);
                }
 
                if (!$this->predefinedStatusService->isValidId($messageId)) {
@@ -254,6 +255,60 @@ class StatusService {
                return $this->mapper->update($userStatus);
        }
 
+       /**
+        * @param string $userId
+        * @param string $status
+        * @param string $messageId
+        * @param bool $createBackup
+        * @throws InvalidStatusTypeException
+        * @throws InvalidMessageIdException
+        */
+       public function setUserStatus(string $userId,
+                                                                                string $status,
+                                                                                string $messageId,
+                                                                                bool $createBackup): void {
+               // Check if status-type is valid
+               if (!\in_array($status, self::PRIORITY_ORDERED_STATUSES, true)) {
+                       throw new InvalidStatusTypeException('Status-type "' . $status . '" is not supported');
+               }
+
+               if (!$this->predefinedStatusService->isValidId($messageId)) {
+                       throw new InvalidMessageIdException('Message-Id "' . $messageId . '" is not supported');
+               }
+
+               if ($createBackup) {
+                       if ($this->backupCurrentStatus($userId) === false) {
+                               return; // Already a status set automatically => abort.
+                       }
+
+                       // If we just created the backup
+                       $userStatus = new UserStatus();
+                       $userStatus->setUserId($userId);
+               } else {
+                       try {
+                               $userStatus = $this->mapper->findByUserId($userId);
+                       } catch (DoesNotExistException $ex) {
+                               $userStatus = new UserStatus();
+                               $userStatus->setUserId($userId);
+                       }
+               }
+
+               $userStatus->setStatus($status);
+               $userStatus->setStatusTimestamp($this->timeFactory->getTime());
+               $userStatus->setIsUserDefined(false);
+               $userStatus->setIsBackup(false);
+               $userStatus->setMessageId($messageId);
+               $userStatus->setCustomIcon(null);
+               $userStatus->setCustomMessage(null);
+               $userStatus->setClearAt(null);
+
+               if ($userStatus->getId() !== null) {
+                       $this->mapper->update($userStatus);
+                       return;
+               }
+               $this->mapper->insert($userStatus);
+       }
+
        /**
         * @param string $userId
         * @param string|null $statusIcon
index c48805b57afbf188394bf5485b4fc844cd06c68d..0d9f1c1f7187e0413173287ab2ea766f62668309 100644 (file)
@@ -252,6 +252,67 @@ class UserStatusMapperTest extends TestCase {
                $this->mapper->insert($userStatus3);
        }
 
+       public function dataCreateBackupStatus(): array {
+               return [
+                       [false, false, false],
+                       [true, false, true],
+                       [false, true, false],
+                       [true, true, false],
+               ];
+       }
+
+       /**
+        * @dataProvider dataCreateBackupStatus
+        * @param bool $hasStatus
+        * @param bool $hasBackup
+        * @param bool $backupCreated
+        */
+       public function testCreateBackupStatus(bool $hasStatus, bool $hasBackup, bool $backupCreated): void {
+               if ($hasStatus) {
+                       $userStatus1 = new UserStatus();
+                       $userStatus1->setUserId('user1');
+                       $userStatus1->setStatus('online');
+                       $userStatus1->setStatusTimestamp(5000);
+                       $userStatus1->setIsUserDefined(true);
+                       $userStatus1->setIsBackup(false);
+                       $userStatus1->setCustomIcon('🚀');
+                       $userStatus1->setCustomMessage('Current');
+                       $userStatus1->setClearAt(50000);
+                       $this->mapper->insert($userStatus1);
+               }
+
+               if ($hasBackup) {
+                       $userStatus1 = new UserStatus();
+                       $userStatus1->setUserId('_user1');
+                       $userStatus1->setStatus('online');
+                       $userStatus1->setStatusTimestamp(5000);
+                       $userStatus1->setIsUserDefined(true);
+                       $userStatus1->setIsBackup(true);
+                       $userStatus1->setCustomIcon('🚀');
+                       $userStatus1->setCustomMessage('Backup');
+                       $userStatus1->setClearAt(50000);
+                       $this->mapper->insert($userStatus1);
+               }
+
+               if ($hasStatus && $hasBackup) {
+                       $this->expectException(Exception::class);
+               }
+
+               self::assertSame($backupCreated, $this->mapper->createBackupStatus('user1'));
+
+               if ($backupCreated) {
+                       $user1Status = $this->mapper->findByUserId('user1', true);
+                       $this->assertEquals('_user1', $user1Status->getUserId());
+                       $this->assertEquals(true, $user1Status->getIsBackup());
+                       $this->assertEquals('Current', $user1Status->getCustomMessage());
+               } else if ($hasBackup) {
+                       $user1Status = $this->mapper->findByUserId('user1', true);
+                       $this->assertEquals('_user1', $user1Status->getUserId());
+                       $this->assertEquals(true, $user1Status->getIsBackup());
+                       $this->assertEquals('Backup', $user1Status->getCustomMessage());
+               }
+       }
+
        public function testRestoreBackupStatuses(): void {
                $userStatus1 = new UserStatus();
                $userStatus1->setUserId('_user1');