374 lines
13 KiB
PHP
374 lines
13 KiB
PHP
<?php
|
|
namespace App\Repositories\Api\Access\Message;
|
|
|
|
use App\Constant\Constant;
|
|
use App\Models\User;
|
|
use App\Models\Messages;
|
|
use App\Models\MessagesThreads;
|
|
use App\Models\UserDeviceToken;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Log;
|
|
use App\Traits\PushNotificationTraits;
|
|
use Illuminate\Support\Facades\Request;
|
|
use App\Repositories\Api\Access\Message\MessageInterface;
|
|
use Carbon\Carbon;
|
|
|
|
class MessageRepository implements MessageInterface
|
|
{
|
|
use PushNotificationTraits;
|
|
|
|
/**
|
|
* @param $request
|
|
* @return array
|
|
*/
|
|
public function sendMessage($request)
|
|
{
|
|
$response = [];
|
|
|
|
try{
|
|
$user = loggedInUser();
|
|
|
|
if($user){
|
|
$messageThread = MessagesThreads::where([
|
|
['sender_id','=',$user->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;
|
|
}
|
|
} |