From fc9369c626f40677168606338c49c88053479fe5 Mon Sep 17 00:00:00 2001 From: christianbeeznst Date: Wed, 31 Jul 2024 17:29:27 -0500 Subject: [PATCH] Internal: Add missing sender entries in message_rel_user migration - refs BT#21887 --- .../Schema/V200/Version20240731120000.php | 61 +++++++++++++++++++ src/CoreBundle/State/MessageProcessor.php | 21 +++++-- 2 files changed, 77 insertions(+), 5 deletions(-) create mode 100644 src/CoreBundle/Migrations/Schema/V200/Version20240731120000.php diff --git a/src/CoreBundle/Migrations/Schema/V200/Version20240731120000.php b/src/CoreBundle/Migrations/Schema/V200/Version20240731120000.php new file mode 100644 index 00000000000..12eb4c85e3d --- /dev/null +++ b/src/CoreBundle/Migrations/Schema/V200/Version20240731120000.php @@ -0,0 +1,61 @@ +addSql(" + INSERT INTO message_rel_user (message_id, user_id, receiver_type, msg_read, starred) + SELECT m.id, m.user_sender_id, $senderType, false, false + FROM message m + LEFT JOIN message_rel_user mru + ON m.id = mru.message_id + AND m.user_sender_id = mru.user_id + WHERE mru.id IS NULL + "); + + // Update message status based on message_rel_user entries + $this->addSql(" + UPDATE message m + LEFT JOIN ( + SELECT message_id, COUNT(*) AS rel_count + FROM message_rel_user + WHERE receiver_type = 1 + GROUP BY message_id + ) AS mru ON m.id = mru.message_id + SET m.status = CASE + WHEN mru.rel_count IS NULL THEN 3 -- Message::MESSAGE_STATUS_DELETED + ELSE 0 -- Set to 0 or whatever the default status should be + END + "); + } + + public function down(Schema $schema): void + { + $senderType = MessageRelUser::TYPE_SENDER; + + // Remove the entries added during the migration + $this->addSql(" + DELETE FROM message_rel_user + WHERE receiver_type = $senderType + "); + } +} diff --git a/src/CoreBundle/State/MessageProcessor.php b/src/CoreBundle/State/MessageProcessor.php index d868907925a..5b4e60a1f14 100644 --- a/src/CoreBundle/State/MessageProcessor.php +++ b/src/CoreBundle/State/MessageProcessor.php @@ -64,11 +64,22 @@ public function process($data, Operation $operation, array $uriVariables = [], a if (!$user) { throw new \LogicException('User not found.'); } - $messageRelUser = new MessageRelUser(); - $messageRelUser->setMessage($message); - $messageRelUser->setReceiver($user); - $messageRelUser->setReceiverType(MessageRelUser::TYPE_SENDER); - $this->entityManager->persist($messageRelUser); + + // Check if the relationship already exists + $messageRelUserRepository = $this->entityManager->getRepository(MessageRelUser::class); + $existingRelation = $messageRelUserRepository->findOneBy([ + 'message' => $message, + 'receiver' => $user, + 'receiverType' => MessageRelUser::TYPE_SENDER + ]); + + if (!$existingRelation) { + $messageRelUser = new MessageRelUser(); + $messageRelUser->setMessage($message); + $messageRelUser->setReceiver($user); + $messageRelUser->setReceiverType(MessageRelUser::TYPE_SENDER); + $this->entityManager->persist($messageRelUser); + } if ($message->getMsgType() === Message::MESSAGE_TYPE_INBOX) { $this->saveNotificationForInboxMessage($message);