Skip to content

Commit

Permalink
Merge pull request #43107 from nextcloud/backport/42896/stable28
Browse files Browse the repository at this point in the history
[stable28] fix(userstatus): CALL status should overwrite MEETING status
  • Loading branch information
nickvergessen authored Jan 25, 2024
2 parents 4d43b6e + aa24c67 commit ddc22c8
Show file tree
Hide file tree
Showing 3 changed files with 110 additions and 25 deletions.
35 changes: 19 additions & 16 deletions apps/dav/lib/CalDAV/Status/StatusService.php
Original file line number Diff line number Diff line change
Expand Up @@ -77,12 +77,13 @@ public function processCalendarStatus(string $userId): void {
return;
}

$userStatusTimestamp = null;
$currentStatus = null;
try {
$currentStatus = $this->userStatusService->findByUserId($userId);
$userStatusTimestamp = $currentStatus->getIsUserDefined() ? $currentStatus->getStatusTimestamp() : null;
// Was the status set by anything other than the calendar automation?
$userStatusTimestamp = $currentStatus->getIsUserDefined() && $currentStatus->getMessageId() !== IUserStatus::MESSAGE_CALENDAR_BUSY ? $currentStatus->getStatusTimestamp() : null;
} catch (DoesNotExistException) {
$userStatusTimestamp = null;
$currentStatus = null;
}

if($currentStatus !== null && $currentStatus->getMessageId() === IUserStatus::MESSAGE_CALL
Expand Down Expand Up @@ -123,19 +124,21 @@ public function processCalendarStatus(string $userId): void {
return;
}

// One event that fulfills all status conditions is enough
// 1. Not an OOO event
// 2. Current user status was not set after the start of this event
// 3. Event is not set to be transparent
$count = count($applicableEvents);
$this->logger->debug("Found $count applicable event(s), changing user status", ['user' => $userId]);
$this->userStatusService->setUserStatus(
$userId,
IUserStatus::AWAY,
IUserStatus::MESSAGE_CALENDAR_BUSY,
true
);

// Only update the status if it's neccesary otherwise we mess up the timestamp
if($currentStatus === null || $currentStatus->getMessageId() !== IUserStatus::MESSAGE_CALENDAR_BUSY) {
// One event that fulfills all status conditions is enough
// 1. Not an OOO event
// 2. Current user status (that is not a calendar status) was not set after the start of this event
// 3. Event is not set to be transparent
$count = count($applicableEvents);
$this->logger->debug("Found $count applicable event(s), changing user status", ['user' => $userId]);
$this->userStatusService->setUserStatus(
$userId,
IUserStatus::AWAY,
IUserStatus::MESSAGE_CALENDAR_BUSY,
true
);
}
}

private function getCalendarEvents(User $user): array {
Expand Down
33 changes: 24 additions & 9 deletions apps/user_status/lib/Service/StatusService.php
Original file line number Diff line number Diff line change
Expand Up @@ -172,8 +172,6 @@ public function setStatus(string $userId,
throw new InvalidStatusTypeException('Status-type "' . $status . '" is not supported');
}



if ($statusTimestamp === null) {
$statusTimestamp = $this->timeFactory->getTime();
}
Expand Down Expand Up @@ -257,21 +255,38 @@ public function setUserStatus(string $userId,
throw new InvalidMessageIdException('Message-Id "' . $messageId . '" is not supported');
}

try {
$userStatus = $this->mapper->findByUserId($userId);
} catch (DoesNotExistException $e) {
// We don't need to do anything
$userStatus = new UserStatus();
$userStatus->setUserId($userId);
}

// CALL trumps CALENDAR status, but we don't need to do anything but overwrite the message
if ($userStatus->getMessageId() === IUserStatus::MESSAGE_CALENDAR_BUSY && $messageId === IUserStatus::MESSAGE_CALL) {
$userStatus->setStatus($status);
$userStatus->setStatusTimestamp($this->timeFactory->getTime());
$userStatus->setIsUserDefined(true);
$userStatus->setIsBackup(false);
$userStatus->setMessageId($messageId);
$userStatus->setCustomIcon(null);
$userStatus->setCustomMessage($customMessage);
$userStatus->setClearAt(null);
$userStatus->setStatusMessageTimestamp($this->timeFactory->now()->getTimestamp());
return $this->mapper->update($userStatus);
}

if ($createBackup) {
if ($this->backupCurrentStatus($userId) === false) {
return null; // Already a status set automatically => abort.
}

// If we just created the backup
// we need to create a new status to insert
// Unfortunatley there's no way to unset the DB ID on an Entity
$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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,73 @@ public function testCreateRestoreBackupAutomatically(): void {
);
}

public function testCallOverwritesMeetingStatus(): void {
$this->service->setStatus(
'test123',
IUserStatus::ONLINE,
null,
false,
);
$this->service->setUserStatus(
'test123',
IUserStatus::AWAY,
IUserStatus::MESSAGE_CALENDAR_BUSY,
true,
);
self::assertSame(
'meeting',
$this->service->findByUserId('test123')->getMessageId(),
);

$this->service->setUserStatus(
'test123',
IUserStatus::AWAY,
IUserStatus::MESSAGE_CALL,
true,
);
self::assertSame(
IUserStatus::AWAY,
$this->service->findByUserId('test123')->getStatus(),
);

self::assertSame(
IUserStatus::MESSAGE_CALL,
$this->service->findByUserId('test123')->getMessageId(),
);
}

public function testOtherAutomationsDoNotOverwriteEachOther(): void {
$this->service->setStatus(
'test123',
IUserStatus::ONLINE,
null,
false,
);
$this->service->setUserStatus(
'test123',
IUserStatus::AWAY,
IUserStatus::MESSAGE_CALENDAR_BUSY,
true,
);
self::assertSame(
'meeting',
$this->service->findByUserId('test123')->getMessageId(),
);

$nostatus = $this->service->setUserStatus(
'test123',
IUserStatus::AWAY,
IUserStatus::MESSAGE_AVAILABILITY,
true,
);

self::assertNull($nostatus);
self::assertSame(
IUserStatus::MESSAGE_CALENDAR_BUSY,
$this->service->findByUserId('test123')->getMessageId(),
);
}

public function testCi(): void {
// TODO: remove if CI turns red
self::assertTrue(false);
Expand Down

0 comments on commit ddc22c8

Please sign in to comment.