Skip to content

Commit 058d1de

Browse files
committed
Do status and predefined message setting in one go
Signed-off-by: Joas Schilling <coding@schilljs.com>
1 parent 5fcbb1c commit 058d1de

File tree

3 files changed

+118
-8
lines changed

3 files changed

+118
-8
lines changed

apps/user_status/lib/Connector/UserStatusProvider.php

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,8 @@ public function getUserStatuses(array $userIds): array {
5757
return $userStatuses;
5858
}
5959

60-
public function setUserStatus(string $userId, string $messageId, string $status, bool $createBackup = false): void {
61-
if ($createBackup) {
62-
if ($this->service->backupCurrentStatus($userId) === false) {
63-
return; // Already a status set automatically => abort.
64-
}
65-
}
66-
$this->service->setStatus($userId, $status, null, true);
67-
$this->service->setPredefinedMessage($userId, $messageId, null);
60+
public function setUserStatus(string $userId, string $messageId, string $status, bool $createBackup): void {
61+
$this->service->setUserStatus($userId, $status, $messageId, $createBackup);
6862
}
6963

7064
public function revertUserStatus(string $userId, string $messageId, string $status): void {

apps/user_status/lib/Service/StatusService.php

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ public function setPredefinedMessage(string $userId,
231231
$userStatus->setStatus(IUserStatus::OFFLINE);
232232
$userStatus->setStatusTimestamp(0);
233233
$userStatus->setIsUserDefined(false);
234+
$userStatus->setIsBackup(false);
234235
}
235236

236237
if (!$this->predefinedStatusService->isValidId($messageId)) {
@@ -254,6 +255,60 @@ public function setPredefinedMessage(string $userId,
254255
return $this->mapper->update($userStatus);
255256
}
256257

258+
/**
259+
* @param string $userId
260+
* @param string $status
261+
* @param string $messageId
262+
* @param bool $createBackup
263+
* @throws InvalidStatusTypeException
264+
* @throws InvalidMessageIdException
265+
*/
266+
public function setUserStatus(string $userId,
267+
string $status,
268+
string $messageId,
269+
bool $createBackup): void {
270+
// Check if status-type is valid
271+
if (!\in_array($status, self::PRIORITY_ORDERED_STATUSES, true)) {
272+
throw new InvalidStatusTypeException('Status-type "' . $status . '" is not supported');
273+
}
274+
275+
if (!$this->predefinedStatusService->isValidId($messageId)) {
276+
throw new InvalidMessageIdException('Message-Id "' . $messageId . '" is not supported');
277+
}
278+
279+
if ($createBackup) {
280+
if ($this->backupCurrentStatus($userId) === false) {
281+
return; // Already a status set automatically => abort.
282+
}
283+
284+
// If we just created the backup
285+
$userStatus = new UserStatus();
286+
$userStatus->setUserId($userId);
287+
} else {
288+
try {
289+
$userStatus = $this->mapper->findByUserId($userId);
290+
} catch (DoesNotExistException $ex) {
291+
$userStatus = new UserStatus();
292+
$userStatus->setUserId($userId);
293+
}
294+
}
295+
296+
$userStatus->setStatus($status);
297+
$userStatus->setStatusTimestamp($this->timeFactory->getTime());
298+
$userStatus->setIsUserDefined(false);
299+
$userStatus->setIsBackup(false);
300+
$userStatus->setMessageId($messageId);
301+
$userStatus->setCustomIcon(null);
302+
$userStatus->setCustomMessage(null);
303+
$userStatus->setClearAt(null);
304+
305+
if ($userStatus->getId() !== null) {
306+
$this->mapper->update($userStatus);
307+
return;
308+
}
309+
$this->mapper->insert($userStatus);
310+
}
311+
257312
/**
258313
* @param string $userId
259314
* @param string|null $statusIcon

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

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,67 @@ private function insertSampleStatuses(): void {
252252
$this->mapper->insert($userStatus3);
253253
}
254254

255+
public function dataCreateBackupStatus(): array {
256+
return [
257+
[false, false, false],
258+
[true, false, true],
259+
[false, true, false],
260+
[true, true, false],
261+
];
262+
}
263+
264+
/**
265+
* @dataProvider dataCreateBackupStatus
266+
* @param bool $hasStatus
267+
* @param bool $hasBackup
268+
* @param bool $backupCreated
269+
*/
270+
public function testCreateBackupStatus(bool $hasStatus, bool $hasBackup, bool $backupCreated): void {
271+
if ($hasStatus) {
272+
$userStatus1 = new UserStatus();
273+
$userStatus1->setUserId('user1');
274+
$userStatus1->setStatus('online');
275+
$userStatus1->setStatusTimestamp(5000);
276+
$userStatus1->setIsUserDefined(true);
277+
$userStatus1->setIsBackup(false);
278+
$userStatus1->setCustomIcon('🚀');
279+
$userStatus1->setCustomMessage('Current');
280+
$userStatus1->setClearAt(50000);
281+
$this->mapper->insert($userStatus1);
282+
}
283+
284+
if ($hasBackup) {
285+
$userStatus1 = new UserStatus();
286+
$userStatus1->setUserId('_user1');
287+
$userStatus1->setStatus('online');
288+
$userStatus1->setStatusTimestamp(5000);
289+
$userStatus1->setIsUserDefined(true);
290+
$userStatus1->setIsBackup(true);
291+
$userStatus1->setCustomIcon('🚀');
292+
$userStatus1->setCustomMessage('Backup');
293+
$userStatus1->setClearAt(50000);
294+
$this->mapper->insert($userStatus1);
295+
}
296+
297+
if ($hasStatus && $hasBackup) {
298+
$this->expectException(Exception::class);
299+
}
300+
301+
self::assertSame($backupCreated, $this->mapper->createBackupStatus('user1'));
302+
303+
if ($backupCreated) {
304+
$user1Status = $this->mapper->findByUserId('user1', true);
305+
$this->assertEquals('_user1', $user1Status->getUserId());
306+
$this->assertEquals(true, $user1Status->getIsBackup());
307+
$this->assertEquals('Current', $user1Status->getCustomMessage());
308+
} else if ($hasBackup) {
309+
$user1Status = $this->mapper->findByUserId('user1', true);
310+
$this->assertEquals('_user1', $user1Status->getUserId());
311+
$this->assertEquals(true, $user1Status->getIsBackup());
312+
$this->assertEquals('Backup', $user1Status->getCustomMessage());
313+
}
314+
}
315+
255316
public function testRestoreBackupStatuses(): void {
256317
$userStatus1 = new UserStatus();
257318
$userStatus1->setUserId('_user1');

0 commit comments

Comments
 (0)