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>tags/v25.0.0beta1
@@ -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); | |||
} | |||
} |
@@ -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); |
@@ -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))); | |||
@@ -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) { |
@@ -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" |
@@ -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') |
@@ -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, |
@@ -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 { |