id], ['receiver_id','=',$request->receiver_id] ])->orWhere([ ['sender_id','=',$request->receiver_id], ['receiver_id','=',$user->id] ])->first(); if(!$messageThread) { $messageThread = new MessagesThreads(); $messageThread->sender_id = $user->id; $messageThread->receiver_id = $request->receiver_id; $messageThread->created_at = Carbon::now(); $messageThread->updated_at = Carbon::now(); $messageThread->save(); } $message = new Messages(); $message->message_thread_id = $messageThread->id; $message->user_id = $user->id; $message->message = $request->message; $message->created_at = Carbon::now(); $message->updated_at = Carbon::now(); $message->save(); // For getting unread messages count $userUnreadMessageCount = User::where('id', $request->receiver_id)->first(); $userUnreadMessageCount->increment('unread_message_count',1); $data = []; $tokens = UserDeviceToken::where('user_id',$request->receiver_id)->get()->toArray(); if($tokens && $tokens > 0) { foreach ($tokens as $token) { $data['notId'] = $message->id ?? 1; $data['userToken'] = $token['token'] ?? ''; $data['title'] = $user->name ?? "New Message"; $data['body'] = $request->message; $data['image'] = ($user->avatar) ? $user->avatar : url('/') . '/media/avatars/avatar0.jpg'; $extraData = []; $extraData['id'] = $messageThread->id; $extraData['avatar'] = ($user->avatar) ? $user->avatar : ''; $extraData['avatar_url'] = ($user->avatar) ? $user->avatar : url('/') . '/media/avatars/avatar0.jpg'; $extraData['user_id'] = $user->id; $extraData['name'] = $user->name ?? ''; $extraData['unread_count'] = messagesCounter($request->receiver_id); $extraData['message'] = $request->message; $extraData['created_at'] = date('Y/m/d H:i:s'); $extraData['os'] = $token['os'] ? getPlatform($token['os']) : ''; $extraData['type'] = 'NewMessage'; $data['extraData'] = $extraData ?? []; $this->pushNotification($data, $extraData); } } if($message){ $response['status'] = 200; $response['data'] = $data; $response['message'] = trans('auth.message.sent'); }else{ $response['message'] = trans('auth.message.sent'); $response['status'] = 200; } } } catch (\Exception $ex) { Log::error($ex); $response['message'] = trans('auth.something_went_wrong'); $response['status'] = 403; } return $response; } /** * @param $request * @return array */ public function messageThreadList($request) { $response = []; try { $user = loggedInUser(); if ($user) { // Make unread message count to 0 $userUnreadMessageCount = User::find($user->id); if ($userUnreadMessageCount && $userUnreadMessageCount->unread_message_count != 0) { $userUnreadMessageCount->unread_message_count = 0; $userUnreadMessageCount->save(); } $messageThreads = DB::table('message_threads as mt') ->leftJoin('users', function ($query) { $query->whereRaw('( CASE WHEN mt.sender_id = ' . loggedInUser()->id . ' THEN mt.receiver_id = users.id WHEN mt.receiver_id = ' . loggedInUser()->id . ' THEN mt.sender_id = users.id END )'); }) ->leftJoin('messages as m', function ($query) { $query->on('m.message_thread_id', '=', 'mt.id') ->where('m.created_at', '=', DB::raw("(select created_at from messages where message_thread_id = mt.id order by created_at DESC limit 1)")); }) ->select( 'mt.id', 'users.id as user_id', 'users.avatar', 'users.name', DB::raw('REPLACE(m.created_at, "-","/") as created_at'), 'm.message', DB::raw('( SELECT COUNT(m.id) FROM messages as m WHERE m.user_id != ' . loggedInUser()->id . ' AND m.message_thread_id = mt.id AND m.status = "0" ) AS unread_count') ); if (isset($request->name) && !empty($request->name)) { $messageThreads = $messageThreads->where('users.name', 'LIKE', "%{$request->name}%"); } $messageThreads = $messageThreads->where(function ($q) { return $q->where('receiver_id', loggedInUser()->id) ->orWhere('sender_id', loggedInUser()->id); }) ->groupBy('mt.id') ->orderBy('m.created_at', 'DESC') ->paginate($request->perPage ?? 20); foreach ($messageThreads->items() as $key => $value) { if($value->avatar) { $value->avatar_url = getImage($value->avatar, Constant::USER_IMAGE_UPLOAD_PATH, ''); } } $response['data'] = $messageThreads; $response['status'] = 200; } } catch (\Exception $ex) { Log::error($ex); $response['message'] = trans('auth.something_went_wrong'); $response['status'] = 403; } return $response; } /** * @param $request * @return array */ public function messageList($request) { $response = []; try{ $user = loggedInUser(); if($user){ if (isset($request->id)) { $messageThread = MessagesThreads::where([ 'id' => $request->id ])->first(); } else if (isset($request->user_id)) { $messageThread = MessagesThreads::where([ ['sender_id','=',$user->id], ['receiver_id','=',$request->user_id] ])->orWhere([ ['sender_id','=',$request->user_id], ['receiver_id','=',$user->id] ])->first(); } if($messageThread) { $messages = Messages::where('message_thread_id', '=', $messageThread->id) ->select('user_id', 'message','created_at') ->latest() ->paginate($request->perPage ?? 20); messageNotificationStatusUpdate($user->id,$messageThread->id); } else { $messages = []; } $response['data'] = $messages; $response['status'] = 200; } } catch (\Exception $ex) { Log::error($ex); $response['message'] = trans('auth.something_went_wrong'); $response['status'] = 403; } return $response; } /** * @param $data * @param $id * @return array */ public function searchMessage($data,$id) { $response = []; try{ $user = loggedInUser(); if($user){ $messageThread = MessagesThreads::where([ ['sender_id','=',$user->id], ['receiver_id','=',$id] ])->orWhere([ ['sender_id','=',$id], ['receiver_id','=',$user->id] ])->first(); if($messageThread) { $messages = Messages::where('message_thread_id', '=', $messageThread->id) ->select('user_id', 'message', 'created_at'); } if(!empty($data['message'])){ $messages = $messages->where('message','like','%'.$data['message'].'%'); } $searchMessage = $messages->get(); $response['status'] = 200; $response['message'] = $searchMessage; }else{ $response['message'] = trans('auth.something_went_wrong'); $response['status'] = 401; } } catch (\Exception $ex) { Log::error($ex); $response['message'] = trans('auth.something_went_wrong'); $response['status'] = 401; } return $response; } /** * @param $messageThreadId * @return array */ public function clearMessageConversation($messageThreadId) { $response = []; $user = User::where('id', $messageThreadId)->first(); try{ $messageThread = MessagesThreads::where([ ['sender_id','=',loggedInUser()->id], ['receiver_id','=',$messageThreadId] ])->orWhere([ ['sender_id','=',$messageThreadId], ['receiver_id','=',loggedInUser()->id] ])->first(); if($messageThread) { $deleteMessageThread = Messages::where('message_thread_id', '=', $messageThread->id) ->select('user_id', 'message', 'created_at') ->delete(); } if($deleteMessageThread){ $response['message'] = trans('auth.message.clear',['username' => $user->name]); $response['status'] = 200; }else{ $response['message'] = trans('auth.no_record_found'); $response['status'] = 404; } } catch (\Exception $ex) { Log::error($ex); $response['message'] = trans('auth.something_went_wrong'); $response['status'] = 401; } return $response; } /** * @param $messageThreadId * @return array */ public function deleteMessageThread($messageThreadId) { $response = []; try{ $user = loggedInUser(); $userName = User::where('id', $messageThreadId)->first(); if($user){ $messageThread = MessagesThreads::where([ ['sender_id','=',$user->id], ['receiver_id','=',$messageThreadId] ])->orWhere([ ['sender_id','=',$messageThreadId], ['receiver_id','=',$user->id] ])->first(); if($messageThread){ $deleteMessage = Messages::where('message_thread_id','=', $messageThread->id) ->select('user_id', 'message', 'created_at') ->delete(); $messageThread = MessagesThreads::where('id','=', $messageThread->id) ->select('sender_id', 'receiver_id', 'created_at') ->delete(); if($messageThread){ $response['message'] = trans('auth.message.delete',['username' => $userName->name]); $response['status'] = 200; }else{ $response['message'] = trans('auth.no_record_found'); $response['status'] = 404; } }else{ $response['message'] = trans('auth.no_record_found'); $response['status'] = 404; } } } catch (\Exception $ex) { Log::error($ex); $response['message'] = trans('auth.something_went_wrong'); $response['status'] = 401; } return $response; } }