diff options
author | Joas Schilling <coding@schilljs.com> | 2022-05-27 11:28:59 +0200 |
---|---|---|
committer | Joas Schilling <coding@schilljs.com> | 2022-05-27 11:32:53 +0200 |
commit | 1429a9a8ef9c65493e0c9276c4cc5f8b8cf94bc2 (patch) | |
tree | a2df0b1ca7fed35bc368e09854e4f25c8136aa15 /apps | |
parent | 9ad5b301ce716d4033e9cbc549aff2a43d5022f5 (diff) | |
download | nextcloud-server-1429a9a8ef9c65493e0c9276c4cc5f8b8cf94bc2.tar.gz nextcloud-server-1429a9a8ef9c65493e0c9276c4cc5f8b8cf94bc2.zip |
Also reset the status on clearAt
When you set yourself to "DND - In a meeting" for one hour,
the expectation is that you are also "online"/normal again
when the meeting is over. So we extend the logic to also include
the status itself to be reverted.
Signed-off-by: Joas Schilling <coding@schilljs.com>
Diffstat (limited to 'apps')
8 files changed, 19 insertions, 26 deletions
diff --git a/apps/user_status/lib/BackgroundJob/ClearOldStatusesBackgroundJob.php b/apps/user_status/lib/BackgroundJob/ClearOldStatusesBackgroundJob.php index 0d8f5ac431b..8f2ef421597 100644 --- a/apps/user_status/lib/BackgroundJob/ClearOldStatusesBackgroundJob.php +++ b/apps/user_status/lib/BackgroundJob/ClearOldStatusesBackgroundJob.php @@ -61,7 +61,7 @@ class ClearOldStatusesBackgroundJob extends TimedJob { protected function run($argument) { $now = $this->time->getTime(); - $this->mapper->clearMessagesOlderThan($now); + $this->mapper->clearOlderThanClearAt($now); $this->mapper->clearStatusesOlderThan($now - StatusService::INVALIDATE_STATUS_THRESHOLD, $now); } } diff --git a/apps/user_status/lib/Controller/UserStatusController.php b/apps/user_status/lib/Controller/UserStatusController.php index 8708a7c2aac..214dc21f453 100644 --- a/apps/user_status/lib/Controller/UserStatusController.php +++ b/apps/user_status/lib/Controller/UserStatusController.php @@ -135,7 +135,7 @@ class UserStatusController extends OCSController { * @NoAdminRequired * * @param string|null $statusIcon - * @param string $message + * @param string|null $message * @param int|null $clearAt * @return DataResponse * @throws OCSBadRequestException @@ -144,7 +144,7 @@ class UserStatusController extends OCSController { ?string $message, ?int $clearAt): DataResponse { try { - if ($message !== null && $message !== '') { + if (($message !== null && $message !== '') || ($clearAt !== null && $clearAt !== 0)) { $status = $this->service->setCustomMessage($this->userId, $statusIcon, $message, $clearAt); } else { $this->service->clearMessage($this->userId); diff --git a/apps/user_status/lib/Db/UserStatusMapper.php b/apps/user_status/lib/Db/UserStatusMapper.php index f67cfcd472d..10939116a53 100644 --- a/apps/user_status/lib/Db/UserStatusMapper.php +++ b/apps/user_status/lib/Db/UserStatusMapper.php @@ -145,13 +145,9 @@ class UserStatusMapper extends QBMapper { * * @param int $timestamp */ - public function clearMessagesOlderThan(int $timestamp): void { + public function clearOlderThanClearAt(int $timestamp): void { $qb = $this->db->getQueryBuilder(); - $qb->update($this->tableName) - ->set('message_id', $qb->createNamedParameter(null)) - ->set('custom_icon', $qb->createNamedParameter(null)) - ->set('custom_message', $qb->createNamedParameter(null)) - ->set('clear_at', $qb->createNamedParameter(null)) + $qb->delete($this->tableName) ->where($qb->expr()->isNotNull('clear_at')) ->andWhere($qb->expr()->lte('clear_at', $qb->createNamedParameter($timestamp, IQueryBuilder::PARAM_INT))); diff --git a/apps/user_status/lib/Service/StatusService.php b/apps/user_status/lib/Service/StatusService.php index 9bf448d9de8..858db48f31f 100644 --- a/apps/user_status/lib/Service/StatusService.php +++ b/apps/user_status/lib/Service/StatusService.php @@ -302,7 +302,7 @@ class StatusService { /** * @param string $userId * @param string|null $statusIcon - * @param string $message + * @param string|null $message * @param int|null $clearAt * @return UserStatus * @throws InvalidClearAtException @@ -311,7 +311,7 @@ class StatusService { */ public function setCustomMessage(string $userId, ?string $statusIcon, - string $message, + ?string $message, ?int $clearAt): UserStatus { try { $userStatus = $this->mapper->findByUserId($userId); @@ -328,7 +328,7 @@ class StatusService { throw new InvalidStatusIconException('Status-Icon is longer than one character'); } // Check for maximum length of custom message - if (\mb_strlen($message) > self::MAXIMUM_MESSAGE_LENGTH) { + if ($message !== null && \mb_strlen($message) > self::MAXIMUM_MESSAGE_LENGTH) { throw new StatusMessageTooLongException('Message is longer than supported length of ' . self::MAXIMUM_MESSAGE_LENGTH . ' characters'); } // Check that clearAt is in the future @@ -432,6 +432,7 @@ class StatusService { $this->cleanStatus($status); } if ($clearAt !== null && $clearAt < $this->timeFactory->getTime()) { + $this->cleanStatus($status); $this->cleanStatusMessage($status); } if ($status->getMessageId() !== null) { diff --git a/apps/user_status/src/components/ClearAtSelect.vue b/apps/user_status/src/components/ClearAtSelect.vue index 09e0068f87f..d0a88ea8255 100644 --- a/apps/user_status/src/components/ClearAtSelect.vue +++ b/apps/user_status/src/components/ClearAtSelect.vue @@ -22,7 +22,7 @@ <template> <div class="clear-at-select"> <span class="clear-at-select__label"> - {{ $t('user_status', 'Clear status message after') }} + {{ $t('user_status', 'Clear status after') }} </span> <Multiselect label="label" :value="option" diff --git a/apps/user_status/tests/Unit/BackgroundJob/ClearOldStatusesBackgroundJobTest.php b/apps/user_status/tests/Unit/BackgroundJob/ClearOldStatusesBackgroundJobTest.php index 2cf9b7d1bd4..da3b342f1a7 100644 --- a/apps/user_status/tests/Unit/BackgroundJob/ClearOldStatusesBackgroundJobTest.php +++ b/apps/user_status/tests/Unit/BackgroundJob/ClearOldStatusesBackgroundJobTest.php @@ -53,7 +53,7 @@ class ClearOldStatusesBackgroundJobTest extends TestCase { public function testRun() { $this->mapper->expects($this->once()) - ->method('clearMessagesOlderThan') + ->method('clearOlderThanClearAt') ->with(1337); $this->mapper->expects($this->once()) ->method('clearStatusesOlderThan') diff --git a/apps/user_status/tests/Unit/Controller/UserStatusControllerTest.php b/apps/user_status/tests/Unit/Controller/UserStatusControllerTest.php index 916f5447ea4..e4d2ab61eee 100644 --- a/apps/user_status/tests/Unit/Controller/UserStatusControllerTest.php +++ b/apps/user_status/tests/Unit/Controller/UserStatusControllerTest.php @@ -315,7 +315,8 @@ class UserStatusControllerTest extends TestCase { public function setCustomMessageDataProvider(): array { return [ ['👨🏽💻', 'Busy developing the status feature', 500, true, false, null, false, null], - ['👨🏽💻', '', 500, true, false, null, false, null, true], + ['👨🏽💻', '', 500, true, false, null, false, null, false], + ['👨🏽💻', '', 0, true, false, null, false, null, true], ['👨🏽💻', 'Busy developing the status feature', 500, false, true, new InvalidClearAtException('Original exception message'), true, 'New user-status for "john.doe" was rejected due to an invalid clearAt value "500"'], ['👨🏽💻', 'Busy developing the status feature', 500, false, true, new InvalidStatusIconException('Original exception message'), true, diff --git a/apps/user_status/tests/Unit/Db/UserStatusMapperTest.php b/apps/user_status/tests/Unit/Db/UserStatusMapperTest.php index 0d9f1c1f718..577277cfd61 100644 --- a/apps/user_status/tests/Unit/Db/UserStatusMapperTest.php +++ b/apps/user_status/tests/Unit/Db/UserStatusMapperTest.php @@ -28,6 +28,7 @@ namespace OCA\UserStatus\Tests\Db; use OCA\UserStatus\Db\UserStatus; use OCA\UserStatus\Db\UserStatusMapper; +use OCP\AppFramework\Db\DoesNotExistException; use OCP\DB\Exception; use Test\TestCase; @@ -204,22 +205,16 @@ class UserStatusMapperTest extends TestCase { ]; } - public function testClearMessagesOlderThan(): void { + public function testClearOlderThanClearAt(): void { $this->insertSampleStatuses(); - $this->mapper->clearMessagesOlderThan(55000); + $this->mapper->clearOlderThanClearAt(55000); $allStatuses = $this->mapper->findAll(); - $this->assertCount(3, $allStatuses); + $this->assertCount(2, $allStatuses); - $user1Status = $this->mapper->findByUserId('user1'); - $this->assertEquals('user1', $user1Status->getUserId()); - $this->assertEquals('dnd', $user1Status->getStatus()); - $this->assertEquals(5000, $user1Status->getStatusTimestamp()); - $this->assertEquals(true, $user1Status->getIsUserDefined()); - $this->assertEquals(null, $user1Status->getCustomIcon()); - $this->assertEquals(null, $user1Status->getCustomMessage()); - $this->assertEquals(null, $user1Status->getClearAt()); + $this->expectException(DoesNotExistException::class); + $this->mapper->findByUserId('user1'); } private function insertSampleStatuses(): void { |