diff --git a/src/Entity/Builder/PrivateMessageThreadViewBuilder.php b/src/Entity/Builder/PrivateMessageThreadViewBuilder.php index c4fb19d..b05b080 100644 --- a/src/Entity/Builder/PrivateMessageThreadViewBuilder.php +++ b/src/Entity/Builder/PrivateMessageThreadViewBuilder.php @@ -103,7 +103,15 @@ class PrivateMessageThreadViewBuilder extends EntityViewBuilder { $last_access_time = $entity->getLastAccessTimestamp($this->currentUser); $newest_message_timestamp = $entity->getNewestMessageCreationTimestamp(); - if ($last_access_time <= $newest_message_timestamp) { + $messages = $entity->getMessages(); + + foreach ($messages as $message) { + if ($message->getCreatedTime() == $newest_message_timestamp) { + break; + } + } + + if ($last_access_time <= $newest_message_timestamp && $message->getOwnerId() != $this->currentUser->id()) { $classes[] = 'unread-thread'; } diff --git a/src/Mapper/PrivateMessageMapper.php b/src/Mapper/PrivateMessageMapper.php index bc36827..2a4e631 100644 --- a/src/Mapper/PrivateMessageMapper.php +++ b/src/Mapper/PrivateMessageMapper.php @@ -250,10 +250,18 @@ class PrivateMessageMapper implements PrivateMessageMapperInterface { */ public function getUnreadThreadCount($uid, $lastCheckTimestamp) { return $this->database->query( - 'SELECT COUNT(thread.id) FROM {private_message_threads} AS thread JOIN ' . - '{private_message_thread__members} AS member ' . + 'SELECT COUNT(DISTINCT thread.id) FROM {private_messages} AS message ' . + 'JOIN {private_message_thread__private_messages} AS thread_message ' . + 'ON message.id = thread_message.private_messages_target_id ' . + 'JOIN {private_message_threads} AS thread ' . + 'ON thread_message.entity_id = thread.id ' . + 'JOIN {private_message_thread__members} AS member ' . 'ON member.entity_id = thread.id AND member.members_target_id = :uid ' . - 'WHERE thread.updated > :timestamp', + 'JOIN {private_message_thread__last_access_time} AS last_access ' . + 'ON last_access.entity_id = thread.id ' . + 'JOIN {pm_thread_access_time} as access_time ' . + 'ON access_time.id = last_access.last_access_time_target_id AND access_time.owner = :uid AND access_time.access_time < thread.updated ' . + 'WHERE thread.updated > :timestamp AND message.created > :timestamp AND message.owner <> :uid', [ ':uid' => $uid, ':timestamp' => $lastCheckTimestamp,