<?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
);
}
}