Rev 14122 | Autoría | Ultima modificación | Ver Log |
<?php/**** Controlador: Mis Perfiles**/declare(strict_types=1);namespace LeadersLinked\Controller;use Laminas\Db\Adapter\AdapterInterface;use Laminas\Cache\Storage\Adapter\AbstractAdapter;use Laminas\Mvc\Controller\AbstractActionController;use Laminas\Log\LoggerInterface;use Laminas\View\Model\ViewModel;use LeadersLinked\Library\Functions;use LeadersLinked\Mapper\UserMapper;use LeadersLinked\Model\User;use LeadersLinked\Mapper\UserBlockedMapper;use LeadersLinked\Mapper\CompanyMapper;use LeadersLinked\Mapper\CompanyUserMapper;use LeadersLinked\Mapper\ConversationMapper;use LeadersLinked\Mapper\MessageMapper;use LeadersLinked\Model\Conversation;use LeadersLinked\Model\UserType;use LeadersLinked\Library\Image;use Laminas\View\Model\JsonModel;use LeadersLinked\Form\CommunicationInMailSendAllForm;use LeadersLinked\Model\Message;use LeadersLinked\Model\VideoConvert;use LeadersLinked\Mapper\VideoConvertMapper;class CommunicationInboxController extends AbstractActionController{/**** @var AdapterInterface*/private $adapter;/**** @var AbstractAdapter*/private $cache;/**** @var LoggerInterface*/private $logger;/**** @var array*/private $config;/**** @param AdapterInterface $adapter* @param AbstractAdapter $cache* @param LoggerInterface $logger* @param array $config*/public function __construct($adapter, $cache , $logger, $config){$this->adapter = $adapter;$this->cache = $cache;$this->logger = $logger;$this->config = $config;}/**** 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()) {$formSendAll = new CommunicationInMailSendAllForm();$this->layout()->setTemplate('layout/layout-backend');$viewModel = new ViewModel();$viewModel->setTemplate('leaders-linked/communication-inbox/index.phtml');$viewModel->setVariables(['formSendAll' => $formSendAll,]);return $viewModel ;} 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/[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*//*** Esta función envia un mensaje* Es una petición POST el url recuperado en /inmail* [ruta del servidor]/inmail/[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/[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 sendAllAction(){$request = $this->getRequest();if($request->isPost()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$currentCompany = $currentUserPlugin->getCompany();$data = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());$form = new CommunicationInMailSendAllForm();$form->setData($data);if($form->isValid()) {return new JsonModel(['success' => false,'data' => $data]);$sendTypeFilter=$form->get('type_send_filter')->getValue();$users=[];if($sendTypeFilter=='company_all'){$companyUserMapper = CompanyUserMapper::getInstance($this->adapter);$userMapper = UserMapper::getInstance($this->adapter);$datosCompanyUser = $companyUserMapper->fetchAllByCompanyIdAndNotUserId($currentCompany->id, $currentUser->id);foreach($datosCompanyUser as $record){$datosUser = $userMapper->fetchOne($record->user_id);array_push($users, $datosUser);}}else if($sendTypeFilter=='studens_all'){$userMapper = UserMapper::getInstance($this->adapter);$datosCompanyUser = $userMapper->fetchAllStudensByCompanyId($currentCompany->id);foreach($datosCompanyUser as $record){$datosUser = $userMapper->fetchOne($record->id);array_push($users, $datosUser);}}else{return new JsonModel(['success' => false,'data' => 'te falta amor, hermano']);}$files = $this->getRequest()->getFiles()->toArray();foreach($users as $user){$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()]);}}$type = Message::TYPE_TEXT;$encoding = $this->params()->fromRoute('encoding');if($encoding == 'base64') {$fileBase64Name = $this->params()->fromPost('file_base64_name');$fileBase64Content = $this->params()->fromPost('file_base64_content');if($fileBase64Name && $fileBase64Content) {try {$fileBase64Content = base64_decode($fileBase64Content);if($fileBase64Content) {$message_filename = $this->normalizeString($fileBase64Name);$message_tmp_filename = 'data' . DIRECTORY_SEPARATOR . 'tmp';if(!file_exists($message_tmp_filename)) {mkdir($message_tmp_filename, 0755, true);}$message_tmp_filename = 'data' . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . $message_filename;file_put_contents($message_tmp_filename, $fileBase64Content);$mime_type = mime_content_type($message_tmp_filename);//echo '$mime_type = '. $mime_type; exit;if($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {$type = Message::TYPE_IMAGE;} else if($mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {$type = Message::FILE_TYPE_VIDEO;} else if($mime_type == 'application/pdf') {$type = Message::FILE_TYPE_DOCUMENT;}}} catch(\Exception $e) {}}} else {if(isset($files['file']) && empty($files['file']['error'])) {$message_tmp_filename = $files['file']['tmp_name'];$message_filename = $this->normalizeString($files['file']['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/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 = $form->get('message')->getValue();$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'] . $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);}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'] . $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';$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'] . $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);}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());}}} else {return new JsonModel(['success' => false,'data' => $messageMapper->getError()]);}}$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);return new JsonModel(['success' => true,'data' => 'Mensajes enviados con exito']);} else {$messages = [];$form_messages = (array) $form->getMessages();foreach($form_messages as $fieldname => $field_messages){$messages[$fieldname] = array_values($field_messages);}return new JsonModel(['success' => false,'data' => $messages]);}} 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));}}