View file upload/src/addons/XenCentral/Feedback/Pub/Controller/Main.php

File size: 23.26Kb
<?php
/**
 * @package XenCentral Feedback System
 * @author DNF Technology
 * @copyright Drnoyan & Nalyan LDA, Portugal, EU
 * @license http://dnf.technology/terms/
 * @link http://customers.dnf.technology
 * @version 2.0.0 Beta 10
 * @revision 12
 */

namespace XenCentral\Feedback\Pub\Controller;

use XF\Db\Exception;
use XF\Mvc\ParameterBag;
use XF\Pub\Controller\AbstractController;

class Main extends AbstractController
{
    use FeedbackAbstractController;


    public function actionIndex(ParameterBag $params)
    {

        if (!(\XF::visitor()->canViewFeedback())) {
            \XF::repository('XenCentral\Feedback:ReportSuspicious')->reportActivity('viewindex');
            return $this->error(\XF::phrase('xcfs_cannot_view_the_page'));
        }
        if ($params->user_id) {

            return $this->rerouteController(__CLASS__, 'view-user', $params);
        }
        $feedbackModel = \XF::repository('XenCentral\Feedback:Feedback');
        $userModel = \XF::repository('XenCentral\Feedback:User');
        $xenUserModel = \XF::repository('XF:User');
        $latestFeedback = $feedbackModel->getNewFeedback(0, 10);

        $viewParams = array(
            'tradingAjaxCallInterval'=> \XF::options()->xcfs_ajax_reload_interval * 1000,
            'latestFeedback' => $latestFeedback,
            'tabs' => $this->getTabs(),
            'sidebar' => $this->getSidebar($userModel->getUserById(\XF::visitor()->user_id), false  )
        );

        \XF::repository('XenCentral\Feedback:Activity')->viewHome();


        return  $this->view('XenCentral\Feedback:HomePage', 'xcfs_home_page', $viewParams);

    }

    public function actionAddFeedback(ParameterBag $params)
    {
        $this->assertRegistrationRequired();

        if (!(\XF::visitor()->canUseFeedback() ||  !\XF::visitor()->feedbackRestricted(\XF::visitor()))) {

            $this->_getReportSuspicious()->reportActivity('addfeedback');
            return $this->error(\XF::phrase('1'));
        }

        if (!\XF::visitor()->canGiveFeedback() || !\XF::visitor()->feedbackRestricted(\XF::visitor())) {
            $this->_getReportSuspicious()->reportActivity('givefeedback');
            return $this->error(\XF::phrase('xcfs_cannot_view_the_page'));
        }

        $user_id = $params->user_id;

        $with = [];
        $user = \XF::em()->find('XF:User', $user_id, $with);

        if (!$user) {
            $this->_getReportSuspicious()->reportActivity('usernotfound', array(
                'user_id' => $user_id
            ));
            return $this->error(\XF::phrase('requested_user_not_found'));
        }

        if($user['user_id']== (\XF::visitor()->user_id)) {
            return $this->error(\XF::phrase('xcfs_cannot_view_the_page'));
        }

        if (!\XF::visitor()->canReceiveFeedback($user)) {
            $this->_getReportSuspicious()->reportActivity('usercannotreceive', array(
                'user_id' => $user_id
            ));
            return $this->error(\XF::phrase('xcfs_cannot_view_the_page'));
        }

        $noRedirect = $this->filter('noRedirect', 'bool');

        if ($this->_getOptionsModel()->getAjaxRedirect() || $this->responseType() != 'json') {
            $noRedirect = false;
        }

	    //throw new Exception($noRedirect);

	    $thread_id = $this->filter('threadId', 'uint');

        $suggestedThreads=array();

        if ($thread_id) {
            $thread = $this->em()->find('XF:Thread', $thread_id, []);
            $dealurl = \XF::app()->router('public')->buildLink('full:threads', $thread);

            if ($this->_getOptionsModel()->getCheckThreadStarter()) {
                $dealurl = '';
                // get list of suggested threads, and if
                $fromuserid = \XF::visitor()->user_id;
                $foruserid = $user_id;

                $suggestedThreads = $this->_getToolsModel()->getThreadSuggestions('', array($fromuserid, $foruserid));

            }
        } else {
            $dealurl = '';
            if ($this->_getOptionsModel()->getCheckThreadStarter()) {
                // get list of suggested threads, and if
                $fromuserid = \XF::visitor()->user_id;
                $foruserid = $user_id;

                $suggestedThreads = $this->_getToolsModel()->getThreadSuggestions('', array($fromuserid, $foruserid));

            }
        }

        $breadCrumbs['userlink'] = array(
            'href' => \XF::app()->router('public')->buildLink('feedback', $user),
            'value' => \XF::phrase('xcfs_feedback_for_x', array(
                'username' => $user['username']
            )),
            'node_id' => $user['user_id']
        );

        $breadCrumbs['addfeedback'] = array(
            'href' => \XF::app()->router('public')->buildLink('feedback/add-feedback', $user),
            'value' => \XF::phrase('xcfs_add_feedback_for_x', array(
                'username' => $user['username']
            ))
        );

        $viewParams = array(
            'user' => $user,
            'breadCrumbs' => $breadCrumbs,
            'feedback' => array(
                'fb_id' => 0,
                'amount' => -2,
                'dealurl' => $dealurl,
                'thread_id' => $thread_id
            ),
            'suggestedThreads'=> $suggestedThreads,
            'disableURL' => $dealurl != '',
            'noRedirect' => $noRedirect,
            'commenttext' => '',
            'showCommentForm' => $this->_getOptionsModel()->getShowCommentForm(),
            'requireComment' => $this->_getOptionsModel()->getRequireComment()
        );

        $this->_getActivityModel()->addFeedback($user);

        return $this->view('XenCentral\Feedback:AddFeedback', 'xcfs_add_feedback', $viewParams);
    }

    public function actionDoAddFeedback(parameterBag $params)
    {
        $this->assertPostOnly();

        if ( ! \XF::visitor()->canUseFeedback() ||  !\XF::visitor()->feedbackRestricted(\XF::visitor()) ) {

            $this->_getReportSuspicious()->reportActivity('addfeedback');
            return $this->error(\XF::phrase('1'));
        }

        if ( ! \XF::visitor()->canGiveFeedback() ||  !\XF::visitor()->feedbackRestricted(\XF::visitor())) {
            $this->_getReportSuspicious()->reportActivity('givefeedback');
            return $this->error(\XF::phrase('2'));
        }

	    $fb_id = $this->filter('fb_id', 'uint');

	    if ( $fb_id ) {
		    return $this->rerouteController('XenCentral\Feedback:Feedback', 'do-edit-feedback', $fb_id);
	    }

        $this->assertValidCsrfToken($this->filter('_xfToken', 'str'));

        $input = $this->filter(array(
            'foruserid' => 'int',
            'type' => 'str',
            'amount' => 'int',
            'dealurl' => 'str',
            'review' => 'str',
            'thread_id' => 'int',
            'comment_html' => 'str'
        ));

        $userRepo = \XF::repository('XF:User');
        $with = [];
        $user = \XF::em()->find('XF:User', $input['foruserid'], $with);

        $feedbackWriter = $this->em()->create('XenCentral\Feedback:Feedback');
        $feedbackWriter->set('foruserid', $input['foruserid']);
        $feedbackWriter->set('fromuserid', \XF::visitor()->user_id);
        $feedbackWriter->set('amount', $input['amount']);
        $feedbackWriter->set('type', $input['type']);
        $feedbackWriter->set('threadid', $input['thread_id']);
        $feedbackWriter->set('dealurl', $input['dealurl']);
        $feedbackWriter->set('review', htmlspecialchars($input['review']));

        if (!$input['comment_html'] && $this->_getOptionsModel()->getRequireComment()) {
             {
                return $this->error(\XF::phrase('xcfs_please_enter_comment_text'));
            }
        }

	    if ( $input['comment_html'] && $this->_getOptionsModel()->getCommentMinimumLength() && strlen( strip_tags( $input['comment_html'] ) ) < $this->_getOptionsModel()->getCommentMinimumLength() ) {
		    $feedbackWriter->error(\XF::phrase( 'xcfs_comment_length_x', array(
			    'length' => $this->_getOptionsModel()->getCommentMinimumLength()
		    ) ) );
	    }

	    $feedbackWriter->preSave();
        $feedbackWriter->save();

	    $fb_id = $feedbackWriter->get('fb_id');

        $message = $this->plugin('XF:Editor')->fromInput('comment');

        if ($message) {
            $commentWriter = $this->em()->create('XenCentral\Feedback:FeedbackComment');
            $commentWriter->set('fb_id', $fb_id);
            $commentWriter->set('user_id', \XF::visitor()->user_id);
            $commentWriter->set('message', $message);
            $commentWriter->preSave();
            $commentWriter->save();
        }
        $activityRepo = \XF::repository('XenCentral\Feedback:Activity');
        $activityRepo->addedFeedback($fb_id, $user);

        return $this->redirect($this->buildLink('feedback', $user));
    }
    public function actionViewUser(ParameterBag $params)
    {
        if (!\XF::visitor()->canViewFeedback()) {
            $user_id = $params->user_id;

            $this->_getReportSuspicious()->reportActivity('viewuser', array(
                'user_id' => $user_id
            ));
            return $this->error(\XF::phrase('xcfs_cannot_view_the_page'));
        }

        if ($this->responseType() == 'json' && $this->filter('viewmoreleft', 'uint')) {

            return $this->rerouteController(__CLASS__, 'view-more-left');
        }

        $user_id = $params->user_id;
        if (!$user_id) {
            $user_id = \XF::visitor()->user_id;
        }

        $with = [];
        $user = \XF::em()->find('XF:User', $user_id, $with);

        if (!$user) {
            $this->_getReportSuspicious()->reportActivity('usernotfound', array(
                'user_id' => $user_id
            ));
            return $this->error(\XF::phrase('requested_user_not_found'));
        }


        $feedbackModel = $this->_getFeedbackModel();

        $settings = $this->filter(
            array(
                'byFilter' => 'array',
                'amountFilter' => 'array',
                'from' => 'str',
                'to' => 'str',
                'usernameFilter' => 'str',
                'lastid'=>'uint'
            )
        );

        $from = strtotime($settings['from']);
        $to = strtotime($settings['to']);

        if ($this->filter('reloadList', 'uint')) {
            if (empty($settings['byFilter']) && empty($settings['amountFilter']) && !$to && !$from || $to && $from && $to < $from) {
                $this->error(\XF::phrase('xcfs_please_check_configuration'));
            }
            $limit= $this->_getOptionsModel()->getFilteredPerPage();

            // results should be reloaded and not appended
            $append = false;
        } else {
            $limit = $this->_getOptionsModel()->getPerPage();
            // used only with JSON requests
            $append = true;
        }

        $all_feedback = $feedbackModel->setAmountFilter($settings['amountFilter'])
            ->setFromDateFilter($from)
            ->setToDateFilter($to)
            ->setFromUserFilter($settings['usernameFilter'])
            ->setTypeFilter($settings['byFilter'])
            ->setLastIdFilter($settings['lastid'])
            ->getFilteredFeedbackList($user_id, $limit);

        $viewMoreParams=$settings;

        unset($viewMoreParams['lastid']);

        $viewMoreReceivedLink=\XF::app()->router('public')->buildLink('feedback', $user, $viewMoreParams);

        if ($this->responseType() == 'json') {
            $viewParams = array(
                'allfeedback' => $all_feedback,
                'filteredNotice' => false,
                'append'=>$append,
                'viewMoreReceivedLink'=> $viewMoreReceivedLink,
                'user' => $user
            );
            if (count($all_feedback)<$limit) {
                $viewParams['empty']=1;
            }
            return $this->view('XenCentral\Feedaback:ViewUser', 'xcfs_feedback_list_simple', $viewParams);
        }


        $sellerfeedback = $buyerfeedback = $traderfeedback = array();

        foreach ($all_feedback as $key => $feedback)
        {
            if ($feedback['type'] == 'sell') {
                $sellerfeedback[$key] = $feedback;
            }
            else if ($feedback['type'] == 'buy') {
                $buyerfeedback[$key] = $feedback;
            }
            else if ($feedback['type'] == 'trade') {
                $traderfeedback[$key] = $feedback;
            }
        }

        // get all feedback user left for others
        $leftfeedback = $feedbackModel->getFeedbackLeft($user_id, $this->_getOptionsModel()->getPerPage());

        if (!empty($leftfeedback)) {
            $lastFeedback = end($leftfeedback);
            $lastFeedbackDate = $lastFeedback['dateline'];
        }
        else
        {
            $lastFeedbackDate = 0;
        }
        $perPage = $this->_getOptionsModel()->getPerPage();

        $userModel = $this->_getUserModel();

        $sidebar = $this->getSidebar($userModel->getUserById($user_id),
            \XF::visitor()->canUseFeedback() && $user_id != \XF::visitor()->user_id);
        $allFeedbackForVisitor = $feedbackModel->setAmountFilter($settings['amountFilter'])
            ->setFromDateFilter($from)
            ->setToDateFilter($to)
            ->setFromUserFilter($settings['usernameFilter'])
            ->setTypeFilter($settings['byFilter'])
            ->setLastIdFilter($settings['lastid'])
            ->getFilteredFeedbackList(\XF::visitor()->user_id, $limit);

        $viewParams = array(
            'user' => $user,
            'filteredNotice'=>$feedbackModel->getResultsAreFiltered(),
            'allfeedback' => $all_feedback,
            'allFeedbackForVisitor' =>$allFeedbackForVisitor,
            'leftfeedback' => $leftfeedback,
            'lastFeedbackDate' => $lastFeedbackDate,
            'viewMoreReceivedLink'=>$viewMoreReceivedLink,
            'sidebar' => $sidebar
        );

        if(count($all_feedback)<$limit) {
            // there is no more...
            $viewParams['viewMoreReceivedLink']='';
        }

        $this->_getActivityModel()->viewUser($user);

        return $this->view('XenCentral\Feedback:ViewUser', 'xcfs_trading_profile', $viewParams);
    }

    public function actionViewMoreLeft(ParameterBag $params)
    {
        $user_id = $params->user_id;

        $with = [];
        $user = \XF::em()->find('XF:User', $user_id, $with);


        if (!$user) {
            $this->_getReportSuspicious()->reportActivity('usernotfound', array(
                'user_id' => $user_id
            ));
            return $this->error(\XF::phrase('requested_user_not_found'));
        }


        $lastid = $this->filter('lastid', 'uint');

        $feedbackModel = $this->_getFeedbackModel();

        $leftfeedback = $feedbackModel->getFeedbackLeft($user_id, $this->_getOptionsModel()->getPerPage(), $lastid);

        $viewParams = array(
            'allfeedback' => $leftfeedback
        );

        if(count($leftfeedback) < $this->_getOptionsModel()->getPerPage()) {
            $viewParams['empty']=1;
        }

        return $this->view('XenCentral\Feedback:ViewUser', 'xcfs_feedback_list_simple', $viewParams);
    }
    public function actionLatestFeedback()
    {
        $lastUpdated = $this->filter('lastUpdate', 'uint');

        if (!$lastUpdated) {
            $lastUpdated=time();
            $limit = 10;
        }
        else
        {
            $limit = 0;
        }

        $feedback = $this->_getFeedbackModel()->getNewFeedback($lastUpdated, $limit);

        $viewParams = array('latestFeedback' => $feedback);

        return $this->view('XenCentral\Feedback:LatestFeedback', 'xcfs_latest_feedback', $viewParams);
    }



    public function actionLatestActivity()
    {
        $this->assertValidCsrfToken($this->filter('_xfToken', 'str'));

        $limit = 10;//TODO change to option.
        $checkedTypes = $this->filter('checkedTypes', 'array');

        $usernameFilter = $this->filter('usernameFilter', 'str');

        $history = $this->_getActivityModel()->setTypeFilter($checkedTypes)->setUserNameFilter($usernameFilter)->getLatestActivity($limit);


        $viewParams = array('history' => $history);

        return $this->view('XenCentral\Feedback:LatestActivity', 'xcfs_latest_activity', $viewParams);
    }

    public function actionSuggestThread()
    {
        $query = $this->filter('query', 'str');
        if ($query == '.') {
            $query = '';
        }

        $foruserid = $this->filter('foruserid', 'uint');
        $fromuserid = $this->filter('fromuserid', 'uint');

        if (
        $this->_getOptionsModel()->getCheckThreadStarter()
        ) {
            $includedUsers = array($foruserid, $fromuserid);
        } else {
            // no check for users if big-board fix is enabled
            $includedUsers = array();
        }

        $threads = $this->_getToolsModel()->getThreadSuggestions($query, $includedUsers);

        $result = array(
            'query' => $query,
            'suggestions' => array()
        );

        if (empty($threads)) {
            echo json_encode($result);
            exit;
        }

        $visitor = \XF::visitor()->user_id;

        $threadModel = \XF::repository('XF:Thread');

        foreach ($threads AS $key => $value) {
            if($key==0) {
                foreach ($value AS $thread) {
                    $result['suggestions'][] = array('value' =>$thread['title'], 'data' => \XF::app()->router('public')->buildLink('full:threads', $thread));

                }
            }

            if($key==1) {
                foreach ($value AS $resource) {
                    $result['suggestions'][] = array('value' => $resource['title'], 'data' => \XF::app()->router('public')->buildLink('full:resources', $resource));

                }
            }
            if($key==2) {
                foreach ($value AS $gallery) {
                    $result['suggestions'][] = array('value' => $gallery['title'], 'data' => \XF::app()->router('public')->buildLink('full:media', $gallery));
                }
            }

        }

        echo json_encode($result);
        exit();

    }

    public function actionSuggestUser()
    {

        $query = $this->filter('query', 'str');
        if (!$query) {
            exit();
        }

        $users = $this->_getUserModel()->getUserNames($query);

        if (empty($users)) {
            exit();
        }


        $result = array(
            'query' => $query,
            'suggestions' => array()
        );

        foreach ($users AS $user)
        {

            $result['suggestions'][] = array('value'=>$user['username'], 'data'=> $user['user_id']);
        }

        echo json_encode($result);
        exit();
    }

    public function actionPreferences()
    {
        if (!\XF::visitor()->user_id OR !\XF::visitor()->canViewFeedback()) {
            return $this->error(\XF::phrase('xcfs_cannot_view_the_page'));
        }

        $viewParams = array(
          'preferences' => $this->_getPreferencesModel()->getUserNotificationPreferences(),
            'showInvisible' => \Xf::visitor()->canBeInvisibleFeedback()
        );
        if($viewParams['preferences']==false){
            $viewParams=array();
        }

        return $this->view(
            'XenCentral\FeedBack:Preferences',
            'xcfs_trading_preferences',
            $viewParams
        );

    }

    public function actionPreferencesSave()
    {
        $this->assertPostOnly();

        if (!\XF::visitor()->user_id OR !\XF::visitor()->canViewFeedback()) {
            return $this->error(\XF::phrase('xcfs_cannot_view_the_page'));
        }

        $writer = $this->em()->find('XenCentral\Feedback:FeedbackPreferences', [
            'pr_user_id' => \XF::visitor()->user_id
        ]);
        if(!$writer){
            $writer= $this->em()->create('XenCentral\Feedback:FeedbackPreferences');
        }


        $preferences = $this->_getPreferencesModel()->getUserNotificationPreferences();

        if (!empty($preferences['default'])) {
            $writer->set('pr_user_id', \XF::visitor()->user_id);
        }
        else
        {
            $writer->set('pr_user_id', \XF::visitor()->user_id);
        }

        $settings = $this->filter(array(
            'xc_feedback_notify_email' => 'array',
            'xc_feedback_notify_pm' => 'array',
            'xc_feedback_notify_notification' =>'array',
            'xc_feedback_is_invisible' => 'uint'
        ));

        if (!\XF::visitor()->canBeInvisibleFeedback()) {
            $settings['xc_feedback_is_invisible'] = 0;
        }

        if(!($this->_verifyNotifyOptions($settings['xc_feedback_notify_email']))){

            return $this->error(\XF::phrase('xcfs_option_is_not_serialaized1'));

        }
        if(!($this->_verifyNotifyOptions($settings['xc_feedback_notify_pm']))){

            return $this->error(\XF::phrase('xcfs_option_is_not_serialaized2'));

        }
        if(!($this->_verifyNotifyOptions($settings['xc_feedback_notify_notification']))){

            return $this->error(\XF::phrase('xcfs_option_is_not_serialaized3'));

        }

        $writer->bulkSet($settings);

        if ($dwErrors = $writer->getErrors()) {
            $this->error($dwErrors);
        }

        $writer->save();

        return $this->redirect( \XF::app()->router('public')->buildLink('feedback'), \XF::phrase('xcfs_preferences_saved'));
    }
    public static function getSessionActivityDetailsForList(array $activities) {
        return \XF::phrase( 'xcfs_viewing_feedback_system' );
    }
    protected function _verifyNotifyOptions(&$value)
    {

        if (!is_array($value))
        {
            $this->error(\XF::phrase('xcfs_incorrect_values_used'));
            return false;
        }

        foreach ($value AS $key => $val)
        {
            $val = intval($val);
            if (!in_array($key, $this->_notifyOptions))
            {
                unset($value[$key]);
                continue;
            }

            $value[$key] = $val;
        }

        foreach ($this->_notifyOptions AS $option)
        {
            if (!isset($value[$option]))
            {
                $value[$option] = false;
            }
        }

        if(isset($value['type']) && !in_array($value['type'], array(0, 1, 24, 168)))
        {
            $value['type']=0;
        }

        $value = serialize($value);

        return true;
    }
    protected $_existingDataErrorPhrase = 'requested_user_not_found';

    protected $_notifyOptions = array(
        'positive', 'neutral', 'negative', 'type'
    );

    public function actionAuthors(ParameterBag $params)
    {
	    $user_id = $params->user_id;

    	$user = $this->_getUserModel()->getTrader( $user_id );


        $with = [];
        $xf_user = \XF::em()->find('XF:User', $user_id, $with);

        $feedback = $this->_getFeedbackModel()->getAllFeedback($user_id, 5);
        $feedbackModel = $this->_getFeedbackModel();


        $allFeedbackForVisitor = $feedbackModel
            ->getFilteredFeedbackList(\XF::visitor()->user_id, 5);

        $canSubmitFeedback = (\XF::visitor()->canGiveFeedback()) && (\XF::visitor()->user_id != $user_id) && ($xf_user->canReceiveFeedback()) && (($this->_getOptionsModel()->getFeedbackRestricted() && !empty($allFeedbackForVisitor) || !($this->_getOptionsModel()->getFeedbackRestricted())));

        $viewParams=[
            'user'=>$user,
	        'xf_user'=>$xf_user,
            'feedback'=>$feedback,
            'canSubmitFeedback'=>$canSubmitFeedback
        ];
        return $this->view(
            'XenCentral\FeedBack:Author',
            'xcfs_membertab_content',
            $viewParams
        );
    }
}