/**
  * 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');
     }
 }
Beispiel #2
0
 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;
 }