Browse Source

fix(chat): Mark notifications read when setting the readmarker to the end

Signed-off-by: Joas Schilling <coding@schilljs.com>
pull/11861/head
Joas Schilling 2 years ago
parent
commit
5f8c5e8e45
No known key found for this signature in database GPG Key ID: 74434EFE0D2E2205
  1. 11
      lib/Controller/ChatController.php
  2. 4
      tests/integration/features/federation/chat.feature
  3. 4
      tests/php/Controller/ChatControllerTest.php

11
lib/Controller/ChatController.php

@ -30,6 +30,7 @@ use OCA\Talk\Chat\AutoComplete\SearchPlugin;
use OCA\Talk\Chat\AutoComplete\Sorter;
use OCA\Talk\Chat\ChatManager;
use OCA\Talk\Chat\MessageParser;
use OCA\Talk\Chat\Notifier;
use OCA\Talk\Chat\ReactionManager;
use OCA\Talk\Exceptions\CannotReachRemoteException;
use OCA\Talk\Federation\Authenticator;
@ -130,6 +131,7 @@ class ChatController extends AEnvironmentAwareController {
private IL10N $l,
protected Authenticator $federationAuthenticator,
protected ProxyCacheMessageService $pcmService,
protected Notifier $notifier,
) {
parent::__construct($appName, $request);
}
@ -1086,14 +1088,19 @@ class ChatController extends AEnvironmentAwareController {
#[PublicPage]
#[RequireAuthenticatedParticipant]
public function setReadMarker(?int $lastReadMessage = null): DataResponse {
$setToMessage = $lastReadMessage ?? $this->room->getLastMessageId();
if ($setToMessage === $this->room->getLastMessageId()
&& $this->participant->getAttendee()->getActorType() === Attendee::ACTOR_USERS) {
$this->notifier->markMentionNotificationsRead($this->room, $this->participant->getAttendee()->getActorId());
}
if ($this->room->isFederatedConversation()) {
/** @var \OCA\Talk\Federation\Proxy\TalkV1\Controller\ChatController $proxy */
$proxy = \OCP\Server::get(\OCA\Talk\Federation\Proxy\TalkV1\Controller\ChatController::class);
return $proxy->setReadMarker($this->room, $this->participant, $this->getResponseFormat(), $lastReadMessage);
}
$lastReadMessage = $lastReadMessage ?? $this->room->getLastMessageId();
$this->participantService->updateLastReadMessage($this->participant, $lastReadMessage);
$this->participantService->updateLastReadMessage($this->participant, $setToMessage);
$attendee = $this->participant->getAttendee();
$headers = $lastCommonRead = [];

4
tests/integration/features/federation/chat.feature

@ -255,9 +255,13 @@ Feature: federation/chat
Given user "participant2" leaves room "LOCAL::room" with 200 (v4)
And user "guest" joins room "room" with 200 (v4)
When user "guest" sends message 'Hi @"federated_user/participant2@{$REMOTE_URL}" bye' to room "room" with 201
When user "guest" sends message "Message 2" to room "room" with 201
Then user "participant2" has the following notifications
| app | object_type | object_id | subject | message |
| spreed | chat | room/Hi @"federated_user/participant2@{$REMOTE_URL}" bye | A guest mentioned you in conversation room | Hi @participant2-displayname bye |
Then user "participant2" reads message "Message 2" in room "LOCAL::room" with 200 (v1)
Then user "participant2" has the following notifications
| app | object_type | object_id | subject | message |
Scenario: Mentioning a federated user as a federated user that is a local user to the mentioned one also triggers a notification for them
Given the following "spreed" app config is set

4
tests/php/Controller/ChatControllerTest.php

@ -26,6 +26,7 @@ namespace OCA\Talk\Tests\php\Controller;
use OCA\Talk\Chat\AutoComplete\SearchPlugin;
use OCA\Talk\Chat\ChatManager;
use OCA\Talk\Chat\MessageParser;
use OCA\Talk\Chat\Notifier;
use OCA\Talk\Chat\ReactionManager;
use OCA\Talk\Controller\ChatController;
use OCA\Talk\Federation\Authenticator;
@ -117,6 +118,7 @@ class ChatControllerTest extends TestCase {
private $l;
private Authenticator|MockObject $federationAuthenticator;
private ProxyCacheMessageService|MockObject $pcmService;
private Notifier|MockObject $notifier;
/** @var Room|MockObject */
protected $room;
@ -157,6 +159,7 @@ class ChatControllerTest extends TestCase {
$this->l = $this->createMock(IL10N::class);
$this->federationAuthenticator = $this->createMock(Authenticator::class);
$this->pcmService = $this->createMock(ProxyCacheMessageService::class);
$this->notifier = $this->createMock(Notifier::class);
$this->room = $this->createMock(Room::class);
@ -202,6 +205,7 @@ class ChatControllerTest extends TestCase {
$this->l,
$this->federationAuthenticator,
$this->pcmService,
$this->notifier,
);
}

Loading…
Cancel
Save