Files
wticreatorstudio/Modules/Chat/Http/Controllers/API/ChatAPIController.php
T
2024-02-12 22:54:20 -05:00

281 lines
9.1 KiB
PHP

<?php
namespace Modules\Chat\Http\Controllers\API;
use App\Events\UserEvent;
use App\Exceptions\ApiOperationFailedException;
use Modules\Chat\Http\Controllers\AppBaseController;
use Modules\Chat\Http\Requests\SendMessageRequest;
use Modules\Chat\Entities\ChatRequestModel;
use Modules\Chat\Entities\Conversation;
use Modules\Chat\Entities\User;
use Modules\Chat\Repositories\ChatRepository;
use Auth;
use Exception;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
/**
* Class ChatAPIController
*/
class ChatAPIController extends AppBaseController
{
/** @var ChatRepository */
private $chatRepository;
/**
* Create a new controller instance.
*
* @param ChatRepository $chatRepository
*/
public function __construct(ChatRepository $chatRepository)
{
$this->chatRepository = $chatRepository;
}
/**
* This function return latest conversations of users.
*
* @param Request $request
*
* @return JsonResponse
*/
public function getLatestConversations(Request $request)
{
$input = $request->all();
$conversations = $this->chatRepository->getLatestConversations($input);
return $this->sendResponse(['conversations' => $conversations], 'Conversations retrieved successfully.');
}
/**
* This function return latest conversations of users.
*
* @return JsonResponse
*/
public function getArchiveConversations(Request $request)
{
$input = $request->all();
$input['isArchived'] = 1;
$conversations = $this->chatRepository->getLatestConversations($input);
return $this->sendResponse(['conversations' => $conversations], 'Conversations retrieved successfully.');
}
/**
* @param SendMessageRequest $request
* @throws Exception
* @return JsonResponse
*/
public function sendMessage(SendMessageRequest $request)
{
$conversation = $this->chatRepository->sendMessage($request->all());
return $this->sendResponse(['message' => $conversation], 'Message sent successfully.');
}
/**
* @param Request $request
*
* @return JsonResponse
*/
public function updateConversationStatus(Request $request)
{
$data = $this->chatRepository->markMessagesAsRead($request->all());
return $this->sendResponse($data, 'Status updated successfully.');
}
/**
* @param Request $request
*
* @throws ApiOperationFailedException
*
* @return JsonResponse
*/
public function addAttachment(Request $request)
{
$files = $request->file('file');
foreach ($files as $file) {
$fileData['attachment'] = $this->chatRepository->addAttachment($file);
$extension = $file->getClientOriginalExtension();
$fileData['message_type'] = $this->chatRepository->getMessageTypeByExtension($extension);
$fileData['file_name'] = $file->getClientOriginalName();
$fileData['unique_code'] = uniqid();
$data['data'][] = $fileData;
}
$data['success'] = true;
return $this->sendData($data);
}
/**
* @param int|string $id
*
* @return JsonResponse
*/
public function deleteConversation($id)
{
if (is_string($id) && ! is_numeric($id)) {
$this->chatRepository->deleteGroupConversation($id);
} else {
$this->chatRepository->deleteConversation($id);
}
return $this->sendSuccess('Conversation deleted successfully.');
}
/**
* @param Conversation $conversation
*
* @param Request $request
* @return JsonResponse
*/
public function deleteMessage(Conversation $conversation, Request $request)
{
$deleteMessageTime = config('configurable.delete_message_time');
if ($conversation->time_from_now_in_min > $deleteMessageTime) {
return $this->sendError('You can not delete message older than '.$deleteMessageTime.' minutes.', 422);
}
if ($conversation->from_id != getLoggedInUserId()) {
return $this->sendError('You can not delete this message.', 403);
}
$previousMessageId = $request->get('previousMessageId');
$previousMessage = $this->chatRepository->find($previousMessageId);
$this->chatRepository->deleteMessage($conversation->id);
return $this->sendResponse(['previousMessage' => $previousMessage], 'Message deleted successfully.');
}
/**
* @param Conversation $conversation
*
* @return JsonResponse
*/
public function show(Conversation $conversation)
{
return $this->sendResponse($conversation->toArray(), 'Conversation retrieved successfully');
}
/**
* @param Conversation $conversation
* @param Request $request
*
* @throws Exception
*
* @return JsonResponse
*/
public function deleteMessageForEveryone(Conversation $conversation, Request $request)
{
$deleteMessageTime = config('configurable.delete_message_for_everyone_time');
if ($conversation->time_from_now_in_min > $deleteMessageTime) {
return $this->sendError('You can not delete message older than '.$deleteMessageTime.' minutes.', 422);
}
if ($conversation->from_id != getLoggedInUserId()) {
return $this->sendError('You can not delete this message.', 403);
}
$conversation->delete();
$previousMessageId = $request->get('previousMessageId');
$previousMessage = $this->chatRepository->find($previousMessageId);
unset($previousMessage->replayMessage);
broadcast(new UserEvent(
[
'id' => $conversation->id,
'type' => User::MESSAGE_DELETED,
'from_id' => $conversation->from_id,
'previousMessage' => $previousMessage,
], $conversation->to_id))->toOthers();
return $this->sendResponse(['previousMessage' => $previousMessage], 'Message deleted successfully.');
}
/**
* @param SendMessageRequest $request
*
* @throws Exception
*
* @return JsonResponse
*/
public function sendChatRequest(SendMessageRequest $request)
{
$isRequestSend = $this->chatRepository->sendChatRequest($request->all());
if ($isRequestSend) {
return $this->sendSuccess('Chat request send successfully.');
}
return $this->sendError('Chat request has already been sent.');
}
/**
* @param Request $request
*
* @return JsonResponse
*/
public function acceptChatRequest(Request $request)
{
$chatRequestModel = ChatRequestModel::whereId($request->id)->first();
$chatRequestModel->status = ChatRequestModel::STATUS_ACCEPTED;
$chatRequestModel->save();
$input = $chatRequestModel->toArray();
$input['message'] = $chatRequestModel->receiver->name.' has accepted your chat request.';
$this->chatRepository->sendAcceptDeclineChatRequestNotification($input, User::CHAT_REQUEST_ACCEPTED);
return $this->sendResponse($chatRequestModel, 'Chat request accepted successfully.');
}
/**
* @param Request $request
*
* @return JsonResponse
*/
public function declineChatRequest(Request $request)
{
$chatRequestModel = ChatRequestModel::find($request->id);
$chatRequestModel->status = ChatRequestModel::STATUS_DECLINE;
$chatRequestModel->save();
Conversation::whereFromId($chatRequestModel->from_id)->whereToId($chatRequestModel->owner_id)->update(['status' => 1]);
$input = $chatRequestModel->toArray();
$input['message'] = $chatRequestModel->receiver->name.' has declined your chat request.';
$this->chatRepository->sendAcceptDeclineChatRequestNotification($input);
return $this->sendResponse($chatRequestModel, 'You have declined given user request !');
}
/**
* @param Request $request
*
* @throws ApiOperationFailedException
*
* @return JsonResponse
*/
public function imageUpload(Request $request)
{
$input = $request->all();
$images = $input['images'];
unset($input['images']);
$input['from_id'] = Auth::id();
$input['to_type'] = Conversation::class;
$conversation = [];
foreach ($images as $image) {
$fileName = Conversation::uploadBase64Image($image, Conversation::PATH);
$input['message'] = $fileName;
$input['status'] = 0;
$input['message_type'] = 1;
$input['file_name'] = $fileName;
$conversation[] = $this->chatRepository->sendMessage($input);
}
return $this->sendResponse($conversation, 'File uploaded');
}
}