Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 2960 | Rev 3298 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

<?php

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 Laminas\View\Model\JsonModel;
use LeadersLinked\Model\Page;
use LeadersLinked\Mapper\NotificationMapper;
use LeadersLinked\Mapper\CompanyMapper;
use LeadersLinked\Mapper\CompanyUserMapper;
use LeadersLinked\Model\Company;
use LeadersLinked\Mapper\PageMapper;
use LeadersLinked\Mapper\MessageMapper;
use LeadersLinked\Mapper\UserMapper;
use LeadersLinked\Mapper\UserProfileMapper;
use LeadersLinked\Mapper\CompanyUserRoleMapper;
use LeadersLinked\Model\Role;
use LeadersLinked\Library\Functions;
use LeadersLinked\Mapper\ConnectionMapper;
use LeadersLinked\Mapper\LocationMapper;
use LeadersLinked\Mapper\PostMapper;
use LeadersLinked\Mapper\ProfileVisitMapper;
use LeadersLinked\Model\Post;
use LeadersLinked\Mapper\UtilMapper;

class HomeController 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;
    }



    public function indexAction()
    {

        $authService = new \Laminas\Authentication\AuthenticationService();
        if ($authService->hasIdentity()) {
            return $this->redirect()->toRoute('dashboard');
        } else {
            return $this->redirect()->toRoute('signin');
        }
    }


    public function dashboardAction()
    {
        $this->layout()->setTemplate('layout/layout.phtml');
        $viewModel = new ViewModel();
        $viewModel->setTemplate('leaders-linked/home/dashboard.phtml');
        return $viewModel;
    }



    public function privacyPolicyAction()
    {
        $pageMapper = PageMapper::getInstance($this->adapter);
        $page = $pageMapper->fetchOne(Page::PAGE_ID_PRIVACY_POLICY);

        $this->layout()->setTemplate('layout/layout.phtml');
        $viewModel = new ViewModel();
        $viewModel->setTemplate('leaders-linked/home/privacy-policy.phtml');
        $viewModel->setVariable('page', $page);
        return $viewModel;
    }

    public function cookiesAction()
    {
        $pageMapper = PageMapper::getInstance($this->adapter);
        $page = $pageMapper->fetchOne(Page::PAGE_ID_COOKIES);

        $this->layout()->setTemplate('layout/layout.phtml');
        $viewModel = new ViewModel();
        $viewModel->setTemplate('leaders-linked/home/cookies.phtml');
        $viewModel->setVariable('page', $page);
        return $viewModel;
    }

    public function professionalismPolicyAction()
    {
        //

        $pageMapper = PageMapper::getInstance($this->adapter);
        $page = $pageMapper->fetchOne(Page::PAGE_ID_PROFESSIONALISM_POLICY);

        $this->layout()->setTemplate('layout/layout.phtml');
        $viewModel = new ViewModel();
        $viewModel->setTemplate('leaders-linked/home/professionalism-policy');
        $viewModel->setVariable('page', $page);
        return $viewModel;
    }


    public function termsAndConditionsAction()
    {
        $pageMapper = PageMapper::getInstance($this->adapter);
        $page = $pageMapper->fetchOne(Page::PAGE_ID_TERMS_AND_CONDITIONS);

        $this->layout()->setTemplate('layout/layout.phtml');
        $viewModel = new ViewModel();
        $viewModel->setTemplate('leaders-linked/home/terms-and-conditions.phtml');
        $viewModel->setVariable('page', $page);
        return $viewModel;
    }

    public function checkSessionAction()
    {

        $request = $this->getRequest();
        if ($request->isGet()) {

            $currentUserPlugin = $this->plugin('currentUserPlugin');
            if (!$currentUserPlugin->hasIdentity()) {
                $flashMessenger = $this->plugin('FlashMessenger');
                $flashMessenger->addErrorMessage('ERROR_SESSION_NOT_FOUND');

                $response = [
                    'success' => false,
                    'data' => [
                        'message' =>  'ERROR_SESSION_NOT_FOUND',
                        'url' => $this->url()->fromRoute('signout')
                    ]
                ];

                return new JsonModel($response);
            }

            $currentUser = $currentUserPlugin->getUser();


            if ($currentUser->last_activity_on) {
                $last_activity_on = strtotime($currentUser->last_activity_on);
            } else {
                $last_activity_on = strtotime('-1 day');
            }

            $expiry_time = $last_activity_on + $this->config['leaderslinked.security.last_activity_expired'];
            if (time() > $expiry_time) {
                //$flashMessenger = $this->plugin('FlashMessenger');
                //$flashMessenger->addErrorMessage('ERROR_SESSION_EXPIRED');

                $response = [
                    'success' => false,
                    'data' => [
                        'message' => 'ERROR_SESSION_EXPIRED',
                        'url' => $this->url()->fromRoute('signout')
                    ]
                ];
            } else {
                $notificationMapper = NotificationMapper::getInstance($this->adapter);
                $total_notifications = $notificationMapper->fetchUnreadNotificationsCount($currentUser->id);

                $messageMapper = MessageMapper::getInstance($this->adapter);
                $total_messages =  $messageMapper->fetchCountUnreadMessagesReceiverId($currentUser->id);
                $response = [
                    'success' => true,
                    'data' => [
                        'total_notifications' => $total_notifications,
                        'total_messages' => $total_messages
                    ]
                ];
            }
        } else {
            $response = [
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ];
        }

        return new JsonModel($response);
    }

    public function notificationsAction()
    {
        $request = $this->getRequest();
        if ($request->isGet()) {

            $currentUserPlugin = $this->plugin('currentUserPlugin');
            $currentUser = $currentUserPlugin->getUser();

            $userMapper = UserMapper::getInstance($this->adapter);
            $user = $userMapper->fetchOne($currentUser->id);

            $userProfileMapper = UserProfileMapper::getInstance($this->adapter);
            $userProfile = $userProfileMapper->fetchOnePublicByUserId($currentUser->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');
                    }
                }
            }

            if ($isJson) {
                
                $utilMapper = UtilMapper::getInstance($this->adapter);
                $now = $utilMapper->getDatebaseNow();


                $notificationMapper = NotificationMapper::getInstance($this->adapter);
                $records = $notificationMapper->fetchAllsReadByUserId($currentUser->id);

                $items = [];
                foreach ($records as $record) {

                    array_push($items, [
                        'message' => $record->message,
                        'link' => $record->url,
                        'time_elapsed' => Functions::timeAgo( $record->added_on, $now),
                        'time' => $record->added_on
                    ]);
                }

                usort($items, function ($a, $b) {
                    
                    if ($a['time'] == $b['time']) {
                        return 0;
                    } else {
                        return $a['time'] < $b['time'] ? -1 : 1;
                    }
                
                });

                $response = [
                    'success' => true,
                    'data' => $items
                ];
            } else {

                if ($user->location_id) {
                    $locationMapper = LocationMapper::getInstance($this->adapter);
                    $location = $locationMapper->fetchOne($user->location_id);

                    $country = $location->country;
                } else {
                    $country = '';
                }

                $profileVisitMapper = ProfileVisitMapper::getInstance($this->adapter);
                $visits = $profileVisitMapper->getTotalByVisitedId($currentUser->id);

                $connectionMapper = ConnectionMapper::getInstance($this->adapter);
                $connections = $connectionMapper->fetchTotalConnectionByUser($currentUser->id);

                $this->layout()->setTemplate('layout/layout.phtml');
                $viewModel = new ViewModel();
                $viewModel->setVariables([
                    'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image]),
                    'fullname' => trim($user->first_name . ' ' . $user->last_name),
                    'description' => empty($userProfile->description) ? '' :  trim($userProfile->description),
                    'country' => $country,
                    'visits' => $visits,
                    'connections' => $connections
                ]);

                $viewModel->setTemplate('leaders-linked/home/notifications.phtml');
                return $viewModel;
            }
        } else {
            $response = [
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ];
        }

        return new JsonModel($response);
    }

    public function lastNotificationsAction()
    {
        $request = $this->getRequest();
        if ($request->isGet()) {
            
            $utilMapper = UtilMapper::getInstance($this->adapter);
            $now = $utilMapper->getDatebaseNow();

            $currentUserPlugin = $this->plugin('currentUserPlugin');
            $currentUser = $currentUserPlugin->getUser();

            $notificationMapper = NotificationMapper::getInstance($this->adapter);
            $records = $notificationMapper->fetchAllsUnreadByUserId($currentUser->id);

            $items = [];
            foreach ($records as $record) {
                array_push($items, [
                    'message' => $record->message,
                    'link' => $record->url,
                    'time_elapsed' => Functions::timeAgo($record->added_on, $now),
                    'time' => $record->added_on
                ]);
            }

            usort($items, function ($a, $b) {

                if ($a['time'] == $b['time']) {
                    return 0;
                } else {
                    return $a['time'] < $b['time'] ? -1 : 1;
                }
            });

            $count = $notificationMapper->fetchUnreadNotificationsCount($currentUser->id);

            $response = [
                'success' => true,
                'data' => $items,
                'unreadNotificationsCount' => $count
            ];
            
        } else {
            $response = [
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ];
        }

        return new JsonModel($response);
    }

    public function markReadAction()
    {

        $request = $this->getRequest();

        if ($request->isPost()) {

            $currentUserPlugin = $this->plugin('currentUserPlugin');
            $currentUser = $currentUserPlugin->getUser();

            $userMapper = UserMapper::getInstance($this->adapter);

            $notificationMapper = NotificationMapper::getInstance($this->adapter);

            $result = $notificationMapper->markAllNotificationsAsReadByUserId($currentUser->id);

            if ($result) {
                $this->logger->info('Se marco como leidas las notificaciones de usuario: ' . $currentUser->id, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                $response = [
                    'success' => true,
                    'data' => 'LABEL_RECORD_UPDATED'
                ];
            } else {
                $response = [
                    'success' => false,
                    'data' => $notificationMapper->getError()
                ];
            }


        }else{
            $response = [
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ];

        }

        return new JsonModel($response);
    }

    public function postAction()
    {
        $id = $this->params()->fromRoute('id');

        $postMapper = PostMapper::getInstance($this->adapter);
        $post = $postMapper->fetchOneByUuid($id);

        if (!$post || $post->status != Post::STATUS_ACTIVE) {
            $flashMessenger = $this->plugin('FlashMessenger');

            if (!$id) {
                $flashMessenger->addErrorMessage('ERROR_POST_NOT_AVAILABLE');
                return $this->redirect()->toRoute('dashboard');
            }
        }


        $this->layout()->setTemplate('layout/layout.phtml');
        $viewModel = new ViewModel();
        $viewModel->setTemplate('leaders-linked/home/post.phtml');
        $viewModel->setVariable('post', $post);
        return $viewModel;
    }
}