diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index 65552b84dce..07722efbe87 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -226,6 +226,7 @@ public function register(IRegistrationContext $context): void { $context->registerEventListener(AttendeesAddedEvent::class, SystemMessageListener::class); $context->registerEventListener(AttendeeRemovedEvent::class, SystemMessageListener::class); $context->registerEventListener(AttendeesRemovedEvent::class, SystemMessageListener::class); + $context->registerEventListener(AttendeesRemovedEvent::class, ChatListener::class); $context->registerEventListener(BeforeDuplicateShareSentEvent::class, SystemMessageListener::class); $context->registerEventListener(BeforeParticipantModifiedEvent::class, SystemMessageListener::class); $context->registerEventListener(BeforeShareCreatedEvent::class, SystemMessageListener::class); diff --git a/lib/Chat/Listener.php b/lib/Chat/Listener.php index 8f3ad4af7d9..970f74bef4c 100644 --- a/lib/Chat/Listener.php +++ b/lib/Chat/Listener.php @@ -9,7 +9,10 @@ namespace OCA\Talk\Chat; +use OCA\Talk\Events\AttendeesRemovedEvent; use OCA\Talk\Events\RoomDeletedEvent; +use OCA\Talk\Model\Attendee; +use OCA\Talk\Service\ReminderService; use OCA\Talk\Service\ScheduledMessageService; use OCP\EventDispatcher\Event; use OCP\EventDispatcher\IEventListener; @@ -21,6 +24,7 @@ class Listener implements IEventListener { public function __construct( private readonly ChatManager $chatManager, private readonly ScheduledMessageService $scheduledMessageService, + private readonly ReminderService $reminderService, ) { } @@ -30,5 +34,15 @@ public function handle(Event $event): void { $this->chatManager->deleteMessages($event->getRoom()); $this->scheduledMessageService->deleteMessagesByRoom($event->getRoom()); } + if ($event instanceof AttendeesRemovedEvent) { + foreach ($event->getAttendees() as $attendee) { + if ($attendee->getActorType() === Attendee::ACTOR_USERS) { + $this->reminderService->deleteAllRemindersForUser( + $attendee->getActorId(), + $event->getRoom()->getToken(), + ); + } + } + } } } diff --git a/lib/Federation/FederationManager.php b/lib/Federation/FederationManager.php index 97be7d20ca7..63e7088a278 100644 --- a/lib/Federation/FederationManager.php +++ b/lib/Federation/FederationManager.php @@ -275,4 +275,8 @@ public function getNumberOfPendingInvitationsForUser(IUser $user): int { public function getNumberOfInvitations(Room $room): int { return $this->invitationMapper->countInvitationsForLocalRoom($room); } + + public function deleteInvitationsForUser(string $userId): void { + $this->invitationMapper->deleteInvitationsForUser($userId); + } } diff --git a/lib/Listener/UserDeletedListener.php b/lib/Listener/UserDeletedListener.php index 7369c3a2a5a..7e8cf5d595a 100644 --- a/lib/Listener/UserDeletedListener.php +++ b/lib/Listener/UserDeletedListener.php @@ -8,10 +8,14 @@ namespace OCA\Talk\Listener; +use OCA\Talk\Federation\FederationManager; use OCA\Talk\Manager; use OCA\Talk\Model\Attendee; use OCA\Talk\Service\ConsentService; +use OCA\Talk\Service\ConversationTagService; +use OCA\Talk\Service\PhoneService; use OCA\Talk\Service\PollService; +use OCA\Talk\Service\ReminderService; use OCA\Talk\Service\ScheduledMessageService; use OCP\EventDispatcher\Event; use OCP\EventDispatcher\IEventListener; @@ -27,6 +31,10 @@ public function __construct( private readonly PollService $pollService, private readonly ConsentService $consentService, private readonly ScheduledMessageService $messageManager, + private readonly ConversationTagService $tagService, + private readonly PhoneService $phoneService, + private readonly ReminderService $reminderService, + private readonly FederationManager $federationManager, ) { } @@ -38,12 +46,14 @@ public function handle(Event $event): void { } $user = $event->getUser(); - $this->manager->removeUserFromAllRooms($user); + $this->manager->removeUserFromAllRooms($user); $this->pollService->neutralizeDeletedUser(Attendee::ACTOR_USERS, $user->getUID()); - $this->consentService->deleteByActor(Attendee::ACTOR_USERS, $user->getUID()); - $this->messageManager->deleteByActor(Attendee::ACTOR_USERS, $user->getUID()); + $this->tagService->deleteAllTagsByUserId($user->getUID()); + $this->phoneService->deleteByUser($user->getUID()); + $this->reminderService->deleteAllRemindersForUser($user->getUID()); + $this->federationManager->deleteInvitationsForUser($user->getUID()); } } diff --git a/lib/Model/ConversationTagMapper.php b/lib/Model/ConversationTagMapper.php index c4840ed8b7e..ca15cef4997 100644 --- a/lib/Model/ConversationTagMapper.php +++ b/lib/Model/ConversationTagMapper.php @@ -74,4 +74,11 @@ public function clearTagFromAttendees(string $tagId, string $userId): void { } $result->closeCursor(); } + + public function deleteAllByUserId(string $userId): void { + $query = $this->db->getQueryBuilder(); + $query->delete('talk_conversation_tags') + ->where($query->expr()->eq('user_id', $query->createNamedParameter($userId))); + $query->executeStatement(); + } } diff --git a/lib/Model/InvitationMapper.php b/lib/Model/InvitationMapper.php index 37e0e4c4389..64100093f5a 100644 --- a/lib/Model/InvitationMapper.php +++ b/lib/Model/InvitationMapper.php @@ -118,6 +118,13 @@ public function countInvitationsForUser(IUser $user, ?int $state = null): int { return $count; } + public function deleteInvitationsForUser(string $userId): void { + $query = $this->db->getQueryBuilder(); + $query->delete($this->getTableName()) + ->where($query->expr()->eq('user_id', $query->createNamedParameter($userId))); + $query->executeStatement(); + } + /** * @throws DoesNotExistException */ diff --git a/lib/Model/ReminderMapper.php b/lib/Model/ReminderMapper.php index b0b33b76d66..9de8b82b383 100644 --- a/lib/Model/ReminderMapper.php +++ b/lib/Model/ReminderMapper.php @@ -73,4 +73,16 @@ public function deleteExecutedReminders(\DateTime $dateTime): void { $query->executeStatement(); } + + public function deleteAllRemindersForUser(string $userId, ?string $token): void { + $query = $this->db->getQueryBuilder(); + $query->delete($this->getTableName()) + ->where($query->expr()->eq('user_id', $query->createNamedParameter($userId, IQueryBuilder::PARAM_STR))); + + if ($token !== null) { + $query->andWhere($query->expr()->eq('token', $query->createNamedParameter($token, IQueryBuilder::PARAM_STR))); + } + + $query->executeStatement(); + } } diff --git a/lib/Service/ConversationTagService.php b/lib/Service/ConversationTagService.php index ac0c5da852b..16e74646394 100644 --- a/lib/Service/ConversationTagService.php +++ b/lib/Service/ConversationTagService.php @@ -178,6 +178,10 @@ public function deleteTag(string $tagId, string $userId): void { $this->mapper->delete($tag); } + public function deleteAllTagsByUserId(string $userId): void { + $this->mapper->deleteAllByUserId($userId); + } + /** * Trim the caller-supplied name, enforce non-empty and the MAX_TAG_NAME_LENGTH cap. * diff --git a/lib/Service/ReminderService.php b/lib/Service/ReminderService.php index 574c4e1a5b5..b6a315e91a1 100644 --- a/lib/Service/ReminderService.php +++ b/lib/Service/ReminderService.php @@ -77,6 +77,10 @@ public function deleteReminder(string $userId, string $token, int $messageId): v } } + public function deleteAllRemindersForUser(string $userId, ?string $token = null): void { + $this->reminderMapper->deleteAllRemindersForUser($userId, $token); + } + public function executeReminders(\DateTime $executeBefore): void { $reminders = $this->reminderMapper->findRemindersToExecute($executeBefore);