Skip to content

Commit 56b68ce

Browse files
authored
Merge pull request #27375 from nextcloud/bugfix/noid/dont-update-offline-status
Don't update statuses to offline again and again
2 parents 92d19bd + 55c4458 commit 56b68ce

File tree

4 files changed

+47
-0
lines changed

4 files changed

+47
-0
lines changed

apps/user_status/lib/Db/UserStatusMapper.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ public function clearStatusesOlderThan(int $olderThan, int $now): void {
137137
->set('is_user_defined', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL))
138138
->set('status_timestamp', $qb->createNamedParameter($now, IQueryBuilder::PARAM_INT))
139139
->where($qb->expr()->lte('status_timestamp', $qb->createNamedParameter($olderThan, IQueryBuilder::PARAM_INT)))
140+
->andWhere($qb->expr()->neq('status', $qb->createNamedParameter(IUserStatus::OFFLINE)))
140141
->andWhere($qb->expr()->orX(
141142
$qb->expr()->eq('is_user_defined', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL), IQueryBuilder::PARAM_BOOL),
142143
$qb->expr()->eq('status', $qb->createNamedParameter(IUserStatus::ONLINE))

apps/user_status/lib/Service/StatusService.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,10 @@ private function processStatus(UserStatus $status): UserStatus {
356356
* @param UserStatus $status
357357
*/
358358
private function cleanStatus(UserStatus $status): void {
359+
if ($status->getStatus() === IUserStatus::OFFLINE && !$status->getIsUserDefined()) {
360+
return;
361+
}
362+
359363
$status->setStatus(IUserStatus::OFFLINE);
360364
$status->setStatusTimestamp($this->timeFactory->getTime());
361365
$status->setIsUserDefined(false);

apps/user_status/tests/Unit/Db/UserStatusMapperTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ public function testClearStatusesOlderThan(string $status, bool $isUserDefined,
188188

189189
public function clearStatusesOlderThanDataProvider(): array {
190190
return [
191+
['offline', false, 6000, false],
191192
['online', true, 6000, false],
192193
['online', true, 4000, true],
193194
['online', false, 6000, false],

apps/user_status/tests/Unit/Service/StatusServiceTest.php

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
use OCA\UserStatus\Service\StatusService;
3939
use OCP\AppFramework\Db\DoesNotExistException;
4040
use OCP\AppFramework\Utility\ITimeFactory;
41+
use OCP\UserStatus\IUserStatus;
4142
use Test\TestCase;
4243

4344
class StatusServiceTest extends TestCase {
@@ -624,4 +625,44 @@ public function testRemoveUserStatusDoesNotExist(): void {
624625
$actual = $this->service->removeUserStatus('john.doe');
625626
$this->assertFalse($actual);
626627
}
628+
629+
public function testCleanStatusAutomaticOnline(): void {
630+
$status = new UserStatus();
631+
$status->setStatus(IUserStatus::ONLINE);
632+
$status->setStatusTimestamp(1337);
633+
$status->setIsUserDefined(false);
634+
635+
$this->mapper->expects(self::once())
636+
->method('update')
637+
->with($status);
638+
639+
parent::invokePrivate($this->service, 'cleanStatus', [$status]);
640+
}
641+
642+
public function testCleanStatusCustomOffline(): void {
643+
$status = new UserStatus();
644+
$status->setStatus(IUserStatus::OFFLINE);
645+
$status->setStatusTimestamp(1337);
646+
$status->setIsUserDefined(true);
647+
648+
$this->mapper->expects(self::once())
649+
->method('update')
650+
->with($status);
651+
652+
parent::invokePrivate($this->service, 'cleanStatus', [$status]);
653+
}
654+
655+
public function testCleanStatusCleanedAlready(): void {
656+
$status = new UserStatus();
657+
$status->setStatus(IUserStatus::OFFLINE);
658+
$status->setStatusTimestamp(1337);
659+
$status->setIsUserDefined(false);
660+
661+
// Don't update the status again and again when no value changed
662+
$this->mapper->expects(self::never())
663+
->method('update')
664+
->with($status);
665+
666+
parent::invokePrivate($this->service, 'cleanStatus', [$status]);
667+
}
627668
}

0 commit comments

Comments
 (0)