/** * Display a listing of messages. * * @param int $chatId Chat ID * @param int|null $lastShownMessageId Last shown message ID * @param int $size Reponse size * @return Response */ public function getList($chatId, $lastShownMessageId = null, $size = 50) { if ((int) $chatId > 0) { if (!is_null($chat = Chat::find((int) $chatId)) && !ChatMember::whereRaw('chat_id = ? and user_id = ?', array($chatId, Auth::user()->id))->get()->isEmpty()) { $result = array(); $size = (int) $size > 0 ? (int) $size : 50; $unread = array(); if (is_null($lastShownMessageId)) { MessageUnread::whereRaw('chat_id = ? and user_id = ? and message_id not in (select b.message_id from messages_removed b where b.chat_id = chat_id and user_id = ' . Auth::user()->id . ')', array($chat->id, Auth::user()->id))->get()->each(function ($message) use(&$unread) { $unread[] = $message->message_id; }); } $cleared = ChatCleared::whereRaw('chat_id = ? and user_id = ?', array($chat->id, Auth::user()->id))->orderBy('message_id', 'desc')->get()->first(); $query = 'select a.* from messages a where a.chat_id = ' . $chat->id . ' and a.id not in (select b.message_id from messages_removed b where b.chat_id = a.chat_id and b.user_id = ' . Auth::user()->id . ')'; if (count($unread) > 0) { $query .= ' and a.id not in (' . implode(',', $unread) . ')'; } if ($cleared) { $query .= ' and a.id > ' . $cleared->message_id; } if (!is_null($lastShownMessageId) && (int) $lastShownMessageId > 0) { $query .= ' and a.id < ' . $lastShownMessageId; } $query .= ' order by a.timestamp desc limit ' . $size; $messages = DB::select($query); if (count($unread) > 0) { $unreadMessages = DB::table('messages')->whereRaw('chat_id = ? and id in (' . implode(',', $unread) . ')', array($chat->id))->orderBy('timestamp', 'desc'); $messages = array_merge($unreadMessages->get(), $messages); } foreach ($messages as $message) { $data = (new Message((array) $message))->getAsArray(); if (in_array($message->id, $unread)) { $data['unread'] = true; } $result['messages'][] = $data; } return $this->respond($result); } else { return $this->respondWithError('Chat doesn\'t exist'); } } else { return $this->respondWithError('Chat doesn\'t exist'); } }
private function markAsRead($chat, $user) { $deliverState = false; foreach ($chat->getMembersTokens(true) as $token) { MessageUnread::whereRaw('chat_id = ' . $chat->id)->get()->each(function ($unread) use($chat, $user, $deliverState) { if ($unread->user_id == $user->id) { $unread->delete(); Message::where('chat_id', $chat->id)->whereNull('delivered_at')->get()->map(function ($message) use($chat, $user, $deliverState) { if (!$message->delivered_at) { $message->delivered_at = Carbon::now(); } if (!$message->viewed_at) { $message->viewed_at = Carbon::now(); } $message->save(); }); } }); $state = new StateSender($token); if ($deliverState) { $state->setChatAsDelivered($chat->id, $user->id); } $state->setChatAsRead($chat->id, $user->id); $state->send(); } $this->updateCounts($chat); return $this; }