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

File size: 20.97Kb
<?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 Feedback extends AbstractController
{
    use FeedbackAbstractController;

    public function actionIndex()
    {
        return $this->rerouteController(__CLASS__, 'View');
    }

    public function actionView(ParameterBag $params)
    {
        $fb_id = $params->fb_id;

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

        $feedback = $this->_getFeedbackModel()->getFeedbackById($fb_id);


        if (!$feedback) {
            $this->_getReportSuspicious()->reportActivity('viewinvalidfeedback', array(
                'fb_id' => $fb_id
            ));
            return $this->error(\XF::phrase('xcfs_invalid_feedback_id'));
        }

        $with = [];
        $user = \XF::em()->find('XF:User', $feedback['foruserid'], $with);
	    $commentModel = $this->_getCommentModel();

        // get all feedback user got
        $comments = $commentModel->getAllComments($fb_id);

        $userModel = $this->_getUserModel();

        $sidebar = $this->getSidebar($userModel->getUserById($user['user_id'], array(
                        'PermissionCombination'
                )),
                \XF::visitor()->canUseFeedback() && $user['user_id'] != \XF::visitor()->user_id);
        $viewParams = array(
            'user' => $user,
            'feedback' => $feedback,
            'comments' => $comments,
            'sidebar' => $sidebar,
            'cancomment' => ((\XF::visitor()->canAdminFeedback() || $this->_getFeedbackModel()->isTrader($feedback, \XF::visitor()->user_id)) && (\XF::visitor()->user_id == $feedback['fromuserid'] || \XF::visitor()->user_id == $feedback['foruserid']))
        );

        $this->_getActivityModel()->viewFeedback($user, $feedback);

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

    public function actionAddFeedback(ParameterBag $params)
    {
        if (!\XF::visitor()->canUseFeedback() || ! \XF::visitor()->feedbackRestricted(\XF::visitor())) {
            $this->_getReportSuspicious()->reportActivity('addfeedback');
            return $this->error(\XF::phrase('xcfs_cannot_view_the_page'));
        }

        $fb_id = $params->fb_id;

        $feedback = $this->_getFeedbackModel()->getFeedbackById($fb_id);

        if (!$feedback) {

            $this->_getReportSuspicious()->reportActivity('addreplyfeedback', array(
                'fb_id' => $fb_id
            ));
            return $this->error(\XF::phrase('xcfs_invalid_feedback_id'));
        }

        $user_id = $feedback['fromuserid'];
        if ($user_id == \XF::visitor()->user_id) {

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

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

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


        $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,
            'feedback' => array(
                'type' => $feedback['type'],
                'fb_id' => 0,
                'amount' => -2,
                'dealurl' => $feedback['dealurl']
            ),
            'breadCrumbs' => $breadCrumbs,
            'disableURL' => $feedback['dealurl'] != '',
            '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 actionAddComment(ParameterBag $params)
    {
        $fb_id = $params->fb_id;

        $feedback = $this->_getFeedbackModel()->getFeedbackById($fb_id);

        if (!$feedback) {
            $this->_getReportSuspicious( )->reportActivity('addcommentfeedbackinvalid', array(
                'fb_id' => $fb_id
            ));
            return $this->error(\XF::phrase('xcfs_invalid_feedback_id'));
        }

        if (\XF::visitor()->canAdminFeedback() && !$this->_getFeedbackModel()->isTrader($feedback, \XF::visitor()->user_id)
        ) {
            $this->_getReportSuspicious( )->reportActivity('addcomment');
            return $this->error(\XF::phrase('xcfs_cannot_view_the_page'));
        }

        $user_id = $feedback['foruserid'];

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

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

        $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['feedbacklink'] = array(
            'href' => \XF::app()->router('public')->buildLink('feedback/feedback/view', $feedback),
            'value' => $feedback['review'],
            'node_id' => $feedback['fb_id']
        );

        $breadCrumbs['commentlink'] = array(
            'href' => \XF::app()->router('public')->buildLink('feedback/feedback/add-comment', $feedback),
            'value' => \XF::phrase('xcfs_add_comment'),
            'node_id' => $feedback['fb_id']
        );
        
        $viewParams = array(
            'user' => $user,
            'feedback' => $feedback,
            'breadCrumbs' => $breadCrumbs,
            'comment' => array(
                'message' => ''
            )
        );

        $this->_getActivityModel()->addComment($feedback, $user);

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

    public function actionDoAddComment(ParameterBag $params)
    {
        $this->assertPostOnly();

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

	    $comment_id=$params->comment_id;

	    if ($comment_id) {

		    return $this->rerouteController('XenCentral\Feedback:Comment', 'do-edit-comment');
	    }
        $feedbackModel = $this->_getFeedbackModel();

        $feedback = $feedbackModel->getFeedbackById($fb_id);

        if (!$feedback) {
            $this->_getReportSuspicious( )->reportActivity('addcommentfeedbackinvalid', array(
                'fb_id' => $fb_id
            ));
            return $this->error(\XF::phrase('xcfs_invalid_feedback_id'));
        }

        if (!\XF::visitor()->canAdminFeedback() && !$this->_getFeedbackModel()->isTrader($feedback, \XF::visitor()->user_id)
        ) {
            $this->_getReportSuspicious( )->reportActivity('addcomment');
            return $this->error(\XF::phrase('xcfs_cannot_view_the_page'));
        }

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

        $input['comment_html'] = $this->filter('comment_html', 'str');
        $input['comment_html'] = $this->plugin('XF:Editor')->fromInput('comment_html');

        $checker= $this->app()->spam()->contentChecker();
        $checker->check($user, $this->filter('comment_html', 'str'));
        if($checker->getFinalDecision()=='denied'){
            $this->error(\XF::phrase('your_content_cannot_be_submitted_try_later'));
        }

        $visitor = \XF::visitor();
        $comment = $this->plugin('XF:Editor')->fromInput('comment');
        $commentWriter = $this->em()->create('XenCentral\Feedback:FeedbackComment');
        $commentWriter->set('fb_id', $fb_id);
        $commentWriter->set('user_id', $visitor->user_id);
        $commentWriter->set('message', $comment);

        $commentWriter->preSave();

        $commentWriter->save();

        $this->_getActivityModel()->commentSaved($feedback, $user);

        return $this->redirect(\XF::app()->router('public')->buildLink('feedback/feedback/view', $feedback),
            \XF::phrase('xcfs_your_comment_has_been_posted'));
    }

    public function actionEdit(ParameterBag $params)
    {

        $fb_id = $params->fb_id;

        $feedbackModel = $this->_getFeedbackModel();

        $feedback = $feedbackModel->getFeedbackById($fb_id);

        if (!$feedback) {
            $this->_getReportSuspicious( )->reportActivity('addcommentfeedbackinvalid', array(
                'fb_id' => $fb_id
            ));
            return $this->error(\XF::phrase('xcfs_invalid_feedback_id'));
        }

        if (!$feedback['canedit']) {
            $this->_getReportSuspicious( )->reportActivity('feedbackedit', array(
                'fb_id' => $fb_id
            ));
            return $this->error(\XF::phrase('xcfs_cannot_view_the_page'));
        }

        $user_id = $feedback['foruserid'];

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

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

        $comment = $this->_getCommentModel()->getFirstComment($fb_id);

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

        $breadCrumbs['feedbacklink'] = array(
            'href' => \XF::app()->router('public')->buildLink('feedback/feedback/view', $feedback),
            'value' => $feedback['review']
        );

        $breadCrumbs['editlink'] = array(
            'href' => \XF::app()->router('public')->buildLink('feedback/feedback/edit', $feedback),
            'value' => \XF::phrase('xcfs_edit_feedback')
        );

        $viewParams = array(
            'user' => $user,
            'breadCrumbs' => $breadCrumbs,
            'feedback' => $feedback,
            'commenttext' => $comment['message'],
            'showCommentForm'=> $this->_getOptionsModel()->getShowCommentForm(),
        );

        $this->_getActivityModel()->editFeedback($feedback, $user);

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

    public function actionDoEditFeedback(ParameterBag $params)
    {

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

        $feedbackModel = $this->_getFeedbackModel();

        $feedback = $feedbackModel->getFeedbackById($fb_id);

        if (!$feedback) {
            $this->_getReportSuspicious( )->reportActivity('editfeedbackinvalid', array(
                'fb_id' => $fb_id
            ));
            return $this->error(\XF::phrase('xcfs_invalid_feedback_id'));
        }

        if (!$feedback['canedit']) {
            return $this->error(\XF::phrase('xcfs_cannot_view_the_page'));
        }

        $user_id = $feedback['foruserid'];

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

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

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

	     $input['review'] = htmlspecialchars($input['review']);

	     if (!$input['amount']) {
            $input['amount'] = -2;
        }

        $checker= $this->app()->spam()->contentChecker();
        $checker->check($user, $input['comment_html']);
        if($checker->getFinalDecision()=='denied'){
            $this->error(\XF::phrase('your_content_cannot_be_submitted_try_later'));
        }
        /**
         * @var XenCentral_Feedback_DataWriter_Feedback
         */
	    if ($feedback['fb_id'])
	    {
		    $feedbackWriter = $this->em()->find('XenCentral\Feedback:Feedback', $feedback['fb_id']);
		    $feedbackWriter->set('foruserid', $feedback['foruserid']);
		    $feedbackWriter->set('fromuserid', $feedback['fromuserid']);
		    $feedbackWriter->set('amount', $input['amount']);
		    $feedbackWriter->set('type', $input['type']);
		    $feedbackWriter->set('dealurl', $input['dealurl']);
		    $feedbackWriter->set('review', $input['review']);

	    }

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

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

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

        if (!empty($input['comment_html'])) {
        	if ( $comment = $this->_getCommentModel()->getFirstComment( $fb_id ) ) {
		$commentWriter = $this->em()->find( 'XenCentral\Feedback:FeedbackComment', $comment );
		$commentWriter->set( 'message', $message);
        	} else {
		$commentWriter = $this->em()->create( 'XenCentral\Feedback:FeedbackComment' );
		$commentWriter->set( 'fb_id', $fb_id );
		$commentWriter->set( 'user_id', $feedback['foruserid'] );
		$commentWriter->set( 'message', $message );
		$commentWriter->preSave();
	}

	$commentWriter->save();

	}
        $this->_getActivityModel()->savedFeedback($feedback, $user);

        return $this->redirect( \XF::app()->router('public')->buildLink('feedback/feedback/view', $feedback),
            \XF::phrase('xcfs_feedback_has_been_edited'));

    }

    public function actionDelete(ParameterBag $params)
    {
        $fb_id = $params->fb_id;

        $feedback = $this->_getFeedbackModel()->getFeedbackById($fb_id);

        if (!$feedback) {
            $this->_getReportSuspicious( )->reportActivity('deletefeedbackinvalid', array(
                'fb_id' => $fb_id
            ));
            return $this->error(\XF::phrase('xcfs_invalid_feedback_id'));
        }

        if (!$feedback['canedit']) {
            $this->_getReportSuspicious( )->reportActivity('feedbackdelete', array(
                'fb_id' => $fb_id
            ));
            return $this->error(XF::phrase('xcfs_cannot_view_the_page'));
        }

        $with = [];
        $user = \XF::em()->find('XF:User', $feedback['foruserid'], $with);
        $breadCrumbs = array();

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

        $breadCrumbs['feedbacklink'] = array(
            'href' => \XF::app()->router('public')->buildLink('feedback/feedback/view', $feedback),
            'value' => $feedback['review']
        );

        $breadCrumbs['deletelink'] = array(
            'href' => \XF::app()->router('public')->buildLink('feedback/feedback/delete', $feedback),
            'value' => \XF::phrase('xcfs_delete_feedback')
        );

        $viewParams = array(
            'user' => $user,
            'feedback' => $feedback,
            'breadCrumbs' => $breadCrumbs
        );

        return $this->view('XenCentralFeedback:DeleteFeedback', 'xcfs_feedback_delete', $viewParams);
    }

    public function actionDoDeleteFeedback(ParameterBag $params)
    {
        $fb_id = $params->fb_id;

        $feedback = $this->em()->find('XenCentral\Feedback:Feedback', [
            'fb_id' => $fb_id
        ]);
        if (!$feedback) {
            $this->_getReportSuspicious( )->reportActivity('deletefeedbackinvalid', array(
                'fb_id' => $fb_id
            ));
            return $this->error(\XF::phrase('xcfs_invalid_feedback_id'));
        }


         if (!\XF::visitor()->canEdit()) {
            $this->_getReportSuspicious( )->reportActivity('feedbackdelete', array(
                'fb_id' => $fb_id
            ));
            return $this->error(\XF::phrase('xcfs_cannot_view_the_page'));
        }

        $with = [];
        $user = \XF::em()->find('XF:User', $feedback['foruserid'], $with);
       /**
         * @var XenCentral_Feedback_DataWriter_Comment
         */

        $feedback->delete();

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

        return $this->redirect(\XF::app()->router('public')->buildLink('feedback', $user),
            \XF::phrase('xcfs_feedback_has_been_deleted'));
    }

    public function actionReport(ParameterBag $params)
    {
        if (!\XF::visitor()->canUseFeedback()) {
            $this->_getReportSuspicious( )->reportActivity('reportfeedback');
            return $this->error(\XF::phrase('xcfs_cannot_view_the_page'));
        }

        $fb_id = $params->fb_id;

        $feedback = $this->_getFeedbackModel()->getFeedbackById($fb_id);

        if (!$feedback) {
            $this->_getReportSuspicious( )->reportActivity('reportfeedbackinvalid', array(
                'fb_id' => $fb_id
            ));
            return $this->error(\XF::phrase('xcfs_invalid_feedback_id'));
        }


        $with = [];
        $user = \XF::em()->find('XF:User', $feedback['foruserid'], $with);
        $breadCrumbs = array();

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

        $breadCrumbs['feedbacklink'] = array(
            'href' => \XF::app()->router('public')->buildLink('feedback/feedback/view', $feedback),
            'value' => $feedback['review']
        );

        $breadCrumbs['reportlink'] = array(
            'href' => \XF::app()->router('public')->buildLink('feedback/feedback/report', $feedback),
            'value' => \XF::phrase('xcfs_report_feedback')
        );

        $viewParams = array(
            'user' => $user,
            'feedback' => $feedback,
            'breadCrumbs' => $breadCrumbs
        );

        return $this->view('XenCentralFeedback:ReportFeedback', 'xcfs_feedback_report', $viewParams);
    }

    public function actionDoReportFeedback(ParameterBag $params)
    {
        if (!\XF::visitor()->canUseFeedback()) {
            $this->_getReportSuspicious( )->reportActivity('reportfeedback');
            return $this->error(\XF::phrase('xcfs_cannot_view_the_page'));
        }

        $fb_id = $params->fb_id;

        $feedback = $this->em()->find('XenCentral\Feedback:Feedback', $fb_id);

        if (!$feedback) {
            $this->_getReportSuspicious( )->reportActivity('reportfeedbackinvalid', array(
                'fb_id' => $fb_id
            ));
            return $this->error(\XF::phrase('xcfs_invalid_feedback_id'));
        }

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

        if (!$message) {
            $this->_getReportSuspicious( )->reportActivity('emptyreport');
            return $this->error(\XF::phrase('xcxf_please_enter_reason_for_reporting_this_feedback'));
        }
        $with = [];
        $user = \XF::em()->find('XF:User', $feedback['foruserid'], $with);
        $checker= $this->app()->spam()->contentChecker();
        $checker->check($user, $message);
        if($checker->getFinalDecision()=='denied'){
            $this->error(\XF::phrase('your_content_cannot_be_submitted_try_later'));
        }
        $reportModel = $this->_getReportModel($feedback);

        $this->_getActivityModel()->reportedFeedback($feedback, $user);

        $reportPlugin = $this->plugin('XF:Report');
        return $reportPlugin->actionReport(
            'feedback', $feedback,
            $this->buildLink('feedback', $feedback),
            $this->buildLink('feedback', $feedback)
        );

    }
	public static function getSessionActivityDetailsForList(array $activities)
	{
		return \XF::phrase('xcfs_viewing_feedback');
	}
}