Rev 16769 | Rev 17002 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
<?phpdeclare(strict_types=1);namespace LeadersLinked\Controller;use Laminas\Db\Adapter\AdapterInterface;use Laminas\Mvc\Controller\AbstractActionController;use Laminas\Log\LoggerInterface;use Laminas\View\Model\ViewModel;use LeadersLinked\Mapper\UserMapper;use LeadersLinked\Mapper\CompanyMapper;use LeadersLinked\Mapper\CompanyUserMapper;use LeadersLinked\Mapper\ConversationMapper;use LeadersLinked\Mapper\MessageMapper;use LeadersLinked\Model\Conversation;use LeadersLinked\Library\Image;use Laminas\View\Model\JsonModel;use LeadersLinked\Form\InMail\SendForm;use LeadersLinked\Model\Message;use LeadersLinked\Model\VideoConvert;use LeadersLinked\Mapper\VideoConvertMapper;use Laminas\I18n\Translator\Translator;use LeadersLinked\Library\Functions;class InMailCompanyController extends AbstractActionController{/**** @var \Laminas\Db\Adapter\AdapterInterface*/private $adapter;/**** @var \LeadersLinked\Cache\CacheInterface*/private $cache;/**** @var \Laminas\Log\LoggerInterface*/private $logger;/**** @var array*/private $config;/**** @var \Laminas\Mvc\I18n\Translator*/private $translator;/**** @param \Laminas\Db\Adapter\AdapterInterface $adapter* @param \LeadersLinked\Cache\CacheInterface $cache* @param \Laminas\Log\LoggerInterface LoggerInterface $logger* @param array $config* @param \Laminas\Mvc\I18n\Translator $translator*/public function __construct($adapter, $cache, $logger, $config, $translator){$this->adapter = $adapter;$this->cache = $cache;$this->logger = $logger;$this->config = $config;$this->translator = $translator;}/**** Generación del listado de conversationes** [* success: true,* data:[* [* uuid: uuid con quien se tiene la conversación,* name: nombre de con quien se tiene la conversacion,* image: imagen de con quien se tiene la conversación,* profile: url del profile con quien se tiene la conversación,* last_message: fecha del ultimo mensaje,* count_unread: cantidad de mensajes sin leer,* messages_link: url para recuperar los mensajes,* send_link: url para enviar el mensaje,* selected: 0 = no seleccionado, 1 = seleccionado* ]* ]*** @return \Laminas\View\Model\JsonModel*/public function indexAction(){$request = $this->getRequest();if ($request->isGet()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentCompany = $currentUserPlugin->getCompany();$companyUserMapper = CompanyUserMapper::getInstance($this->adapter);$companyUser = $companyUserMapper->fetchOwnerByCompanyId($currentCompany->id);$userMapper = UserMapper::getInstance($this->adapter);$currentUser = $userMapper->fetchOne($companyUser->user_id);$headers = $request->getHeaders();$isJson = false;if ($headers->has('Accept')) {$accept = $headers->get('Accept');$prioritized = $accept->getPrioritized();foreach ($prioritized as $key => $value) {$raw = trim($value->getRaw());if (!$isJson) {$isJson = strpos($raw, 'json');}}}//$isJson = true;if ($isJson) {$search = Functions::sanitizeFilterString($this->params()->fromQuery('search'));$conversation_id = Functions::sanitizeFilterString($this->params()->fromQuery('conversation_id'));$last_message = Functions::sanitizeFilterString($this->params()->fromQuery('last_message'));$now = $userMapper->getDatebaseNow();$conversationMapper = ConversationMapper::getInstance($this->adapter);$messageMapper = MessageMapper::getInstance($this->adapter);$conversations = [];$messages = [];if($conversation_id ) {$companyMapper = CompanyMapper::getInstance($this->adapter);$company = $companyMapper->fetchOneByUuid($conversation_id);if ($company) {$companyUserMapper = CompanyUserMapper::getInstance($this-> adapter);$companyUser = $companyUserMapper->fetchOwnerByCompanyId($company->id);$user = $userMapper->fetchOne($companyUser->user_id);$conversation_id = $user->id;$conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);$lastMessage = '';$timeElapsedString = '';if ($conversation) {$unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId($conversation->id, $currentUser->id);$lastMessage = $messageMapper->fetchLastMessageByConversation($conversation->id);if ($lastMessage) {$timeElapsedString = $this->timeAgo($lastMessage, $now);} else {$lastMessage = '';}} else {$unread = 0;}array_push($conversations, ['uuid' => $company->uuid,'name' => $company->name,'image' => $this->url()->fromRoute('storage', ['type' => 'company', 'code' => $company->uuid, 'filename' => $company->image]),'profile' => '', // $this->url()->fromRoute('company/view', ['id' => $company->uuid]),'last_message' => $timeElapsedString,'datetime_last_message' => $lastMessage,'count_unread' => $unread,'messages_link' => $this->url()->fromRoute('inmail-company/messages', ['id' => $user->uuid]),'send_link' => $this->url()->fromRoute('inmail-company/messages/send', ['id' => $user->uuid]),'selected' => 1,'delete_link' => $this->url()->fromRoute('inmail-company/delete', ['id' => $user->uuid]),]);} else {$user = $userMapper->fetchOneByUuid($conversation_id);if ($user) {$lastMessage = '';$timeElapsedString = '';$conversation_id = $user->id;$conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);if ($conversation) {$unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId($conversation->id, $currentUser->id);$lastMessage = $messageMapper->fetchLastMessageByConversation($conversation->id);if ($lastMessage) {$timeElapsedString = $this->timeAgo($lastMessage, $now);} else {$lastMessage = '';}} else {$unread = 0;}array_push($conversations, ['uuid' => $user->uuid,'name' => trim($user->first_name . ' ' . $user->last_name),'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image]),'profile' => '', //$this->url()->fromRoute('profile/view', ['id' => $user->uuid]),'last_message' => $timeElapsedString,'datetime_last_message' => $lastMessage,'count_unread' => $unread,'messages_link' => $this->url()->fromRoute('inmail-company/messages', ['id' => $user->uuid]),'send_link' => $this->url()->fromRoute('inmail-company/messages/send', ['id' => $user->uuid]),'selected' => 1,'delete_link' => $this->url()->fromRoute('inmail-company/delete', ['id' => $user->uuid]),]);}}if($user) {$conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);if(!$conversation) {$conversation = new Conversation();$conversation->sender_id = $currentUser->id;$conversation->sender_status = Conversation::STATUS_NORMAL;$conversation->receiver_id = $user->id;$conversation->receiver_status = Conversation::STATUS_NORMAL;$conversationMapper->insert($conversation);}$message = $messageMapper->fetchOneByUuid( $last_message);if($message && $message->conversation_id == $conversation_id) {$message_id = $message->id;} else {$message_id = 0;}$records = $messageMapper->fetchBatchMessagesByConversationIdAndGreaterThanMessageId($conversation->id, $message_id);foreach ($records as $record){$timeElapsedString = $this->timeAgo($record->added_on, $now);if ($record->sender_id == $currentUser->id) {array_push($messages, ['uuid' => $record->uuid,'sender_name' => trim($currentUser->first_name . ' ' . $currentUser->last_name),'sender_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $currentUser->image, 'code' => $currentUser->uuid]),'sender_profile' =>'', // $this->url()->fromRoute('profile/view', ['id' => $currentUser->uuid]),'receiver_name' => trim($user->first_name . ' ' . $user->last_name),'receiver_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $user->image, 'code' => $user->uuid]),'receiver_profile' => '', //$this->url()->fromRoute('profile/view', ['id' => $user->uuid]),'side' => 'left','message' => $record->message,'type' => $record->type,'filename' => $record->filename ? $this->url()->fromRoute('storage', ['type' => 'message', 'filename' => $record->filename, 'code' => $record->uuid]) : '','date' => $timeElapsedString]);} else {array_push($messages, ['uuid' => $record->uuid,'sender_name' => trim($user->first_name . ' ' . $user->last_name),'sender_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $user->image, 'code' => $user->uuid]),'sender_profile' => '', // $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),'receiver_name' => trim($currentUser->first_name . ' ' . $currentUser->last_name),'receiver_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $currentUser->image, 'code' => $user->uuid]),'receiver_profile' => '', //$this->url()->fromRoute('profile/view', ['id' => $currentUser->uuid]),'side' => 'right','message' => $record->message,'type' => $record->type,'filename' => $record->filename ? $this->url()->fromRoute('storage', ['type' => 'message', 'filename' => $record->filename, 'code' => $record->uuid]) : '','date' => $timeElapsedString]);$messageMapper->markAsRead($record->id);}}}}$records = $conversationMapper->fetchAllByUserId($currentUser->id);foreach ($records as $record){if ($conversation_id) {if ($record->sender_id == $currentUser->id && $record->receiver_id == $conversation_id) {continue;}if ($record->receiver_id == $currentUser->id && $record->sender_id == $conversation_id) {continue;}}if ($record->sender_id == $currentUser->id) {$user = $userMapper->fetchOne($record->receiver_id);}if ($record->receiver_id == $currentUser->id) {$user = $userMapper->fetchOne($record->sender_id);}$username = trim($user->first_name . ' ' . $user->last_name);if($search) {if(strpos($username, $search) === false && strpos($user->email, $search) === false) {continue;}}$timeElapsedString = '';$unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId($record->id, $currentUser->id);$lastMessage = $messageMapper->fetchLastMessageByConversation($record->id);if ($lastMessage) {$timeElapsedString = $this->timeAgo($lastMessage, $now);} else {$lastMessage = '';}array_push($conversations, ['uuid' => $user->uuid,'name' => $username,'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image]),'profile' => '', //$this->url()->fromRoute('profile/view', ['id' => $user->uuid]),'last_message' => $timeElapsedString,'datetime_last_message' => $lastMessage,'count_unread' => $unread,'messages_link' => $this->url()->fromRoute('inmail-company/messages', ['id' => $user->uuid]),'send_link' => $this->url()->fromRoute('inmail-company/messages/send', ['id' => $user->uuid]),'selected' => $conversation_id == $user->id ? 1 : 0,'delete_link' => $this->url()->fromRoute('inmail-company/delete', ['id' => $user->uuid]),]);}usort($conversations, function ($a, $b) {if ($a['selected'] == $b['selected']) {return $a['datetime_last_message'] < $b['datetime_last_message'] ? 1 : -1;} else {return $a['selected'] < $b['selected'] ? 1 : 0;}});return new JsonModel(['success' => true,'data' => ['conversations' => $conversations,'messages' => $messages,],]);} else {$this->layout()->setTemplate('layout/layout-backend');$viewModel = new ViewModel();$viewModel->setTemplate('leaders-linked/inmail/company.phtml');return $viewModel;}} else {return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}}public function startConversationAction(){$request = $this->getRequest();if ($request->isPost()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$userMapper = UserMapper::getInstance($this->adapter);$now = $userMapper->getDatebaseNow();$id = Functions::sanitizeFilterString($this->params()->fromPost('id'));if (!$id) {return new JsonModel(['success' => false,'data' => 'ERROR_PARAMETERS_ARE_INVALID']);}$user = $userMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);if (!$user) {return new JsonModel(['success' => false,'data' => 'ERROR_REQUEST_IS_INVALID']);}$conversationMapper = ConversationMapper::getInstance($this->adapter);$conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);if(!$conversation) {$conversation = new Conversation();$conversation->sender_id = $currentUser->id;$conversation->sender_status = Conversation::STATUS_NORMAL;$conversation->receiver_id = $user->id;$conversation->receiver_status = Conversation::STATUS_NORMAL;$conversationMapper->insert($conversation);} else {if($conversation->sender_id == $currentUser->id) {$conversation->sender_status = Conversation::STATUS_NORMAL;} else {$conversation->sender_status = Conversation::STATUS_NORMAL;}$conversationMapper->update($conversation);}$timeElapsedString = '';$messageMapper = MessageMapper::getInstance($this->adapter);$unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId($conversation->id, $currentUser->id);$lastMessage = $messageMapper->fetchLastMessageByConversation($conversation->id);if ($lastMessage) {$timeElapsedString = $this->timeAgo($lastMessage, $now);} else {$lastMessage = '';}return new JsonModel(['success' => true,'data' => ['uuid' => $user->uuid,'name' => trim($user->first_name . ' ' . $user->last_name),'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image]),'profile' => '', //$this->url()->fromRoute('profile/view', ['id' => $user->uuid]),'last_message' => $timeElapsedString,'datetime_last_message' => $lastMessage,'count_unread' => $unread,'messages_link' => $this->url()->fromRoute('inmail-personal/messages', ['id' => $user->uuid]),'send_link' => $this->url()->fromRoute('inmail-personal/messages/send', ['id' => $user->uuid]),'selected' => 1,'delete_link' => $this->url()->fromRoute('inmail-personal/delete', ['id' => $user->uuid]),]]);} else {return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}}/*** Esta función remueve el usuario del grupo* Es una petición GET el url recuperado en /inmail* [ruta del servidor]/inmail-company/[uuid]/message* retorna un json en caso de ser positivo* [* success: true,* data: [* [* sender_name: nombre de quien que envia el mensaje,* sender_image: imagen de quien que recibe el mensaje,* sender_profile: url de profile de quien que envia el mensaje,* receiver_name: nombre de quien que recibe el mensaje,* receiver_image: url de la imagen de quien que recibe el mensaje,* receiver_profile: url del profile de quien recibe el mensaje,* side: left/righ de que lado de la pantalla se mostrara,* message: texto del mensaje,* type: text|image|video|document,* filename: url del archivo enviado,* date: cadena que describe hace cuanto se recibio el mensaje* ]* ]* ]* En caso de ser negativo puede haber 2 formatos* [* 'success' : false,* 'data' : mensaje de error* ]* @return \Laminas\View\Model\JsonModel*/public function messageAction(){$request = $this->getRequest();if ($request->isGet()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentCompany = $currentUserPlugin->getCompany();$companyUserMapper = CompanyUserMapper::getInstance($this->adapter);$companyUser = $companyUserMapper->fetchOwnerByCompanyId($currentCompany->id);$userMapper = UserMapper::getInstance($this->adapter);$currentUser = $userMapper->fetchOne($companyUser->user_id);$now = $userMapper->getDatebaseNow();$conversationMapper = ConversationMapper::getInstance($this->adapter);$messageMapper = MessageMapper::getInstance($this->adapter);$type = Functions::sanitizeFilterString($this->params()->fromQuery('type', ''));if(!in_array($type, ['first','changes', 'older'])) {$type = 'first';}$id = $this->params()->fromRoute('id');if (!$id) {return new JsonModel(['success' => false,'data' => 'ERROR_PARAMETERS_ARE_INVALID']);}$user = $userMapper->fetchOneByUuid($id);if (!$user) {return new JsonModel(['success' => false,'data' => 'ERROR_REQUEST_IS_INVALID']);}$first_message = Functions::sanitizeFilterString($this->params()->fromQuery('first_message'));$last_message = Functions::sanitizeFilterString($this->params()->fromQuery('last_message'));$conversationMapper = ConversationMapper::getInstance($this->adapter);$conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);if(!$conversation) {$conversation = new Conversation();$conversation->sender_id = $currentUser->id;$conversation->sender_status = Conversation::STATUS_NORMAL;$conversation->receiver_id = $user->id;$conversation->receiver_status = Conversation::STATUS_NORMAL;$conversationMapper->insert($conversation);}$messages = [];if ($conversation) {switch($type){case 'older' :$message = $messageMapper->fetchOneByUuid( $first_message);if($message && $message->conversation_id == $conversation->id) {$message_id = $message->id;} else {$message_id = 0;}$records = $messageMapper->fetchBatchMessagesByConversationIdAndLessThanMessageId($conversation->id, $message_id);$count = $messageMapper->fetchCountMessagesByConversationIdAndLessThanMessageId($conversation->id, $message_id) - count( $records );break;case 'changes' :$message = $messageMapper->fetchOneByUuid( $last_message);if($message && $message->conversation_id == $conversation->id) {$message_id = $message->id;} else {$message_id = 0;}$records = $messageMapper->fetchBatchMessagesByConversationIdAndGreaterThanMessageId($conversation->id, $message_id);$count = $messageMapper->fetchCountMessagesByConversationIdAndGreaterThanMessageId($conversation->id, $message_id) - count( $records );break;default :$records = $messageMapper->fetchBatchMessagesByConversationId($conversation->id);$count = $messageMapper->fetchCountMessagesByConversationId($conversation->id) - count( $records );break;}foreach ($records as $record){$timeElapsedString = $this->timeAgo($record->added_on, $now);if ($record->sender_id == $currentUser->id) {array_push($messages, ['uuid' => $record->uuid,'sender_name' => trim($currentUser->first_name . ' ' . $currentUser->last_name),'sender_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $currentUser->image, 'code' => $currentUser->uuid]),'sender_profile' =>'', // $this->url()->fromRoute('profile/view', ['id' => $currentUser->uuid]),'receiver_name' => trim($user->first_name . ' ' . $user->last_name),'receiver_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $user->image, 'code' => $user->uuid]),'receiver_profile' => '', //$this->url()->fromRoute('profile/view', ['id' => $user->uuid]),'side' => 'left','message' => $record->message,'type' => $record->type,'filename' => $record->filename ? $this->url()->fromRoute('storage', ['type' => 'message', 'filename' => $record->filename, 'code' => $record->uuid]) : '','date' => $timeElapsedString]);} else {array_push($messages, ['uuid' => $record->uuid,'sender_name' => trim($user->first_name . ' ' . $user->last_name),'sender_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $user->image, 'code' => $user->uuid]),'sender_profile' => '', // $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),'receiver_name' => trim($currentUser->first_name . ' ' . $currentUser->last_name),'receiver_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $currentUser->image, 'code' => $user->uuid]),'receiver_profile' => '', //$this->url()->fromRoute('profile/view', ['id' => $currentUser->uuid]),'side' => 'right','message' => $record->message,'type' => $record->type,'filename' => $record->filename ? $this->url()->fromRoute('storage', ['type' => 'message', 'filename' => $record->filename, 'code' => $record->uuid]) : '','date' => $timeElapsedString]);$messageMapper->markAsRead($record->id);}}}$timeElapsedString = '';$unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId($user->id, $currentUser->id);$lastMessage = $messageMapper->fetchLastMessageByConversation($user->id);if ($lastMessage) {$timeElapsedString = $this->timeAgo($lastMessage, $now);}return new JsonModel(['success' => true,'data' => ['messages' => $messages,'there_olders' => $count > 0,'last_message' => $timeElapsedString,'datetime_last_message' => $lastMessage,'count_unread' => $unread,]]);} else {return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}}/*** Esta función envia un mensaje* Es una petición POST el url recuperado en /inmail* [ruta del servidor]/inmail-company/[uidd del usuario]/message/send* Lo párametros son* message: text plain requerido* file: no requerido puede jpg, png, jpeg, mp3, mp4, webm o pdf* o* [ruta del servidor]/inmail-company/[uidd del usuario]/message/send/encoding/base64 para el caso de react-native* Los párametros son* message: text plain requerido* fileBase64Name: nombre del archivo que se envia en base64 solo requerido si se envia un archivo* fileBase64Content: contenido en base 64 del archivo** retorna un json en caso de ser positivo* [* success: true,* data:{* sender_name: nombre de quien que envia el mensaje,* sender_image: imagen de quien que recibe el mensaje,* sender_profile: url de profile de quien que envia el mensaje,* receiver_name: nombre de quien que recibe el mensaje,* receiver_image: url de la imagen de quien que recibe el mensaje,* receiver_profile: url del profile de quien recibe el mensaje,* side: left/righ de que lado de la pantalla se mostrara,* message: texto del mensaje,* type: text|image|video|document,* filename: url del archivo enviado,* date: cadena que describe hace cuanto se recibio el mensaje* ]* ]* En caso de ser negativo puede haber 2 formatos* [* 'success' : false,* 'data' : mensaje de error* ]* @return \Laminas\View\Model\JsonModel*/public function sendMessageAction(){$request = $this->getRequest();if ($request->isPost()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentCompany = $currentUserPlugin->getCompany();$companyUserMapper = CompanyUserMapper::getInstance($this->adapter);$companyUser = $companyUserMapper->fetchOwnerByCompanyId($currentCompany->id);$userMapper = UserMapper::getInstance($this->adapter);$currentUser = $userMapper->fetchOne($companyUser->user_id);$now = $userMapper->getDatebaseNow();$id = $this->params()->fromRoute('id');if (!$id) {return new JsonModel(['success' => false,'data' => 'ERROR_PARAMETERS_ARE_INVALID']);}$user = $userMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);if (!$user) {return new JsonModel(['success' => false,'data' => 'ERROR_REQUEST_IS_INVALID']);}$data = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());$form = new SendForm();$form->setData($data);if ($form->isValid()) {$dataPost = (array) $form->getData();$conversationMapper = ConversationMapper::getInstance($this->adapter);$conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);if ($conversation) {$conversation->receiver_status = Conversation::STATUS_NORMAL;$conversation->sender_status = Conversation::STATUS_NORMAL;if (!$conversationMapper->update($conversation)) {return new JsonModel(['success' => false,'data' => $conversationMapper->getError()]);}} else {$conversation = new Conversation();$conversation->sender_id = $currentUser->id;$conversation->sender_status = Conversation::STATUS_NORMAL;$conversation->receiver_id = $user->id;$conversation->receiver_status = Conversation::STATUS_NORMAL;if (!$conversationMapper->insert($conversation)) {return new JsonModel(['success' => false,'data' => $conversationMapper->getError()]);}}$files = $this->getRequest()->getFiles()->toArray();$type = Message::TYPE_TEXT;if (isset($files['filename']) && empty($files['filename']['error'])) {$message_tmp_filename = $files['filename']['tmp_name'];$message_filename = $this->normalizeString($files['filename']['name']);$mime_type = mime_content_type($message_tmp_filename);if ($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {$type = Message::TYPE_IMAGE;} else if ($mime_type == 'video/quicktime' || $mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {$type = Message::TYPE_VIDEO;} else if ($mime_type == 'application/pdf') {$type = Message::TYPE_DOCUMENT;}}$message = new Message();$message->conversation_id = $conversation->id;$message->read = Message::NO;$message->message = $type == Message::TYPE_TEXT ? $dataPost['message'] : '';$message->receiver_id = $user->id;$message->receiver_status = Message::STATUS_NORMAL;$message->sender_id = $currentUser->id;$message->sender_status = Message::STATUS_NORMAL;$message->type = $type;$messageMapper = MessageMapper::getInstance($this->adapter);if ($messageMapper->insert($message)) {$message = $messageMapper->fetchOne($message->id);if ($type == Message::TYPE_DOCUMENT) {try {$target_path = $this->config['leaderslinked.fullpath.message'] . DIRECTORY_SEPARATOR . $message->uuid;if (!file_exists($target_path)) {mkdir($target_path, 0755);}$full_filename = $target_path . DIRECTORY_SEPARATOR . $message_filename;/*if($encoding == 'base64') {$resultMoveOrRename = rename($message_tmp_filename , $full_filename);} else {$resultMoveOrRename = move_uploaded_file($message_tmp_filename , $full_filename);}*/$resultMoveOrRename = move_uploaded_file($message_tmp_filename, $full_filename);if ($resultMoveOrRename) {$message->type = $type;$message->filename = basename($message_filename);$messageMapper->update($message);} else {error_log('no se pudo mover o renombrar el documento : ' . $message_tmp_filename . ' al directorio : ' . $full_filename);}} catch (\Throwable $e) {error_log($e->getTraceAsString());}}if ($type == Message::TYPE_IMAGE) {try {$target_path = $this->config['leaderslinked.fullpath.message'] . DIRECTORY_SEPARATOR . $message->uuid;if (!file_exists($target_path)) {mkdir($target_path, 0755);}list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.message_image_size']);$message_filename = substr($message_filename, 0, strrpos($message_filename, '.')) . '.png';//echo "target_path = $target_path message_tmp_filename = $message_tmp_filename message_filename = $message_filename"; exit;$crop_to_dimensions = false;if (Image::uploadImage($message_tmp_filename, $target_path, $message_filename, $target_width, $target_height, $crop_to_dimensions)) {$message->type = $type;$message->filename = basename($message_filename);$messageMapper->update($message);}} catch (\Throwable $e) {error_log($e->getTraceAsString());}}if ($type == Message::TYPE_VIDEO) {try {$target_path = $this->config['leaderslinked.fullpath.message'] . DIRECTORY_SEPARATOR . $message->uuid;if (!file_exists($target_path)) {mkdir($target_path, 0755);}$full_filename = $target_path . DIRECTORY_SEPARATOR . $message_filename;/*if($encoding == 'base64') {$resultMoveOrRename = rename($message_tmp_filename , $full_filename);} else {$resultMoveOrRename = move_uploaded_file($message_tmp_filename , $full_filename);}*/$resultMoveOrRename = move_uploaded_file($message_tmp_filename, $full_filename);if ($resultMoveOrRename) {$size = $this->config['leaderslinked.image_sizes.message_image_size'];$getFromSecound = 2;//extracción del cover$generateFileName = substr($message_filename, 0, strrpos($message_filename, '.'));$generateFile = $target_path . DIRECTORY_SEPARATOR . $generateFileName . '.png';$cmd = "/usr/bin/ffmpeg -i $full_filename -an -ss $getFromSecound -s $size $generateFile";exec($cmd);$message->type = $type;$message->filename = basename($message_filename);$message->image_preview = basename($generateFile);$messageMapper->update($message);$videoConvert = new VideoConvert();$videoConvert->filename = $full_filename;$videoConvert->type = VideoConvert::TYPE_FEED;$videoConvertMapper = VideoConvertMapper::getInstance($this->adapter);$videoConvertMapper->insert($videoConvert);} else {error_log('no se pudo mover o renombrar el documento : ' . $message_tmp_filename . ' al directorio : ' . $full_filename);}} catch (\Throwable $e) {error_log($e->getTraceAsString());}}$message = $messageMapper->fetchOne($message->id);if ($message->filename) {$filename = $this->url()->fromRoute('storage', ['type' => 'message', 'filename' => $message->filename, 'code' => $message->uuid]);} else {$filename = '';}//$dt = \DateTime::createFromFormat('Y-m-d H:i:s', $message->added_on);$userMapper->updateLastActivity($currentUser->id);$count = $messageMapper->fetchCountMessagesByConversationId($conversation->id);if($count < 10) {$max_page = 1;} else {$max_page = (int) ($count / 10);if($count > ($max_page * 10) ) {$max_page++;}}return new JsonModel(['success' => true,'data' => ['max_page' => $max_page,'message' => ['uuid' => $message->uuid,'sender_name' => trim($currentUser->first_name . ' ' . $currentUser->last_name),'sender_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $currentUser->image, 'code' => $currentUser->uuid]),'sender_profile' => '', //$this->url()->fromRoute('profile/view', ['id' => $currentUser->uuid]),'receiver_name' => trim($user->first_name . ' ' . $user->last_name),'receiver_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $user->image, 'code' => $user->uuid]),'receiver_profile' => '', //$this->url()->fromRoute('profile/view', ['id' => $user->uuid]),'side' => 'left','message' => $message->message,'type' => $message->type,'filename' => $filename,'date' => $this->timeAgo($now, $now),]]]);} else {return new JsonModel(['success' => false,'data' => $messageMapper->getError()]);}} else {$message = '';$form_messages = (array) $form->getMessages();foreach ($form_messages as $fieldname => $field_messages) {$messages = array_values($field_messages);$message = array_pop($messages);}return new JsonModel(['success' => false,'data' => $message,]);}} else {return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}}private function normalizeString($str = ''){$basename = substr($str, 0, strrpos($str, '.'));$basename = str_replace('.', '-', $basename);$extension = substr($str, strrpos($str, '.'));$str = $basename . $extension;$str = strip_tags($str);$str = preg_replace('/[\r\n\t ]+/', ' ', $str);$str = preg_replace('/[\"\*\/\:\<\>\?\'\|\,]+/', ' ', $str);$str = strtolower($str);$str = html_entity_decode($str, ENT_QUOTES, "utf-8");$str = htmlentities($str, ENT_QUOTES, "utf-8");$str = preg_replace("/(&)([a-z])([a-z]+;)/i", '$2', $str);$str = str_replace(' ', '-', $str);$str = rawurlencode($str);$str = str_replace('%', '-', $str);return trim(strtolower($str));}/**** @param string $timestamp* @param string $now* @return string*/private function timeAgo($timestamp, $now = ''){if ($now) {$datetime1 = \DateTime::createFromFormat('Y-m-d H:i:s', $now);} else {$now = date('Y-m-d H:i:s');$datetime1 = date_create($now);}$datetime2 = date_create($timestamp);$diff = date_diff($datetime1, $datetime2);$timemsg = '';if ($diff->y > 0) {$timemsg = $diff->y . ' ' .($diff->y > 1 ? $this->translator->translate('LABEL_YEARS_SMALL') : $this->translator->translate('LABEL_YEAR_SMALL') );} else if ($diff->m > 0) {$timemsg = $diff->m . ' ' .($diff->m > 1 ? $this->translator->translate('LABEL_MONTHS_SMALL') : $this->translator->translate('LABEL_MONTH_SMALL') );} else if ($diff->d > 0) {$timemsg = $diff->d . ' ' .($diff->d > 1 ? $this->translator->translate('LABEL_DAYS_SMALL') : $this->translator->translate('LABEL_DAY_SMALL') );} else if ($diff->h > 0) {$timemsg = $diff->h . ' ' .($diff->h > 1 ? $this->translator->translate('LABEL_HOURS_SMALL') : $this->translator->translate('LABEL_HOUR_SMALL') );} else if ($diff->i > 0) {$timemsg = $diff->i . ' ' .($diff->i > 1 ? $this->translator->translate('LABEL_MINUTES_SMALL') : $this->translator->translate('LABEL_MINUTE_SMALL') );} else if ($diff->s > 0) {$timemsg = $diff->s . ' ' . ($diff->s > 1 ? $this->translator->translate('LABEL_SECONDS_SMALL') : $this->translator->translate('LABEL_SECOND_SMALL') );}if (!$timemsg) {$timemsg = $this->translator->translate('LABEL_NOW') ;} else {$timemsg = $this->translator->translate('LABEL_AGO_SMALL') . ' '. $timemsg . '';}return $timemsg;}public function deleteAction(){$request = $this->getRequest();if ($request->isPost()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentCompany = $currentUserPlugin->getCompany();$companyUserMapper = CompanyUserMapper::getInstance($this->adapter);$companyUser = $companyUserMapper->fetchOwnerByCompanyId($currentCompany->id);$userMapper = UserMapper::getInstance($this->adapter);$currentUser = $userMapper->fetchOne($companyUser->user_id);$id = $this->params()->fromRoute('id');if (!$id) {return new JsonModel(['success' => false,'data' => 'ERROR_PARAMETERS_ARE_INVALID']);}$userMapper = UserMapper::getInstance($this->adapter);$user = $userMapper->fetchOneByUuid($id);if (!$user) {return new JsonModel(['success' => false,'data' => 'ERROR_REQUEST_IS_INVALID']);}$conversationMapper = ConversationMapper::getInstance($this->adapter);$conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);if ($conversation) {if ($conversation->sender_id == $currentUser->id && $conversation->receiver_id == $user->id) {$conversation->sender_status = Conversation::STATUS_DELETED;if ($conversationMapper->update($conversation)) {$response = ['success' => true,'data' => 'LABEL_CONVERSATION_WAS_DELETED'];} else {$response = ['success' => false,'data' => $conversationMapper->getError()];}}if ($conversation->receiver_id == $currentUser->id && $conversation->sender_id == $user->id) {$conversation->receiver_status = Conversation::STATUS_DELETED;if ($conversationMapper->update($conversation)) {$response = ['success' => true,'data' => 'LABEL_CONVERSATION_WAS_DELETED'];} else {$response = ['success' => false,'data' => $conversationMapper->getError()];}}return new JsonModel($response);} else {$response = ['success' => false,'data' => 'ERROR_CONVERSATION_NOT_FOUND'];}return new JsonModel($response);} else {$response = ['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED'];}return new JsonModel($response);}}