Rev 5962 | Rev 6033 | Ir a la última revisión | Autoría | Comparar con el anterior | 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\JsonModel;use LeadersLinked\Library\Functions;use LeadersLinked\Mapper\CompanyUserMapper;use LeadersLinked\Form\Feed\CreateForm;use LeadersLinked\Hydrator\ObjectPropertyHydrator;use LeadersLinked\Model\Feed;use LeadersLinked\Mapper\FeedMapper;use LeadersLinked\Library\Image;use LeadersLinked\Mapper\GroupMapper;use LeadersLinked\Mapper\UserMapper;use LeadersLinked\Mapper\CommentMapper;use LeadersLinked\Mapper\ConnectionMapper;use LeadersLinked\Mapper\CompanyFollowerMapper;use LeadersLinked\Mapper\QueryMapper;use Laminas\Paginator\Paginator;use Laminas\Paginator\Adapter\DbSelect;use LeadersLinked\Mapper\ContentReactionMapper;use LeadersLinked\Model\ContentReaction;use LeadersLinked\Form\Feed\CommentForm;use LeadersLinked\Model\Comment;use LeadersLinked\Form\Feed\CreateGroupCompanyForm;use LeadersLinked\Model\CompanyUser;use LeadersLinked\Model\VideoConvert;use LeadersLinked\Mapper\VideoConvertMapper;use LeadersLinked\Mapper\CompanyMapper;use LeadersLinked\Model\Company;use LeadersLinked\Model\Group;use LeadersLinked\Mapper\GroupMemberMapper;use LeadersLinked\Model\GroupMember;use LeadersLinked\Model\Notification;use LeadersLinked\Mapper\NotificationMapper;use LeadersLinked\Mapper\UserNotificationSettingMapper;use LeadersLinked\Mapper\EmailTemplateMapper;use LeadersLinked\Model\EmailTemplate;use LeadersLinked\Library\QueueEmail;use LeadersLinked\Mapper\UtilMapper;class FeedController 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 perfiles* {@inheritDoc}* @see \Laminas\Mvc\Controller\AbstractActionController::indexAction()*/public function indexAction(){return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}public function commentAction(){$id = $this->params()->fromRoute('id');$request = $this->getRequest();if ($request->isPost()) {$feedMapper = FeedMapper::getInstance($this->adapter);$feed = $feedMapper->fetchOneByUuid($id);if (!$feed) {$response = ['success' => false,'data' => 'ERROR_POST_NOT_FOUND'];return new JsonModel($response);}$dataPost = $request->getPost()->toArray();$form = new CommentForm();$form->setData($dataPost);if ($form->isValid()) {$utilMapper = UtilMapper::getInstance($this->adapter);$now = $utilMapper->getDatebaseNow();$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$dataPost = (array) $form->getData();$comment = new Comment();$comment->network_id = $currentUser->network_id;$comment->comment = $dataPost['comment'];$comment->user_id = $currentUser->id;$comment->feed_id = $feed->id;$comment->relational = Comment::RELATIONAL_FEED;$commentMapper = CommentMapper::getInstance($this->adapter);if ($commentMapper->insert($comment)) {if ($feed->type == Feed::TYPE_UPDATE) {$userMapper = UserMapper::getInstance($this->adapter);$ownerFeed = $userMapper->fetchOne($feed->user_id);$notification = new Notification();$notification->type = Notification::TYPE_COMMENT_MY_FEED;$notification->feed_id = $feed->id;$notification->read = Notification::NO;$notification->user_id = $ownerFeed->id;$notification->message = 'LABEL_COMMENT_MY_FEED';$notification->url = $this->url()->fromRoute('dashboard', ['feed' => $feed->uuid]);$notificationMapper = NotificationMapper::getInstance($this->adapter);$notificationMapper->insert($notification);$userNotificationMapper = UserNotificationSettingMapper::getInstance($this->adapter);$userNotification = $userNotificationMapper->fetchOne($ownerFeed->id);if ($userNotification && $userNotification->comment_my_feed) {$emailTemplateMapper = EmailTemplateMapper::getInstance($this->adapter);$emailTemplate = $emailTemplateMapper->fetchOneByCodeAndNetworkId(EmailTemplate::CODE_COMMENT_MY_FEED, $currentUser->network_id);if ($emailTemplate) {$arrayCont = ['firstname' => $currentUser->first_name,'lastname' => $currentUser->last_name,'other_user_firstname' => $ownerFeed->first_name,'other_user_lastname' => $ownerFeed->last_name,'company_name' => '','group_name' => '','content' => '','code' => '','link' => $this->url()->fromRoute('dashboard', ['feed' => $feed->uuid], ['force_canonical' => true])];$email = new QueueEmail($this->adapter);$email->processEmailTemplate($emailTemplate, $arrayCont, $ownerFeed->email, trim($ownerFeed->first_name . ' ' . $ownerFeed->last_name));}}}$total_comments = $commentMapper->fetchCountCommentByFeedId($comment->feed_id);$feed->total_comments = $total_comments;$feedMapper->update($feed);$response = ['success' => true,'data' => $this->renderComment($comment->id, $now),'total_comments' => $total_comments];return new JsonModel($response);} else {$response = ['success' => false,'data' => $commentMapper->getError()];return new JsonModel($response);}} else {$message = '';;$form_messages = (array) $form->getMessages();foreach ($form_messages as $fieldname => $field_messages) {foreach ($field_messages as $key => $value) {$message = $value;}}$response = ['success' => false,'data' => $message];return new JsonModel($response);}} else {$response = ['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED'];return new JsonModel($response);}}public function shareAction(){$id = $this->params()->fromRoute('id');$request = $this->getRequest();if ($request->isPost()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$feedMapper = FeedMapper::getInstance($this->adapter);$feed = $feedMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);if (!$feed) {$response = ['success' => false,'data' => 'ERROR_POST_NOT_FOUND'];return new JsonModel($response);}$dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());$dataPost['company_id'] = $this->params()->fromRoute('company_id');$dataPost['group_id'] = $this->params()->fromRoute('group_id');$dataPost['shared_feed_id'] = $feed->id;$response = $this->postOrShareFeed($dataPost);if ($response['success']) {$feedMapper->incTotalShared($feed->id);$total_shared = $feedMapper->fetchTotalShared($feed->id);$response['total_shared'] = $total_shared;}return new JsonModel($response);} else {$response = ['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED'];}return new JsonModel($response);}public function commentDeleteAction(){$request = $this->getRequest();if ($request->isPost()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$feed_id = $this->params()->fromRoute('id');$comment = $this->params()->fromRoute('comment');$feedMapper = FeedMapper::getInstance($this->adapter);$feed = $feedMapper->fetchOneByUuidAndNetworkId($feed_id, $currentUser->network_id);if ($feed) {$commentMapper = CommentMapper::getInstance($this->adapter);$comment = $commentMapper->fetchOneByUuid($comment);if ($comment && $comment->feed_id == $feed->id && $comment->user_id == $currentUser->id) {$comment->status = Comment::STATUS_DELETED;if ($commentMapper->update($comment)) {$total_comments = $commentMapper->fetchCountCommentByFeedId($comment->feed_id);$feedMapper = FeedMapper::getInstance($this->adapter);$feed = $feedMapper->fetchOne($comment->feed_id);$feed->total_comments = $total_comments;$feedMapper->update($feed);$response = ['success' => true,'data' => 'LABEL_COMMENT_WAS_DELETED','total_comments' => $total_comments];} else {$response = ['success' => false,'data' => $commentMapper->getError()];}} else {$response = ['success' => false,'data' => 'ERROR_COMMENT_NOT_FOUND'];}} else {$response = ['success' => false,'data' => 'ERROR_COMMENT_NOT_FOUND'];}} else {$response = ['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED'];}return new JsonModel($response);}public function deleteAction(){$request = $this->getRequest();if ($request->isPost()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$feed_id = $this->params()->fromRoute('id');$feedMapper = FeedMapper::getInstance($this->adapter);$feed = $feedMapper->fetchOneByUuidAndNetworkId($feed_id, $currentUser->network_id);if ($feed) {if ($feed->user_id && $feed->user_id == $currentUser->id) {return new JsonModel($this->deleteFeed($feed));} else if ($feed->group_id) {$groupMapper = GroupMapper::getInstance($this->adapter);$group = $groupMapper->fetchOne($feed->group_id);if ($group && $group->user_id == $currentUser->id) {return new JsonModel($this->deleteFeed($feed));}} else if ($feed->company_id) {$companyUserMapper = CompanyUserMapper::getInstance($this->adapter);$companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($feed->company_id, $currentUser->id);if ($companyUser) {if (in_array($companyUser->type, [CompanyUser::TYPE_OWNER, CompanyUser::TYPE_ADMINISTRATOR, CompanyUser::TYPE_MANAGER])) {return new JsonModel($this->deleteFeed($feed));}}}$response = ['success' => false,'data' => ' ERROR_UNAUTHORIZED'];} else {$response = ['success' => false,'data' => 'ERROR_FEED_NOT_FOUND'];}return new JsonModel($response);} else {$response = ['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED'];}return new JsonModel($response);}public function addAction(){$request = $this->getRequest();if ($request->isPost()) {$dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());$dataPost['company_id'] = $this->params()->fromRoute('company_id');$dataPost['group_id'] = $this->params()->fromRoute('group_id');$response = $this->postOrShareFeed($dataPost);return new JsonModel($response);} else {$response = ['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED'];}return new JsonModel($response);}public function postOrShareFeed($dataPost){$utilMapper = UtilMapper::getInstance($this->adapter);$now = $utilMapper->getDatebaseNow();$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$companyId = empty($dataPost['company_id']) ? '' : $dataPost['company_id'];$groupId = empty($dataPost['group_id']) ? '' : $dataPost['group_id'];if ($groupId || $companyId) {$form = new CreateGroupCompanyForm($this->adapter);} else {$form = new CreateForm($this->adapter);}$form->setData($dataPost);if ($form->isValid()) {$hydrator = new ObjectPropertyHydrator();$feed = new Feed();$hydrator->hydrate($dataPost, $feed);$company = null;$group = null;if ($companyId) {$companyMapper = CompanyMapper::getInstance($this->adapter);$company = $companyMapper->fetchOneByUuidAndNetworkId($companyId, $currentUser->network_id);if (!$company) {return ['success' => false,'data' => 'ERROR_COMPANY_NOT_FOUND'];}if ($company->status != Company::STATUS_ACTIVE) {return ['success' => false,'data' => 'ERROR_COMPANY_IS_NOT_ACTIVE'];}$companyUserMapper = CompanyUserMapper::getInstance($this->adapter);$companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);//print_r($companyUser); exit;if (!$companyUser || $companyUser->status != CompanyUser::STATUS_ACCEPTED) {return ['success' => false,'data' => 'ERROR_UNAUTHORIZED'];}}if ($groupId) {$groupMapper = GroupMapper::getInstance($this->adapter);$group = $groupMapper->fetchOneByUuidAndNetworkId($groupId, $currentUser->network_id);if (!$group) {return ['success' => false,'data' => 'ERROR_GROUP_NOT_FOUND'];}if ($group->status != Group::STATUS_ACTIVE) {return ['success' => false,'data' => 'ERROR_GROUP_IS_NOT_ACTIVE'];}$groupMemberMapper = GroupMemberMapper::getInstance($this->adapter);$groupMember = $groupMemberMapper->fetchOneByGroupIdAndUserId($group->id, $currentUser->id);if (!$groupMember || !in_array($groupMember->status, [GroupMember::STATUS_ACCEPTED, GroupMember::STATUS_AUTO_JOIN])) {return ['success' => false,'data' => 'ERROR_UNAUTHORIZED'];}}$feed->network_id = $currentUser->network_id;$feed->company_id = $company ? $company->id : null;$feed->group_id = $group ? $group->id : null;$feed->user_id = $currentUser->id;if ($companyId) {$feed->type = Feed::TYPE_COMPANY;} else if ($groupId) {$feed->type = Feed::TYPE_GROUP;} else {$feed->type = Feed::TYPE_UPDATE;}$posted_or_shared = $dataPost['posted_or_shared'];if ($posted_or_shared != Feed::POSTED && $posted_or_shared != Feed::SHARED) {return ['success' => false,'data' => 'ERROR_SUPPLY_VALID_SHARING_STATUS'];}$feed->posted_or_shared = $posted_or_shared;$feedMapper = FeedMapper::getInstance($this->adapter);$shared_with = isset($dataPost['shared_with']) ? $dataPost['shared_with'] : Feed::SHARE_WITH_PUBLIC;if ($shared_with != Feed::SHARE_WITH_PUBLIC && $shared_with != Feed::SHARE_WITH_CONNECTIONS) {return ['status' => false,'error' => 'ERROR_SUPPLY_VALID_SHARING_WITH_TYPE',];}$feed->shared_with = $shared_with;if (Feed::SHARED == $feed->posted_or_shared) {$shared_feed_id = empty($dataPost['shared_feed_id']) ? 0 : $dataPost['shared_feed_id'];$sharedFeed = $feedMapper->fetchOneByIdAndNetworkId($shared_feed_id, $currentUser->network_id);if (!$sharedFeed) {return ['status' => false,'error' => 'ERROR_POST_SHARE',];}$feed->shared_feed_id = $sharedFeed->id;$feed->shared_company_id = $sharedFeed->shared_company_id;$feed->shared_group_id = $sharedFeed->shared_group_id;$feed->shared_job_id = $sharedFeed->shared_job_id;} else {$sharedFeed = null;}$feed->status = Feed::STATUS_PUBLISHED;$feed->total_comments = 0;$feed->total_shared = 0;$files = $this->getRequest()->getFiles()->toArray();$file_type = '';$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) {$feed_filename = $this->normalizeString($fileBase64Name);$feed_tmp_filename = 'data' . DIRECTORY_SEPARATOR . 'tmp';if (!file_exists($feed_tmp_filename)) {mkdir($feed_tmp_filename, 0755, true);}$feed_tmp_filename = 'data' . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . $feed_filename;file_put_contents($feed_tmp_filename, $fileBase64Content);$mime_type = mime_content_type($feed_tmp_filename);//echo '$mime_type = '. $mime_type; exit;if ($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {$file_type = Feed::FILE_TYPE_IMAGE;} else if ($mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {$file_type = Feed::FILE_TYPE_VIDEO;} else if ($mime_type == 'application/pdf') {$file_type = Feed::FILE_TYPE_DOCUMENT;}}} catch (\Exception $e) {}}} else {if (isset($files['file']) && empty($files['file']['error'])) {$feed_tmp_filename = $files['file']['tmp_name'];$feed_filename = $this->normalizeString($files['file']['name']);$mime_type = mime_content_type($feed_tmp_filename);if ($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {$file_type = Feed::FILE_TYPE_IMAGE;} else if ($mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {$file_type = Feed::FILE_TYPE_VIDEO;} else if ($mime_type == 'application/pdf') {$file_type = Feed::FILE_TYPE_DOCUMENT;}}}$result = $feedMapper->insert($feed);if ($result) {if ($sharedFeed && $sharedFeed->type == Feed::TYPE_UPDATE) {$userMapper = UserMapper::getInstance($this->adapter);$ownerFeed = $userMapper->fetchOne($sharedFeed->user_id);$notification = new Notification();$notification->type = Notification::TYPE_SHARE_MY_FEED;$notification->read = Notification::NO;$notification->user_id = $ownerFeed->id;$notification->feed_id = $feed->id;$notification->message = 'LABEL_SHARE_MY_FEED';$notification->url = $this->url()->fromRoute('dashboard', ['feed' => $sharedFeed->uuid]);$notificationMapper = NotificationMapper::getInstance($this->adapter);$notificationMapper->insert($notification);$userNotificationMapper = UserNotificationSettingMapper::getInstance($this->adapter);$userNotification = $userNotificationMapper->fetchOne($ownerFeed->id);if ($userNotification && $userNotification->share_my_feed) {$emailTemplateMapper = EmailTemplateMapper::getInstance($this->adapter);$emailTemplate = $emailTemplateMapper->fetchOneByCodeAndNetworkId(EmailTemplate::CODE_SHARE_MY_FEED, $currentUser->network_id);if ($emailTemplate) {$arrayCont = ['firstname' => $currentUser->first_name,'lastname' => $currentUser->last_name,'other_user_firstname' => $ownerFeed->first_name,'other_user_lastname' => $ownerFeed->last_name,'company_name' => '','group_name' => '','content' => '','code' => '','link' => $this->url()->fromRoute('dashboard', ['feed' => $feed->uuid], ['force_canonical' => true])];$email = new QueueEmail($this->adapter);$email->processEmailTemplate($emailTemplate, $arrayCont, $ownerFeed->email, trim($ownerFeed->first_name . ' ' . $ownerFeed->last_name));}}}$feed = $feedMapper->fetchOne($feed->id);if ($file_type == Feed::FILE_TYPE_DOCUMENT) {try {$target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;if (!file_exists($target_path)) {mkdir($target_path, 0755);}$full_filename = $target_path . DIRECTORY_SEPARATOR . $feed_filename;if ($encoding == 'base64') {$resultMoveOrRename = rename($feed_tmp_filename, $full_filename);} else {$resultMoveOrRename = move_uploaded_file($feed_tmp_filename, $full_filename);}if ($resultMoveOrRename) {$feed->file_type = $file_type;$feed->file_name = basename($feed_filename);$feedMapper->update($feed);} else {error_log('no se pudo mover o renombrar el documento : ' . $feed_tmp_filename . ' al directorio : ' . $full_filename);}} catch (\Throwable $e) {error_log($e->getTraceAsString());}}if ($file_type == Feed::FILE_TYPE_IMAGE) {try {$target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;if (!file_exists($target_path)) {mkdir($target_path, 0755);}list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.feed_image_size']);$feed_filename = substr($feed_filename, 0, strrpos($feed_filename, '.')) . '.png';//$crop_to_dimensions = false;//if(Image::uploadImage($feed_tmp_filename, $target_path, $feed_filename, $target_width, $target_height, $crop_to_dimensions )) {if (Image::uploadImageWithoutCompletationSize($feed_tmp_filename, $target_path, $feed_filename, $target_width, $target_height)) {$feed->file_type = $file_type;$feed->file_name = basename($feed_filename);$feedMapper->update($feed);}} catch (\Throwable $e) {error_log($e->getTraceAsString());}}if ($file_type == Feed::FILE_TYPE_VIDEO) {try {$target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;if (!file_exists($target_path)) {mkdir($target_path, 0755);}$full_filename = $target_path . DIRECTORY_SEPARATOR . $feed_filename;if ($encoding == 'base64') {$resultMoveOrRename = rename($feed_tmp_filename, $full_filename);} else {$resultMoveOrRename = move_uploaded_file($feed_tmp_filename, $full_filename);}if ($resultMoveOrRename) {// $getFromSecound = 2;//extracción del cover$generateFileName = substr($feed_filename, 0, strrpos($feed_filename, '.'));$generateFile = $target_path . DIRECTORY_SEPARATOR . $generateFileName . '.jpg';$cmd = "/usr/bin/ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width,duration $full_filename";//error_log($cmd);$response = trim(shell_exec($cmd));$source_duration = 0;$lines = explode("\n", $response);foreach ($lines as $line) {$line = trim(strtolower($line));if (strpos($line, 'duration') !== false) {$values = explode('=', $line);$source_duration = intval(str_replace($values[1], '#', ''), 10);}}if ($source_duration == 0) {$second_extract = '00:00:02';} else {if ($source_duration > 10) {$second_extract = '00:00:10';} else {$second_extract = '00:00:02';}}$imageSize = $this->config['leaderslinked.image_sizes.feed_image_size'];//$cmd = "/usr/bin/ffmpeg -y -i $full_filename -pix_fmt yuvj422p -deinterlace -an -ss $second_extract -f mjpeg -t 1 -r 1 -y -s $imageSize $generateFile";$cmd = "/usr/bin/ffmpeg -y -i $full_filename -pix_fmt yuvj422p -an -ss $second_extract -f mjpeg -t 1 -r 1 -y -s $imageSize $generateFile";//error_log($cmd);exec($cmd);$feed->file_type = $file_type;$feed->file_name = basename($feed_filename);$feed->file_image_preview = basename($generateFile);$feedMapper->update($feed);$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 : ' . $feed_tmp_filename . ' al directorio : ' . $full_filename);}} catch (\Throwable $e) {error_log($e->getTraceAsString());}}return ['success' => true,'data' => $this->renderFeed($feed->id, $now)];} else {return ['success' => false,'data' => $feedMapper->getError()];}} else {$messages = [];$form_messages = (array) $form->getMessages();foreach ($form_messages as $fieldname => $field_messages) {$messages[$fieldname] = array_values($field_messages);}return ['success' => false,'data' => $messages];}}public function saveReactionAction(){$id = $this->params()->fromRoute('id');$reaction = $this->params()->fromRoute('reaction');$request = $this->getRequest();if ($request->isPost()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$feedMapper = FeedMapper::getInstance($this->adapter);$feed = $feedMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);if (!$feed) {$response = ['success' => false,'data' => 'ERROR_POST_NOT_FOUND'];return new JsonModel($response);}$contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);$contentReaction = $contentReactionMapper->fetchOneByFeedIdAndUserId($feed->id, $currentUser->id);if ($contentReaction) {$contentReaction->reaction = $reaction;$result = $contentReactionMapper->update($contentReaction);} else {$contentReaction = new ContentReaction();$contentReaction->user_id = $currentUser->id;$contentReaction->feed_id = $feed->id;$contentReaction->relational = ContentReaction::RELATIONAL_FEED;$contentReaction->reaction = $reaction;$result = $contentReactionMapper->insert($contentReaction);}if ($result) {$reactions = $contentReactionMapper->fetchCountContentReactionsByFeedId($feed->id);$response = ['success' => true,'data' => ['reactions' => $reactions]];} else {$response = ['success' => false,'data' => $contentReactionMapper->getError()];}return new JsonModel($response);}$response = ['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED'];return new JsonModel($response);}public function deleteReactionAction(){$id = $this->params()->fromRoute('id');$request = $this->getRequest();if ($request->isPost()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$feedMapper = FeedMapper::getInstance($this->adapter);$feed = $feedMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);if (!$feed) {$response = ['success' => false,'data' => 'ERROR_POST_NOT_FOUND'];return new JsonModel($response);}$contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);$contentReaction = $contentReactionMapper->fetchOneByFeedIdAndUserId($feed->id, $currentUser->id);if (!$contentReaction) {$response = ['success' => false,'data' => 'ERROR_DUPLICATE_ACTION'];return new JsonModel($response);}if ($contentReactionMapper->deleteByFeedIdAndUserId($feed->id, $currentUser->id)) {$reactions = $contentReactionMapper->fetchCountContentReactionsByFeedId($feed->id);$response = ['success' => true,'data' => ['reactions' => $reactions]];} else {$response = ['success' => false,'data' => $contentReactionMapper->getError()];}return new JsonModel($response);}$response = ['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED'];return new JsonModel($response);}/*public function likeAction(){$id = $this->params()->fromRoute('id');$request = $this->getRequest();if ($request->isPost()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$feedMapper = FeedMapper::getInstance($this->adapter);$feed = $feedMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);if (!$feed) {$response = ['success' => false,'data' => 'ERROR_POST_NOT_FOUND'];return new JsonModel($response);}$contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);$contentReaction = $contentReactionMapper->fetchOneByFeedIdAndUserId($feed->id, $currentUser->id);if ($contentReaction) {$response = ['success' => false,'data' => 'ERROR_DUPLICATE_ACTION'];return new JsonModel($response);}$contentReaction = new Like();$contentReaction->user_id = $currentUser->id;$contentReaction->feed_id = $feed->id;$contentReaction->relational = Like::RELATIONAL_FEED;if ($contentReactionMapper->insert($contentReaction)) {$contentReactions = $contentReactionMapper->fetchCountLikeByFeedId($feed->id);if ($feed->type == Feed::TYPE_UPDATE) {$userMapper = UserMapper::getInstance($this->adapter);$ownerFeed = $userMapper->fetchOne($feed->user_id);$notification = new Notification();$notification->type = Notification::TYPE_LIKE_MY_FEED;$notification->read = Notification::NO;$notification->user_id = $feed->user_id;$notification->feed_id = $feed->id;$notification->message = 'LABEL_LIKE_MY_FEED';$notification->url = $this->url()->fromRoute('dashboard', ['feed' => $feed->uuid]);$notificationMapper = NotificationMapper::getInstance($this->adapter);$notificationMapper->insert($notification);$userNotificationMapper = UserNotificationSettingMapper::getInstance($this->adapter);$userNotification = $userNotificationMapper->fetchOne($ownerFeed->id);if ($userNotification && $userNotification->like_my_feed) {$emailTemplateMapper = EmailTemplateMapper::getInstance($this->adapter);$emailTemplate = $emailTemplateMapper->fetchOneByCodeAndNetworkId(EmailTemplate::CODE_LIKE_MY_FEED, $currentUser->network_id);if ($emailTemplate) {$arrayCont = ['firstname' => $currentUser->first_name,'lastname' => $currentUser->last_name,'other_user_firstname' => $ownerFeed->first_name,'other_user_lastname' => $ownerFeed->last_name,'company_name' => '','group_name' => '','content' => '','code' => '','link' => $this->url()->fromRoute('dashboard', ['feed' => $feed->uuid], ['force_canonical' => true])];$email = new QueueEmail($this->adapter);$email->processEmailTemplate($emailTemplate, $arrayCont, $ownerFeed->email, trim($ownerFeed->first_name . ' ' . $ownerFeed->last_name));}}}$response = ['success' => true,'data' => ['likes' => $contentReactions]];} else {$response = ['success' => false,'data' => $contentReactionMapper->getError()];}return new JsonModel($response);}$response = ['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED'];return new JsonModel($response);}public function unlikeAction(){$id = $this->params()->fromRoute('id');$request = $this->getRequest();if ($request->isPost()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$feedMapper = FeedMapper::getInstance($this->adapter);$feed = $feedMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);if (!$feed) {$response = ['success' => false,'data' => 'ERROR_POST_NOT_FOUND'];return new JsonModel($response);}$contentReactionMapper = LikeMapper::getInstance($this->adapter);$contentReaction = $contentReactionMapper->fetchOneByFeedIdAndUserId($feed->id, $currentUser->id);if (!$contentReaction) {$response = ['success' => false,'data' => 'ERROR_DUPLICATE_ACTION'];return new JsonModel($response);}if ($contentReactionMapper->deleteByFeedIdAndUserId($feed->id, $currentUser->id)) {$contentReactions = $contentReactionMapper->fetchCountLikeByFeedId($feed->id);$response = ['success' => true,'data' => ['likes' => $contentReactions]];} else {$response = ['success' => false,'data' => $contentReactionMapper->getError()];}return new JsonModel($response);}$response = ['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED'];return new JsonModel($response);}*/public function timelineAction(){$utilMapper = UtilMapper::getInstance($this->adapter);$now = $utilMapper->getDatebaseNow();$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$type = $this->params()->fromRoute('type');if ($type == 'user') {$id = $currentUser->id;} else {$id = $this->params()->fromRoute('id');}$feedHighlighted = 0;$feedUuid = $this->params()->fromRoute('feed');if ($feedUuid) {$feedMapper = FeedMapper::getInstance($this->adapter);$feed = $feedMapper->fetchOneByUuidAndNetworkIdAnyStatus($feedUuid, $currentUser->network_id);if ($feed) {$feedHighlighted = $feed->id;}}$request = $this->getRequest();if ($request->isGet()) {$page = (int) $this->params()->fromQuery('page');if ($type == 'user') {$connectionMapper = ConnectionMapper::getInstance($this->adapter);$records = $connectionMapper->fetchAllConnectionsByUser($id);$connectionIds = [0];foreach ($records as $record) {if ($currentUser->id == $record->request_from) {array_push($connectionIds, $record->request_to);} else {array_push($connectionIds, $record->request_from);}}array_push($connectionIds, 1);$companyFollowerMapper = CompanyFollowerMapper::getInstance($this->adapter);$records = $companyFollowerMapper->fetchAllByFollowerId($currentUser->id);$companyIds = [0];foreach ($records as $record) {if (!in_array($record->company_id, $companyIds)) {array_push($companyIds, $record->company_id);}}$companyUserMapper = CompanyUserMapper::getInstance($this->adapter);$companyUsers = $companyUserMapper->fetchAllByUserId($currentUser->id);foreach ($companyUsers as $companyUser) {if ($companyUser->status == CompanyUser::STATUS_ACCEPTED) {if (!in_array($companyUser->company_id, $companyIds)) {array_push($companyIds, $companyUser->company_id);}}}$groupMemberMapper = GroupMemberMapper::getInstance($this->adapter);$groupMembers = $groupMemberMapper->fetchAllByUserId($currentUser->id);$groupIds = [0];foreach ($groupMembers as $groupMember) {if ($groupMember->status == GroupMember::STATUS_ACCEPTED) {if (!in_array($groupMember->group_id, $groupIds)) {array_push($groupIds, $groupMember->group_id);}}}$queryMapper = QueryMapper::getInstance($this->adapter);$select = $queryMapper->getSql()->select(FeedMapper::_TABLE);$select->columns(['id']);$select->where->equalTo('network_id', $currentUser->network_id);$select->where->equalTo('status', Feed::STATUS_PUBLISHED)->AND->NEST->OR->NEST->equalTo('user_id', $id)->and->equalTo('type', Feed::TYPE_UPDATE)->UNNEST->OR->NEST->and->equalTo('type', Feed::TYPE_UPDATE)->and->equalTo('shared_with', Feed::SHARE_WITH_PUBLIC)->UNNEST->OR->NEST->in('user_id', $connectionIds)->and->equalTo('type', Feed::TYPE_UPDATE)->and->equalTo('shared_with', Feed::SHARE_WITH_CONNECTIONS)->UNNEST->OR->NEST->or->in('company_id', $companyIds)->and->equalTo('type', Feed::TYPE_COMPANY)->UNNEST->OR->NEST->or->in('group_id', $groupIds)->and->equalTo('type', Feed::TYPE_GROUP)->UNNEST->UNNEST;$select->order('added_on desc');}if ($type == 'company') {$companyMapper = CompanyMapper::getInstance($this->adapter);$company = $companyMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);if (!$company || $company->status != Company::STATUS_ACTIVE) {$id = 0;} else {$companyFollowerMapper = CompanyFollowerMapper::getInstance($this->adapter);$companyFollower = $companyFollowerMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);if ($companyFollower) {$id = $company->id;} else {$companyUserMapper = CompanyUserMapper::getInstance($this->adapter);$companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);if (!$companyUser || $companyUser->status != CompanyUser::STATUS_ACCEPTED) {$id = 0;} else {$id = $company->id;}}}$queryMapper = QueryMapper::getInstance($this->adapter);$select = $queryMapper->getSql()->select(FeedMapper::_TABLE);$select->columns(['id']);$select->where->equalTo('network_id', $currentUser->network_id);$select->where->equalTo('status', Feed::STATUS_PUBLISHED);$select->where->equalTo('company_id', $id);$select->where->and->equalTo('type', Feed::TYPE_COMPANY);$select->order('added_on desc');}if ($type == 'group') {$groupMapper = GroupMapper::getInstance($this->adapter);$group = $groupMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);$id = 0;if ($group && $group->status == Group::STATUS_ACTIVE) {$groupMemberMapper = GroupMemberMapper::getInstance($this->adapter);$groupMember = $groupMemberMapper->fetchOneByGroupIdAndUserId($group->id, $currentUser->id);if ($groupMember) {if ($groupMember->status == GroupMember::STATUS_ACCEPTED ||$groupMember->status == GroupMember::STATUS_AUTO_JOIN) {$id = $groupMember->group_id;}}}$queryMapper = QueryMapper::getInstance($this->adapter);$select = $queryMapper->getSql()->select(FeedMapper::_TABLE);$select->columns(['id']);$select->where->equalTo('network_id', $currentUser->network_id);$select->where->equalTo('status', Feed::STATUS_PUBLISHED);$select->where->equalTo('group_id', $id);$select->where->and->equalTo('type', Feed::TYPE_GROUP);$select->where->or->equalTo('type', Feed::TYPE_UPDATE);$select->order('added_on desc');}$dbSelect = new DbSelect($select, $this->adapter);$paginator = new Paginator($dbSelect);$paginator->setCurrentPageNumber($page ? $page : 1);$paginator->setItemCountPerPage(10);$items = [];if ($feedHighlighted) {$items[] = $this->renderFeed($feedHighlighted, $now, $feedHighlighted);}$feeds = $paginator->getCurrentItems();foreach ($feeds as $feed) {$items[] = $this->renderFeed($feed->id, $now, $feedHighlighted);}$response = ['success' => true,'data' => ['total' => ['count' => $paginator->getTotalItemCount(),'pages' => $paginator->getPages()->pageCount,],'current' => ['items' => $items,'page' => $paginator->getCurrentPageNumber(),'count' => $paginator->getCurrentItemCount(),]]];/*if($feedHighlighted) {$items[] = $this->renderFeed($feedHighlighted, $now, $feedHighlighted);$response = ['success' => true,'data' => ['total' => ['count' => 1,'pages' => 1,],'current' => ['items' => $items,'page' => 1,'count' => 1,]]];} else {$feeds = $paginator->getCurrentItems();foreach($feeds as $feed){$items[] = $this->renderFeed($feed->id, $now, $feedHighlighted);}$response = ['success' => true,'data' => ['total' => ['count' => $paginator->getTotalItemCount(),'pages' => $paginator->getPages()->pageCount,],'current' => ['items' => $items,'page' => $paginator->getCurrentPageNumber(),'count' => $paginator->getCurrentItemCount(),]]];}*/return new JsonModel($response);}$response = ['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED'];return new JsonModel($response);}/**** @param string $str* @return string*/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 int $feed_id* @return array*/private function renderFeed($feed_id, $now, $feedHighlighted = 0){$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();//$acl = $this->getEvent()->getViewModel()->getVariable('acl');$userMapper = UserMapper::getInstance($this->adapter);$feedMapper = FeedMapper::getInstance($this->adapter);$feed = $feedMapper->fetchOneAnyStatus($feed_id);/*$contentReactionMapper = LikeMapper::getInstance($this->adapter);$contentReaction = $contentReactionMapper->fetchOneByFeedIdAndUserId($feed->id, $currentUser->id);$contentReactions = $contentReactionMapper->fetchCountLikeByFeedId($feed->id);*/$contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);$reactions = $contentReactionMapper->fetchCountContentReactionsByFeedId($feed->id);$reaction = $contentReactionMapper->fetchOneByFeedIdAndUserId($feed->id, $currentUser->id);$params = ['id' => $feed->uuid];if ($feed->company_id) {$companyMapper = CompanyMapper::getInstance($this->adapter);$company = $companyMapper->fetchOne($feed->company_id);$params['company_id'] = $company->uuid;} else {$company = null;}if ($feed->group_id) {$groupMapper = GroupMapper::getInstance($this->adapter);$group = $groupMapper->fetchOne($feed->group_id);$params['group_id'] = $group->uuid;} else {$group = null;}$timestamp = time();list($usec, $sec) = explode(' ', microtime());$seed = intval($sec + ((float) $usec * 100000));mt_srand($seed, MT_RAND_MT19937);$rand = mt_rand();$password = md5('user-' . $currentUser->uuid . '-feed-' . $feed->uuid . '-timestamp-' . $timestamp . '-rand-' . $rand . '-share-key-' . $currentUser->share_key);$share_params = ['type' => 'feed','code' => $feed->uuid,'user' => $currentUser->uuid,'timestamp' => $timestamp,'rand' => $rand,'password' => $password,];$share_increment_external_counter_url = $this->url()->fromRoute('share/increment-external-counter', $share_params, ['force_canonical' => true]);$share_external_url = $this->url()->fromRoute('shorter/generate', ['code' => $feed->uuid, 'type' => 'feed'], ['force_canonical' => true]);$params_reaction = array_merge($params, ['reaction' => ContentReaction::REACTION_RECOMMENDED]);$feed_save_reaction_recommended = $this->url()->fromRoute('feed/save-reaction', $params_reaction);$params_reaction = array_merge($params, ['reaction' => ContentReaction::REACTION_SUPPORT]);$feed_save_reaction_support = $this->url()->fromRoute('feed/save-reaction', $params_reaction);$params_reaction = array_merge($params, ['reaction' => ContentReaction::REACTION_LOVE]);$feed_save_reaction_love = $this->url()->fromRoute('feed/save-reaction', $params_reaction);$params_reaction = array_merge($params, ['reaction' => ContentReaction::REACTION_INTEREST]);$feed_save_reaction_interest = $this->url()->fromRoute('feed/save-reaction', $params_reaction);$params_reaction = array_merge($params, ['reaction' => ContentReaction::REACTION_FUN]);$feed_save_reaction_fun = $this->url()->fromRoute('feed/save-reaction', $params_reaction);$item = ['feed_unique' => uniqid(),'feed_uuid' => $feed->uuid,'feed_my_reaction' => $reaction ? $reaction->reaction : '','feed_save_reaction_recommended_url' => $feed_save_reaction_recommended,'feed_save_reaction_support_url' => $feed_save_reaction_support,'feed_save_reaction_love_url' => $feed_save_reaction_love,'feed_save_reaction_interest_url' => $feed_save_reaction_interest,'feed_save_reaction_fun_url' => $feed_save_reaction_fun,'feed_delete_reaction_url' => $this->url()->fromRoute('feed/delete-reaction', $params),'feed_share_url' => $this->url()->fromRoute('feed/share', $params),'feed_share_external_url' => $share_external_url,'feed_increment_external_counter_url' => $share_increment_external_counter_url,'feed_delete_url' => '','feed_content_type' => $feed->file_type ? $feed->file_type : '','feed_reactions' => $reactions,'feed_highlighted' => $feed->id == $feedHighlighted ? 1 : 0,//'is_liked' => $contentReaction ? 1 : 0,//'like_url' => $this->url()->fromRoute('post/like', ['id' => $post->uuid]),//'unlike_url' => $this->url()->fromRoute('post/unlike', ['id' => $post->uuid]),];if ($feed->posted_or_shared == Feed::POSTED) {if ($feed->type == Feed::TYPE_COMPANY) {$companyMapper = CompanyMapper::getInstance($this->adapter);$company = $companyMapper->fetchOne($feed->company_id);$item['owner_url'] = $this->url()->fromRoute('company/view', ['id' => $company->uuid]);$item['owner_image'] = $this->url()->fromRoute('storage', ['code' => $company->uuid, 'type' => 'company', 'filename' => $company->image]);$item['owner_name'] = $company->name;/*$companyUserMapper = CompanyUserMapper::getInstance($this->adapter);$companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);if( $companyUser && $acl->isAllowed( $currentUser->usertype_id, 'my-company/feed' ) ) {$item['feed_delete_url'] = $this->url()->fromRoute('feed/delete', $params);}*/} else if ($feed->type == Feed::TYPE_GROUP) {$groupMapper = GroupMapper::getInstance($this->adapter);$group = $groupMapper->fetchOne($feed->group_id);$item['owner_url'] = '';$item['owner_image'] = $this->url()->fromRoute('storage', ['code' => $group->uuid, 'type' => 'group', 'filename' => $group->image]);$item['owner_name'] = $group->name;if ($group->user_id == $currentUser->id) {$item['feed_delete_url'] = $this->url()->fromRoute('feed/delete', $params);}} else {$userMapper = UserMapper::getInstance($this->adapter);$user = $userMapper->fetchOne($feed->user_id);$item['owner_url'] = $this->url()->fromRoute('profile/view', ['id' => $user->uuid]);$item['owner_image'] = $this->url()->fromRoute('storage', ['code' => $user->uuid, 'type' => 'user', 'filename' => $user->image]);$item['owner_name'] = $user->first_name . ' ' . $user->last_name;if ($feed->user_id == $currentUser->id) {$item['feed_delete_url'] = $this->url()->fromRoute('feed/delete', $params);}}} else {if ($feed->user_id == $currentUser->id) {$item['feed_delete_url'] = $this->url()->fromRoute('feed/delete', $params);}}$userMapper = UserMapper::getInstance($this->adapter);$user = $userMapper->fetchOne($feed->user_id);if ($feed->posted_or_shared == Feed::SHARED) {$item['owner_url'] = $this->url()->fromRoute('profile/view', ['id' => $user->uuid]);$item['owner_image'] = $this->url()->fromRoute('storage', ['code' => $user->uuid, 'type' => 'user', 'filename' => $user->image]);$item['owner_name'] = $user->first_name . ' ' . $user->last_name;}$item['owner_description'] = $feed->description;$item['owner_feed_type'] = $feed->type;$item['owner_shared'] = $feed->total_shared;$item['owner_external_shared'] = $feed->total_external_shared;$item['owner_comments'] = $feed->total_comments;$item['owner_time_elapse'] = Functions::timeAgo($feed->added_on, $now);if ($feed->file_type == Feed::FILE_TYPE_IMAGE) {$item['owner_file_image'] = $this->url()->fromRoute('storage', ['code' => $feed->uuid, 'type' => 'feed', 'filename' => $feed->file_name]);}if ($feed->file_type == Feed::FILE_TYPE_DOCUMENT) {$item['owner_file_document'] = $this->url()->fromRoute('storage', ['code' => $feed->uuid, 'type' => 'feed', 'filename' => $feed->file_name]);}if ($feed->file_type == Feed::FILE_TYPE_VIDEO) {$item['owner_file_image_preview'] = $this->url()->fromRoute('storage', ['code' => $feed->uuid, 'type' => 'feed', 'filename' => $feed->file_image_preview]);$item['owner_file_video'] = $this->url()->fromRoute('storage', ['code' => $feed->uuid, 'type' => 'feed', 'filename' => $feed->file_name]);}if ($feed->posted_or_shared == Feed::SHARED) {$sharedFeed = $feedMapper->fetchOneAnyStatus($feed->shared_feed_id);$item['shared_description'] = $sharedFeed->description;$item['shared_time_elapse'] = Functions::timeAgo($sharedFeed->added_on, $now);if ($sharedFeed->file_type == Feed::FILE_TYPE_IMAGE) {$item['shared_file_image'] = $this->url()->fromRoute('storage', ['code' => $sharedFeed->uuid, 'type' => 'feed', 'filename' => $sharedFeed->file_name]);}if ($sharedFeed->file_type == Feed::FILE_TYPE_DOCUMENT) {$item['shared_file_document'] = $this->url()->fromRoute('storage', ['code' => $sharedFeed->uuid, 'type' => 'feed', 'filename' => $sharedFeed->file_name]);}if ($sharedFeed->file_type == Feed::FILE_TYPE_VIDEO) {$item['shared_file_image_preview'] = $this->url()->fromRoute('storage', ['code' => $sharedFeed->uuid, 'type' => 'feed', 'filename' => $sharedFeed->file_image_preview]);$item['shared_file_video'] = $this->url()->fromRoute('storage', ['code' => $sharedFeed->uuid, 'type' => 'feed', 'filename' => $sharedFeed->file_name]);}$item['shared_content_type'] = $sharedFeed->file_type ? $sharedFeed->file_type : '';if ($feed->company_id) {$companyMapper = CompanyMapper::getInstance($this->adapter);$sharedCompany = $companyMapper->fetchOne($feed->company_id);$item['shared_url'] = $this->url()->fromRoute('company/view', ['id' => $sharedCompany->uuid]);$item['shared_image'] = $this->url()->fromRoute('storage', ['code' => $sharedCompany->uuid, 'type' => 'company', 'filename' => $sharedCompany->image]);$item['shared_name'] = $sharedCompany->name;} else if ($feed->group_id) {$groupMapper = GroupMapper::getInstance($this->adapter);$sharedGroup = $groupMapper->fetchOne($feed->group_id);$item['shared_url'] = '';$item['shared_image'] = $this->url()->fromRoute('storage', ['code' => $sharedGroup->uuid, 'type' => 'group', 'filename' => $sharedGroup->image]);$item['shared_name'] = $sharedGroup->name;} else {$sharedUser = $userMapper->fetchOne($sharedFeed->user_id);$item['shared_url'] = $this->url()->fromRoute('profile/view', ['id' => $sharedUser->uuid]);$item['shared_image'] = $this->url()->fromRoute('storage', ['code' => $sharedUser->uuid, 'type' => 'user', 'filename' => $sharedUser->image]);$item['shared_name'] = $sharedUser->first_name . ' ' . $sharedUser->last_name;}}$commentMapper = CommentMapper::getInstance($this->adapter);$records = $commentMapper->fetchAllPublishedByFeedId($feed->id);$comments = [];foreach ($records as $record) {$user = $userMapper->fetchOne($record->user_id);if ($record->user_id == $currentUser->id) {$link_delete = $this->url()->fromRoute('feed/comment/delete', ['id' => $feed->uuid, 'comment' => $record->uuid]);} else {$link_delete = '';}array_push($comments, ['unique' => uniqid(),'user_url' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),'user_name' => $user->first_name . ' ' . $user->last_name,'user_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image]),'time_elapsed' => Functions::timeAgo($record->added_on, $now),'comment' => $record->comment,'link_delete' => $link_delete]);}$item['comment_add_url'] = $this->url()->fromRoute('feed/comment', ['id' => $feed->uuid]);$item['comments'] = $comments;return $item;}/**** @param int $comment_id* @return array*/private function renderComment($comment_id, $now){$item = [];$commentMapper = CommentMapper::getInstance($this->adapter);$record = $commentMapper->fetchOne($comment_id);$feedMapper = FeedMapper::getInstance($this->adapter);$feed = $feedMapper->fetchOne($record->feed_id);if ($record) {$userMapper = UserMapper::getInstance($this->adapter);$user = $userMapper->fetchOne($record->user_id);$item['unique'] = uniqid();$item['user_image'] = $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image]);$item['user_url'] = $this->url()->fromRoute('profile', ['id' => $user->uuid]);$item['user_name'] = $user->first_name . ' ' . $user->last_name;$item['time_elapsed'] = Functions::timeAgo($record->added_on, $now);$item['comment'] = $record->comment;$item['link_delete'] = $this->url()->fromRoute('feed/comment/delete', ['id' => $feed->uuid, 'comment' => $record->uuid]);}return $item;}/**** @param string $path* @return boolean*/private function deletePath($path){try {if (is_dir($path)) {if ($dh = opendir($path)) {while (($file = readdir($dh)) !== false) {if ($file == '.' || $file == '..') {continue;}unlink($path . DIRECTORY_SEPARATOR . $file);}closedir($dh);}rmdir($path);}return true;} catch (\Throwable $e) {error_log($e->getTraceAsString());return false;}}/**** @param Feed $feed* @return array*/private function deleteFeed($feed){$feedMapper = FeedMapper::getInstance($this->adapter);$feed->status = Feed::STATUS_DELETED;if ($feedMapper->update($feed)) {$response = ['success' => true,'data' => 'LABEL_FEED_WAS_DELETED'];} else {$response = ['success' => false,'data' => $feedMapper->getError()];}/*$commentMapper = CommentMapper::getInstance($this->adapter);if($commentMapper->deleteAllByFeedId($feed->id)) {if($feedMapper->delete($feed->id)) {$target_path = $this->config['leaderslinked.fullpath.feed'] . DIRECTORY_SEPARATOR . $feed->id;if(file_exists($target_path)) {$this->deletePath($target_path);}$response = ['success' => true,'data' => 'LABEL_FEED_WAS_DELETED'];} else {$response = ['success' => false,'data' => $feedMapper->getError()];}} else {$response = ['success' => false,'data' => $commentMapper->getError()];}*/return $response;}}