public function fetchMessagesInbox($uid, $messageId = null) { $select = new Select($this->table); $select->columns(['message_id' => 'response_to', 'thread_length' => new Expression('COUNT(`directus_messages`.`id`)')])->join('directus_messages_recipients', 'directus_messages_recipients.message_id = directus_messages.id', ['id', 'message_id', 'recipient', 'read', 'group']); $select->where->equalTo('recipient', $uid); if (!empty($messageId)) { if (gettype($messageId) == 'array') { $select->where->in('response_to', $messageId)->or->in('directus_messages.id', $messageId); } else { $select->where->nest->equalTo('response_to', $messageId)->or->equalTo('directus_messages.id', $messageId)->unnest; } } $select->group(['directus_messages_recipients.id', 'directus_messages_recipients.message_id', 'directus_messages_recipients.recipient', 'directus_messages_recipients.read', 'directus_messages_recipients.group', 'response_to', 'directus_messages.id'])->order('directus_messages.id DESC'); $result = $this->selectWith($select)->toArray(); $messageIds = []; foreach ($result as $message) { $messageIds[] = $message['message_id']; } if (sizeof($messageIds) == 0) { return []; } $result = $this->fetchMessageThreads($messageIds, $uid); if (sizeof($result) == 0) { return []; } $resultLookup = []; $ids = []; // Grab ids; foreach ($result as $item) { $ids[] = $item['id']; } $directusMessagesTableGateway = new DirectusMessagesRecipientsTableGateway($this->acl, $this->adapter); $recipients = $directusMessagesTableGateway->fetchMessageRecipients($ids); foreach ($result as $item) { $item['responses'] = ['rows' => []]; $item['recipients'] = implode(',', $recipients[$item['id']]); $resultLookup[$item['id']] = $item; } foreach ($result as $item) { if ($item['response_to'] != NULL) { // Move it to resultLookup unset($resultLookup[$item['id']]); $item = $this->parseRecord($item); $resultLookup[$item['response_to']]['responses']['rows'][] = $item; } } $result = array_values($resultLookup); foreach ($result as &$row) { $row = $this->parseRecord($row); } // Add date_updated // Update read foreach ($result as &$message) { $responses = $message['responses']['rows']; /*foreach ($responses as $response) { if($response['read'] == "0") { $message['read'] = "0"; break; } }*/ $lastResponse = end($responses); if ($lastResponse) { $message['date_updated'] = $lastResponse['datetime']; } else { $message['date_updated'] = $message['datetime']; } } return $result; }